ZGlmZiAtLWdpdCBhL3YxL1JFQURNRS50eHQgYi92MS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJlYTQ5Li4wMDAwMDAwCi0tLSBhL3YxL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotMTAvMzAvMjAwMwotCi1XZWxjb21lIHRvIFhtbEJlYW5zIQotCi1BcGFjaGUgWE1MQmVhbnMgaXMgYW4gZWZmb3J0IHVuZGVyZ29pbmcgaW5jdWJhdGlvbiBhdCB0aGUgCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IHRoZSBYTUwgcHJvamVjdC4gCi1JbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyB1bnRpbCBhIAotZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgCi1hbmQgZGVjaXNpb24gbWFraW5nIHByb2Nlc3MgaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgCi13aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgCi1uZWNlc3NhcmlseSBhIHJlZmxlY3Rpb24gb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgb2YgdGhlIAotY29kZSwgaXQgZG9lcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9qZWN0IGhhcyB5ZXQgdG8gYmUgZnVsbHkgCi1lbmRvcnNlZCBieSB0aGUgQVNGLiAKLQotCi1JZiB5b3UndmUgY29tZSBoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgWG1sQmVhbnMsIGhlcmUgYXJlIGEgZmV3Ci1zdGFydGluZyBwb2ludHM6Ci0KLQotCi0KLSgxKSBEb2NzCi0gICAgCi1JZiB5b3UgImFudCBkb2NzIiB0aGVuIHlvdSBjYW4gZ2V0IGphdmFkb2NzIGJ1aWx0IGZvciBhIGJ1bmNoCi1vZiBvdXIgc3R1ZmYuIEluIHBhcnRpY3VsYXIsIGxvb2sgYXQgdGhlIG9yZy5hcGFjaGUueG1sYmVhbnMgcGFja2FnZSwKLXN0YXJ0aW5nIHdpdGggWG1sT2JqZWN0IGFuZCBYbWxDdXJzb3IuCi0KLU5vdCBhIGxvdCBpcyBkb2MnZWQgeWV0LCBzbyB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZSBzYW1wbGVzCi10byBsZWFybiBtb3JlIC0gd2UgcmVhbGx5IG5lZWQgYSBsaXR0bGUgdHV0b3JpYWwuCi0KLUluIHRoZSBtZWFuIHRpbWUsIGlmIHlvdSd2ZSBnb3QgbW9yZSBxdWVzdGlvbnMsIHBsZWFzZSBwb3N0IHlvdXIgcXVlc3Rpb25zCi10byB4bWxiZWFucy11c2VyQHhtbC5hcGFjaGUub3JnICh5b3UgbmVlZCB0byBzdWJzY3JpYmUgcHJpb3IgdG8gcG9zdGluZywKLWJ5IHNlbmRpbmcgYSBibGFuayBtYWlsIHRvIHhtbGJlYW5zLXVzZXItc3Vic2NyaWJlQHhtbC5hcGFjaGUub3JnKS4KLQotCi0KLSgyKSBCdWlsZAotCi1UaGUgZGVmYXVsdCB0YXJnZXQsIGFrYSAiYW50IGRlZmF1bHQiLCBidWlsZHMgZXZlcnl0aGluZyB5b3UgbmVlZAotdG8gdGVzdCBhbmQgcnVuLiAKLQotCi1PdGhlciB0YXJnZXRzOgotICBhbnQgYnVpbGQ6IGJ1aWxkcyBwdWJsaWMgamFycyB0aGF0IGFyZSB1c2VkIGZvciBjb21waWxpbmcgb3RoZXIgYml0cyBvZiB3bHcKLSAgYW50IGRlcGxveTogYnVpbGRzIHhiZWFuLmphciB0b28KLSAgYW50IGRydDogYnVpbGRzIGRydCB0ZXN0cyB0b28KLSAgYW50IGJvb3RzdHJhcDogYnVpbGRzIHhiZWFuLmphciwgdGhlbiBidWlsZHMgaXQgYWdhaW4gdXNpbmcgaXRzZWxmLgotCi0KLUludGVyZmFjZSBKQVJzOgotCi14bWxwdWJsaWMuamFyIC0gdGhlIFhCZWFucyBwdWJsaWMgaW50ZXJmYWNlcywgZm9yIHVzZSBieSBvdXIgdXNlcnMuCi13bHhiZWFuLmphciAtIGludGVyZmFjZXMgc3BlY2lmaWMgdG8gdGhlIElERS9ydW50aW1lLCBub3QgZm9yIHVzZSBieSBvdGhlcnMuCi0KLQotSW1wbGVtZW50YXRpb24gSkFSczoKLQoteGJlYW4uamFyIC0gdGhlIHdob2xlIHhiZWFuLmphciAtIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gcnVuLiBXaGVuIHRoaXMKLSBpcyBvbiB5b3VyIGNsYXNzcGF0aCwgeW91IGRvbid0IG5lZWQgeG1scHVibGljLmphciBvciB3bHhiZWFuLmphcgotCi0KLVRlc3RpbmcgSkFSczoKLQotZHJ0LmphciAtIG91ciBEUlQKLWVudW10ZXN0LmphciwgZWFzeXBvLmphciwgbmFtZXdvcmxkLmphciwgeHN0eXBlcy5qYXIgLSBzYW1wbGUgWEJlYW4gSkFScy4KLQotCi1PdGhlciBKQVJzOgotCi1vbGR4YmVhbi5qYXIgLSBhIGZ1bGx5IGJ1aWx0IHByZXZpb3VzLXZlcnNpb24gb2YgeGJlYW4uamFyLCB1c2VkIGZvcgotICBib290c3RyYXBwaW5nLCBzaW5jZSB4YmVhbnMgYXJlIHVzZWQgaW4gYnVpbGRpbmcgeGJlYW4uamFyIGl0c2VsZi4KLQotCi0KLQotCi0oMykgUnVubmluZwotCi1UaGVyZSBhcmUgYSBmZXcgd2F5cyB5b3UgY2FuIHJ1bi4gIFRoZXJlIGlzIHNvbWUgcHJldHR5IHBsYWluLWphbmUKLUpVbml0IHRlc3RpbmcgY29kZSBjaGVja2VkIGludG8geGJlYW5cdGVzdFxzcmNcZHJ0IHRoYXQgeW91IGNhbgotdXNlIHRvIHNlZSBob3cgdG8gZXhlcmNpc2Ugb3VyIGZ1bmN0aW9uYWxpdHkuIChUaGUgdGVzdHMgaW4gdGhhdAotZGlyZWN0b3J5IGFyZSBvdXIgRGV2ZWxvcGVyIFJlZ3Jlc3Npb24gVGVzdHMuKQotCi1Zb3UgY2FuIHJ1biB0aGUgZHJ0IHVzaW5nIHhiZWFuXGJpblxkcnRbLnNofC5jbWRdLgotCi1Bbm90aGVyIHRvb2wgdGhhdCB5b3UgY2FuIHVzZSBpcyAic2NvbXAiLCB0aGUgWEJlYW4gc2NoZW1hCi1jb21waWxlci4gVGhlIHNjb21wIHNjcmlwdCBpcyBhdCB4YmVhblxiaW5cc2NvbXBbLnNofC5jbWRdLgotCi1UbyBydW4gc2NvbXAsIGp1c3QgcG9pbnQgaXQgYXQgYW4gWFNEIGZpbGUgb3IgYSBkaXJlY3RvcnkgZnVsbAotb2YgWFNEIGZpbGVzLCBhbmQgaXQgd2lsbCBwcm9kdWNlIGFuIG91dHB1dCAuamFyIHdpdGggYWxsIHlvdXIKLXR5cGVzLgotCi1TaW5jZSBzY29tcCBqYXJzIHVwIGl0cyByZXN1bHRzLCBpdCBjYW4gYmUgaGFyZCB0byBzZWUgd2hhdCBpdAotaXMgZG9pbmcuIEJ1dCBpZiB5b3UgdXNlIHRoZSAiLXNyYyBteWRpciIgb3B0aW9uIHdpdGggc2NvbXAsCi15b3UgY2FuIHNwZWNpZnkgYSBkaXJlY3RvcnkgaW50byB3aGljaCBpdCB3aWxsIGR1bXAgLmphdmEgc291cmNlCi1jb2RlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgamF2YSB0eXBlcyBpdCBpcyBnZW5lcmF0aW5nLgotCi1GaW5hbGx5LCB0aGVyZSBpcyBhIHV0aWxpdHkgY2FsbGVkICJkdW1weHNiIi4gSWYgeW91IHVuamFyCi1hIGJ1aWx0IHhiZWFuIGphciwgeW91J2xsIG5vdGljZSBhIGJ1bmNoIG9mIC54c2IgZmlsZXMgc2NhdHRlcmVkCi1hYm91dC4gRWFjaCBvbmUgb2YgdGhlc2UgZmlsZXMgcmVwcmVzZW50cyBhIHNjaGVtYSB0eXBlLCBhdHRyaWJ1dGUsCi1vciBlbGVtZW50IGRlZmluaXRpb24sIGFuZCB5b3UgY2FuIHVzZSAiZHVtcHhzYiIgdG8gc2VlIHRoZQotY29udGVudHMuCi0KZGlmZiAtLWdpdCBhL3YxL2Jpbi9kdW1weHNiIGIvdjEvYmluL2R1bXB4c2IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5OGJjNWMuLjAwMDAwMDAKLS0tIGEvdjEvYmluL2R1bXB4c2IKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vc2gKLSNYU0IgZmlsZSBkdW1wZXIKLSNQcmludHMgdGhlIGNvbnRlbnRzIG9mIGFuIHhzYiBmaWxlIGluIGh1bWFuLXJlYWRtYmxlIGZvcm0KLQotY3A9Ci1jcD0kY3A6JFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyCi0KLWNhc2UgImB1bmFtZWAiIGluCi0gICAgQ1lHV0lOKikKLSAgICAgICAgY3A9YGN5Z3BhdGggLXcgLXAgJGNwYAotICAgICAgICA7OwotZXNhYwotCi1qYXZhIC1jbGFzc3BhdGggJyRjcCcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWHNiRHVtcGVyICQqCmRpZmYgLS1naXQgYS92MS9iaW4vZHVtcHhzYi5jbWQgYi92MS9iaW4vZHVtcHhzYi5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YjYyY2YuLjAwMDAwMDAKLS0tIGEvdjEvYmluL2R1bXB4c2IuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQHJlbSBYU0IgZmlsZSBkdW1wZXIKLUByZW0KLUByZW0gUHJpbnRzIHRoZSBjb250ZW50cyBvZiBhbiB4c2IgZmlsZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtCi1AZWNobyBvZmYKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Yc2JEdW1wZXIgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi9qYXhiYy5jbWQgYi92MS9iaW4vamF4YmMuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQyMDc5Li4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9qYXhiYy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1AcmVtIFNjaGVtYSBjb21waWxlcgotQHJlbQotQHJlbSBCdWlsZHMgamF4YiB0eXBlcyBmcm9tIHhzZCBmaWxlcy4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxleHRlcm5hbFxsaWJcamF4Yi0xLjBcamF4Yi1hcGkuamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIC1qYXhiICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vcmFuZG9tLmNtZCBiL3YxL2Jpbi9yYW5kb20uY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI3ZDI2Li4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9yYW5kb20uY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLUByZW0gRFJUCi1AcmVtCi1AcmVtIEludm9rZXMgUmFuZG9tIHRlc3QKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXHByaXZhdGVcbGliXHJhbmRvbS5qYXIKLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxwcml2YXRlXGxpYlxlYXN5cG8uamFyCi0KLXJlbSBqYXZhIC1lYSAtRHRyZWVhc3NlcnRzPXRydWUgIC1EeGJlYW4ucm9vdGRpcj0lWE1MQkVBTlNfSE9NRSUgLWNsYXNzcGF0aCAlY3AlIFJhbmRvbSAtbm9xdWVyeSAlKgotICAgIGphdmEgLWVhIC1EdHJlZWFzc2VydHM9ZmFsc2UgLUR4YmVhbi5yb290ZGlyPSVYTUxCRUFOU19IT01FJSAtY2xhc3NwYXRoICVjcCUgUmFuZG9tIC1ub3F1ZXJ5ICUqCmRpZmYgLS1naXQgYS92MS9iaW4vc2NvbXAgYi92MS9iaW4vc2NvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZmE1NmEuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3Njb21wCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyEvYmluL3NoCi0KLSNTY2hlbWEgY29tcGlsZXIKLSNCdWlsZHMgWEJlYW4gdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphcgotCi1jYXNlICJgdW5hbWVgIiBpbgotICAgIENZR1dJTiopCi0gICAgICAgIGNwPWBjeWdwYXRoIC13IC1wICRjcGAKLSAgICAgICAgOzsKLWVzYWMKLQotamF2YSAtY2xhc3NwYXRoICRjcCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb21wLmNtZCBiL3YxL2Jpbi9zY29tcC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWQwMWIuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3Njb21wLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUByZW0gU2NoZW1hIGNvbXBpbGVyCi1AcmVtCi1AcmVtIEJ1aWxkcyBYQmVhbiB0eXBlcyBmcm9tIHhzZCBmaWxlcy4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXIgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi9zY29weS5jbWQgYi92MS9iaW4vc2NvcHkuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk0YzNhLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9zY29weS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1AcmVtIFNjaGVtYSBjb21waWxlcgotQHJlbQotQHJlbSBCdWlsZHMgWEJlYW4gdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLUBlY2hvIG9mZgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvcHkgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi9zZG93bmxvYWQuY21kIGIvdjEvYmluL3Nkb3dubG9hZC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTgyOWQuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3Nkb3dubG9hZC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1AcmVtIFNjaGVtYSBkb3dubG9hZGVyCi1AcmVtCi1AcmVtIFRvb2wgdG8gZG93bmxvYWQgc2NoZW1hcy4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hUmVzb3VyY2VNYW5hZ2VyICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vc2ZhY3Rvci5jbWQgYi92MS9iaW4vc2ZhY3Rvci5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTA3MDMuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3NmYWN0b3IuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotQHJlbSBTY2hlbWEgRmFjdG9yaW5nIHRvb2wKLUByZW0KLUByZW0gRmFjdG9yZXMgcmVkdW5kYW50IGRlZmluaXRpb25zIG91dCBvZiBhIHNldCBvZiBzY2hlbWFzIGFuZCB1c2VzIGltcG9ydHMgaW5zdGVhZC4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuRmFjdG9ySW1wb3J0cyAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3ZhbGlkYXRlIGIvdjEvYmluL3ZhbGlkYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzczMTI1Li4wMDAwMDAwCi0tLSBhL3YxL2Jpbi92YWxpZGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBJbnN0YW5jZSBWYWxpZGF0b3IKLSMKLSMgVmFsaWRhdGVzIGFuIGluc3RhbmNlIGFnYWluc3QgYSBzY2hlbWEuCi0KLUNQPQotQ1A9JENQOiRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphcgotCi1jYXNlICJgdW5hbWVgIiBpbgotICAgIENZR1dJTiopCi0gICAgICAgIGNwPWBjeWdwYXRoIC13IC1wICRjcGAKLSAgICAgICAgOzsKLWVzYWMKLQotamF2YSAtY2xhc3NwYXRoICRDUCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3ZhbGlkYXRlLmNtZCBiL3YxL2Jpbi92YWxpZGF0ZS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjg1Y2YuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3ZhbGlkYXRlLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUByZW0gSW5zdGFuY2UgVmFsaWRhdG9yCi1AcmVtCi1AcmVtIFZhbGlkYXRlcyBhbiBpbnN0YW5jZSBhZ2FpbnN0IGEgc2NoZW1hLgotCi1AZWNobyBvZmYKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3hwcmV0dHkuY21kIGIvdjEvYmluL3hwcmV0dHkuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUxZThhLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi94cHJldHR5LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUBlY2hvIG9mZgotCi1AcmVtIEludm9rZXMgcHJldHR5IHByaW50ZXIKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5QcmV0dHlQcmludGVyICUqCmRpZmYgLS1naXQgYS92MS9iaW4veHNkdHJlZS5jbWQgYi92MS9iaW4veHNkdHJlZS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzFhOGYuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3hzZHRyZWUuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLUByZW0gSW52b2tlcyB0eXBlIGhpZXJhcmNoeSBwcmludGVyCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuVHlwZUhpZXJhcmNoeVByaW50ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2Jpbi94c3RjLmNtZCBiL3YxL2Jpbi94c3RjLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlYmQ2MS4uMDAwMDAwMAotLS0gYS92MS9iaW4veHN0Yy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1AZWNobyBvZmYKLQotQHJlbSBJbnZva2VzIFhTVEMKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YU1RDVGVzdGVyICUqCmRpZmYgLS1naXQgYS92MS9idWlsZC54bWwgYi92MS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmQ1Y2EuLjAwMDAwMDAKLS0tIGEvdjEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODY5ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlhiZWFuIiBkZWZhdWx0PSJkZWZhdWx0IiBiYXNlZGlyPSIuIj4KLQotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJqYXZhYzEuNCIvPgotICA8cHJvcGVydHkgbmFtZT0icHJvZHVjdC52ZXJzaW9uIiB2YWx1ZT0iMS4wLjEiLz4KLQotICA8dGFyZ2V0IG5hbWU9InVzYWdlIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJUaGUgZm9sbG93aW5nIGFudCB0YXJnZXRzIGFyZSBkZWZpbmVkOiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9InVzYWdlICAgIC0gdGhpcyBoZWxwIHRleHQiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJidWlsZCAgICAtIGJ1aWxkcyBvdXIgcHVibGljIGludGVyZmFjZSBqYXJzIHNvIG90aGVycyBjYW4gY29tcGlsZSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImRlcGxveSAgIC0gYnVpbGRzIG91ciBpbXBsZW1lbnRhdGlvbiBqYXIgKHhiZWFuLmphcikiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJjbGVhbiAgICAtIGNsZWFucyBvdXQgdGhlIHhiZWFucyBkaXJlY3RvcmllcyIvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkZHJ0IC0gYnVpbGRzLCBidXQgZG9lcyBub3QgcnVuLCB0aGUgeGJlYW4gZHJ0Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iZHJ0ICAgICAgLSBydW5zIHRoZSB4YmVhbiBkcnQiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgPGRlbGV0ZSBkaXI9ImJ1aWxkIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJzb3VyY2VzLCB4YmVhbiwgZHJ0LmphciwgcmFuZG9tLmphciIgLz4KLQotICA8dGFyZ2V0IG5hbWU9InNvdXJjZXMiIGRlcGVuZHM9ImRpcnMiPgotICAgIDx6aXAgZGVzdGZpbGU9ImJ1aWxkL2FyL3hiZWFuc3JjLnppcCIgYmFzZWRpcj0iLiIgZXhjbHVkZXM9ImJ1aWxkLyoqIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ieGJlYW4iIGRlcGVuZHM9InhiZWFuLmphciI+Ci0gICAgPGNvcHkgZmlsZT0iYnVpbGQvbGliL3hiZWFuLmphciIgdG9maWxlPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXJzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZCIvPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9saWIiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9hciIvPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3NyYyIvPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2xpYiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRydCIgPgotICAgICAgPGVjaG8gbWVzc2FnZT0iUnVubmluZyByYW5kb20gdGVzdGVyIi8+Ci0gICAgICAgPGphdmEgY2xhc3NuYW1lPSJSYW5kb20iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9yYW5kb20uamFyIi8+Ci0gICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgICAgIDxhcmcgbGluZT0iLXNlZWQgMCAtaSAyMCAtbm9xdWVyeSIvPgotICAgICAgIDwvamF2YT4KLQotICAgIDxta2RpciBkaXI9ImJ1aWxkL3Rlc3Qvb3V0cHV0Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iUnVubmluZyB4YmVhbiBwcm9kdWN0IGRydCB0ZXN0cyIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IkpVbml0IG91dHB1dCBiZWluZyBzZW50IHRvIHhiZWFuL2J1aWxkL3Rlc3Qvb3V0cHV0L2RydC1wcm9kdWN0LnR4dCIvPgotICAgIDxqdW5pdCBmb3JrPSJ5ZXMiIHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiIHNob3dvdXRwdXQ9InllcyI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9InhiZWFuLnJvb3RkaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0cmVlYXNzZXJ0cyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2RydC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lYXN5cG8uamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvc2NoZW1hcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi94c3R5cGVzLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2VudW10ZXN0LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL251bWVyYWxzLmphciIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+Ci0gICAgICA8dGVzdCBuYW1lPSJkcnRjYXNlcy5TbW9rZVRlc3RzIiBvdXRmaWxlPSJidWlsZC90ZXN0L291dHB1dC9kcnQtcHJvZHVjdCIgLz4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkZHJ0IiBkZXBlbmRzPSJkcnQuamFyLCByYW5kb20uamFyLCBlcmljIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJlcmljIiBkZXBlbmRzPSJlcmljdGVzdC5qYXIiLz4KLQotICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIGRlcGVuZHM9ImRlcGxveSwgYnVpbGRkcnQiLz4KLQotICA8dGFyZ2V0IG5hbWU9InJlZGVwbG95IiBkZXBlbmRzPSJjbGVhbiwgZGVwbG95Ii8+Ci0KLSAgPCEtLSBvbGR4YmVhbi5qYXIgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJvbGR4YmVhbi5qYXIiPgotICAgIDxjb3B5IGZpbGU9ImV4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIiIHRvZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gYm9vdHN0cmFwIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iYm9vdHN0cmFwIiBkZXBlbmRzPSJ4YmVhbiI+Ci0KLSAgICA8IS0tIGFmdGVyIHhiZWFuLmphciBpcyBidWlsdCwgbW92ZSBpdCBvdXQgb2YgdGhlIHdheSBhbmQgY2xlYW4gdGhlIHByb2plY3QgLS0+Ci0gICAgPHRlbXBmaWxlIHByb3BlcnR5PSJib290c3RyYXAuamFyZmlsZSIgcHJlZml4PSJvbGR4YmVhbiIgc3VmZml4PSIuamFyIi8+Ci0gICAgPG1vdmUgZmlsZT0iYnVpbGQvYXIveGJlYW4uamFyIiB0b2ZpbGU9IiR7Ym9vdHN0cmFwLmphcmZpbGV9Ii8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIgaW5oZXJpdEFsbD0iZmFsc2UiLz4KLQotICAgIDwhLS0gdGhlbiBtb3ZlIGl0IGJhY2sgaW50byBwbGFjZSBhcyBvbGR4YmVhbi5qYXIgYW5kIGRvIGFub3RoZXIgYnVpbGQgLS0+Ci0gICAgPG1vdmUgZmlsZT0iJHtib290c3RyYXAuamFyZmlsZX0iIHRvZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJ4YmVhbiIgaW5oZXJpdEFsbD0iZmFsc2UiLz4KLQotICAgIDwhLS0gY29tcGFyZSB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IGphciB0byB0aGUgY29udGVudHMgb2YgdGhlIHNlY29uZCBqYXIgLS0+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJ6aXBjb21wYXJlLmNsYXNzZXMiIGluaGVyaXRBbGw9ImZhbHNlIi8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJ6aXBjb21wYXJlLlppcENvbXBhcmUiCi0gICAgICAgICAgY2xhc3NwYXRoPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvemlwY29tcGFyZSIKLSAgICAgICAgICBmb3JrPSJ0cnVlIgotICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iYnVpbGQvYXIveGJlYW4uamFyIGJ1aWxkL3ByaXZhdGUvbGliL29sZHhiZWFuLmphciIvPgotICAgIDwvamF2YT4KLQotICAgIDwhLS0gd2hlbiBldmVyeXRoaW5nIHN1Y2NlZWRzLCBjaGVjayBvdXQgb2xkeGJlYW4uamFyIGZyb20gcGVyZm9yY2UgLS0+Ci0gICAgPGVjaG8gbWVzc2FnZT0iPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJSZXN1bHRzIG1hdGNoISBCb290c3RyYXAgc3VjY2VlZGVkLiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9Ij09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iQXR0ZW1wdGluZyB0byBjb3B5IG9sZHhiZWFuLmphciIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IklmIHRoZSBjb3B5IGZhaWxzLCB5b3UgbXVzdCBjaGVjayBvdXQgb2xkeGJlYW4uamFyIi8+Ci0gICAgPCEtLSBjb3B5IG9sZHhiZWFuLmphciB3aGV0aGVyIG9yIG5vdCBwZXJmb3JjZSBzdWNjZWVkZWQgLS0+Ci0gICAgPGVjaG8gbWVzc2FnZT0ib3ZlcndyaXRpbmcgb2xkIGV4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIiLz4KLSAgICA8Y29weSBmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9vbGR4YmVhbi5qYXIiIHRvZmlsZT0iZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphciIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHppcGNvbXBhcmUgKGZvciBjaGVja2luZyBib290c3RyYXApID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJ6aXBjb21wYXJlLmNsYXNzZXMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy96aXBjb21wYXJlIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3ppcGNvbXBhcmUiCi0gICAgICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy96aXBjb21wYXJlIgotICAgICAgICAgICBkZWJ1Zz0ib24iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0ZXN0IHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8cGF0aCBpZD0idGVzdC5jb21waWxlLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lYXN5cG8uamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lcmljc2NoZW1hLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvc2NoZW1hcy5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2VudW10ZXN0LmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIveHN0eXBlcy5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL251bWVyYWxzLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgotICA8L3BhdGg+Ci0KLSAgPHBhdGggaWQ9InRlc3QucnVuLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJleHRlcm5hbC9saWIvanVuaXQuamFyIi8+Ci0gIDwvcGF0aD4KLQotICA8IS0tIGJ1aWxkZHJ0IHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iZHJ0LmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIGVhc3lwby5qYXIsIHNjaGVtYXMuamFyLAotICAJICB4c3R5cGVzLmphciwgZW51bXRlc3QuamFyLCBudW1lcmFscy5qYXIiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9kcnQiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2RydCIKLSAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZHJ0IgotICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jb21waWxlLnBhdGgiCi0gICAgICAgc291cmNlPSIxLjQiCi0gICAgICAgZGVidWc9Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZHJ0LmphciIgZGVwZW5kcz0iZHJ0LmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvZHJ0LmphciIgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL2RydCIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHN0c3NjaGVtYSAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8cGF0aCBpZD0ic2NvbXAucnVuLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hiZWFuLmphciIvPgotICA8L3BhdGg+Ci0KLSAgPHRhcmdldCBuYW1lPSJzdHNzY2hlbWEuY2hlY2siPgotICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0ic3Rzc2NoZW1hLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIj4KLSAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3Qvc3JjL3N0c3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic3Rzc2NoZW1hLmphciIgZGVwZW5kcz0ic3Rzc2NoZW1hLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJzdHNzY2hlbWEubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIHRlc3Qvc3JjL3N0c3NjaGVtYSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBzb2FwdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBzdHNzY2hlbWEuamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJ0ZXN0L3NyYy9zb2FwdGVzdCIgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NvYXB0ZXN0IiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2pkb20uamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3N0c3NjaGVtYS5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5qYXIiIGRlcGVuZHM9InNvYXB0ZXN0LmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvc29hcHRlc3QuamFyIiBiYXNlZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBlcmljdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iZXJpY3Rlc3QuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeGJlYW4sIGVyaWNzY2hlbWEuamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZXJpY3Rlc3QiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2VyaWN0ZXN0IgotICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9lcmljdGVzdCIKLSAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgotICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVyaWN0ZXN0LmphciIgZGVwZW5kcz0iZXJpY3Rlc3QuY2xhc3NlcyI+Ci0gICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9lcmljdGVzdC5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9lcmljdGVzdCIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHJhbmRvbSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0icmFuZG9tLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhiZWFuLCBlYXN5cG8uamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvcmFuZG9tIi8+Ci0gICAgPGphdmFjCi0gICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy9yYW5kb20iCi0gICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3JhbmRvbSIKLSAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgotICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJhbmRvbS5qYXIiIGRlcGVuZHM9InJhbmRvbS5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3JhbmRvbS5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9yYW5kb20iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0ZXN0c3RvcmUgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RzdG9yZS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHN0b3JlIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0idGVzdC9zcmMvdGVzdHN0b3JlIiBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHN0b3JlIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NpbXBsZXR5cGVzIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3htbGNvbXAiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdHlwZXN0b3JlIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90eXBlaW1wbCIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RzdG9yZS5qYXIiIGRlcGVuZHM9InRlc3RzdG9yZS5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3Rlc3RzdG9yZS5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0c3RvcmUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBzaW1wbGV0eXBlcyAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InNpbXBsZXR5cGVzLmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9InNpbXBsZXR5cGVzLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zaW1wbGV0eXBlcy5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL3ByaXZhdGUvbGliIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzaW1wbGV0eXBlcy5qYXIiIGRlcGVuZHM9InNpbXBsZXR5cGVzLmNoZWNrLCBkaXJzIiB1bmxlc3M9InNpbXBsZXR5cGUubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW5hbWUgc2NoZW1hLnRlc3Quc2ltcGxlIC1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvc2ltcGxldHlwZXMuamFyIHRlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBlYXN5cG8gKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImVhc3lwby5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJlYXN5cG8ubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZWFzeXBvIiBpbmNsdWRlcz0iKiovKiIvPgotICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVhc3lwby5qYXIiIGRlcGVuZHM9ImVhc3lwby5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0iZWFzeXBvLm5vdFJlcXVpcmVkIj4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciB0ZXN0L3NyYy9lYXN5cG8iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gbnVtZXJhbHMgKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJudW1lcmFscy5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJudW1lcmFscy5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvbnVtZXJhbHMuamFyIj4KLSAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3Qvc3JjL251bWVyYWxzIiBpbmNsdWRlcz0iKiovKiIvPgotICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJudW1lcmFscy5qYXIiIGRlcGVuZHM9Im51bWVyYWxzLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJudW1lcmFscy5ub3RSZXF1aXJlZCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL251bWVyYWxzLmphciB0ZXN0L3NyYy9udW1lcmFscyIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBzY2hlbWFzIChmb3IgdGVzdGluZykgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ic2NoZW1hcy5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJzY2hlbWFzLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zY2hlbWFzLmphciI+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJ0ZXN0L3NyYy9zY2hlbWFzIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL2FyIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzY2hlbWFzLmphciIgZGVwZW5kcz0ic2NoZW1hcy5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0ic2NoZW1hcy5ub3RSZXF1aXJlZCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIHRlc3Qvc3JjL3NjaGVtYXMiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gZXJpY3NjaGVtYSAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImVyaWNzY2hlbWEuY2hlY2siPgotICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iZXJpY3NjaGVtYS5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvZXJpY3NjaGVtYS5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZXJpY3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZXJpY3NjaGVtYS5qYXIiIGRlcGVuZHM9ImVyaWNzY2hlbWEuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9ImVyaWNzY2hlbWEubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLXNyYyBidWlsZC9wcml2YXRlL3NyYyAtb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2VyaWNzY2hlbWEuamFyIHRlc3Qvc3JjL2VyaWNzY2hlbWEiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gZW51bXRlc3QgKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iZW51bXRlc3QuY2hlY2siPgotICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iZW51bXRlc3Qubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2VudW10ZXN0LmphciI+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJ0ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVudW10ZXN0LmphciIgZGVwZW5kcz0iZW51bXRlc3QuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9ImVudW10ZXN0Lm5vdFJlcXVpcmVkIj4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZW51bXRlc3QuamFyIHRlc3Qvc3JjL2VudW10ZXN0Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8IS0tIHhzdHlwZXMgKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieHN0eXBlcy5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ4c3R5cGVzLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi94c3R5cGVzLmphciI+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJ0ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhzdHlwZXMuamFyIiBkZXBlbmRzPSJ4c3R5cGVzLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJ4c3R5cGVzLm5vdFJlcXVpcmVkIj4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIveHN0eXBlcy5qYXIgdGVzdC9zcmMveHN0eXBlcyIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBqYXZhZG9jcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLSBBbGwgZG9jcyB0byBidWlsZC9kb2NzLCBpbmNsdWRpbmcgZ3VpZGUgYW5kIGphdmFkb2NzLiAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImRvY3MiIGRlcGVuZHM9InhiZWFuIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kaXIiIHZhbHVlPSJidWlsZC9kb2NzIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZG9jcy5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtkb2NzLmRpcn0iLz4KLSAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9IioiIHNvdXJjZXBhdGg9InNyYy94bWxwdWJsaWMiIGNsYXNzcGF0aD0iJHtqYXZhZG9jLnBhdGh9IiBkZXN0ZGlyPSIke2RvY3MuZGlyfS9yZWZlcmVuY2UiIHdpbmRvd3RpdGxlPSJYTUxCZWFucyBEb2N1bWVudGF0aW9uIiBzb3VyY2U9IjEuNCIgc3R5bGVzaGVldGZpbGU9ImRvY3Mvc3R5bGVzaGVldC5jc3MiPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2UtZG9jcy5iZWEuY29tL3dscy9kb2NzODEvamF2YWRvY3MvIi8+Ci0gICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvIi8+Ci0gICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvMS40L2RvY3MvYXBpLyIvPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2FwaURvY3MvIi8+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhZG9jPgotICAgIDxjb3B5IGZpbGU9ImRvY3MveG1sYmVhbnMuY3NzIiB0b2ZpbGU9IiR7ZG9jcy5kaXJ9L3htbGJlYW5zLmNzcyIgLz4KLSAgICA8Y29weSB0b2Rpcj0iJHtkb2NzLmRpcn0vZ3VpZGUiPgotICAgICAgPGZpbGVzZXQgZGlyPSJkb2NzL2d1aWRlIi8+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke2RvY3MuZGlyfS9pbWFnZXMiPgotICAgICAgPGZpbGVzZXQgZGlyPSJkb2NzL2ltYWdlcyIvPgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBzdHJlYW0gY29uZm9ybWFuY2UgdGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ic3RyZWFtdGVzdC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc3RyZWFtdGVzdCIvPgotICAgIDxqYXZhYwotICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy9zdHJlYW10ZXN0IgotICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgotICAgICAgc291cmNlPSIxLjQiCi0gICAgICBkZWJ1Zz0ib24iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzdHJlYW10ZXN0LmphciIgZGVwZW5kcz0ic3RyZWFtdGVzdC5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3N0cmVhbXRlc3QuamFyIiBiYXNlZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc3RyZWFtdGVzdCIvPgotICA8L3RhcmdldD4KLQotICA8cGF0aCBpZD0icnVuLnN0cmVhbWNvbmYucGF0aCI+Ci0gICAgPHBhdGggcmVmaWQ9InRlc3QucnVuLnBhdGgiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9zdHJlYW10ZXN0LyIvPgotICA8L3BhdGg+Ci0KLSAgPHRhcmdldCBuYW1lPSJzdHJlYW1jb25mIiBkZXBlbmRzPSJzdHJlYW10ZXN0LmphciI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJzdHJlYW10ZXN0LlhtbFN0cmVhbUNvbmZvcm1hbmNlIgotICAgICAgICAgIGNsYXNzcGF0aHJlZj0icnVuLnN0cmVhbWNvbmYucGF0aCIKLSAgICAgICAgICBmb3JrPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPCEtLWFyZyBsaW5lPSJ0ZXN0L2Nhc2VzL3N0cmVhbWNvbmYvc21hbGwueG1sIiAvLS0+Ci0gICAgICA8YXJnIGxpbmU9InRlc3QvY2FzZXMvc3RyZWFtY29uZi9kdGQueG1sIiAvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImRpc3Qtc3JjLCBkaXN0LWJpbiI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdC1iaW4iIGRlcGVuZHM9InhiZWFuLCBkb2NzIj4KLSAgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259Ii8+Ci0gICAgIDxkZWxldGUgZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS56aXAiLz4KLSAgICAgPGRlbGV0ZSBmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LnRneiIvPgotCi0gICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259Ii8+Ci0gICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ieGtpdCIvPgotICAgICA8L2NvcHk+Ci0KLSAgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vbGliIi8+Ci0gICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9saWIiIGZpbGU9ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotCi0gICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L3NyYy9zY2hlbWEiLz4KLSAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L3NyYy9zY2hlbWEiPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy90b29sc2NoZW1hIi8+Ci0gICAgIDwvY29weT4KLQotICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9kb2NzIi8+Ci0gICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9kb2NzIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9kb2NzIi8+Ci0gICAgIDwvY29weT4KLQotICAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LnppcCIKLSAgICAgICAgICBiYXNlZGlyPSJidWlsZC9wcml2YXRlIgotICAgICAgICAgIGluY2x1ZGVzPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vKioiLz4KLSAgICAgPHRhciBkZXN0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS50Z3oiCi0gICAgICAgICAgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZSIKLSAgICAgICAgICBpbmNsdWRlcz0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LyoqIgotICAgICAgICAgIGNvbXByZXNzaW9uPSJnemlwIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdC1zcmMiIGRlcGVuZHM9ImNsZWFuLCBkaXJzIj4KLSAgICAgPGRlbGV0ZSBmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy56aXAiLz4KLQkgPGRlbGV0ZSBmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy50Z3oiLz4KLQotCSA8emlwIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL2luY3ViYXRpbmcteG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy56aXAiPgotICAgICAJPHppcGZpbGVzZXQKLSAgICAgCQlkaXI9Ii4iCi0gICAgICAgCQlpbmNsdWRlcz0iKioiCi0gICAgICAgCQlleGNsdWRlcz0iYnVpbGQvKioiCi0gICAgICAgCQlwcmVmaXg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgotICAgICA8L3ppcD4KLQkgPHRhciBkZXN0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS1zcmMudGd6IgotCSAJICBjb21wcmVzc2lvbj0iZ3ppcCI+Ci0gICAgIAk8dGFyZmlsZXNldAotICAgICAJCWRpcj0iLiIKLSAgICAgICAJCWluY2x1ZGVzPSIqKiIKLSAgICAgICAJCWV4Y2x1ZGVzPSJidWlsZC8qKiIKLSAgICAgICAJCXByZWZpeD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259Ii8+Ci0gICAgIDwvdGFyPgotICA8L3RhcmdldD4KLQotICA8IS0tIHByZXZpb3VzbHkgaW4geGJlYW4ueG1sIC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieGJlYW4uamFyIgotICAgICAgICBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIGNvbW1vbi5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCB4bWxjb21wLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIHhtbHN0b3JlLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIG9sZHhiZWFuLmphciwgeHNkc2NoZW1hLmNsYXNzZXMsCi0gICAgICAgICAgICAgICAgIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvbGliL3hiZWFuLmphciIgaW5kZXg9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVpbXBsIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gamF4YiB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxwYXRoIGlkPSJqYXhiLmNvbXBpbGUucGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJleHRlcm5hbC9saWIvamF4Yi0xLjAvamF4Yi1hcGkuamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2pheGJzY2hlbWEiLz4KLSAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXhic2NoZW1hLmNoZWNrIj4KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF4YnNjaGVtYS5ub3RSZXF1aXJlZCI+Ci0gICAgICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImpheGJzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMvamF4YnNjaGVtYS9zY2hlbWEvc3lzdGVtL0pBWEJDT05GSUcvaW5kZXgueHNiIj4KLSAgICAgICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSJzcmMvamF4Yi9zY2hlbWEiIGluY2x1ZGVzPSIqKi8qLnhzZDsqKi8qLnhzZGNvbmZpZyIvPgotICAgICAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImpheGJzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0iamF4YnNjaGVtYS5jaGVjaywgeG1scHVibGljLmNsYXNzZXMsIHR5cGVpbXBsLmNsYXNzZXMsIGNvbW1vbi5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcywgeG1saW5wdXRzdHJlYW0uY2xhc3NlcyIgdW5sZXNzPSJqYXhic2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMvamF4YnNjaGVtYSIvPgotICAgICAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvc3JjL2pheGJzY2hlbWEiLz4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSIke2Jvb3RzdHJhcF9zY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9ImJvb3RzdHJhcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7cmVwYWNrYWdlX2FyZ30gLW5hbWUgSkFYQkNPTkZJRyAtY3AgJHtib290c3RyYXAuY29tcGlsZS5wYXRofSAtc3Jjb25seSAtZCBidWlsZC9jbGFzc2VzL2pheGJzY2hlbWEgLXNyYyBidWlsZC9zcmMvamF4YnNjaGVtYSBzcmMvamF4Yi9zY2hlbWEiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXhiLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIGpheGJzY2hlbWEuY2xhc3NlcywgeG1scHVibGljLmNsYXNzZXMsIHR5cGVpbXBsLmNsYXNzZXMsIGNvbW1vbi5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcywgeG1saW5wdXRzdHJlYW0uY2xhc3NlcyI+Ci0gICAgICAgIDxta2RpciBkaXI9ImJ1aWxkL3NyYy9qYXhiIi8+Ci0gICAgICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvamF4YiIvPgotCi0gICAgICAgIDxqYXZhYyBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL2pheGIiIGNsYXNzcGF0aHJlZj0iamF4Yi5jb21waWxlLnBhdGgiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPHNyYyBwYXRoPSJzcmMvamF4YiIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSJidWlsZC9zcmMvamF4YnNjaGVtYSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gIDwhLS0gYnVpbGQgWE1MSW5wdXRTdHJlYW0gaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbGlucHV0c3RyZWFtLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1saW5wdXRzdHJlYW0iCi0gICAgICAgIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iCi0gICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHhtbHB1YmxpYyB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbHB1YmxpYy5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxwdWJsaWMiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhtbHB1YmxpYy5qYXIiIGRlcGVuZHM9ImRpcnMsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCB4bWxzY2hlbWEuY2xhc3NlcywgeHNkc2NoZW1hLmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiICBpbmRleD0idHJ1ZSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIi8+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gdHlwZXN0b3JlIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0idHlwZXN0b3JlLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhtbHB1YmxpYy5jbGFzc2VzLCBjb21tb24uY2xhc3NlcywgeG1saW5wdXRzdHJlYW0uY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlc3RvcmUiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMvdHlwZXN0b3JlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvY29tbW9uIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotCi0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gY29tbW9uIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21tb24uY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmphciwgeG1saW5wdXRzdHJlYW0uY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMvY29tbW9uIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1scHVibGljLmphciIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIHR5cGVpbXBsIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0idHlwZWltcGwuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgcmVwYWNrYWdlLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcywgeHNkc2NoZW1hLmNsYXNzZXMsIGNvbmZpZ3NjaGVtYS5jbGFzc2VzLCB0b29sc2NoZW1hLmNsYXNzZXMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiLz4KLSAgICA8amF2YWMgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy90eXBlc3RvcmUiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0KLSAgICAgICAgPHNyYyBwYXRoPSJzcmMvdHlwZWltcGwiLz4KLSAgICAgICAgPHNyYyBwYXRoPSJidWlsZC9zcmMveG1sc2NoZW1hIi8+Ci0gICAgICAgIDxzcmMgcGF0aD0iYnVpbGQvc3JjL3hzZHNjaGVtYSIvPgotICAgICAgICA8c3JjIHBhdGg9ImJ1aWxkL3NyYy9jb25maWdzY2hlbWEiLz4KLSAgICAgICAgPHNyYyBwYXRoPSJidWlsZC9zcmMvdG9vbHNjaGVtYSIvPgotICAgICAgICA8c3JjIHBhdGg9InNyYy94bWxjb25maWciLz4KLSAgICA8L2phdmFjPgotCi0gICAgPCEtLSBOZWVkIHByb3BlcnRpZXMgZmlsZXMgZm9yIHJlZ2V4IC0tPgotICAgIDxjb3B5Ci0gICAgICB0b2Rpcj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90eXBlaW1wbCI+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB4bWxjb21wIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbGNvbXAuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgcmVwYWNrYWdlLmNsYXNzZXMsIHR5cGVpbXBsLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxjb21wIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbGNvbXAiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvY29tbW9uIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9yZXBhY2thZ2UiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3R5cGVpbXBsIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxjb25maWciLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdG9vbHNjaGVtYSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmFjPgotCi0gIDwvdGFyZ2V0PgotCi0gIDwhLS0geG1sc3RvcmUgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4bWxzdG9yZS5jbGFzc2VzIgotICAgICAgICBkZXBlbmRzPSJkaXJzLCBjb21tb24uY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbHN0b3JlIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbHN0b3JlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbHN0b3JlIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGggaWQ9InhtbHN0b3JlLmNvbXBpbGUucGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIGJvb3RzdHJhcCBzY2hlbWEgdGFyZ2V0IHN1cHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotICA8IS0tIHhzZHNjaGVtYSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLSBOb3RlIHRoYXQgdGhpcyBpcyBhIHRyaWNreSB0YXJnZXQgYmVjYXVzZSBpdCBib290c3RyYXBzIHhiZWFucyBvbiBpdHNlbGYuIC0tPgotICA8IS0tIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byByZWx5IG9uIHRoZSBvbGR4YmVhbnMuamFyIGNoZWNrZWQgaW50byBleHRlcm5hbC9saWIgLS0+Ci0KLSAgPHBhdGggaWQ9ImJvb3RzdHJhcC5ydW4ucGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9vbGR4YmVhbi5qYXIiLz4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJib290c3RyYXAuY29tcGlsZS5wYXRoIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIi8+Ci0gIDwvcGF0aD4KLQotICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCIgcmVmaWQ9ImJvb3RzdHJhcC5jb21waWxlLnBhdGgiLz4KLQotICA8cGF0aCBpZD0ieHNkc2NoZW1hLmNvbXBpbGUucGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHNjaGVtYSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgPC9wYXRoPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJ4c2RzY2hlbWEuY29tcGlsZS5wYXRoIiByZWZpZD0ieHNkc2NoZW1hLmNvbXBpbGUucGF0aCIvPgotCi0gIDx0YXJnZXQgbmFtZT0ieHNkc2NoZW1hLmNoZWNrIj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ4c2RzY2hlbWEubm90UmVxdWlyZWQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9InhzZHNjaGVtYS5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEvc2NoZW1hL3N5c3RlbS9zWE1MU0NIRU1BL2luZGV4LnhzYiI+Ci0gICAgICAgICAgPHNyY2ZpbGVzIGRpcj0ic3JjL3hzZHNjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ieHNkc2NoZW1hLmNsYXNzZXMiIGRlcGVuZHM9InhzZHNjaGVtYS5jaGVjaywgeG1sc2NoZW1hLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCBvbGR4YmVhbi5qYXIiIHVubGVzcz0ieHNkc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEiLz4KLSAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvc3JjL3hzZHNjaGVtYSIvPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtib290c3RyYXBfc2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJib290c3RyYXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSIke3JlcGFja2FnZV9hcmd9IC1uYW1lIHNYTUxTQ0hFTUEgLWNwICR7eHNkc2NoZW1hLmNvbXBpbGUucGF0aH0gLXNyY29ubHkgLWQgYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEgLXNyYyBidWlsZC9zcmMveHNkc2NoZW1hIHNyYy94c2RzY2hlbWEvc2NoZW1hIi8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8IS0tIHhtbHNjaGVtYSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cmlja3kgdGFyZ2V0IGJlY2F1c2UgaXQgYm9vdHN0cmFwcyB4YmVhbnMgb24gaXRzZWxmLiAtLT4KLSAgPCEtLSBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gcmVseSBvbiB0aGUgb2xkeGJlYW5zLmphciBjaGVja2VkIGludG8gZXh0ZXJuYWwvbGliIC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieG1sc2NoZW1hLmNoZWNrIj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ4bWxzY2hlbWEubm90UmVxdWlyZWQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9InhtbHNjaGVtYS5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvY2xhc3Nlcy94bWxzY2hlbWEvc2NoZW1hL3N5c3RlbS9zWE1MTEFORy9pbmRleC54c2IiPgotICAgICAgICAgIDxzcmNmaWxlcyBkaXI9InNyYy94bWxzY2hlbWEiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhtbHNjaGVtYS5jbGFzc2VzIiBkZXBlbmRzPSJ4bWxzY2hlbWEuY2hlY2ssIHhtbHB1YmxpYy5jbGFzc2VzLCBvbGR4YmVhbi5qYXIiIHVubGVzcz0ieG1sc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzY2hlbWEiLz4KLSAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvc3JjL3htbHNjaGVtYSIvPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtib290c3RyYXBfc2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJib290c3RyYXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSIke3JlcGFja2FnZV9hcmd9IC1uYW1lIHNYTUxMQU5HIC1kIGJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIC1zcmMgYnVpbGQvc3JjL3htbHNjaGVtYSAtc3Jjb25seSBzcmMveG1sc2NoZW1hL3NjaGVtYSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB4bWxjb25maWcgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieG1sY29uZmlnLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhtbHB1YmxpYy5qYXIsIGNvbmZpZ3NjaGVtYS5jbGFzc2VzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbmZpZyIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxjb25maWciIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIGNvbmZpZ3NjaGVtYSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cmlja3kgdGFyZ2V0IGJlY2F1c2UgaXQgYm9vdHN0cmFwcyB4YmVhbnMgb24gaXRzZWxmLiAtLT4KLSAgPCEtLSBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gcmVseSBvbiB0aGUgb2xkeGJlYW5zLmphciBjaGVja2VkIGludG8gZXh0ZXJuYWwvbGliIC0tPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXAuY29tcGlsZS5wYXRoIiByZWZpZD0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCIvPgotCi0gIDx0YXJnZXQgbmFtZT0iY29uZmlnc2NoZW1hLmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImNvbmZpZ3NjaGVtYS5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEvc2NoZW1hL3N5c3RlbS9zWE1MQ09ORklHL2luZGV4LnhzYiI+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJzcmMvY29uZmlnc2NoZW1hIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbmZpZ3NjaGVtYS5jbGFzc2VzIiBkZXBlbmRzPSJjb25maWdzY2hlbWEuY2hlY2ssIHhtbHB1YmxpYy5jbGFzc2VzLCBvbGR4YmVhbi5qYXIiIHVubGVzcz0iY29uZmlnc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MQ09ORklHIC1zcmNvbmx5IC1zcmMgYnVpbGQvc3JjL2NvbmZpZ3NjaGVtYSAtZCBidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSBzcmMvY29uZmlnc2NoZW1hL3NjaGVtYSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0b29sc2NoZW1hIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLSBOb3RlIHRoYXQgdGhpcyBpcyBhIHRyaWNreSB0YXJnZXQgYmVjYXVzZSBpdCBib290c3RyYXBzIHhiZWFucyBvbiBpdHNlbGYuIC0tPgotICA8IS0tIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byByZWx5IG9uIHRoZSBvbGR4YmVhbnMuamFyIGNoZWNrZWQgaW50byBleHRlcm5hbC9saWIgLS0+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJvb3RzdHJhcC5jb21waWxlLnBhdGgiIHJlZmlkPSJib290c3RyYXAuY29tcGlsZS5wYXRoIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0b29sc2NoZW1hLmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9InRvb2xzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMvdG9vbHNjaGVtYS9zY2hlbWEvc3lzdGVtL3NYTUxUT09MUy9pbmRleC54c2IiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0ic3JjL3Rvb2xzY2hlbWEiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idG9vbHNjaGVtYS5jbGFzc2VzIiBkZXBlbmRzPSJ0b29sc2NoZW1hLmNoZWNrLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9InRvb2xzY2hlbWEubm90UmVxdWlyZWQiPgotICAgIDxkZWxldGUgZGlyPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9zcmMvdG9vbHNjaGVtYSIvPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtib290c3RyYXBfc2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJib290c3RyYXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSIke3JlcGFja2FnZV9hcmd9IC1uYW1lIHNYTUxUT09MUyAtc3Jjb25seSAtc3JjIGJ1aWxkL3NyYy90b29sc2NoZW1hIC1kIGJ1aWxkL2NsYXNzZXMvdG9vbHNjaGVtYSBzcmMvdG9vbHNjaGVtYSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gPT09PT0gICBSZXBhY2thZ2luZyAgPT09PT09IC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRhcmdldCBuYW1lPSJlZGl0X2J1aWxkX3NjcmlwdCI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImVkaXRpbmcgcmVwYWNrYWdlIGJ1aWxkIGZpbGU6ICR7dG9rZW59IC0tPiR7cmVwbGFjZW1lbnR9Ii8+Ci0KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJyZXBhY2thZ2UuRWRpdEJ1aWxkU2NyaXB0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkL3JlcGFja2FnZS9idWlsZC54bWwiLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7dG9rZW59Ii8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke3JlcGxhY2VtZW50fSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHByb3BlcnR5IG5hbWU9InJlcGFja2FnZV9hcmciIHZhbHVlPSIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hX2NvbXBpbGVyIiB2YWx1ZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwX3NjaGVtYV9jb21waWxlciIgdmFsdWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIi8+Ci0KLSAgICA8IS0tCi0gICAgICAgIFBhcmFtcyB0byByZXBhY2thZ2UgYXJlOgotCi0gICAgICAgICAgICByZXBhY2thZ2Vfc3BlYzoKLQotICAgICAgICAgICAgICAgIE9mIHRoZSBmb3JtIGZyb21fcGtnXzE6dG9fcGtnXzE7ZnJvbV9wa2dfMjp0b19wa2dfMiB3aGljaCBzcGVjaWZpZXMgd2hpY2ggcGFja2FnZXMKLSAgICAgICAgICAgICAgICBhcmUgdG8gYmUgY29udmVydGVkIHdoaWNoIHdoaWNoIHdoaWNoIG90aGVyIHBhY2thZ2VzLiAgUmlnaHQgbm93LCB0aGVyZSBhcmUgdHdvLgotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMgYW5kIGFwYWNoZS54bWxiZWFucy5pbXBsLCB0aGUgcHVibGljIGFuZCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHBhY2thZ2VzLgotCi0gICAgICAgICAgICBuZXdfc2NoZW1hX2NvbXBpbGVyCi0KLSAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBuZXcgdGhlIG5ldyBzY2hlbWEgY29tcGlsZXIuICBXaWxsIHJlcGxhY2UKLSAgICAgICAgICAgICAgICAke3NjaGVtYV9jb21waWxlcn0gZHVyaW5nIHRoZSBib290c3RyYXAgcHJvY2Vzcy4KLSAgICAtLT4KLQotICAgIDx0YXJnZXQgbmFtZT0icmVwYWNrYWdlIiBkZXBlbmRzPSJyZXBhY2thZ2UuY2xhc3NlcyI+Ci0KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iUmUtcGFja2FnaW5nIFhNbEJlYW5zIi8+Ci0KLSAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICBuYW1lPSJuZXdfcmVwYWNrYWdlX2FyZyIKLSAgICAgICAgICAgIHZhbHVlPSItcmVwYWNrYWdlICR7cmVwYWNrYWdlX3NwZWN9Ii8+Ci0KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJyZXBhY2thZ2UuUmVwYWNrYWdlIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9yZXBhY2thZ2UiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPGFyZyBsaW5lPSIke25ld19yZXBhY2thZ2VfYXJnfSIvPgotICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJlZGl0X2J1aWxkX3NjcmlwdCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idG9rZW4iICAgICAgIHZhbHVlPSJyZXBhY2thZ2VfYXJnIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVwbGFjZW1lbnQiIHZhbHVlPSIke25ld19yZXBhY2thZ2VfYXJnfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJlZGl0X2J1aWxkX3NjcmlwdCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idG9rZW4iICAgICAgIHZhbHVlPSJzY2hlbWFfY29tcGlsZXIiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXBsYWNlbWVudCIgdmFsdWU9IiR7bmV3X3NjaGVtYV9jb21waWxlcn0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotCi0gICAgICAgIDxhbnQgZGlyPSJidWlsZC9yZXBhY2thZ2UiIHRhcmdldD0ieGJlYW4iIGluaGVyaXRBbGw9ImZhbHNlIi8+Ci0KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJlZGl0X2J1aWxkX3NjcmlwdCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idG9rZW4iICAgICAgIHZhbHVlPSJib290c3RyYXBfc2NoZW1hX2NvbXBpbGVyIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVwbGFjZW1lbnQiIHZhbHVlPSIke25ld19zY2hlbWFfY29tcGlsZXJ9Ii8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLQotICAgICAgICA8YW50IGRpcj0iYnVpbGQvcmVwYWNrYWdlIiB0YXJnZXQ9ImJvb3RzdHJhcCIgaW5oZXJpdEFsbD0iZmFsc2UiLz4KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJyZXBhY2thZ2UuY2xhc3NlcyI+Ci0gICAgICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgICAgIDxqYXZhYyBzcmNkaXI9InNyYy9yZXBhY2thZ2UiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvYW50WG1sYmVhbi5odG1sIGIvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTRjZjUuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD48IS0tIEluc3RhbmNlQmVnaW4gdGVtcGxhdGU9ImZpbGU6Ly8vQ3wvcDQvbWFpbi9oZWxwL2lkZS9lbi9UZW1wbGF0ZXMvQ29tbWFuZC5kd3QiIGNvZGVPdXRzaWRlSFRNTElzTG9ja2VkPSJmYWxzZSIgLS0+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT54bWxiZWFuIEFudCBUYXNrPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotPG1ldGEgbmFtZT0iY29tcG9uZW50IiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBjb21wb25lbnQgbWV0YXRhZywgcGxlYXNlIGxpc3Qga2V5d29yZHMgdGhhdCB3aWxsIGhlbHAgYSB1c2VyIHNlYXJjaCBmb3IgdGhpcyB0b3BpYy4gLS0+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Ci08ZGl2IGlkPXRvcGljdGl0bGU+Ci0gIDxIMSBjbGFzcz1UaXRsZT54bWxiZWFuIEFudCBUYXNrPC9oMT4KLTwvZGl2PgotPGRpdiBpZD10b3BpY3RleHQ+Ci0gIDxwPkNvbXBpbGVzIGEgc2V0IG9mIFhTRCBhbmQvb3IgV1NETCBmaWxlcyBpbnRvIFhNTEJlYW5zLiBUaGlzIGlzIHVzZWZ1bCBmb3IKLSAgICBidWlsZGluZyBhbiBYTUxCZWFuIEpBUiBmcm9tIFhTRCBhbmQgV1NETCBmaWxlcy4gSWYgZGVzaXJlZCwgdGhlIHRhc2sgY2FuCi0gICAgYWxzbyBnZW5lcmF0ZSB0aGUgc291cmNlIGNvZGUgdGhhdCBtYWtlcyB1cCB0aGUgWE1MQmVhbiB0eXBlIHN5c3RlbSBzcGVjaWZpZWQKLSAgICBieSB0aGUgc2NoZW1hIGZpbGVzLjwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gYW4gZXh0ZXJuYWwgbGlicmFyeSBub3QKLSAgICBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbiBjYWxsZWQgeGJlYW4uamFyLiAmbmJzcDtJdCBjYW4gYmUgZm91bmQgaW4KLSAgICB0aGUgWE1MQmVhbnMgZGV2ZWxvcGVyIGtpdCBhdCA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvIgotICAgICAgICB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzwvYT4uCi0gICAgVGhlIGJ1aWxkIHNjcmlwdCB3aWxsIG5lZWQgdG8gaW5jbHVkZSBhIHRhc2tkZWYgZm9yIHhtbGJlYW4sIHdoaWNoIGNvdWxkIGxvb2sKLSAgICBsaWtlIHRoaXM6PC9wPgotPC9kaXY+Ci08YmxvY2txdW90ZT4KLSAgPGRpdiBjbGFzcz0ibm90ZXBhcmEiPgotICAgIDxwcmUgY2xhc3M9Im5vdGVwYXJhIj4mbHQ7dGFza2RlZiBuYW1lPSJ4bWxiZWFuIiBjbGFzc25hbWU9ImNvbS5iZWEueGJlYW4udG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIi8mZ3Q7PC9wcmU+Ci0gIDwvZGl2PgotPC9ibG9ja3F1b3RlPgotPGRpdj4KLTxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC4gVGhpcwotICAgIGNhbiBiZSBkb25lIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlc2ZpbGU8L3NwYW4+LAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlc2ZpbGU8L3NwYW4+Ci0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kZWZhdWx0ZXhjbHVkZXM8L3NwYW4+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlczwvc3Bhbj4KLSAgICBvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW5jbHVkZXNmaWxlPC9zcGFuPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlCi0gICAgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlPC9zcGFuPgotICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlc2ZpbGU8L3NwYW4+IGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeQotICAgIHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKLSAgICBmaW5hbGx5IHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kZWZhdWx0ZXhjbHVkZXM8L3NwYW4+IGF0dHJpYnV0ZSwKLSAgICB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZQotICAgIHNlY3Rpb24gb24gPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyIgdGFyZ2V0PSJfYmxhbmsiPmRpcmVjdG9yeQotICAgIGJhc2VkIHRhc2tzPC9hPiBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC8iIHRhcmdldD0iX2JsYW5rIj5BbnQKLSAgICBkb2N1bWVudGF0aW9uPC9hPiwgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93Ci0gICAgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgotICA8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5GaWxlU2V0PC9hPgotICAgIGFuZCBzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8Y29kZT5kaXI8L2NvZGU+Ci0gICAgYmVjb21lcyA8Y29kZT5iYXNlZGlyPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sCi0gICAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Ci0gIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zY2hlbWE8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEgZmlsZQotICAgICAgICAgIG9yIGEgZGlyZWN0b3J5IG9mIGZpbGVzLiAmbmJzcDtOb3QgYSBwYXRoIHJlZmVyZW5jZS4gJm5ic3A7SWYgbXVsdGlwbGUKLSAgICAgICAgICBzY2hlbWEgZmlsZXMgbmVlZCB0byBiZSBidWlsdCB0b2dldGhlciwgdXNlIGEgbmVzdGVkIGZpbGVzZXQgaW5zdGVhZAotICAgICAgICAgIG9mIHNldHRpbmcgc2NoZW1hLjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCB1bmxlc3MgYSBmaWxlc2V0IGVsZW1lbnQgaXMgbmVzdGVkLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGphciBmaWxlIGNyZWF0ZWQuJm5ic3A7IEZvciBpbnN0YW5jZSwKLSAgICAgICAgICAibXlYTUxCZWFuLmphciIgd2lsbCBvdXRwdXQgdGhlIHJlc3VsdHMgb2YgdGhpcyB0YXNrIGludG8gYSBqYXIgd2l0aAotICAgICAgICAgIHRoZSBzYW1lIG5hbWUuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAieG1sdHlwZXMuamFyIi48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kb3dubG9hZDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRvIHRydWUgdG8gcGVybWl0IHRoZSBjb21waWxlciB0byBkb3dubG9hZCBVUkxzIGZvcgotICAgICAgICAgIGltcG9ydHMgYW5kIGluY2x1ZGVzLiZuYnNwOyBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyBhbmQKLSAgICAgICAgICBpbmNsdWRlcyBtdXN0IGJlIGNvcGllZCBsb2NhbGx5Ljxicj4gPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGFudCB0YXJnZXQgd2lsbCBjb250aW51ZQotICAgICAgICAgIGlmIHRoZSBYTUxCZWFuIGNyZWF0aW9uIGVuY291bnRlcnMgYSBidWlsZCBlcnJvci48YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIHRoZSBhbW91bnQgb2YgYnVpbGQgbWVzc2FnZSBvdXRwdXQuPGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHRydWUuPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZXN5c3RlbW5hbWU8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCB0aGUgVHlwZVN5c3RlbUhvbGRlciBjbGFzcwotICAgICAgICAgIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4uJm5ic3A7IE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgdW5zcGVjaWZpZWQuCi0gICAgICAgICAgTm9uZSBvZiB0aGUgWE1MQmVhbnMgYXJlIGdlbmVyYXRlZCBpbiB0aGlzIHBhY2thZ2UuIFVzZSAueHNkY29uZmlnIGZpbGVzCi0gICAgICAgICAgdG8gbW9kaWZ5IFhNTEJlYW4gcGFja2FnZSBvciBjbGFzcyBuYW1lcy48YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzZ2VuZGlyPGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIGxvY2F0aW9uIHRvIGdlbmVyYXRlIENMQVNTIGZpbGVzIGludG8uPGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPiA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNvbmx5PGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNnZW5kaXI8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgSkFWQSBmaWxlcyBpbnRvLjxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBpZiBzY2hlbWFzIGluIHRoZSBmaWxlc2V0IGltcG9ydAotICAgICAgICAgIGRlZmluaXRpb25zIHRoYXQgYXJlIHN1cHBsaWVkIGJ5IG90aGVyIGNvbXBpbGVkIFhNTEJlYW5zIEpBUiBmaWxlcywKLSAgICAgICAgICBvciBpZiBKQVZBIGZpbGVzIGFyZSBpbiB0aGUgc2NoZW1hIGZpbGVzZXQuIEFsc28gc3VwcG9ydHMgYSBuZXN0ZWQgY2xhc3NwYXRoLjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFkZHMgYSBjbGFzc3BhdGgsIGdpdmVuIGFzIDxhCi0gaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI3JlZmVyZW5jZXMiIHRhcmdldD0iX2JsYW5rIj5yZWZlcmVuY2U8L2E+Ci0gICAgICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQKLSAgICAgICAgICBtdXN0IGJlIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8KLSAgICAgICAgICBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdAotICAgICAgICAgIG11c3QgYmUgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4KLSAgICAgICAgICBvbWl0dGVkLjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0bwotICAgICAgICAgIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yCi0gICAgICAgICAgbm90ICgieWVzIi8ibm8iKS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggZGVidWcKLSAgICAgICAgICBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi4gSWYgc2V0IHRvIDxjb2RlPm9mZjwvY29kZT4sCi0gICAgICAgICAgPGNvZGU+LWc6bm9uZTwvY29kZT4gd2lsbCBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgY29tcGlsZXJzCi0gICAgICAgICAgdGhhdCBzdXBwb3J0IGl0IChmb3Igb3RoZXIgY29tcGlsZXJzLCBubyBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2lsbAotICAgICAgICAgIGJlIHVzZWQpLiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4KLSAgICAgICAgICBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50LjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1Z2xldmVsPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxjb2RlPi1nPC9jb2RlPiBjb21tYW5kLWxpbmUKLSAgICAgICAgICBzd2l0Y2guIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IDxjb2RlPm1vZGVybjwvY29kZT4KLSAgICAgICAgICBhbmQgPGNvZGU+Y2xhc3NpYyh2ZXIgJmd0Oz0gMS4yKTwvY29kZT4uIExlZ2FsIHZhbHVlcyBhcmUgPGNvZGU+bm9uZTwvY29kZT4KLSAgICAgICAgICBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IDxjb2RlPmxpbmVzPC9jb2RlPiwKLSAgICAgICAgICA8Y29kZT52YXJzPC9jb2RlPiwgYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4uIElmIDxjb2RlPmRlYnVnbGV2ZWw8L2NvZGU+Ci0gICAgICAgICAgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGJlIGFwcGVuZGVkIHRvIDxjb2RlPi1nPC9jb2RlPi4KLSAgICAgICAgICBJZiA8Y29kZT5kZWJ1ZzwvY29kZT4gaXMgbm90IHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+b3B0aW1pemU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb247Ci0gICAgICAgICAgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUFudFJ1bnRpbWU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllcyBpbiB0aGUKLSAgICAgICAgICBjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lIGxpYnJhcmllcyBmcm9tCi0gICAgICAgICAgdGhlIGV4ZWN1dGluZyBWTSBpbiB0aGUgY2xhc3NwYXRoOyBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZXhlY3V0ZSA8Y29kZT5qYXZhYzwvY29kZT4gdXNpbmcgdGhlIEpESyBjb21waWxlcgotICAgICAgICAgIGV4dGVybmFsbHk7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tcGxldGUgcGF0aCB0byB0aGUgPGNvZGU+amF2YWM8L2NvZGU+IGV4ZWN1dGFibGUgdG8KLSAgICAgICAgICB1c2UgaW4gY2FzZSBvZiA8Y29kZT5mb3JrPSZxdW90O3llcyZxdW90OzwvY29kZT4uIERlZmF1bHRzIHRvIHRoZSBjb21waWxlcgotICAgICAgICAgIG9mIHRoZSBKYXZhIHZlcnNpb24gdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZyBBbnQuIElnbm9yZWQgaWYgPGNvZGU+Zm9yaz0mcXVvdDtubyZxdW90OzwvY29kZT48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWVtb3J5SW5pdGlhbFNpemU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCi0gICAgICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKLSAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LAotICAgICAgICAgIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yIDxjb2RlPjgwbTwvY29kZT4pPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeU1heGltdW1TaXplPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNLAotICAgICAgICAgIGlmIDxjb2RlPmphdmFjPC9jb2RlPiBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuIERlZmF1bHRzCi0gICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLiAoRXhhbXBsZXM6IDxjb2RlPjgzODg2MDgwPC9jb2RlPiwKLSAgICAgICAgICA8Y29kZT44MTkyMGs8L2NvZGU+LCBvciA8Y29kZT44MG08L2NvZGU+KTwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gSWYgdGhpcyBhdHRyaWJ1dGUKLSAgICAgICAgICBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSwgaWYKLSAgICAgICAgICBzZXQsIHdpbGwgYmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0KLSAgICAgICAgICB3aWxsIGJlIHVzZWQuCi0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICA8L3Rib2R5PgotICA8L3RhYmxlPgotICA8aDM+RXhhbXBsZTwvaDM+Ci08L2Rpdj4KLTxkaXYgaWQ9dG9waWN0ZXh0PiBCZSBzdXJlIHRvIGRlZmluZSB0aGUgdGFzayBpbiB5b3VyIHNjcmlwdCwgbGlrZSB0aGlzOjwvZGl2PgotPGRpdj4KLSAgPHByZT4mbHQ7dGFza2RlZiBuYW1lPSJ4bWxiZWFuIiBjbGFzc25hbWU9ImNvbS5iZWEueGJlYW4udG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIjwvcHJlPgotICA8cD5UaGUgZm9sbG93aW5nIGJ1aWxkcyBhbGwgdGhlIHNjaGVtYXMgaW4gdGhlIHNjaGVtYXMgZGlyZWN0b3J5IGFuZCBjcmVhdGVzCi0gICAgYSBqYXIgY2FsbGVkICZxdW90O1NjaGVtYXMuamFyJnF1b3Q7LjwvcD4KLTwvZGl2PgotPGRpdj4KLSAgPHByZT4KLSZsdDt4bWxiZWFuIHNjaGVtYT0ic2NoZW1hcyIgZGVzdGZpbGU9IlNjaGVtYXMuamFyIi8mZ3Q7PC9wcmU+Ci0gIFRoZSBmb2xsb3dpbmcgY29tcGlsZXMgdGhlIHNjaGVtYSAmcXVvdDtvdXJTY2hlbWEueHNkJnF1b3Q7IGludG8gdGhlIGRlZmF1bHQKLSAgamFyICZxdW90O3htbHR5cGVzLmphciZxdW90Oy4gJm5ic3A7SWYgJm5ic3A7YW55IGltcG9ydHMgYW5kIGluY2x1ZGVzIGFyZSBkZWZpbmVkCi0gIGJ5IHJlbW90ZSBVUkxzLCB0aGV5IGFyZSBkb3dubG9hZGVkIGR1cmluZyB0aGUgYnVpbGQuCi0gIDxkaXY+Ci0gICAgPHByZT4mbHQ7eG1sYmVhbiBzY2hlbWE9InNjaGVtYXMvb3VyU2NoZW1hLnhzZCIgZG93bmxvYWQ9InRydWUiLyZndDs8L3ByZT4KLSAgPC9kaXY+Ci0gIDxkaXY+Ci0gICAgPGg0PlVzaW5nIGEgZmlsZXNldDwvaDQ+Ci0gIDwvZGl2PgotICA8ZGl2PgotICAgIDxwcmU+Jmx0O3htbGJlYW4gY2xhc3NnZW5kaXI9IiR7YnVpbGQuZGlyfSIgY2xhc3NwYXRoPSIke2NsYXNzLnBhdGh9Ijxicj4gICAgICBmYWlsb25lcnJvcj0idHJ1ZSImZ3Q7PGJyPiAgJmx0O2ZpbGVzZXQgYmFzZWRpcj0ic3JjIiBleGNsdWRlcz0iKiovKi54c2QiLyZndDs8YnI+ICAmbHQ7ZmlsZXNldCBiYXNlZGlyPSJzY2hlbWFzIiBpbmNsdWRlcz0iKiovKi4qIi8mZ3Q7PGJyPiZsdDsveG1sYmVhbiZndDs8L3ByZT4KLSAgPC9kaXY+Ci0gIDxkaXY+IEdhdGhlcnMgYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeSBleGNlcHQgWFNEIGZpbGVzLCBhbG9uZyB3aXRoCi0gICAgZXZlcnkgZmlsZSBpbiB0aGUgc2NoZW1hcyBkaXJlY3RvcnksIGFuZCBjb21waWxlcyB0aGVtLiBUaGUgZmlsZXNldCBjYW4gaW5jbHVkZQotICAgIHNjaGVtYSBmaWxlcyB0aGF0IHJlZmVyIHRvIHByZXZpb3VzbHkgY29tcGlsZWQgc2NoZW1hIGNvbXBvbmVudHMuJm5ic3A7IFRoZQotICAgIGZpbGVzZXQgY2FuIGFsc28gY29udGFpbiBKQVZBIGZpbGVzLiZuYnNwOyBUaGUgY2xhc3NwYXRoIHBhcmFtZXRlciBkZWZpbmVzCi0gICAgdGhlIGNsYXNzcGF0aCBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBjb21waWxlZCBzY2hlbWEgYW5kIGphdmEgcmVmZXJlbmNlcy48YnI+Ci0gICAgPGJyPgotICAgIFRoZSBidWlsdCBjbGFzc2VzIHdpbGwgZ28gaW50byAke2J1aWxkLmRpcn0uPC9kaXY+Ci0gIDxkaXY+Ci0gICAgPHAgY2xhc3M9cmVsYXRlZHRvcGljcz5SZWxhdGVkIFRvcGljczwvcD4KLSAgICA8cD5Ob25lLjwvcD4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTwvYm9keT4KLTwhLS0gSW5zdGFuY2VFbmQgLS0+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM5OGZkLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KLQotPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJ5b3VyIG5hbWUiPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiI+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyI+Ci08bWV0YSBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiIGNvbnRlbnQ9IjEwLzI1LzAyIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPiAKLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPiAKLTxoMT4gR2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2gxPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4gCi0gIDxwPlhNTEJlYW5zIHByb3ZpZGVzIGludHVpdGl2ZSB3YXlzIHRvIGhhbmRsZSBYTUwgdGhhdCBtYWtlIGl0IGVhc2llciBmb3IgeW91IAotICAgIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSBYTUwgZGF0YSBhbmQgZG9jdW1lbnRzIGluIEphdmEuIDwvcD4KLSAgPHA+Q2hhcmFjdGVyaXN0aWNzIG9mIFhNTEJlYW5zIGFwcHJvYWNoIHRvIFhNTDo8L3A+Ci08L2Rpdj4KLTx1bD4KLSAgPGxpPiAKLSAgICA8ZGl2Pkl0IHByb3ZpZGVzIGEgZmFtaWxpYXIgSmF2YSBvYmplY3QtYmFzZWQgdmlldyBvZiBYTUwgZGF0YSB3aXRob3V0IGxvc2luZyAKLSAgICAgIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwsIG5hdGl2ZSBYTUwgc3RydWN0dXJlLjwvZGl2PgotICA8L2xpPgotICA8bGk+IAotICAgIDxkaXY+VGhlIFhNTCdzIGludGVncml0eSBhcyBhIGRvY3VtZW50IGlzIG5vdCBsb3N0IHdpdGggWE1MQmVhbnMuIFhNTC1vcmllbnRlZCAKLSAgICAgIEFQSXMgY29tbW9ubHkgdGFrZSB0aGUgWE1MIGFwYXJ0IGluIG9yZGVyIHRvIGJpbmQgdG8gaXRzIHBhcnRzLiBXaXRoIFhNTEJlYW5zLCAKLSAgICAgIHRoZSBlbnRpcmUgWE1MIGluc3RhbmNlIGRvY3VtZW50IGlzIGhhbmRsZWQgYXMgYSB3aG9sZS4gVGhlIFhNTCBkYXRhIGlzIAotICAgICAgc3RvcmVkIGluIG1lbW9yeSBhcyBYTUwuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZG9jdW1lbnQgb3JkZXIgaXMgcHJlc2VydmVkIAotICAgICAgYXMgd2VsbCBhcyB0aGUgb3JpZ2luYWwgZWxlbWVudCBjb250ZW50IHdpdGggd2hpdGVzcGFjZS48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPiAKLSAgICA8ZGl2PldpdGggdHlwZXMgZ2VuZXJhdGVkIGZyb20gc2NoZW1hLCBhY2Nlc3MgdG8gWE1MIGluc3RhbmNlcyBpcyB0aHJvdWdoIAotICAgICAgSmF2YUJlYW4tbGlrZSBhY2Nlc3NvcnMsIHdpdGggZ2V0IGFuZCBzZXQgbWV0aG9kcy48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPiAKLSAgICA8ZGl2Pkl0IGlzIGRlc2lnbmVkIHdpdGggWE1MIHNjaGVtYSBpbiBtaW5kIGZyb20gdGhlIGJlZ2lubmluZyAmIzgyMTI7IFhNTEJlYW5zIAotICAgICAgc3VwcG9ydHMgYWxsIFhNTCBzY2hlbWEgZGVmaW5pdGlvbnMuPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT5BY2Nlc3MgdG8gWE1MIGlzIGZhc3QuPC9saT4KLTwvdWw+Ci08ZGl2PiAKLSAgPHA+VGhlIHN0YXJ0aW5nIHBvaW50IGZvciBYTUxCZWFucyBpcyBYTUwgc2NoZW1hLiBBIHNjaGVtYSAoY29udGFpbmVkIGluIGFuIAotICAgIFhTRCBmaWxlKSBpcyBhbiBYTUwgZG9jdW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJ1bGVzIHRvIHdoaWNoIG90aGVyIFhNTCAKLSAgICBkb2N1bWVudHMgbXVzdCBjb25mb3JtLiBUaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGEgcmljaCBkYXRhIAotICAgIG1vZGVsIHRoYXQgYWxsb3dzIHlvdSB0byBleHByZXNzIHNvcGhpc3RpY2F0ZWQgc3RydWN0dXJlIGFuZCBjb25zdHJhaW50cyBvbiAKLSAgICB5b3VyIGRhdGEuIEZvciBleGFtcGxlLCBhbiBYTUwgc2NoZW1hIGNhbiBlbmZvcmNlIGNvbnRyb2wgb3ZlciBob3cgZGF0YSBpcyAKLSAgICBvcmRlcmVkIGluIGEgZG9jdW1lbnQsIG9yIGNvbnN0cmFpbnRzIG9uIHBhcnRpY3VsYXIgdmFsdWVzIChmb3IgZXhhbXBsZSwgYSAKLSAgICBiaXJ0aCBkYXRlIHRoYXQgbXVzdCBiZSBsYXRlciB0aGFuIDE5MDApLiBVbmZvcnR1bmF0ZWx5LCB0aGUgYWJpbGl0eSB0byBlbmZvcmNlIAotICAgIHJ1bGVzIGxpa2UgdGhpcyBpcyB0eXBpY2FsbHkgbm90IGF2YWlsYWJsZSBpbiBKYXZhIHdpdGhvdXQgd3JpdGluZyBjdXN0b20gCi0gICAgY29kZS4gWE1MQmVhbnMgaG9ub3JzIHNjaGVtYSBjb25zdHJhaW50cy48L3A+Ci0gIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBXaGVyZSBhbiBYTUwgc2NoZW1hIGRlZmluZXMgcnVsZXMgCi0gICAgZm9yIGFuIFhNTCBkb2N1bWVudCwgYW4gWE1MIDxlbT5pbnN0YW5jZTwvZW0+IGlzIGFuIFhNTCBkb2N1bWVudCB0aGF0IGNvbmZvcm1zIAotICAgIHRvIHRoZSBzY2hlbWEuPC9wPgotICA8cD5Zb3UgY29tcGlsZSBhIHNjaGVtYSAoWFNEKSBmaWxlIHRvIGdlbmVyYXRlIGEgc2V0IG9mIEphdmEgaW50ZXJmYWNlcyB0aGF0IAotICAgIG1pcnJvciB0aGUgc2NoZW1hLiBXaXRoIHRoZXNlIHR5cGVzLCB5b3UgcHJvY2VzcyBYTUwgaW5zdGFuY2UgZG9jdW1lbnRzIHRoYXQgCi0gICAgY29uZm9ybSB0byB0aGUgc2NoZW1hLiBZb3UgYmluZCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgdG8gdGhlc2UgdHlwZXM7IGNoYW5nZXMgCi0gICAgbWFkZSB0aHJvdWdoIHRoZSBKYXZhIGludGVyZmFjZSBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgWE1MIHJlcHJlc2VudGF0aW9uLjwvcD4KLSAgPHA+UHJldmlvdXMgb3B0aW9ucyBmb3IgaGFuZGxpbmcgWE1MIGluY2x1ZGUgdXNpbmcgWE1MIHByb2dyYW1taW5nIGludGVyZmFjZXMgCi0gICAgKHN1Y2ggYXMgRE9NIG9yIFNBWCkgb3IgYW4gWE1MIG1hcnNoYWxsaW5nL2JpbmRpbmcgdG9vbCAoc3VjaCBhcyBKQVhCKS4gQmVjYXVzZSAKLSAgICBpdCBsYWNrcyBzdHJvbmcgc2NoZW1hLW9yaWVudGVkIHR5cGluZywgbmF2aWdhdGlvbiBpbiBhIERPTS1vcmllbnRlZCBtb2RlbCAKLSAgICBpcyBtb3JlIHRlZGlvdXMgYW5kIHJlcXVpcmVzIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvbXBsZXRlIG9iamVjdCBtb2RlbC4gCi0gICAgSkFYQiBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgWE1MIHNjaGVtYSBzcGVjaWZpY2F0aW9uLCBidXQgaGFuZGxlcyBvbmx5IGEgCi0gICAgc3Vic2V0IG9mIGl0OyBYTUxCZWFucyBzdXBwb3J0cyBhbGwgb2YgaXQuIEFsc28sIGJ5IHN0b3JpbmcgdGhlIGRhdGEgaW4gbWVtb3J5IAotICAgIGFzIFhNTCwgWE1MQmVhbnMgaXMgYWJsZSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nLjwvcD4KLSAgPGgxPkFjY2Vzc2luZyBYTUwgVXNpbmcgSXRzIFNjaGVtYTwvaDE+Ci0gIDxwPlRvIGdldCBhIGdsaW1wc2Ugb2YgdGhlIGtpbmRzIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggWE1MQmVhbnMsIHRha2UgYSAKLSAgICBsb29rIGF0IGFuIGV4YW1wbGUgdXNpbmcgWE1MIGZvciBhIHB1cmNoYXNlIG9yZGVyLiBUaGUgcHVyY2hhc2Ugb3JkZXIgWE1MIAotICAgIGNvbnRhaW5zIGRhdGEgZXhjaGFuZ2VkIGJ5IHR3byBwYXJ0aWVzLCBzdWNoIGFzIHR3byBjb21wYW5pZXMuIEJvdGggcGFydGllcyAKLSAgICBuZWVkIHRvIGJlIGFibGUgdG8gcmVseSBvbiBhIGNvbnNpc3RlbnQgbWVzc2FnZSBzaGFwZSwgYW5kIGEgc2NoZW1hIHNwZWNpZmllcyAKLSAgICB0aGUgY29tbW9uIGdyb3VuZC4gPC9wPgotICA8cD5IZXJlJ3Mgd2hhdCBhIHB1cmNoYXNlIG9yZGVyIFhNTCBpbnN0YW5jZSBtaWdodCBsb29rIGxpa2UuPC9wPgotICA8cHJlPgotJmx0O3BvOnB1cmNoYXNlLW9yZGVyIHhtbG5zOnBvPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIiZndDsKLSAgICAmbHQ7cG86Y3VzdG9tZXImZ3Q7Ci0gICAgICAgICZsdDtwbzpuYW1lJmd0O0dsYWR5cyBLcmF2aXR6Jmx0Oy9wbzpuYW1lJmd0OwotICAgICAgICAmbHQ7cG86YWRkcmVzcyZndDtBbnl0b3duLCBQQSZsdDsvcG86YWRkcmVzcyZndDsKLSAgICAmbHQ7L3BvOmN1c3RvbWVyJmd0OwotICAgICZsdDtwbzpkYXRlJmd0OzIwMDMtMDEtMDdUMTQ6MTY6MDAtMDU6MDAmbHQ7L3BvOmRhdGUmZ3Q7Ci0gICAgJmx0O3BvOmxpbmUtaXRlbSZndDsKLSAgICAgICAgJmx0O3BvOmRlc2NyaXB0aW9uJmd0O0J1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxJmx0Oy9wbzpkZXNjcmlwdGlvbiZndDsKLSAgICAgICAgJmx0O3BvOnBlci11bml0LW91bmNlcyZndDs1Jmx0Oy9wbzpwZXItdW5pdC1vdW5jZXMmZ3Q7Ci0gICAgICAgICZsdDtwbzpwcmljZSZndDsyMS43OSZsdDsvcG86cHJpY2UmZ3Q7Ci0gICAgICAgICZsdDtwbzpxdWFudGl0eSZndDsyJmx0Oy9wbzpxdWFudGl0eSZndDsKLSAgICAmbHQ7L3BvOmxpbmUtaXRlbSZndDsKLSAgICAmbHQ7cG86bGluZS1pdGVtJmd0OwotICAgICAgICAmbHQ7cG86ZGVzY3JpcHRpb24mZ3Q7QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDImbHQ7L3BvOmRlc2NyaXB0aW9uJmd0OwotICAgICAgICAmbHQ7cG86cGVyLXVuaXQtb3VuY2VzJmd0OzUmbHQ7L3BvOnBlci11bml0LW91bmNlcyZndDsKLSAgICAgICAgJmx0O3BvOnByaWNlJmd0OzE5Ljg5Jmx0Oy9wbzpwcmljZSZndDsKLSAgICAgICAgJmx0O3BvOnF1YW50aXR5Jmd0OzImbHQ7L3BvOnF1YW50aXR5Jmd0OwotICAgICZsdDsvcG86bGluZS1pdGVtJmd0OwotJmx0O3BvOnNoaXBwZXImZ3Q7Ci0gICAgICAgICZsdDtwbzpuYW1lJmd0O1ppcFNoaXAmbHQ7L3BvOm5hbWUmZ3Q7Ci0gICAgICAgICZsdDtwbzpwZXItb3VuY2UtcmF0ZSZndDswLjc0Jmx0Oy9wbzpwZXItb3VuY2UtcmF0ZSZndDsKLSAgICAmbHQ7L3BvOnNoaXBwZXImZ3Q7Ci0mbHQ7L3BvOnB1cmNoYXNlLW9yZGVyJmd0OzwvcHJlPgotICA8cD5UaGlzIFhNTCBpbmNsdWRlcyBhIHJvb3QgZWxlbWVudCwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPiwgCi0gICAgdGhhdCBoYXMgdGhyZWUga2luZHMgb2YgY2hpbGQgZWxlbWVudHM6IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jdXN0b21lcjwvc3Bhbj4sIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kYXRlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4sIAotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2hpcHBlcjwvc3Bhbj4uIEFuIGludHVpdGl2ZSwgb2JqZWN0LWJhc2VkIHZpZXcgCi0gICAgb2YgdGhpcyBYTUwgd291bGQgcHJvdmlkZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+IAotICAgIGVsZW1lbnQsIGFuZCBpdCB3b3VsZCBoYXZlIG1ldGhvZHMgZm9yIGdldHRpbmcgdGhlIGRhdGUgYW5kIGZvciBnZXR0aW5nIHN1Ym9yZGluYXRlIAotICAgIG9iamVjdHMgZm9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jdXN0b21lcjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+LCAKLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNoaXBwZXI8L3NwYW4+IGVsZW1lbnRzLiBFYWNoIG9mIHRoZSBsYXN0IHRocmVlIAotICAgIHdvdWxkIGhhdmUgaXRzIG93biBtZXRob2RzIGZvciBnZXR0aW5nIHRoZSBkYXRhIGluc2lkZSB0aGVtIGFzIHdlbGwuPC9wPgotICA8aDI+TG9va2luZyBhdCB0aGUgU2NoZW1hPC9oMj4KLSAgPHA+VGhlIGZvbGxvd2luZyBYTUwgaXMgdGhlIHRoZSBzY2hlbWEgZm9yIHRoZSBwcmVjZWRpbmcgcHVyY2hhc2Ugb3JkZXIgWE1MLiAKLSAgICBJdCBkZWZpbmVzIHRoZSBYTUwncyAmcXVvdDtzaGFwZSZxdW90OyAmIzgyMTI7IHdoYXQgaXRzIGVsZW1lbnRzIGFyZSwgd2hhdCAKLSAgICBvcmRlciB0aGV5IGFwcGVhciBpbiwgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIHdoaWNoLCBhbmQgc28gb24uPC9wPgotPC9kaXY+Ci08ZGl2PiAKLSAgPHByZT4KLSZsdDt4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIgotICAgIHhtbG5zOnBvPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIgotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCImZ3Q7Ci0JCi0gICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icHVyY2hhc2Utb3JkZXIiJmd0OwotICAgICAgICAmbHQ7eHM6Y29tcGxleFR5cGUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0iY3VzdG9tZXIiIHR5cGU9InBvOmN1c3RvbWVyIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJsaW5lLWl0ZW0iIHR5cGU9InBvOmxpbmUtaXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InNoaXBwZXIiIHR5cGU9InBvOnNoaXBwZXIiIG1pbk9jY3Vycz0iMCIvJmd0OwotICAgICAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLSAgICAmbHQ7L3hzOmVsZW1lbnQmZ3Q7Ci0gICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWVyIiZndDsKLSAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSJsaW5lLWl0ZW0iJmd0OwotICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwZXItdW5pdC1vdW5jZXMiIHR5cGU9InhzOmRlY2ltYWwiLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4czpkb3VibGUiLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnQiLyZndDsKLSAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSJzaGlwcGVyIiZndDsKLSAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwZXItb3VuY2UtcmF0ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvJmd0OwotICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7L3hzOnNjaGVtYSZndDs8L3ByZT4KLSAgPGRpdj4gCi0gICAgPHA+VGhpcyBzY2hlbWEgZGVzY3JpYmVzIHRoZSBwdXJjaGFzZSBvcmRlciBYTUwgaW5zdGFuY2UgYnkgZGVmaW5pbmcgdGhlIGZvbGxvd2luZzo8L3A+Ci0gIDwvZGl2PgotICA8dWw+Ci0gICAgPGxpPiAKLSAgICAgIDxkaXY+RGVmaW5pdGlvbnMgZm9yIHRocmVlIGNvbXBsZXggdHlwZXMgJiM4MjEyOyBjdXN0b21lciwgbGluZS1pdGVtLCBhbmQgCi0gICAgICAgIHNoaXBwZXIuIFRoZXNlIGFyZSB0aGUgdHlwZXMgdXNlZCBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBwdXJjaGFzZS1vcmRlciAKLSAgICAgICAgZWxlbWVudC4gSW4gc2NoZW1hLCBhIGNvbXBsZXggdHlwZSBpcyBvbmUgdGhhdCBkZWZpbmVzIGFuIGVsZW1lbnQgdGhhdCAKLSAgICAgICAgbWF5IGhhdmUgY2hpbGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuIFRoZSBzZXF1ZW5jZSBlbGVtZW50IG5lc3RlZCBpbiAKLSAgICAgICAgdGhlIGNvbXBsZXggdHlwZSBsaXN0cyBpdHMgY2hpbGQgZWxlbWVudHMuPC9kaXY+Ci0gICAgICA8cD5UaGVzZSBhcmUgYWxzbyA8ZW0+Z2xvYmFsPC9lbT4gdHlwZXMuIFRoZXkgYXJlIGdsb2JhbCBiZWNhdXNlIHRoZXkgYXJlIAotICAgICAgICBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBzY2hlbWEgKGluIG90aGVyIHdvcmRzLCBqdXN0IGJlbmVhdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zY2hlbWE8L3NwYW4+IAotICAgICAgICByb290IGVsZW1lbnQpLiBUaGlzIG1lYW5zIHRoYXQgdGhleSBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIGFueXdoZXJlIGVsc2UgCi0gICAgICAgIGluIHRoZSBzY2hlbWEuPC9wPgotICAgIDwvbGk+Ci0gIDwvdWw+Ci08L2Rpdj4KLTxkaXY+Ci0gIDx1bD4KLSAgICA8bGk+VXNlIG9mIHNpbXBsZSB0eXBlcyB3aXRoaW4gdGhlIGNvbXBsZXggdHlwZXMuIFRoZSBuYW1lLCBhZGRyZXNzLCBhbmQgZGVzY3JpcHRpb24gCi0gICAgICBlbGVtZW50cyAoYW1vbmcgb3RoZXJzKSBhcmUgdHlwZWQgYXMgc2ltcGxlIHR5cGVzLiBBcyBpdCBoYXBwZW5zLCB0aGVzZSAKLSAgICAgIGFyZSBhbHNvIDxlbT5idWlsdC1pbjwvZW0+IHR5cGVzLiBBIGJ1aWx0LWluIHR5cGUgKGhlcmUsIG9uZSB3aXRoIHRoZSAmcXVvdDt4cyZxdW90OyAKLSAgICAgIHByZWZpeCkgaXMgcGFydCBvZiB0aGUgc2NoZW1hIHNwZWNpZmljYXRpb24uIChUaGUgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIAotICAgICAgNDYgYnVpbHQtaW4gdHlwZXMuKTwvbGk+Ci0gICAgPGxpPkEgZ2xvYmFsIGVsZW1lbnQgY2FsbGVkIHB1cmNoYXNlLW9yZGVyLiBUaGlzIGVsZW1lbnQgZGVmaW5pdGlvbiBpbmNsdWRlcyAKLSAgICAgIGEgbmVzdGVkIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBjaGlsZCBlbGVtZW50cyBmb3IgYSAKLSAgICAgIHB1cmNoYXNlLW9yZGVyIGVsZW1lbnQuIE5vdGljZSB0aGF0IHRoZSBjb21wbGV4IHR5cGUgaW5jbHVkZXMgcmVmZXJlbmNlcyAKLSAgICAgIHRvIHRoZSBvdGhlciBjb21wbGV4IHR5cGVzIGRlZmluZWQgaW4gdGhpcyBzY2hlbWEuPC9saT4KLSAgPC91bD4KLSAgPGRpdj48L2Rpdj4KLSAgPHA+SW4gb3RoZXIgd29yZHMsIHRoZSBzY2hlbWEgZGVmaW5lcyB0eXBlcyBmb3IgdGhlIGNoaWxkIGVsZW1lbnRzIGFuZCBkZXNjcmliZXMgCi0gICAgdGhlaXIgcG9zaXRpb24gYXMgc3Vib3JkaW5hdGUgdG8gdGhlIHJvb3QgZWxlbWVudCwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPi48L3A+Ci0gIDxwPldoZW4geW91IHVzZSB0aGUgWE1MQmVhbiBjb21waWxlciB3aXRoIGFuIFhTRCBmaWxlIHN1Y2ggYXMgdGhpcyBvbmUsIHlvdSAKLSAgICBnZW5lcmF0ZSBhIEpBUiBmaWxlIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNjaGVtYS48L3A+Ci0gIDxoMj5Xcml0aW5nIEphdmEgQ29kZSBUaGF0IFVzZXMgdGhlIEludGVyZmFjZXM8L2gyPgotICA8cD5XaXRoIHRoZSBYTUxCZWFucyBpbnRlcmZhY2VzIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBjYW4gd3JpdGUgY29kZSB0aGF0IAotICAgIHVzZXMgdGhlIG5ldyB0eXBlcyB0byBoYW5kbGUgWE1MIGJhc2VkIG9uIHRoZSBzY2hlbWEuIEhlcmUncyBhbiBleGFtcGxlIHRoYXQgCi0gICAgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgb3JkZXJlZCBpdGVtcyBpbiB0aGUgcHVyY2hhc2Ugb3JkZXIgCi0gICAgWE1MLCBjb3VudHMgdGhlIGl0ZW1zLCBhbmQgY2FsY3VsYXRlcyBhIHRvdGFsIG9mIHRoZWlyIHByaWNlcy4gSW4gcGFydGljdWxhciwgCi0gICAgbG9vayBhdCB0aGUgdXNlIG9mIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBzY2hlbWEgYW5kIGltcG9ydGVkIGFzIHBhcnQgb2YgCi0gICAgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5vcmcub3BlbnVyaS5lYXN5cG88L3NwYW4+IHBhY2thZ2UuIDwvcD4KLSAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmludEl0ZW1zPC9zcGFuPiBtZXRob2QgcmVjZWl2ZXMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4gCi0gICAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHB1cmNoYXNlIG9yZGVyIFhNTCBmaWxlLjwvcD4KLSAgPHByZT4KLXBhY2thZ2UgZG9jcy54bWxiZWFuczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZWFzeXBvLlB1cmNoYXNlT3JkZXJEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5lYXN5cG8uUHVyY2hhc2VPcmRlcjsKLWltcG9ydCBvcmcub3BlbnVyaS5lYXN5cG8uTGluZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBQT0hhbmRsZXIgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50SXRlbXMoRmlsZSBwbykgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFsbCBYTUxCZWFucyBzY2hlbWEgdHlwZXMgcHJvdmlkZSBhIG5lc3RlZCBGYWN0b3J5IGNsYXNzIHlvdSBjYW4KLSAgICAgICAgICogdXNlIHRvIGJpbmQgWE1MIHRvIHRoZSB0eXBlLCBvciB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdHlwZS4KLSAgICAgICAgICogTm90ZSB0aGF0IGEgIkRvY3VtZW50IiB0eXBlIHN1Y2ggYXMgdGhpcyBvbmUgaXMgYW4gWE1MQmVhbnMgCi0gICAgICAgICAqIGNvbnN0cnVjdCBmb3IgcmVwcmVzZW50aW5nIGEgZ2xvYmFsIGVsZW1lbnQuIEl0IHByb3ZpZGVzIGEgd2F5Ci0gICAgICAgICAqIGZvciB5b3UgdG8gZ2V0IGFuZCBzZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpcmUgZWxlbWVudC4KLSAgICAgICAgICoKLSAgICAgICAgICogQWxzbywgbm90ZSB0aGF0IHRoZSBwYXJzZSBtZXRob2Qgd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIAotICAgICAgICAgKiBYTUwgeW91J3JlIHBhcnNpbmcgYXBwZWFycyB0byBjb25mb3JtIHRvIHRoZSBzY2hlbWEuCi0gICAgICAgICAqLwotICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2MgPQotICAgICAgICAgICAgUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UocG8pOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBQdXJjaGFzZU9yZGVyIHR5cGUgcmVwcmVzZW50cyB0aGUgcHVyY2hhc2Utb3JkZXIgZWxlbWVudCdzCi0gICAgICAgICAqIGNvbXBsZXggdHlwZS4KLSAgICAgICAgICovCi0gICAgICAgIFB1cmNoYXNlT3JkZXIgcG8gPSBwb0RvYy5nZXRQdXJjaGFzZU9yZGVyKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2hlbiBhbiBlbGVtZW50IG1heSBvY2N1ciBtb3JlIHRoYW4gb25jZSBhcyBhIGNoaWxkIGVsZW1lbnQsCi0gICAgICAgICAqIHRoZSBzY2hlbWEgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBtZXRob2RzIHRoYXQgcmVmZXIgdG8gYW4gCi0gICAgICAgICAqIGFycmF5IG9mIHRoYXQgZWxlbWVudC4gVGhlIGxpbmUtaXRlbSBlbGVtZW50IGlzIGRlZmluZWQgd2l0aAotICAgICAgICAgKiBhIG1heE9jY3VycyBhdHRyaWJ1dGUgdmFsdWUgb2YgInVuYm91bmRlZCIsIG1lYW5pbmcgdGhhdCAKLSAgICAgICAgICogaXQgbWF5IG9jY3VyIGFzIG1hbnkgdGltZXMgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQgYXMgbmVlZGVkLgotICAgICAgICAgKiBTbyB0aGVyZSBhcmUgbWV0aG9kcyBzdWNoIGFzIGdldExpbmVJdGVtQXJyYXkgYW5kIHNldExpbmVJdGVtQXJyYXkuIAotICAgICAgICAgKi8KLSAgICAgICAgTGluZUl0ZW1bXSBsaW5laXRlbXMgPSBwby5nZXRMaW5lSXRlbUFycmF5KCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHVyY2hhc2Ugb3JkZXIgaGFzICIgKyBsaW5laXRlbXMubGVuZ3RoICsgIiBsaW5lIGl0ZW1zLiIpOwotCi0gICAgICAgIGRvdWJsZSB0b3RhbEFtb3VudCA9IDAuMDsKLSAgICAgICAgaW50IG51bWJlck9mSXRlbXMgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIExvb3AgdGhyb3VnaCB0aGUgbGluZS1pdGVtIGVsZW1lbnRzLCB1c2luZyBnZW5lcmF0ZWQgYWNjZXNzb3JzIHRvIAotICAgICAgICAgKiBnZXQgdmFsdWVzIGZvciBjaGlsZCBlbGVtZW50cyBzdWNoIGEgZGVzY3JpcHRpb24sIHF1YW50aXR5LCBhbmQKLSAgICAgICAgICogcHJpY2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpbmVpdGVtcy5sZW5ndGg7IGorKykgCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIExpbmUgaXRlbTogIiArIGopOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICIgICBEZXNjcmlwdGlvbjogIiArIGxpbmVpdGVtc1tqXS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgUXVhbnRpdHk6ICIgKyBsaW5laXRlbXNbal0uZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIFByaWNlOiAiICsgbGluZWl0ZW1zW2pdLmdldFByaWNlKCkpOwotICAgICAgICAgICAgbnVtYmVyT2ZJdGVtcyArPSBsaW5laXRlbXNbal0uZ2V0UXVhbnRpdHkoKTsKLSAgICAgICAgICAgIHRvdGFsQW1vdW50ICs9IGxpbmVpdGVtc1tqXS5nZXRQcmljZSgpICogbGluZWl0ZW1zW2pdLmdldFF1YW50aXR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBpdGVtczogIiArIG51bWJlck9mSXRlbXMpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGFtb3VudDogIiArIHRvdGFsQW1vdW50KTsKLSAgICB9Ci19Ci08L3ByZT4KLSAgPHA+Tm90aWNlIHRoYXQgdHlwZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNjaGVtYSByZWZsZWN0IHdoYXQncyBpbiB0aGUgWE1MOjwvcD4KLTwvZGl2PgotPHVsPgotICA8bGk+IAotICAgIDxkaXY+QSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHVyY2hhc2VPcmRlckRvY3VtZW50PC9zcGFuPiByZXByZXNlbnRzIHRoZSAKLSAgICAgIGdsb2JhbCByb290IGVsZW1lbnQuPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4gCi0gICAgPGRpdj5BIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRQdXJjaGFzZU9yZGVyPC9zcGFuPiBtZXRob2QgcmV0dXJucyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QdXJjaGFzZU9yZGVyRG9jdW1lbnQuUHVyY2hhc2VPcmRlcjwvc3Bhbj4gCi0gICAgICB0eXBlIHRoYXQgY29udGFpbnMgY2hpbGQgZWxlbWVudHMsIGluY2x1ZGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPi4gCi0gICAgICBBIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRMaW5lSXRlbUFycmF5PC9zcGFuPiBtZXRob2QgcmV0dXJucyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5MaW5lSXRlbTwvc3Bhbj4gCi0gICAgICBhcnJheSBjb250YWluaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPiBlbGVtZW50cy48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPk90aGVyIG1ldGhvZHMsIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFF1YW50aXR5PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFByaWNlPC9zcGFuPiwgCi0gICAgYW5kIHNvIG9uLCBmb2xsb3cgbmF0dXJhbGx5IGZyb20gd2hhdCB0aGUgc2NoZW1hIGRlc2NyaWJlcywgcmV0dXJuaW5nIGNvcnJlc3BvbmRpbmcgCi0gICAgY2hpbGRyZW4gb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnQuPC9saT4KLSAgPGxpPlRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlc2UgdHlwZXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBzY2hlbWEncyAKLSAgICB0YXJnZXQgbmFtZXNwYWNlLjwvbGk+Ci08L3VsPgotPGRpdj4gCi0gIDxwPkNhcGl0YWxpemF0aW9uIGFuZCBwdW5jdHVhdGlvbiBmb3IgZ2VuZXJhdGVkIHR5cGUgbmFtZXMgZm9sbG93IEphdmEgY29udmVudGlvbi4gCi0gICAgQWxzbywgd2hpbGUgdGhpcyBleGFtcGxlIHBhcnNlcyB0aGUgWE1MIGZyb20gYSBmaWxlLCBvdGhlciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cGFyc2U8L3NwYW4+IAotICAgIG1ldGhvZHMgc3VwcG9ydCBhIEphdmEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPklucHV0U3RyZWFtPC9zcGFuPiBvYmplY3QsIAotICAgIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlJlYWRlcjwvc3Bhbj4gb2JqZWN0LCBhbmQgc28gb24uPC9wPgotICA8cD5UaGUgcHJlY2VkaW5nIEphdmEgY29kZSBwcmludHMgdGhlIGZvbGxvd2luZyB0byB0aGUgY29uc29sZTo8L3A+Ci08L2Rpdj4KLTxkaXY+IAotICA8cHJlPgotUHVyY2hhc2Ugb3JkZXIgaGFzIDMgbGluZSBpdGVtcy4KLSBMaW5lIGl0ZW0gMAotICAgRGVzY3JpcHRpb246IEJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxCi0gICBRdWFudGl0eTogMgotICAgUHJpY2U6IDIxLjc5Ci0gTGluZSBpdGVtIDEKLSAgIERlc2NyaXB0aW9uOiBCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMgotICAgUXVhbnRpdHk6IDIKLSAgIFByaWNlOiAxOS44OQotVG90YWwgaXRlbXM6IDQKLVRvdGFsIGFtb3VudDogNDEuNjg8L3ByZT4KLSAgPGgyPkNyZWF0aW5nIE5ldyBYTUwgSW5zdGFuY2VzIGZyb20gU2NoZW1hPC9oMj4KLSAgPHA+QXMgeW91J3ZlIHNlZW4gWE1MQmVhbnMgcHJvdmlkZXMgYSAmcXVvdDtmYWN0b3J5JnF1b3Q7IGNsYXNzIHlvdSBjYW4gdXNlIAotICAgIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+IAotICAgIGVsZW1lbnQgYW5kIGFkZHMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3VzdG9tZXI8L3NwYW4+IGNoaWxkIGVsZW1lbnQuIAotICAgIEl0IHRoZW4gaW5zZXJ0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5hZGRyZXNzPC9zcGFuPiAKLSAgICBjaGlsZCBlbGVtZW50cywgY3JlYXRpbmcgdGhlIGVsZW1lbnRzIGFuZCBzZXR0aW5nIHRoZWlyIHZhbHVlcyB3aXRoIGEgc2luZ2xlIAotICAgIGNhbGwgdG8gdGhlaXIgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNldDwvc3Bhbj4gbWV0aG9kcy48L3A+Ci0gIDxwcmU+Ci1wdWJsaWMgUHVyY2hhc2VPcmRlckRvY3VtZW50IGNyZWF0ZVBPKCkKLXsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1B1cmNoYXNlT3JkZXJEb2N1bWVudCBuZXdQT0RvYyA9IFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQdXJjaGFzZU9yZGVyIG5ld1BPID0gbmV3UE9Eb2MuYWRkTmV3UHVyY2hhc2VPcmRlcigpOwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3VzdG9tZXIgbmV3Q3VzdG9tZXIgPSBuZXdQTy5hZGROZXdDdXN0b21lcigpOwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmV3Q3VzdG9tZXIuc2V0TmFtZSgmcXVvdDtEb3JpcyBLcmF2aXR6JnF1b3Q7KTsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25ld0N1c3RvbWVyLnNldEFkZHJlc3MoJnF1b3Q7QmVsbGZsb3dlciwgQ0EmcXVvdDspOwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmV0dXJuIG5ld1BPRG9jOwotfQotPC9wcmU+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgaXMgdGhlIFhNTCB0aGF0IHJlc3VsdHMuIE5vdGUgdGhhdCBYTUxCZWFucyBhc3NpZ25zIHRoZSBjb3JyZWN0IAotICAgIG5hbWVzcGFjZSBiYXNlZCBvbiB0aGUgc2NoZW1hLCB1c2luZyBhbiAmcXVvdDtuczEmcXVvdDsgKG9yLCAmcXVvdDtuYW1lc3BhY2UgCi0gICAgMSZxdW90OykgcHJlZml4LiBGb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgcHJlZml4IGl0c2VsZiBkb2Vzbid0IHJlYWxseSAKLSAgICBtYXR0ZXIgJiM4MjEyOyBpdCdzIHRoZSBuYW1lc3BhY2UgVVJJIChodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvKSB0aGF0IGRlZmluZXMgCi0gICAgdGhlIG5hbWVzcGFjZS4gVGhlIHByZWZpeCBpcyBtZXJlbHkgYSBtYXJrZXIgdGhhdCByZXByZXNlbnRzIGl0LjwvcD4KLSAgPHByZT4mbHQ7bnMxOnB1cmNoYXNlLW9yZGVyIHhtbG5zOm5zMT0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJnF1b3Q7Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25zMTpjdXN0b21lciZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczE6bmFtZSZndDtEb3JpcyBLcmF2aXR6Jmx0Oy9uczE6bmFtZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczE6YWRkcmVzcyZndDtCZWxsZmxvd2VyLCBDQSZsdDsvbnMxOmFkZHJlc3MmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L25zMTpjdXN0b21lciZndDsKLSZsdDsvbnMxOnB1cmNoYXNlLW9yZGVyJmd0OwotPC9wcmU+Ci0gIDxwPk5vdGUgdGhhdCBhbGwgdHlwZXMgKGluY2x1ZGluZyB0aG9zZSBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEpIGluaGVyaXQgZnJvbSAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiwgYW5kIHNvIHByb3ZpZGUgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmFjdG9yeTwvc3Bhbj4gCi0gICAgY2xhc3MuIEZvciBhbiBvdmVydmlldyBvZiB0aGUgdHlwZSBzeXN0ZW0gaW4gd2hpY2ggPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gCi0gICAgZml0cywgc2VlIDxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0IAotICAgIGZvciBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+LiBGb3IgcmVmZXJlbmNlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPlhtbE9iamVjdCAKLSAgICBJbnRlcmZhY2U8L2E+LjwvcD4KLSAgPGgxPlhNTEJlYW5zIEhpZXJhcmNoeTwvaDE+Ci0gIDxwPlRoZSBnZW5lcmF0ZWQgdHlwZXMgeW91IHNhdyB1c2VkIGluIHRoZSBwcmVjZWRpbmcgZXhhbXBsZSBhcmUgYWN0dWFsbHkgcGFydCAKLSAgICBvZiBhIGhpZXJhcmNoeSBvZiBYTUxCZWFucyB0eXBlcy4gVGhpcyBoaWVyYXJjaHkgaXMgb25lIG9mIHRoZSB3YXlzIGluIHdoaWNoIAotICAgIFhNTEJlYW5zIHByZXNlbnRzIGFuIGludHVpdGl2ZSB2aWV3IG9mIHNjaGVtYS4gQXQgdGhlIHRvcCBvZiB0aGUgaGllcmFyY2h5IAotICAgIGlzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LCB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIFhNTEJlYW5zIAotICAgIHR5cGVzLiBCZW5lYXRoIHRoaXMgbGV2ZWwsIHRoZXJlIGFyZSB0d28gbWFpbiB0eXBlIGNhdGVnb3JpZXM6IGdlbmVyYXRlZCB0eXBlcyAKLSAgICB0aGF0IHJlcHJlc2VudCB1c2VyLWRlcml2ZWQgc2NoZW1hIHR5cGVzLCBhbmQgaW5jbHVkZWQgdHlwZXMgdGhhdCByZXByZXNlbnQgCi0gICAgYnVpbHQtaW4gc2NoZW1hIHR5cGVzLjwvcD4KLSAgVGhpcyB0b3BpYyBoYXMgYWxyZWFkeSBpbnRyb2R1Y2VkIGdlbmVyYXRlZCB0eXBlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAKLSAgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20gCi0gIFVzZXItRGVyaXZlZCBTY2hlbWEgVHlwZXMuPC9hPiAKLSAgPGgyPkJ1aWx0LUluIFR5cGUgU3VwcG9ydDwvaDI+Ci0gIDxwPkluIGFkZGl0aW9uIHRvIHR5cGVzIGdlbmVyYXRlZCBmcm9tIGEgZ2l2ZW4gc2NoZW1hLCBYTUxCZWFucyBwcm92aWRlcyA0NiAKLSAgICBKYXZhIHR5cGVzIHRoYXQgbWlycm9yIHRoZSA0NiBidWlsdC1pbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24uIAotICAgIFdoZXJlIHNjaGVtYSBkZWZpbmVzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzdHJpbmc8L3NwYW4+LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6ZGVjaW1hbDwvc3Bhbj4sIAotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6aW50PC9zcGFuPiwgZm9yIGV4YW1wbGUsIFhNTEJlYW5zIHByb3ZpZGVzIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuaHRtbCI+WG1sU3RyaW5nPC9hPjwvc3Bhbj4sIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEZWNpbWFsLmh0bWwiPlhtbERlY2ltYWw8L2E+PC9zcGFuPiwgCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnQuaHRtbCI+WG1sSW50PC9hPjwvc3Bhbj4uIAotICAgIEVhY2ggb2YgdGhlc2UgYWxzbyBpbmhlcml0cyBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LCAKLSAgICB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgYnVpbHQtaW4gc2NoZW1hIHR5cGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmFueVR5cGU8L3NwYW4+LjwvcD4KLSAgPHA+WE1MQmVhbnMgcHJvdmlkZXMgYSB3YXkgZm9yIHlvdSB0byBoYW5kbGUgWE1MIGRhdGEgYXMgdGhlc2UgYnVpbHQtaW4gdHlwZXMuIAotICAgIFdoZXJlIHlvdXIgc2NoZW1hIGluY2x1ZGVzIGFuIGVsZW1lbnQgd2hvc2UgdHlwZSBpcywgZm9yIGV4YW1wbGUsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czppbnQ8L3NwYW4+LCAKLSAgICBYTUxCZWFucyB3aWxsIHByb3ZpZGUgYSBnZW5lcmF0ZWQgbWV0aG9kIGRlc2lnbmVkIHRvIHJldHVybiBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sSW50PC9zcGFuPi4gCi0gICAgSW4gYWRkaXRpb24sIGFzIHlvdSBzYXcgaW4gdGhlIHByZWNlZGluZyBleGFtcGxlLCBmb3IgbW9zdCB0eXBlcyB0aGVyZSB3aWxsIAotICAgIGFsc28gYmUgYSBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmF0dXJhbCBKYXZhIHR5cGUgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW50PC9zcGFuPi4gCi0gICAgVGhlIGZvbGxvd2luZyB0d28gbGluZXMgb2YgY29kZSByZXR1cm4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5xdWFudGl0eTwvc3Bhbj4gCi0gICAgZWxlbWVudCdzIHZhbHVlLCBidXQgcmV0dXJuIGl0IGFzIGRpZmZlcmVudCB0eXBlcy48L3A+Ci0gIDxwcmU+Ci0vLyBNZXRob2RzIHRoYXQgcmV0dXJuIHNpbXBsZSB0eXBlcyBiZWdpbiB3aXRoIGFuICJ4Ii4KLVhtbEludCB4bWxRdWFudGl0eSA9IGxpbmVpdGVtc1tqXS54Z2V0UXVhbnRpdHkoKTsKLS8vIE1ldGhvZHMgdGhhdCByZXR1cm4gYSBuYXR1cmFsIEphdmEgdHlwZSBhcmUgdW5hZG9ybmVkLgotaW50IGphdmFRdWFudGl0eSA9IGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpOwotPC9wcmU+Ci0gIDxwPkluIGEgc2Vuc2UgYm90aCBnZXQgbWV0aG9kcyBuYXZpZ2F0ZSB0byB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnF1YW50aXR5PC9zcGFuPiAKLSAgICBlbGVtZW50OyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFF1YW50aXR5PC9zcGFuPiBtZXRob2QgZ29lcyBhIHN0ZXAgCi0gICAgZnVydGhlciBhbmQgY29udmVydHMgdGhlIGVsZW1lbnRzIHZhbHVlIHRvIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG5hdHVyYWwgSmF2YSAKLSAgICB0eXBlIGJlZm9yZSByZXR1cm5pbmcgaXQuIChYTUxCZWFucyBhbHNvIHByb3ZpZGVzIGEgbWVhbnMgZm9yIHZhbGlkYXRpbmcgdGhlIAotICAgIFhNTCBhcyB5b3Ugd29yayB3aXRoIGl0Lik8L3A+Ci0gIDxwPklmIHlvdSBrbm93IGEgYml0IGFib3V0IFhNTCBzY2hlbWEsIFhNTEJlYW5zIHR5cGVzIHNob3VsZCBzZWVtIGZhaXJseSBpbnR1aXRpdmUuIAotICAgIElmIHlvdSBkb24ndCwgeW91J2xsIGxlYXJuIGEgbG90IGJ5IGV4cGVyaW1lbnRpbmcgd2l0aCBYTUxCZWFucyB1c2luZyB5b3VyIAotICAgIG93biBzY2hlbWFzIGFuZCBYTUwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZW0uIDwvcD4KLSAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIG1ldGhvZHMgb2YgdHlwZXMgZ2VuZXJhdGVkIGZyb20gc2NoZW1hLCBzZWUgPGEgaHJlZj0iY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sIj5NZXRob2RzIAotICAgIGZvciBUeXBlcyBHZW5lcmF0ZWQgRnJvbSBTY2hlbWE8L2E+LiBGb3IgbW9yZSBhYm91dCB0aGUgaG93IFhNTEJlYW5zIHJlcHJlc2VudHMgCi0gICAgYnVpbHQtaW4gc2NoZW1hIHR5cGVzLCBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIAotICAgIFN1cHBvcnQgZm9yIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uPC9wPgotICA8aDE+VXNpbmcgWFF1ZXJ5IEV4cHJlc3Npb25zPC9oMT4KLSAgPHA+V2l0aCBYTUxCZWFucyB5b3UgY2FuIHVzZSBYUXVlcnkgdG8gcXVlcnkgWE1MIGZvciBzcGVjaWZpYyBwaWVjZXMgb2YgZGF0YS4gCi0gICAgWFF1ZXJ5IGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyAmcXVvdDtTUUwgZm9yIFhNTCZxdW90OyBiZWNhdXNlIGl0IHByb3ZpZGVzIAotICAgIGEgbWVjaGFuaXNtIHRvIGFjY2VzcyBkYXRhIGRpcmVjdGx5IGZyb20gWE1MIGRvY3VtZW50cywgbXVjaCBhcyBTUUwgcHJvdmlkZXMgCi0gICAgYSBtZWNoYW5pc20gZm9yIGFjY2Vzc2luZyBkYXRhIGluIHRyYWRpdGlvbmFsIGRhdGFiYXNlcy48L3A+Ci0gIDxwPlhRdWVyeSBib3Jyb3dzIHNvbWUgb2YgaXRzIHN5bnRheCBmcm9tIFhQYXRoLCBhIHN5bnRheCBmb3Igc3BlY2lmeWluZyBuZXN0ZWQgCi0gICAgZGF0YSBpbiBYTUwuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSByZXR1cm5zIGFsbCBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4gCi0gICAgZWxlbWVudHMgd2hvc2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlPC9zcGFuPiBjaGlsZCBlbGVtZW50cyBoYXZlIHZhbHVlcyAKLSAgICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMjAuMDA6PC9wPgotICA8cHJlPgotUHVyY2hhc2VPcmRlckRvY3VtZW50IGRvYyA9IFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHBvKTsKLQotLyoKLSAqIFRoZSBYUXVlcnkgZXhwcmVzc2lvbiBpcyB0aGUgZm9sbG93aW5nIHR3byBzdHJpbmdzIGNvbWJpbmVkLiBUaGV5J3JlCi0gKiBkZWNsYXJlZCBzZXBhcmF0ZWx5IGhlcmUgZm9yIGNvbnZlbmllbmNlLiBUaGUgZmlyc3Qgc3RyaW5nIGRlY2xhcmVzCi0gKiB0aGUgbmFtZXNwYWNlIHByZWZpeCB0aGF0J3MgdXNlZCBpbiB0aGUgcXVlcnkgZXhwcmVzc2lvbjsgdGhlIHNlY29uZAotICogZGVjbGFyZXMgdGhlIGV4cHJlc3Npb24gaXRzZWxmLgotICovCi1TdHJpbmcgbnNUZXh0ID0gImRlY2xhcmUgbmFtZXNwYWNlIHBvID0gJ2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nIjsKLVN0cmluZyBwYXRoVGV4dCA9ICIkdGhpcy9wbzpwdXJjaGFzZS1vcmRlci9wbzpsaW5lLWl0ZW1bcG86cHJpY2UgPD0gMjAuMDBdIjsKLVN0cmluZyBxdWVyeVRleHQgPSBuc1RleHQgKyBwYXRoVGV4dDsKLQotWG1sQ3Vyc29yIGl0ZW1DdXJzb3IgPSBkb2MubmV3Q3Vyc29yKCkuZXhlY1F1ZXJ5KHF1ZXJ5VGV4dCk7Ci1TeXN0ZW0ub3V0LnByaW50bG4oaXRlbUN1cnNvci54bWxUZXh0KCkpOwotPC9wcmU+Ci0gIDxwPlRoaXMgY29kZSBjcmVhdGVzIGEgbmV3IGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LiBGcm9tIHRoZXJlLCAKLSAgICBpdCB1c2VzIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UncyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiAKLSAgICBtZXRob2QgdG8gZXhlY3V0ZSB0aGUgcXVlcnkgZXhwcmVzc2lvbi4gSW4gdGhpcyBleGFtcGxlLCB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyIAotICAgIGlzIGFuIFhRdWVyeSBleHByZXNzaW9uIHRoYXQgc2ltcGx5IHNheXMsICZxdW90O0Zyb20gbXkgY3VycmVudCBsb2NhdGlvbiwgCi0gICAgbmF2aWdhdGUgdGhyb3VnaCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPiBlbGVtZW50IAotICAgIGFuZCByZXRyaWV2ZSB0aG9zZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPiBlbGVtZW50cyB3aG9zZSAKLSAgICB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMjAuMDAuJnF1b3Q7IFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+JHRoaXM8L3NwYW4+IAotICAgIHZhcmlhYmxlIG1lYW5zICZxdW90O3RoZSBjdXJyZW50IHBvc2l0aW9uLiZxdW90OzwvcD4KLSAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgWFF1ZXJ5LCBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHF1ZXJ5LyIgdGFyZ2V0PSJfYmxhbmsiPlhRdWVyeSAKLSAgICAxLjA6IEFuIFhNTCBRdWVyeSBMYW5ndWFnZTwvYT4gYXQgdGhlIFczQyB3ZWIgc2l0ZS48L3A+Ci0gIDxoMj5Vc2luZyBYTUwgQ3Vyc29yczwvaDI+Ci0gIDxwPkluIHRoZSBwcmVjZWRpbmcgZXhhbXBsZSB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj5YbWxDdXJzb3I8L2E+PC9zcGFuPiAKLSAgICBpbnRlcmZhY2UuIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBhIHdheSB0byBleGVjdXRlIFhRdWVyeSBleHByZXNzaW9uLCBhbiAKLSAgICBYTUwgY3Vyc29ycyBvZmZlcnMgYSBmaW5lLWdyYWluZWQgbW9kZWwgZm9yIG1hbmlwdWxhdGluZyBkYXRhLiBUaGUgWE1MIGN1cnNvciAKLSAgICBBUEksIGFuYWxvZ291cyB0byB0aGUgRE9NJ3Mgb2JqZWN0IEFQSSwgaXMgc2ltcGx5IGEgd2F5IHRvIHBvaW50IGF0IGEgcGFydGljdWxhciAKLSAgICBwaWVjZSBvZiBkYXRhLiBTbywganVzdCBsaWtlIGEgY3Vyc29yIGhlbHBzIG5hdmlnYXRlIHRocm91Z2ggYSB3b3JkIHByb2Nlc3NpbmcgCi0gICAgZG9jdW1lbnQsIHRoZSBYTUwgY3Vyc29yIGRlZmluZXMgYSBsb2NhdGlvbiBpbiBYTUwgd2hlcmUgeW91IGNhbiBwZXJmb3JtIGFjdGlvbnMgCi0gICAgb24gdGhlIHNlbGVjdGVkIFhNTC48L3A+Ci0gIDxwPkN1cnNvcnMgYXJlIGlkZWFsIGZvciBtb3ZpbmcgdGhyb3VnaCBhbiBYTUwgZG9jdW1lbnQgd2hlbiB0aGVyZSdzIG5vIHNjaGVtYSAKLSAgICBhdmFpbGFibGUuIE9uY2UgeW91J3ZlIGdvdCB0aGUgY3Vyc29yIGF0IHRoZSBsb2NhdGlvbiB5b3UncmUgaW50ZXJlc3RlZCBpbiwgCi0gICAgeW91IGNhbiBwZXJmb3JtIGEgdmFyaWV0eSBvZiBvcGVyYXRpb25zIHdpdGggaXQuIEZvciBleGFtcGxlLCB5b3UgY2FuIHNldCAKLSAgICBhbmQgZ2V0IHZhbHVlcywgaW5zZXJ0IGFuZCByZW1vdmUgZnJhZ21lbnRzIG9mIFhNTCwgY29weSBmcmFnbWVudHMgb2YgWE1MIAotICAgIHRvIG90aGVyIHBhcnRzIG9mIHRoZSBkb2N1bWVudCwgYW5kIG1ha2Ugb3RoZXIgZmluZS1ncmFpbmVkIGNoYW5nZXMgdG8gdGhlIAotICAgIFhNTCBkb2N1bWVudC48L3A+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIGFuIFhNTCBjdXJzb3IgdG8gbmF2aWdhdGUgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jdXN0b21lcjwvc3Bhbj4gCi0gICAgZWxlbWVudCdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiBjaGlsZCBlbGVtZW50LjwvcD4KLSAgPHByZT4KLVB1cmNoYXNlT3JkZXJEb2N1bWVudCBkb2MgPSAKLSAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShwbyk7Ci0KLVhtbEN1cnNvciBjdXJzb3IgPSBkb2MubmV3Q3Vyc29yKCk7Ci1jdXJzb3IudG9GaXJzdENvbnRlbnRUb2tlbigpOwotY3Vyc29yLnRvRmlyc3RDaGlsZEVsZW1lbnQoKTsKLWN1cnNvci50b0ZpcnN0Q2hpbGRFbGVtZW50KCk7Ci1TeXN0ZW0ub3V0LnByaW50bG4oY3Vyc29yLmdldFRleHQoKSk7Ci0KLWN1cnNvci5kaXNwb3NlKCk7Ci08L3ByZT4KLSAgPHA+V2hhdCdzIGhhcHBlbmluZyBoZXJlPyBBcyB3aXRoIHRoZSBlYXJsaWVyIGV4YW1wbGUsIHRoZSBjb2RlIGxvYWRzIHRoZSBYTUwgCi0gICAgZnJvbSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GaWxlPC9zcGFuPiBvYmplY3QuIEFmdGVyIGxvYWRpbmcgdGhlIGRvY3VtZW50LCAKLSAgICB0aGUgY29kZSBjcmVhdGVzIGEgY3Vyc29yIGF0IGl0cyBiZWdpbm5pbmcuIE1vdmluZyB0aGUgY3Vyc29yIGEgZmV3IHRpbWVzIAotICAgIHRha2VzIGl0IHRvIHRoZSBuZXN0ZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm5hbWUgPC9zcGFuPiBlbGVtZW50LiBPbmNlIAotICAgIHRoZXJlLCB0aGUgZ2V0VGV4dCBtZXRob2QgcmV0cmlldmVzIHRoZSBlbGVtZW50J3MgdmFsdWUuPC9wPgotICA8cD5UaGlzIGlzIGp1c3QgYW4gaW50cm9kdWN0aW9uIHRvIFhNTCBjdXJzb3JzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyAKLSAgICBjdXJzb3JzLCBzZWUgPGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGggCi0gICAgQ3Vyc29yczwvYT4uPC9wPgotICA8aDI+V2hlcmUgdG8gR28gTmV4dDwvaDI+Ci08L2Rpdj4KLTx1bD4KLSAgPGxpPiAKLSAgICA8ZGl2PlhNTEJlYW5zIHByb3ZpZGVzIGludHVpdGl2ZSB3YXlzIHRvIGhhbmRsZSBYTUwsIHBhcnRpY3VsYXJseSBpZiB5b3UncmUgCi0gICAgICBzdGFydGluZyB3aXRoIHNjaGVtYS4gSWYgeW91J3JlIGFjY2Vzc2luZyBYTUwgdGhhdCdzIGJhc2VkIG9uIGEgc2NoZW1hLCAKLSAgICAgIHlvdSdsbCBwcm9iYWJseSBmaW5kIGl0IG1vc3QgZWZmaWNpZW50IHRvIGFjY2VzcyB0aGUgWE1MIHRocm91Z2ggZ2VuZXJhdGVkIAotICAgICAgdHlwZXMgc3BlY2lmaWMgdG8gdGhlIHNjaGVtYS4gVG8gZG8gdGhpcywgeW91IGJlZ2luIGJ5IGNvbXBpbGluZyB0aGUgc2NoZW1hIAotICAgICAgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgWE1MQmVhbnMgdHlwZXMgZ2VuZXJhdGVkIAotICAgICAgYnkgY29tcGlsaW5nIHNjaGVtYSwgc2VlIDxhIGhyZWY9ImNvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIj5KYXZhIAotICAgICAgVHlwZXMgR2VuZXJhdGVkIEZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvYT4gYW5kIDxhIGhyZWY9ImNvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbCI+TWV0aG9kcyAKLSAgICAgIGZvciBUeXBlcyBHZW5lcmF0ZWQgRnJvbSBTY2hlbWE8L2E+LjwvZGl2PgotICA8L2xpPgotICA8bGk+IAotICAgIDxkaXY+WW91IG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gcmVhZGluZyBtb3JlIGFib3V0IHRoZSB0eXBlIHN5c3RlbSBvbiB3aGljaCAKLSAgICAgIFhNTEJlYW5zIGlzIGJhc2VkLCBwYXJ0aWN1bGFybHkgaWYgeW91J3JlIHVzaW5nIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHNjaGVtYS4gCi0gICAgICBYTUxCZWFucyBwcm92aWRlcyBhIGhpZXJhcmNoaWNhbCBzeXN0ZW0gb2YgdHlwZXMgdGhhdCBtaXJyb3Igd2hhdCB5b3UgZmluZCAKLSAgICAgIGluIHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24gaXRzZWxmLiBJZiB5b3UncmUgd29ya2luZyB3aXRoIHNjaGVtYSwgeW91IAotICAgICAgbWlnaHQgZmluZCBpdCBoZWxwcyB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSB0eXBlcyB3b3JrLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgCi0gICAgICBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIFN1cHBvcnQgCi0gICAgICBmb3IgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPiBhbmQgPGEgaHJlZj0iY29uSW50cm9Ub1RoZVNjaGVtYVR5cGVTeXN0ZW0uaHRtbCI+SW50cm9kdWN0aW9uIAotICAgICAgdG8gU2NoZW1hIFR5cGUgU2lnbmF0dXJlczwvYT4uPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4gCi0gICAgPGRpdj5YTUxCZWFucyBwcm92aWRlcyBhY2Nlc3MgdG8gWE1MIHRocm91Z2ggWFF1ZXJ5LCB3aGljaCBib3Jyb3dzIHBhdGggc3ludGF4IAotICAgICAgZnJvbSBYUGF0aC4gV2l0aCBYUXVlcnksIHlvdSBjYW4gc3BlY2lmeSBzcGVjaWZpYyBmcmFnbWVudHMgb2YgWE1MIGRhdGEgCi0gICAgICB3aXRoIG9yIHdpdGhvdXQgc2NoZW1hLiBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIFhRdWVyeSBhbmQgWFBhdGggaW4gWE1MQmVhbnMsIAotICAgICAgc2VlIDxhIGhyZWY9ImNvblNlbGVjdGluZ1hNTHdpdGhYUXVlcnlQYXRoWFBhdGguaHRtbCI+U2VsZWN0aW5nIFhNTCB3aXRoIAotICAgICAgWFF1ZXJ5IGFuZCBYUGF0aDwvYT4uPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT5Zb3UgY2FuIHVzZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlIGZvciAKLSAgICBmaW5lLWdyYWluZWQgbmF2aWdhdGlvbiBhbmQgbWFuaXB1bGF0aW9uIG9mIFhNTC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAKLSAgICA8YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC9hPi48L2xpPgotPC91bD4KLTxkaXY+Ci0gIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgeGJlYW4uamFyIGZpbGUgdGhhdCBjb250YWlucyAKLSAgICB0aGUgWE1MQmVhbnMgbGlicmFyeSBpcyBmdWxseSBmdW5jdGlvbmFsIGFzIGEgc3RhbmRhbG9uZSBsaWJyYXJ5LjwvcD4KLSAgPGgxPlJlbGF0ZWQgVG9waWNzPC9oMT4KLSAgPHA+PGEgaHJlZj0iLi4vLi4vc2FtcGxlcy9uYXZYTUxCZWFuc1NhbXBsZXMuaHRtbCI+WE1MQmVhbnMgU2FtcGxlczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvbkludHJvVG9UaGVTY2hlbWFUeXBlU3lzdGVtLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvbkludHJvVG9UaGVTY2hlbWFUeXBlU3lzdGVtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTg1YzcuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5JbnRyb2R1Y3Rpb24gdG8gU2NoZW1hIFR5cGUgU2lnbmF0dXJlczwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBjb250ZW50PSJ5b3VyIG5hbWUiIG5hbWU9ImF1dGhvciI+Ci08bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KLTxtZXRhIGNvbnRlbnQ9ImtleXdvcmRzIHRvIGhlbHAgaW4gc2VhcmNoZXMiIG5hbWU9ImtleXdvcmRzIj4KLTxtZXRhIGNvbnRlbnQ9IjEwLzI1LzAyIiBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+IAotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGgxPiBJbnRyb2R1Y3Rpb24gdG8gU2NoZW1hIFR5cGUgU2lnbmF0dXJlczwvaDE+Ci08ZGl2IGlkPSJ0b3BpY3RleHQiPiAKLSAgPHA+V2hlbiB5b3UgY29tcGlsZSBzY2hlbWEsIHRoZSBBUEkgZ2VuZXJhdGVkIGZyb20geW91ciBzY2hlbWEgaXMgaW50ZWdyYXRlZCAKLSAgICB3aXRoIHRoZSBYTUxCZWFucyB0eXBlIHN5c3RlbSB0aGF0IHJlcHJlc2VudHMgdGhlIHVuZGVybHlpbmcgWE1MIHNjaGVtYS4gQWxsIAotICAgIHRvZ2V0aGVyLCB0aGVzZSB0eXBlcyBtYWtlIHVwIHRoZSA8ZW0+c2NoZW1hIHR5cGUgc3lzdGVtPC9lbT4gdG8gd2hpY2ggeW91ciAKLSAgICBjb2RlIGhhcyBhY2Nlc3MuIFdoZW4gaGFuZGxpbmcgWE1MIGJhc2VkIG9uIHRoZSBzY2hlbWEsIHlvdSB0eXBpY2FsbHkgY2FsbCAKLSAgICBtZXRob2RzIG9mIHRoZSBBUEkgZ2VuZXJhdGVkIHdoZW4geW91IGNvbXBpbGVkIHRoZSBzY2hlbWEuIEhvd2V2ZXIsIGZvciB0aGUgCi0gICAgY2FzZXMgd2hlbiB5b3Ugd2FudCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjaGVtYSBpdHNlbGYsIHlvdSB1c2UgdGhlIAotICAgIHNjaGVtYSB0eXBlIHN5c3RlbSBBUEkuPC9wPgotICA8cD5JbiB0aGUgWE1MQmVhbnMgQVBJLCB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhlIHN5c3RlbSBpdHNlbGYgdGhyb3VnaCA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlU3lzdGVtLmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TY2hlbWFUeXBlU3lzdGVtPC9zcGFuPjwvYT4gCi0gICAgYW5kIHJlbGF0ZWQgY2xhc3Nlcy4gVGhlc2UgbWFrZSB1cCBhIGtpbmQgb2YgJnF1b3Q7bWV0YS1BUEksJnF1b3Q7IG9yIGEgdmlldyAKLSAgICBvbiB0aGUgc2NoZW1hLiBZb3UgY2FuIHVzZSB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtIEFQSSB0byBkaXNjb3ZlciB0aGUgdHlwZSAKLSAgICBzeXN0ZW0gYXQgcnVuIHRpbWUuIFNlZSB0aGUgcmVmZXJlbmNlIHRvcGljIG9uIHRoYXQgaW50ZXJmYWNlIGZvciBhbiBvdmVydmlldyAKLSAgICBvZiB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLjwvcD4KLSAgPGgyPlNjaGVtYSBUeXBlICZxdW90O1NpZ25hdHVyZXMmcXVvdDs8L2gyPgotICA8cD5BIHNjaGVtYSBpcyBtYWRlIHVwIG9mIHNjaGVtYSBjb21wb25lbnRzLiBTY2hlbWEgY29tcG9uZW50cyBhcmUgdGhlIHBpZWNlcyAKLSAgICBvZiBhIHNjaGVtYSwgc3VjaCBhcyBhIHR5cGUgZGVmaW5pdGlvbiwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiwgYXR0cmlidXRlIAotICAgIGRlY2xhcmF0aW9uLCBhbmQgc28gb24uIFRvIG1pcnJvciB0aGVzZSBpbiB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLCBhIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUNvbXBvbmVudC5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U2NoZW1hQ29tcG9uZW50PC9zcGFuPjwvYT4gCi0gICAgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGNvbXBvbmVudCBpbiB0aGUgdW5kZXJseWluZyBzY2hlbWE7IHNlcGFyYXRlIGNvbXBvbmVudHMgCi0gICAgaGF2ZSBjb3JyZXNwb25kaW5nIHR5cGVzLiBGb3IgZXhhbXBsZSB5b3Ugd291bGQgaGF2ZSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlLmh0bWwiPlNjaGVtYVR5cGU8L2E+PC9zcGFuPiAKLSAgICBvYmplY3QgZm9yIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkN1c3RvbWVyVHlwZTwvc3Bhbj4geW91ciBzY2hlbWEgZGVmaW5lZCwgCi0gICAgb3IgYSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50Lmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TY2hlbWFHbG9iYWxFbGVtZW50PC9zcGFuPjwvYT4gCi0gICAgb2JqZWN0IGZvciBhIGdsb2JhbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHVyY2hhc2VPcmRlcjwvc3Bhbj4gZWxlbWVudC4gCi0gICAgWW91IHdvdWxkIGFsc28gaGF2ZSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TY2hlbWFUeXBlPC9zcGFuPiBmb3IgYnVpbHQtaW4gCi0gICAgc2NoZW1hIHR5cGVzLCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzdHJpbmc8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpkYXRldGltZTwvc3Bhbj4uIAotICAgIFhNTEJlYW4gcHJvdmlkZXMgYSAmcXVvdDtzaWduYXR1cmUmcXVvdDsgdG8gZGVzY3JpYmUgZWFjaCB0eXBlLiBZb3UgY2FuIHJldHJpZXZlIAotICAgIHRoaXMgc2lnbmF0dXJlIGJ5IGNhbGxpbmcgdGhlIFNjaGVtYVR5cGUgY2xhc3MncyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9TdHJpbmc8L3NwYW4+IAotICAgIG1ldGhvZC48L3A+Ci0gIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9TdHJpbmc8L3NwYW4+IG1ldGhvZCByZXR1cm5zIFhNTEJlYW5zJyB2ZXJzaW9uIAotICAgIG9mIGEgdW5pcXVlIHNpZ25hdHVyZSBmb3IgYSBzY2hlbWEgdHlwZS4gVGhpcyBzdHJpbmcgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgCi0gICAgYmVjYXVzZSBpdCBkZXNjcmliZXMgYSBnaXZlbiB0eXBlIGV2ZW4gd2hlbiB0aGUgdHlwZSBkb2Vzbid0IGhhdmUgYSBuYW1lLiAKLSAgPC9wPgotICA8cCBjbGFzcz0ibm90ZXBhcmEiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSXQncyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIAotICAgIHNpZ25hdHVyZSBpcyBhbiBYTUxCZWFucyBjb252ZW50aW9uLCByYXRoZXIgdGhhbiBhIHN0YW5kYXJkIGZyb20gdGhlIHNjaGVtYSAKLSAgICB3b3JraW5nIGdyb3VwLiBUaGUgd29ya2luZyBncm91cCBoYXMgbm90IHlldCBzdGFuZGFyZGl6ZWQgYSBzaWduYXR1cmUgZm9yIAotICAgIFhNTCBzY2hlbWEgdHlwZXMuIEFzIGEgcmVzdWx0IHRoZSBzaWduYXR1cmUgeW91J2xsIHNlZSBmcm9tIFhNTEJlYW5zIGlzIHN1YmplY3QgCi0gICAgdG8gY2hhbmdlICYjODIxMjsgd2hhdGV2ZXIgdGhlIHNjaGVtYSB3b3JraW5nIGdyb3VwIGNvbWVzIHVwIHdpdGggaW4gdGhlIGVuZCAKLSAgICAoaWYgYW55dGhpbmcpIGlzIHByb2JhYmx5IHdoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoaXMgQVBJLiBJbiBvdGhlciB3b3JkcywgZG9uJ3QgCi0gICAgd3JpdGUgYSBwcm9ncmFtIHRvIGRlY29kZSB0aGUgc2lnbmF0dXJlLjwvcD4KLSAgPHA+WW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiB0byB1bmRlcnN0YW5kIGhvdyBhIHNpZ25hdHVyZSBpcyBjb25zdHJ1Y3RlZC48L3A+Ci08L2Rpdj4KLTx1bD4KLSAgPGxpPiAKLSAgICA8ZGl2PjxzdHJvbmc+R2xvYmFsIHR5cGVzLjwvc3Ryb25nPiBJZiB0aGUgdHlwZSBoYXMgYSBuYW1lLCBpdCdzIGEgZ2xvYmFsIAotICAgICAgdHlwZS4gVGhlIGZvbGxvd2luZyBmb3JtIGlzIHVzZWQ6PC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8ZGl2PiAKLSAgICAgICAgPHByZT5UPSZsdDtsb2NhbG5hbWUmZ3Q7QCZsdDt0YXJnZXROYW1lc3BhY2UmZ3Q7PC9wcmU+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgICA8cD5UaGUgJnF1b3Q7VCZxdW90OyBpcyBmb3IgJnF1b3Q7dHlwZSwmcXVvdDsgb2YgY291cnNlLiAmcXVvdDtsb2NhbG5hbWUmcXVvdDsgCi0gICAgICBpcyBhIGNvbnZlbnRpb24gdXNlZCBieSBxbmFtZXMgKHF1YWxpZmllZCBuYW1lcyksIHdoaWNoIGluY2x1ZGUgYSBsb2NhbCAKLSAgICAgIG5hbWUgYW5kIHRoZSBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiBTbyBhbiBleGFtcGxlIG1pZ2h0IGJlOjwvcD4KLSAgICA8cHJlPlQ9Y3VzdG9tZXJAb3BlbnVyaS5vcmc8L3ByZT4KLSAgPC9saT4KLSAgPGxpPjxzdHJvbmc+RG9jdW1lbnQgdHlwZXMgYW5kIGdsb2JhbCBhdHRyaWJ1dGUgdHlwZXMuPC9zdHJvbmc+IFRoZXNlIGNvcnJlc3BvbmQgCi0gICAgdG8gYSBzcGVjaWFsIGFub255bW91cyB0eXBlIGNvbnRhaW5pbmcgb25lIGdsb2JhbCBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gVGhlc2UgCi0gICAgc3BlY2lhbCB0eXBlcyBhcmUgZ2VuZXJhdGVkIGJ5IFhNTEJlYW5zIHRvIHJlcHJlc2VudCBnbG9iYWwgdHlwZXMgZGVjbGFyZWQgCi0gICAgd2l0aCB0aGUgJmx0O2VsZW1lbnQmZ3Q7IG9yICZsdDthdHRyaWJ1dGUmZ3Q7IHRhZyBpbiBzY2hlbWEuIEJlY2F1c2Ugc3VjaCAKLSAgICB0eXBlcyBhcmUgdHlwZXMsIGJ1dCBhcmUgZGVjbGFyZWQgYXMgZWxlbWVudHMgb3IgYXR0cmlidXRlcywgdGhleSByZXF1aXJlIAotICAgIHNwZWNpYWwgdHJlYXRtZW50LiBUaGUgZm9sbG93aW5nIHNpZ25hdHVyZSBmb3JtIGlzIHVzZWQ6IAotICAgIDxkaXY+IAotICAgICAgPHByZT4KLUQ9Jmx0O2RvY3VtZW50LWVsZW1lbnQtbmFtZSZndDtAJmx0O3RhcmdldE5hbWVzcGFjZSZndDsKLVI9Jmx0O2F0dHJpYnV0ZS10eXBlLW5hbWUmZ3Q7QCZsdDt0YXJnZXROYW1lc3BhY2UmZ3Q7Ci08L3ByZT4KLSAgICAgIDxkaXY+PC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8ZGl2Pk5vdGUgdGhhdCB0aGVzZSBhcmUgYWxzbyB0aGUgc2lnbmF0dXJlcyBvZiBhIHR5cGUgcmV0dXJuZWQgYnkgYSBGb29Eb2N1bWVudC50eXBlIAotICAgICAgICBvciBGb29BdHRyaWJ1dGUudHlwZSBtZXRob2QgY2FsbC48L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9saT4KLSAgPGxpPjxzdHJvbmc+QW5vbnltb3VzIHR5cGVzLjwvc3Ryb25nPiBJZiB0aGUgdHlwZSBpcyBhbm9ueW1vdXMsIGl0IGlzIGRlZmluZWQgCi0gICAgYXMgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUsIG9yIHdpdGhpbiBhIGZ1cnRoZXIgYW5vbnltb3VzIHR5cGUuIEluIHRoaXMgY2FzZSwgCi0gICAgdGhlIHNpZ25hdHVyZSBpcyBidWlsdCBieSBlc3RhYmxpc2hpbmcgdGhlIGxvY2FsIGNvbnRleHQgKGluIG9yZGVyIHdvcmRzLCAKLSAgICB3aGF0IGlzIHRoZSBhbm9ueW1vdXMgdHlwZSBuZXN0ZWQgaW4/KS4gRnJvbSB0aGUgbG9jYWwgY29udGV4dCwgdGhlIGxhcmdlciAKLSAgICBjb250ZXh0IGlzIGJ1aWx0IHJlY3Vyc2l2ZWx5LiBJbiBvdGhlciB3b3JkcywgdGhlIHNpZ25hdHVyZSBpcyBidWlsdCBieSBnaXZpbmcgCi0gICAgbm90IG9ubHkgdGhlIGFub255bW91cyB0eXBlIGl0c2VsZiwgYnV0IGFsc28gYnkgZGVzY3JpYmluZyBpdHMgY29udGV4dC4gCi0gICAgPHA+IFRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIHVzZWQgZm9yIGJ1aWxkaW5nIGEgc2lnbmF0dXJlIGZvciBhbiBhbm9ueW1vdXMgCi0gICAgICB0eXBlLiA8L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPiBJdCBtaWdodCBiZSBhbiBhbm9ueW1vdXMgdHlwZSBkZWZpbmVkIGluc2lkZSBhIGxvY2FsIGVsZW1lbnQgb3IgYXR0cmlidXRlLCAKLSAgICAgICAgd2hpY2ggaW4gdHVybiBpcyBkZWZpbmVkIHdpdGhpbiBzb21ldGhpbmcgZWxzZTogCi0gICAgICAgIDxwPklmIHRoZSBlbGVtZW50IGlzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIiBzdHlsZT0ibGFuZ2lubGluZSI+Zm9ybT0mcXVvdDtxdWFsaWZpZWQmcXVvdDs8L3NwYW4+IAotICAgICAgICAgICh0aGUgdXN1YWwgZGVmYXVsdCk6PC9wPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj4gCi0gICAgICA8cHJlPkU9Jmx0O2VsdG5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHdoaWNoIHRoZSBlbHQgaXMgZGVmaW5lZCZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2PklmIHRoZSBlbGVtZW50IGlzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIiBzdHlsZT0ibGFuZ2lubGluZSI+Zm9ybT0mcXVvdDt1bnF1YWxpZmllZCZxdW90Ozwvc3Bhbj46PC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPlU9Jmx0O2VsdG5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHdoaWNoIHRoZSBlbHQgaXMgZGVmaW5lZCZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2PklmIHRoZSBhdHRyaWJ1dGUgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiIHN0eWxlPSJsYW5nbGluZSI+Zm9ybT0mcXVvdDt1bnF1YWxpZmllZCZxdW90Ozwvc3Bhbj4gCi0gICAgICAodGhlIHVzdWFsIGRlZmF1bHQpOjwvZGl2PgotICAgIDxkaXY+IAotICAgICAgPHByZT5BPSZsdDthdHRybmFtZSZndDt8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgdHlwZSB3aXRoaW4gdGhlIGF0dHIgaXMgZGVmaW5lZCZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2PmlmIHRoZSBhdHRyaWJ1dGUgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiIHN0eWxlPSJsYW5naW5saW5lIj5mb3JtPSZxdW90O3F1YWxpZmllZCZxdW90Ozwvc3Bhbj46PC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPlE9Jmx0O2F0dHJuYW1lJmd0O3wmbHQ7c2lnbmF0dXJlIG9mIHRoZSB0eXBlIHdpdGhpbiB0aGUgYXR0ciBpcyBkZWZpbmVkJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDx1bD4KLSAgICA8bGk+SXQgbWlnaHQgYmUgYW4gYW5vbnltb3VzIHR5cGUgZGVmaW5lZCBhIHNpbXBsZSByZXN0cmljdGlvbiwgdW5pb24sIG9yIAotICAgICAgbGlzdCBkZWZpbml0aW9uOjwvbGk+Ci0gIDwvdWw+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PiAKLSAgICAgIDxwcmU+TT0jfCZsdDtzaWduYXR1cmUgb2YgdGhlIGNvbnRhaW5pbmcgdW5pb24gdHlwZSZndDs8L3ByZT4KLSAgICAgIDxwPihUaGUgIyBpcyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoIHVuaW9uIG1lbWJlciBpdCBpcywgYnkgc291cmNlIG9yZGVyIAotICAgICAgICAmIzgyMTI7IHN1Y2ggYXMgMCwxLDIsIGV0Yy4pPC9wPgotICAgICAgPHByZT5CPXwmbHQ7c2lnbmF0dXJlIG9mIHRoZSBjb250YWluaW5nIGJhc2UgdHlwZSBmb3IgYSByZXN0cmljdGlvbiZndDs8L3ByZT4KLSAgICAgIDxwcmU+ST18Jmx0O3NpZ25hdHVyZSBvZiB0aGUgY29udGFpbmluZyBsaXN0IHR5cGUmZ3Q7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPHVsPgotICAgIDxsaT4gCi0gICAgICA8ZGl2PiBJbiB0aGUgZnV0dXJlIGlmIGFub255bW91cyB0eXBlcyBhcmUgYWxsb3dlZCBpbiBzb21lIG90aGVyIGNvbnRleHQsIAotICAgICAgICB0aGVyZSBtYXkgYmUgbW9yZSBjb2Rlcy48L2Rpdj4KLSAgICA8L2xpPgotICA8L3VsPgotPC91bD4KLTxoMj5BbiBFeGFtcGxlPC9oMj4KLTxwPlNvLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBsaXN0IGl0ZW1zIHdpdGhpbiBhbiAKLSAgYXR0cmlidXRlIG9mIGFuIGluc3RhbmNlIHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KLTxibG9ja3F1b3RlPiAKLSAgPGRpdj4gCi0gICAgPHByZT4gJmx0O3Jvb3QgbXlsaXN0PSZxdW90OzQzMiA5OTkgMTQzIDEyMyZxdW90Oy8mZ3Q7PC9wcmU+Ci0gIDwvZGl2PgotPC9ibG9ja3F1b3RlPgotPGRpdj4gVGhlIHNjaGVtYSwgaWYgZG9uZSB3aXRoIGxvdHMgb2YgbmVzdGVkIHR5cGVzLCBjb3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIAotICB0aGlzOjwvZGl2PgotPGJsb2NrcXVvdGU+Ci0gIDxkaXY+Ci0gICAgPHByZT4KLSZsdDtzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O215TmFtZXNwYWNlJnF1b3Q7IGVsZW1lbnRGb3JtRGVmYXVsdD0mcXVvdDtxdWFsaWZpZWQmcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O3Jvb3QmcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Y29tcGxleFR5cGUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7bXlsaXN0JnF1b3Q7Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3NpbXBsZVR5cGUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bGlzdCZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzaW1wbGVUeXBlJmd0OyAmbHQ7IS0tVGhpcyBpcyB0aGUgdHlwZSB0aGF0IHRoZSBzaWduYXR1cmUgaXMgZm9yIC0tJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Jlc3RyaWN0aW9uIGJhc2U9JnF1b3Q7eHM6bm9uTmVnYXRpdmVJbnRlZ2VyJnF1b3Q7Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3RvdGFsRGlnaXRzIHZhbHVlPSZxdW90OzMmcXVvdDsvJmd0Oy4uCi08L3ByZT4KLSAgPC9kaXY+Ci08L2Jsb2NrcXVvdGU+Ci08ZGl2PiBUaGUgc2lnbmF0dXJlIGZvciB0aGUgc2ltcGxlVHlwZSBpbmRpY2F0ZWQgaW4gdGhlIGV4YW1wbGUgd291bGQgYmU6PC9kaXY+Ci08YmxvY2txdW90ZT4KLSAgPHByZT5JPXxBPW15bGlzdHxFPXJvb3R8RD1yb290QG15TmFtZXNwYWNlPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08ZGl2PiAKLSAgPHA+WW91IGNvdWxkIHJlYWQgdGhpcyBhczogPC9wPgotPC9kaXY+Ci08YmxvY2txdW90ZT4KLSAgPGRpdj4mcXVvdDtUaGUgdHlwZSBvZiB0aGUgbGlzdCBpdGVtIHwgd2l0aGluIHRoZSB0eXBlIG9mIHRoZSBteWxpc3QgYXR0cmlidXRlJ3MgCi0gICAgdHlwZSB8IHdpdGhpbiB0aGUgdHlwZSBvZiB0aGUgcm9vdCBlbGVtZW50IHwgd2l0aGluIHRoZSBkb2N1bWVudCB0eXBlIGZvciAKLSAgICAmbHQ7cm9vdCZndDsgZG9jdW1lbnRzIHwgaW4gdGhlIG15TmFtZXNwYWNlIG5hbWVzcGFjZSZxdW90Oy48L2Rpdj4KLTwvYmxvY2txdW90ZT4KLTxkaXY+IAotICA8cD5Ob3RlIHRoYXQgdGhlIHNpZ25hdHVyZSBzdHJ1Y3R1cmUgbWlycm9ycyB0aGUgSmF2YSBjbGFzcyBzdHJ1Y3R1cmUgZ2VuZXJhdGVkIAotICAgIGJ5IFhNTEJlYW5zIHdoZW4gY29tcGlsaW5nIHRoZSBzY2hlbWEuIEluIG90aGVyIHdvcmRzLCBpZiB5b3Ugd2VyZSB0byBjb21waWxlIAotICAgIGEgc2NoZW1hIHRoYXQgaW5jbHVkZWQgdGhlIHByZWNlZGluZyBzbmlwcGV0LCB5b3Ugd291bGQgYmUgYWJsZSB0byBhY2Nlc3MgCi0gICAgYW4gaW5zdGFuY2Ugb2YgdGhlIHNjaGVtYSB3aXRoIEphdmEgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgotICA8cHJlPlNjaGVtYVR5cGUgc1R5cGUgPSBSb290RG9jdW1lbnQuUm9vdC5NeUxpc3QuSXRlbS50eXBlOzwvcHJlPgotPC9kaXY+Ci08cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+Ci08cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTEyNDYuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+IAotPHRpdGxlPkphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20gU2NoZW1hPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi0KLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+IAotCi08bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci0KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci0gCi08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLQotPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJ5b3VyIG5hbWUiPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiI+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyI+Ci08bWV0YSBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiIGNvbnRlbnQ9IjEwLzI1LzAyIj4KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPjwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Ci08aDE+IEphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvaDE+Ci08ZGl2IGlkPSJ0b3BpY3RleHQiPiAKLSAgPHA+V2hlbiB5b3UgY29tcGlsZSBYTUwgc2NoZW1hLCB0aGUgcmVzdWx0aW5nIEFQSSBpcyBtYWRlIHVwIG9mIHR3byBjYXRlZ29yaWVzIAotICAgIG9mIHR5cGVzOiBidWlsdC1pbiB0eXBlcyB0aGF0IG1pcnJvciB0aG9zZSBpbiB0aGUgc2NoZW1hIHNwZWNpZmljYXRpb24gYW5kIAotICAgIG90aGVycyB0aGF0IGFyZSBnZW5lcmF0ZWQgZnJvbSB1c2VyLWRlcml2ZWQgc2NoZW1hIHR5cGVzLiBUaGlzIHRvcGljIHByb3ZpZGVzIAotICAgIGFuIG92ZXJ2aWV3IG9mIHRoZSBKYXZhIHR5cGVzIGdlbmVyYXRlZCBmb3IgdXNlci1kZXJpdmVkIHR5cGVzLCBkZXNjcmliaW5nIAotICAgIHRoZSBtZXRob2RzIHRoZSBKYXZhIHR5cGVzIHByb3ZpZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGJ1aWx0LWluIHR5cGVzLCAKLSAgICBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIFN1cHBvcnQgZm9yIAotICAgIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWV0aG9kcyBleHBvc2VkIAotICAgIGJ5IGdlbmVyYXRlZCB0eXBlcywgc2VlIDxhIGhyZWY9ImNvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbCI+TWV0aG9kcyAKLSAgICBmb3IgR2VuZXJhdGVkIEphdmEgVHlwZXM8L2E+LjwvcD4KLSAgPHA+SW4gZ2VuZXJhbCwgYW4gQVBJIGdlbmVyYXRlZCBmcm9tIHNjaGVtYSBpcyBhbiBpbnR1aXRpdmUgbWVhbnMgdG8gYWNjZXNzIAotICAgIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlIHNjaGVtYS4gWW91J2xsIHByb2JhYmx5IGZpbmQgdGhhdCBmb3IgbW9zdCB1c2VzIAotICAgIGl0J3MgdW5uZWNlc3NhcnkgdG8ga25vdyB0aGUgcnVsZXMgZm9yIGdlbmVyYXRpbmcgaXQgaW4gb3JkZXIgdG8gdXNlIGl0LiBIb3dldmVyLCAKLSAgICBmb3IgdGhvc2UgY2FzZXMgd2hlbiBpdCdzIHVuY2xlYXIgd2hhdCdzIGdvaW5nIG9uIGJlaGluZCB0aGUgc2NlbmVzIChvciBpZiAKLSAgICB5b3UncmUganVzdCBjdXJpb3VzKSwgdGhpcyB0b3BpYyBkZXNjcmliZXMgdGhlIHJ1bGVzLjwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBYTUxCZWFucyBBUEkgYWxzbyBwcm92aWRlcyBhIAotICAgIHdheSBmb3IgeW91IHRvIGdldCBpbmZvcm1hdGlvbiA8ZW0+YWJvdXQgPC9lbT50aGUgdHlwZSBzeXN0ZW0gaXRzZWxmICYjODIxMjsgCi0gICAgaW4gb3RoZXIgd29yZHMsIGFib3V0IHRoZSBBUEkgYW5kIHRoZSB1bmRlcmx5aW5nIHNjaGVtYS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIAotICAgIHNlZSA8YSBocmVmPSJjb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIj5JbnRyb2R1Y3Rpb24gdG8gU2NoZW1hIFR5cGUgCi0gICAgU2lnbmF0dXJlczwvYT4uPC9wPgotICA8cD5FYWNoIG9mIHRoZSB0eXBlcyBnZW5lcmF0ZWQgd2hlbiB5b3UgY29tcGlsZSBhIHNjaGVtYSBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgCi0gICAgZm9yIGFjY2VzcyB0byBYTUwgaW5zdGFuY2VzIGNvbmZvcm1pbmcgdG8gdGhhdCBwYXJ0IG9mIHRoZSBzY2hlbWEuIFN0YXJ0IGJ5IAotICAgIHRha2luZyBhIGxvb2sgYXQgYSBzaW1wbGUgWE1MIGFuZCBzY2hlbWEgZXhhbXBsZS4gVGhlIGZvbGxvd2luZyBzY2hlbWEgZGVzY3JpYmVzIAotICAgIGFuIFhNTCBkb2N1bWVudCB0byBjb250YWluIGEgc3RvY2sgcHJpY2UgcXVvdGUuPC9wPgotICA8cHJlPiZsdDt4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsKLSAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwcmljZS1xdW90ZSImZ3Q7Ci0gICAgICAgICZsdDt4czpjb21wbGV4VHlwZSZndDsKLSAgICAgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJzdG9jay1zeW1ib2wiIHR5cGU9InhzOnN0cmluZyIvJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InN0b2NrLXByaWNlIiB0eXBlPSJ4czpmbG9hdCIvJmd0OwotICAgICAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLSAgICAmbHQ7L3hzOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzOnNjaGVtYSZndDsKLTwvcHJlPgotICA8cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgWE1MIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBzY2hlbWEuPC9wPgotICA8cHJlPiZsdDtwcmljZS1xdW90ZSZndDsKLSAgICAmbHQ7c3RvY2stc3ltYm9sJmd0O0JFQVMmbHQ7L3N0b2NrLXN5bWJvbCZndDsKLSAgICAmbHQ7c3RvY2stcHJpY2UmZ3Q7NTkuMjEmbHQ7L3N0b2NrLXByaWNlJmd0OwotJmx0Oy9wcmljZS1xdW90ZSZndDs8L3ByZT4KLSAgPHA+V2hlbiB5b3UgY29tcGlsZSB0aGlzIHNjaGVtYSwgeW91IGdldCB0d28gZ2VuZXJhdGVkIFhNTEJlYW5zIGludGVyZmFjZXM6IAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4gUHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudC5QcmljZVF1b3RlPC9zcGFuPi48L3A+Ci0gIDxwPkZyb20gdGhlIHNjaGVtYSBwb2ludCBvZiB2aWV3LCB0aGUgZ2VuZXJhdGVkIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPiAKLSAgICBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgPGVtPmNvbXBsZXggdHlwZTwvZW0+IHlvdSBzZWUgaW5zaWRlIHRoZSBzY2hlbWEncyAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2UtcXVvdGU8L3NwYW4+IGVsZW1lbnQgZGVjbGFyYXRpb24uIExvb2tpbmcgYXQgCi0gICAgdGhlIFhNTCBpbnN0YW5jZSwgeW91IGNhbiBzZWUgdGhhdCB0aGlzIGNvbXBsZXggdHlwZSB0cmFuc2xhdGVzIGludG8gYSBzZXF1ZW5jZSAKLSAgICBvZiB0d28gZWxlbWVudHMsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zdG9jay1zeW1ib2w8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stcHJpY2U8L3NwYW4+LiAKLSAgICBTbyBpdCdzIG5vdCBzdXJwcmlzaW5nIHRoYXQgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPiAKLSAgICBpbnRlcmZhY2UgZXhwb3NlcyBtZXRob2RzIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFN0b2NrUHJpY2U8L3NwYW4+IAotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2V0U3RvY2tQcmljZTwvc3Bhbj4gdG8gc2V0IHRoZSB2YWx1ZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stcHJpY2U8L3NwYW4+IAotICAgIGVsZW1lbnQuPC9wPgotICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudDwvc3Bhbj4gaW50ZXJmYWNlLCBvbiB0aGUgCi0gICAgb3RoZXIgaGFuZCwgcmVwcmVzZW50cyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiA8ZW0+ZG9jdW1lbnQ8L2VtPiAKLSAgICB0aGF0IGNvbnRhaW5zIHRoZSByb290IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudC4gCi0gICAgWE1MQmVhbnMgY3JlYXRlcyBhIHNwZWNpYWwgJnF1b3Q7ZG9jdW1lbnQmcXVvdDsgdHlwZSBmb3IgZ2xvYmFsIGVsZW1lbnQgdHlwZXMuIAotICAgIEEgZG9jdW1lbnQgdHlwZSBwcm92aWRlcyBhIHdheSBmb3IgeW91IHRvIGdldCBhbmQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyAKLSAgICB0eXBlLCBoZXJlIHJlcHJlc2VudGVkIGJ5IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPi4gVGhlIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudCBpcyBjb25zaWRlcmVkIGEgPGVtPmdsb2JhbDwvZW0+IAotICAgIGVsZW1lbnQgYmVjYXVzZSBpdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIGFueXdoZXJlIGVsc2UgaW4gdGhlIHNjaGVtYS4gRm9yIAotICAgIGdsb2JhbCBlbGVtZW50cywgdGhlIFhNTEJlYW5zIHNjaGVtYSBjb21waWxlciBnZW5lcmF0ZXMgYW4gaW50ZXJmYWNlIHdob3NlIAotICAgIG5hbWUgZW5kcyB3aXRoICZxdW90O0RvY3VtZW50LiZxdW90OyBUaGlzIGlzIGJlY2F1c2UgYW4gWE1MIHNjaGVtYSBoYXMgbm8gCi0gICAgd2F5IG9mIGRlZmluaW5nIGEgJnF1b3Q7cm9vdCZxdW90OyBlbGVtZW50OyBhbnkgZ2xvYmFsIGVsZW1lbnQgY2FuIGJlIHRoZSAKLSAgICByb290LjwvcD4KLSAgPHA+VGhlIGZvbGxvd2luZyBiaXQgb2YgSmF2YSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB5b3UgbWlnaHQgdXNlIHRoZXNlIGludGVyZmFjZXMgCi0gICAgdG8gZ2V0IHRoZSBzdG9jayBwcmljZSBjb250YWluZWQgaW4gdGhlIFhNTC48L3A+Ci0gIDxwcmU+Ci1wdWJsaWMgc3RhdGljIGZsb2F0IGdldFN0b2NrUHJpY2UoamF2YS5pby5GaWxlIG9yZGVyWE1MKSB0aHJvd3MgRXhjZXB0aW9uIAotewotICAgIFByaWNlUXVvdGVEb2N1bWVudCBkb2NYTUwgPSBQcmljZVF1b3RlRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShvcmRlclhNTCk7Ci0gICAgUHJpY2VRdW90ZSBxdW90ZVhNTCA9IGRvY1hNTC5nZXRQcmljZVF1b3RlKCk7Ci0gICAgZmxvYXQgc3RvY2tQcmljZSA9IHF1b3RlWE1MLmdldFN0b2NrUHJpY2UoKTsKLSAgICByZXR1cm4gc3RvY2tQcmljZTsKLX0KLTwvcHJlPgotICA8cD5UaGlzIGNvZGUgbG9hZHMgdGhlIFhNTCBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdCwgCi0gICAgY29udmVydGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBhcnNlPC9zcGFuPiBtZXRob2QncyByZXR1cm4gdmFsdWUgCi0gICAgdG8gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBpbnN0YW5jZS4gSXQgdGhlbiAKLSAgICB1c2VzIHRoaXMgaW5zdGFuY2UgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPi4gCi0gICAgV2l0aCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZTwvc3Bhbj4sIHRoZSBjb2RlIGV4dHJhY3RzIHRoZSBzdG9jayAKLSAgICBwcmljZS4gPC9wPgotPC9kaXY+Ci08ZGl2PiAKLSAgPGRpdiBpZD0idG9waWN0ZXh0Ij4gCi0gICAgPHA+VGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbiBwcm92aWRlcyBhIHJpY2ggc2V0IG9mIHJ1bGVzIHRocm91Z2ggd2hpY2ggCi0gICAgICB5b3UgY2FuIGRlcml2ZSBuZXcgdHlwZXMuIFdoZW4geW91IGdlbmVyYXRlIGludGVyZmFjZXMgZnJvbSB5b3VyIHNjaGVtYSwgCi0gICAgICBYTUxCZWFucyB1c2VzIHRoZSBzY2hlbWEncyBydWxlcyB0byBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGludGVyZmFjZXMuIAotICAgICAgVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgc29tZSBvZiB0aGUgZ3VpZGVsaW5lcyBieSB3aGljaCB0aGlzIGlzIGRvbmUuPC9wPgotICAgIDxoMj5OYW1lcyBmb3IgSW50ZXJmYWNlczwvaDI+Ci0gICAgPHA+SW50ZXJmYWNlcyBhcmUgZ2VuZXJhdGVkIGZvciBzY2hlbWEgdHlwZXMgKGJvdGggc2ltcGxlIGFuZCBjb21wbGV4KS4gQW5vbnltb3VzIAotICAgICAgc2NoZW1hIHR5cGVzIHJlc3VsdCBpbiBpbm5lciBpbnRlcmZhY2VzIGluc2lkZSB0aGUgdHlwZSBpbnRlcmZhY2UgaW4gd2hpY2ggCi0gICAgICB0aGV5IGFyZSBkZWZpbmVkLiBUaGVpciBuYW1lIGNvbWVzIGZyb20gdGhlIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIHdoaWNoIAotICAgICAgdGhleSBpcyBkZWZpbmVkLjwvcD4KLSAgICA8cD5OYW1lcyBmb3Igc2NoZW1hIHR5cGVzIGJlY29tZSBKYXZhLWZyaWVuZGx5IG5hbWVzIHdoZW4gdGhlIHNjaGVtYSBpcyBjb21waWxlZC4gCi0gICAgICBJbiBvdGhlciB3b3JkcywgbmFtZXMgc3VjaCBhcyAicHJpY2UtcXVvdGUiIGJlY29tZSAiUHJpY2VRdW90ZS4iIEluIGFkZGl0aW9uLCAKLSAgICAgIGEgc2NoZW1hJ3MgWE1MIG5hbWVzcGFjZSBVUklzIGJlY29tZSBwYWNrYWdlIG5hbWVzIGZvciBYTUxCZWFuIHR5cGVzIGdlbmVyYXRlZCAKLSAgICAgIGZyb20gdGhlIHNjaGVtYS4gVGhlIHdheSB0aGlzIG5hbWUgdHJhbnNsYXRpb24gaXMgZG9uZSBpcyBkZXNjcmliZWQgYnkgc2VjdGlvbiAKLSAgICAgIEMgb2YgdGhlIEphdmEgQVBJIGZvciBYTUwgQmluZGluZyAoSkFYQikgc3BlY2lmaWNhdGlvbiBhdCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9kb3dubG9hZHMvamF4Yi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+IAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4Yi5odG1sLjwvYT4gPC9wPgotICAgIDxwPkhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzOjwvcD4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+IAotICAgICAgICA8dGQ+PHN0cm9uZz5TY2hlbWEgVGFyZ2V0IE5hbWVzcGFjZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij48c3Ryb25nPlhNTCBMb2NhbG5hbWU8L3N0cm9uZz48L3RkPgotICAgICAgICA8dGQ+PHN0cm9uZz5GdWxseS1RdWFsaWZpZWQgWE1MQmVhbiBUeXBlIE5hbWU8L3N0cm9uZz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4gCi0gICAgICAgIDx0ZD5odHRwOi8vd3d3Lm15Y29tcGFueS5jb20vMjAwMi9idXllcjwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij5wdXJjaGFzZS1vcmRlci00PC90ZD4KLSAgICAgICAgPHRkPmNvbS5teWNvbXBhbnkueDIwMDIuYnV5ZXIuUHVyY2hhc2VPcmRlcjQ8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4gCi0gICAgICAgIDx0ZD5odHRwOi8vbXljby5jb20vc2FtcGxlLmh0bWw8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjE1NSI+U2FtcGxlRG9jdW1lbnQ8L3RkPgotICAgICAgICA8dGQ+Y29tLm15Y28uc2FtcGxlLlNhbXBsZURvY3VtZW50PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+IAotICAgICAgICA8dGQ+aHR0cDovL29wZW51cmkub3JnL3Rlc3RfY2FzZV8xPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxNTUiPnRlc3RfdHlwZTwvdGQ+Ci0gICAgICAgIDx0ZD5vcmcub3BlbnVyaS50ZXN0Q2FzZTEuVGVzdFR5cGU8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxwPldoZW4gdGhlcmUgYXJlIG5hbWUgY29sbGlzaW9ucywgdGhlIGdlbmVyYXRlZCB0eXBlcyB3aWxsIGhhdmUgbmFtZXMgd2l0aCAKLSAgICAgIG51bWVyYWxzIGFwcGVuZGVkJm5ic3A7lyBmb3IgZXhhbXBsZSwgIlRlc3RUeXBlMiIuPC9wPgotICAgIDxoMj5HbG9iYWwgRWxlbWVudHMgYW5kIEF0dHJpYnV0ZXM8L2gyPgotICAgIDxwPkluIHNjaGVtYSwgZ2xvYmFsIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBhcmUgdGhvc2UgdGhhdCBhcmUgCi0gICAgICBkZWNsYXJlZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBzY2hlbWEgKHRoYXQgaXMsIGltbWVkaWF0ZWx5IHdpdGhpbiB0aGUgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2NoZW1hPC9zcGFuPiByb290IGVsZW1lbnQpLiBCZWNhdXNlIHRoZXkgYXJlIGdsb2JhbCwgCi0gICAgICB0aGV5IG1heSBiZSByZWZlcmVuY2VkIGZyb20gaW5zaWRlIHRoZSBzY2hlbWEgYnkgbmFtZS4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jcmVkaXRSZXBvcnQ8L3NwYW4+IAotICAgICAgKG5vdCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNyZWRpdFJlcG9ydFR5cGU8L3NwYW4+IGNvbXBsZXggdHlwZSkgCi0gICAgICBlbGVtZW50IGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzY2hlbWEgaXMgYW4gZXhhbXBsZS48L3A+Ci0gICAgPHByZT4KLSZsdDt4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGVzL2NyZWRpdFJlcG9ydCZxdW90OyAKLSAgICB4bWxuczpjcj0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvc2FtcGxlcy9jcmVkaXRSZXBvcnQmcXVvdDsgCi0gICAgeG1sbnM6eHM9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEmcXVvdDsKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9JnF1b3Q7cXVhbGlmaWVkJnF1b3Q7Ci0gICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9JnF1b3Q7dW5xdWFsaWZpZWQmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7Y3JlZGl0UmVwb3J0VHlwZSZxdW90OyZndDsKLSAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtiYW5rUmVwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7eHM6c3RyaW5nJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7dGF4UmVwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7eHM6c3RyaW5nJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7Y3JlZGl0UmVwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7Y3I6Y3JlZGl0UmVwb3J0VHlwZSZxdW90Oy8mZ3Q7Ci0mbHQ7L3hzOnNjaGVtYSZndDs8L3ByZT4KLSAgICA8cD5YTUxCZWFucyBnZW5lcmF0ZXMgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgZm9yIGVhY2ggb2YgdGhlc2UuIEFsc28sIGdsb2JhbCAKLSAgICAgIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSB0eXBlcyBhcmUgc29tZXdoYXQgdW5pcXVlIGluIHRoYXQgdGhlIHNjaGVtYSBjb21waWxlciAKLSAgICAgIHdpbGwgY3JlYXRlIHNwZWNpYWwgdHlwZXMgdG8gaG9sZCB0aGUgZ2xvYmFsbHkgZGVmaW5lZCBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gCi0gICAgICBUaGUgbmFtZXMgb2YgdGhlc2UgdHlwZXMgd2lsbCBiZSBhcHBlbmRlZCB3aXRoICZxdW90O0RvY3VtZW50JnF1b3Q7IChmb3IgCi0gICAgICBlbGVtZW50cykgb3IgJnF1b3Q7QXR0cmlidXRlJnF1b3Q7IChmb3IgYXR0cmlidXRlcykuIFlvdSBjYW4gcmV0cmlldmUgdGhlIAotICAgICAgZWxlbWVudCBvciBhdHRyaWJ1dGUgaXRzZWxmIChvciBjcmVhdGUgYSBuZXcgb25lKSBieSBjYWxsaW5nIHRoZSBhY2Nlc3NvciAKLSAgICAgIG1ldGhvZHMgdGhhdCB0aGUgc3BlY2lhbCB0eXBlcyBwcm92aWRlLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgd291bGQgY3JlYXRlIAotICAgICAgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNyZWRpdFJlcG9ydCBlbGVtZW50LjwvcD4KLSAgICA8cHJlPgotLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWFsIGRvY3VtZW50IHR5cGUuCi1DcmVkaXRSZXBvcnREb2N1bWVudCByZXBvcnREb2MgPSBDcmVkaXRSZXBvcnREb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0vKgotICogVXNlIHRoZSBkb2N1bWVudCB0eXBlIHRvIGFkZCBhIG5ldyBjcmVkaXRSZXBvcnQgZWxlbWVudCB0byB0aGUgWE1MIGluc3RhbmNlLgotICogTm90ZSB0aGF0IHRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBhZGROZXdDcmVkaXRSZXBvcnQgbWV0aG9kIGlzIHRoZSAKLSAqIGNyZWRpdFJlcG9ydFR5cGUgY29tcGxleCB0eXBlIGRlZmluZWQgZm9yIGl0IGluIHNjaGVtYS4KLSAqLwotQ3JlZGl0UmVwb3J0VHlwZSByZXBvcnQgPSByZXBvcnREb2MuYWRkTmV3Q3JlZGl0UmVwb3J0KCk7Ci08L3ByZT4KLSAgICA8aDI+R2xvYmFsIFVzZXItRGVyaXZlZCBUeXBlczwvaDI+Ci0gICAgPHA+QSA8ZW0+dXNlci1kZXJpdmVkPC9lbT4gdHlwZSBpcyBvbmUgZGVmaW5lZCB3aXRoIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNvbXBsZXhUeXBlPC9zcGFuPiAKLSAgICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaW1wbGVUeXBlPC9zcGFuPiBlbGVtZW50IGluIHNjaGVtYS4gVXNlci1kZXJpdmVkIAotICAgICAgdHlwZXMgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIHNjaGVtYSBhcmUgZ2xvYmFsLiBYTUxCZWFucyBnZW5lcmF0ZXMgYW4gaW50ZXJmYWNlIAotICAgICAgZm9yIGVhY2ggb2YgdGhlc2UsIGFzIGl0IGRvZXMgd2l0aCBnbG9iYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuIFRoZXNlIAotICAgICAgaW50ZXJmYWNlcyBpbmNsdWRlIG1ldGhvZHMgdGhyb3VnaCB3aGljaCB5b3UgY2FuIGdldCBhbmQgc2V0IHRoZSB0eXBlJ3MgCi0gICAgICB2YWx1ZXMsIGluY2x1ZGluZyBhbnkgbmVzdGVkIGRlcml2ZWQgdHlwZXMgaXQgbWF5IGNvbnRhaW4uIFRoZSBmb2xsb3dpbmcgCi0gICAgICBzY2hlbWEgc25pcHBldCBkZWZpbmVzIGEgdXNlci1kZXJpdmVkIGNvbXBsZXggdHlwZSBjYWxsZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW1UeXBlPC9zcGFuPiwgCi0gICAgICBhbG9uZyB3aXRoIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlVHlwZTwvc3Bhbj4gdGhhdCB1c2VzIGl0IGFzIHRoZSAKLSAgICAgIHR5cGUgZm9yIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtPC9zcGFuPiBjaGlsZCBlbGVtZW50LjwvcD4KLSAgICA8cHJlPgotJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7aXRlbVR5cGUmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O25hbWUmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2Ftb3VudCZxdW90OyB0eXBlPSZxdW90O3hzOmludCZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7cHJpY2UmcXVvdDsgdHlwZT0mcXVvdDt4czpkb3VibGUmcXVvdDsvJmd0OwotICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0mbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7cHJpY2VUeXBlJnF1b3Q7Jmd0OwotICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtpdGVtJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6aXRlbVR5cGUmcXVvdDsgbWluT2NjdXJzPSZxdW90OzAmcXVvdDsgbWF4T2NjdXJzPSZxdW90O3VuYm91bmRlZCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3ByaWNlJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6cHJpY2VUeXBlJnF1b3Q7LyZndDsKLTwvcHJlPgotICAgIDxwPkJ5IGRlZmF1bHQsIHRoZSBnZW5lcmF0ZWQgSmF2YSB0eXBlIGZvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+IAotICAgICAgd291bGQgYmUgYW4gaW50ZXJmYWNlIGNhbGxlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+SXRlbVR5cGU8L3NwYW4+LiBXaXRoIAotICAgICAgdGhpcyB0eXBlLCB5b3Ugd291bGQgYmUgYWJsZSB0byBnZXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZTwvc3Bhbj4sIAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmFtb3VudDwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2U8L3NwYW4+IAotICAgICAgY2hpbGQgZWxlbWVudHMuIEhvd2V2ZXIsIGEgdXNlci1kZXJpdmVkIHR5cGUgKGFzIG9wcG9zZWQgdG8gYW4gZWxlbWVudCBvciAKLSAgICAgIGF0dHJpYnV0ZSkgaXMgYWx3YXlzIGludGVuZGVkIGZvciB1c2UgYXMgdGhlIHR5cGUgdG8gd2hpY2ggYW4gZWxlbWVudCBvciAKLSAgICAgIGF0dHJpYnV0ZSBpcyBib3VuZC4gSW4gb3RoZXIgd29yZHMsIGl0J3MgY29udGFpbmVkIGJ5IGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLiAKLSAgICAgIFdoaWxlIHlvdSBjYW4gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgdXNlci1kZXJpdmVkIHR5cGUsIHRoZSBuZXcgaW5zdGFuY2UncyAKLSAgICAgIHVuZGVybHlpbmcgWE1MIGlzIGEgZnJhZ21lbnQuIEFzIHRoZSBnZW5lcmF0ZWQgQVBJIHdvdWxkIG1ha2UgY2xlYXIsIHRoZSAKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtVHlwZTwvc3Bhbj4gYmVjb21lcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnZXQgCi0gICAgICBtZXRob2QsIG9yIHRoZSBwYXJhbWV0ZXIgb2YgYSBzZXQgbWV0aG9kLjwvcD4KLSAgICA8cHJlPgotLy8gQ3JlYXRlIGEgbmV3IHByaWNlIGRvY3VtZW50LgotUHJpY2VEb2N1bWVudCBwcmljZURvYyA9IFByaWNlRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotUHJpY2VUeXBlIHByaWNlID0gcHJpY2VEb2MuZ2V0UHJpY2UoKTsKLQotLyogCi0gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgSXRlbVR5cGUgYW5kIHNldCB0aGUgdmFsdWVzIG9mIGl0cwotICogY2hpbGQgZWxlbWVudHMuCi0gKi8KLUl0ZW1UeXBlIGl0ZW0gPSBJdGVtVHlwZS5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci1pdGVtLnNldE5hbWUoJnF1b3Q7YmljeWNsZSZxdW90Oyk7Ci1pdGVtLnNldEFtb3VudCgxMik7Ci1pdGVtLnNldFByaWNlKDU2MC4wMCk7Ci0KLS8qIAotICogVXNlIHRoZSBuZXcgSXRlbVR5cGUgaW5zdGFuY2UgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgCi0gKiBwcmljZSBlbGVtZW50J3MgZmlyc3QgaXRlbSBjaGlsZCBlbGVtZW50LiBOb3RpY2UgdGhhdCB0aGUgc2V0IG1ldGhvZAotICogaGVyZSBpcyBhbiAiQXJyYXkiIG1ldGhvZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBpdGVtIGVsZW1lbnQKLSAqIGlzIGRlZmluZWQgd2l0aCBhIG1heE9jY3Vycz0idW5ib3VuZGVkIiBhdHRyaWJ1dGUuIEl0IGNhbiBvY2N1cgotICogbWFueSB0aW1lcyBhcyBhIGNoaWxkIG9mIHByaWNlLgotICovCi1wcmljZS5zZXRJdGVtQXJyYXkoMCwgaXRlbSk7Ci08L3ByZT4KLSAgICA8aDI+TmVzdGVkIEVsZW1lbnRzIGFuZCBEZXJpdmVkIFR5cGVzPC9oMj4KLSAgICA8cD5XaGVuIHlvdXIgc2NoZW1hIGluY2x1ZGVzIG5hbWVkIHR5cGVzIHRoYXQgYXJlIGRlY2xhcmVkIGxvY2FsbHmXd2l0aGluIAotICAgICAgdGhlIGRlY2xhcmF0aW9uIG9mIGFub3RoZXIgZWxlbWVudCBvciB0eXBll3RoZSBzY2hlbWEgdHlwZSdzIGdlbmVyYXRlZCBKYXZhIAotICAgICAgaW50ZXJmYWNlIHdpbGwgYmUgYW4gaW5uZXIgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdHlwZSBpdCdzIG5lc3RlZCBpbi48L3A+Ci0gICAgPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2NoZW1hIHNuaXBwZXQgZGVmaW5lcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZTwvc3Bhbj4gCi0gICAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdlbmRlcjwvc3Bhbj4gZWxlbWVudHMgbmVzdGVkIHdpdGhpbiBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wZXJzb248L3NwYW4+IAotICAgICAgY29tcGxleCB0eXBlLiBJbiBwYXJ0aWN1bGFyLCBub3RlIHRoYXQgdGhlIGdlbmRlciBlbGVtZW50IGlzIGRlZmluZWQgYXMgCi0gICAgICBkZXJpdmluZyBmcm9tIHRoZSB4czpOTVRPS0VOIGJ1aWx0LWluIHR5cGUuPC9wPgotICAgIDxwcmU+Ci0mbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0icGVyc29uIiZndDsKLSAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJnZW5kZXIiJmd0OwotICAgICAgICAgICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iJmd0OwotICAgICAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbGUiLyZndDsKLSAgICAgICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSJmZW1hbGUiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L3hzOnJlc3RyaWN0aW9uJmd0OwotICAgICAgICAgICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwotICAgICAgICAmbHQ7L3hzOmVsZW1lbnQmZ3Q7Ci0gICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci08L3ByZT4KLSAgICA8cD5UaGUgZ2VuZXJhdGVkIGludGVyZmFjZXMgZm9yIHBlcnNvbiBhbmQgZ2VuZGVyIHdvdWxkIGJlIG9yZ2FuaXplZCBpbiBzb3VyY2UgCi0gICAgICBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLiBPZiBjb3Vyc2UsIHlvdSB3b3VsZG4ndCBzZWUgdGhlIHNvdXJjZSwgYnV0IAotICAgICAgeW91IGNhbiBzZWUgaGVyZSB0aGF0IHRoZSBHZW5kZXIgaW50ZXJmYWNlIGlzIG5lc3RlZCB3aXRoIFBlcnNvbi4gQWxzbywgCi0gICAgICBub3RpY2UgdGhhdCBpdCBleHRlbmRzIFhtbE5NVE9LRU4sIG1pcnJvcmluZyB0aGUgc2NoZW1hLjwvcD4KLSAgICA8cHJlPnB1YmxpYyBpbnRlcmZhY2UgUGVyc29uIGV4dGVuZHMgWG1sT2JqZWN0Ci17Ci0gICAgcHVibGljIGludGVyZmFjZSBHZW5kZXIgZXh0ZW5kcyBYbWxOTVRPS0VOCi0gICAgewotICAgICAgICAvLyBNZXRob2RzIG9taXR0ZWQgZm9yIHRoaXMgZXhhbXBsZQotICAgIH0KLSAgICAvLyBNZXRob2RzIG9taXR0ZWQgZm9yIHRoaXMgZXhhbXBsZQotfQotPC9wcmU+Ci0gICAgPHA+WW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkdlbmRlcjwvc3Bhbj4gCi0gICAgICB0eXBlIGluIHRoaXMgd2F5ICh0aGVyZSBhcmUgYWxzbyB2YXJpb3VzIGFsdGVybmF0aXZlcyB0byB0aGlzKTo8L3A+Ci0gICAgPHByZT4KLS8vIENyZWF0ZSBhIG5ldyBQZXJzb24gaW5zdGFuY2UuCi1QZXJzb24gcGVyc29uID0gUGVyc29uLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8qCi0gKiBTZXQgdGhlIGdlbmRlciBlbGVtZW50J3MgdmFsdWUgdXNpbmcgdGhlIAotICogZW51bWVyYXRpb24gZ2VuZXJhdGVkIGZyb20gdGhlIHNjaGVtYS4KLSAqLwotcGVyc29uLnNldEdlbmRlcihHZW5kZXIuRkVNQUxFKTs8L3ByZT4KLSAgICA8aDI+VXNlci1EZXJpdmVkIFNpbXBsZSBUeXBlczwvaDI+Ci0gICAgPHA+SW4gYWRkaXRpb24gdG8gdGhlIDQ2IGJ1aWx0LWluIHNpbXBsZSB0eXBlcyBpbiBYTUwgc2NoZW1hLCBhIHNjaGVtYSBjYW4gCi0gICAgICBpbmNsdWRlIGl0cyBvd24gY3VzdG9tIHNpbXBsZSB0eXBlcyB1c2luZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c2ltcGxlVHlwZTwvc3Bhbj4gCi0gICAgICBkZWNsYXJhdGlvbnMuIFRoZXNlIHVzZXItZGVyaXZlZCBzaW1wbGUgdHlwZXMgYXJlIGFsd2F5cyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4gCi0gICAgICBYTUwgc2NoZW1hIHR5cGVzLiBUaGUgYnVpbHQtaW4gdHlwZXMgY2FuIGJlIG1vZGlmaWVkIGJ5IDxlbT5yZXN0cmljdGluZzwvZW0+IAotICAgICAgdGhlbSwgdGFraW5nIDxlbT51bmlvbnM8L2VtPiBvZiB0aGVtLCBvciBtYWtpbmcgc3BhY2Utc2VwYXJhdGVkIDxlbT5saXN0czwvZW0+IAotICAgICAgb2YgdGhlbS4gRWFjaCBYTUwgc2ltcGxlIHR5cGUgaXMgdHJhbnNsYXRlZCBpbnRvIGEgSmF2YSB0eXBlIHRoYXQgcHJvdmlkZXMgCi0gICAgICBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgZGF0YS48L3A+Ci0gICAgPGgzPlVuaW9uczwvaDM+Ci0gICAgPHA+SW4gc2NoZW1hLCB5b3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6dW5pb248L3NwYW4+IHRvIHNwZWNpZnkgCi0gICAgICBhIHNpbXBsZSB0eXBlIHRoYXQgaXMgYWxsb3dlZCB0byBjb250YWluIHZhbHVlcyBvZiBhIG51bWJlciBvZiBvdGhlciBzaW1wbGUgCi0gICAgICB0eXBlcy4gWE1MQmVhbnMgZ2VuZXJhdGVzIGEgdHlwZSBmb3IgYSB1bmlvbiwganVzdCBhcyBpdCBnZW5lcmF0ZXMgYSB0eXBlIAotICAgICAgZm9yIGFueSBvdGhlciBzY2hlbWEgdHlwZS4gQXQgcnVuIHRpbWUsIHlvdSBjYW4gZGlzY292ZXIgdGhlIHVuZGVybHlpbmcgCi0gICAgICB0eXBlIG9mIGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSBieSBjYWxsaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiAKLSAgICAgIGludGVyZmFjZSdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnN0YW5jZVR5cGU8L3NwYW4+IG1ldGhvZC4gT25jZSB5b3UgCi0gICAgICBoYXZlIGRldGVybWluZWQgdGhlIHR5cGUsIHlvdSBjYW4gY2FzdCBhbiBpbnN0YW5jZSBvZiBhIHVuaW9uIHR5cGUgdG8gdGhlIAotICAgICAgYWN0dWFsIHVuZGVybHlpbmcgaW5zdGFuY2UgdHlwZS48L3A+Ci0gICAgPHByZT4KLSZsdDt4czpzaW1wbGVUeXBlIG5hbWU9JnF1b3Q7aW50T3JTdHJpbmcmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOnVuaW9uIG1lbWJlclR5cGVzPSZxdW90O3hzOmludCB4czpzdHJpbmcmcXVvdDsmZ3Q7Ci0mbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7Ci08L3ByZT4KLSAgICA8cD5HaXZlbiB0aGUgcHJlY2VkaW5nIHNjaGVtYSBzbmlwcGV0LCB5b3UgY291bGQgc2V0IHRoZSBpbnRPclN0cmluZyB2YWx1ZSAKLSAgICAgIHRvLCBzYXksIDYgb3IgJnF1b3Q7c2l4JnF1b3Q7LiBUaGUgdW5pb24gb2YgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludDwvc3Bhbj4gCi0gICAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4gbWFrZXMgYm90aCBhbGxvd2FibGUuPC9wPgotICAgIDxwcmU+Ci0vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHR5cGUuCi1JbnRPclN0cmluZyBpbnRPclN0cmluZyA9IEludE9yU3RyaW5nLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLWludE9yU3RyaW5nLnNldCgmcXVvdDs1JnF1b3Q7KTsKLS8vIFRoaXMgY29kZSBwcmludHMgIlhtbEludCIgdG8gdGhlIGNvbnNvbGUuCi1TeXN0ZW0ub3V0LnByaW50bG4oaW50T3JTdHJpbmcuaW5zdGFuY2VUeXBlKCkuZ2V0U2hvcnRKYXZhTmFtZSgpKTsKLTwvcHJlPgotICAgIDxoMz5SZXN0cmljdGlvbnM8L2gzPgotICAgIDxwPlhNTCBzY2hlbWEgcmVzdHJpY3Rpb25zIG9uIHNpbXBsZSBYTUxCZWFucyB0eXBlcyBhcmUgZW5mb3JjZWQuIFNvLCBmb3IgCi0gICAgICBleGFtcGxlLCBpdCBpcyBpbGxlZ2FsIHRvIHNldCBhIG51bWJlciBvdXRzaWRlIGl0cyByZXN0cmljdGVkIHJhbmdlLiA8L3A+Ci0gICAgPGg0Pk51bWVyaWMgVHlwZSBSZXN0cmljdGlvbnM8L2g0PgotICAgIDxwPkluIHNjaGVtYSwgeW91IGNhbiByZXN0cmljdCBudW1lcmljIHR5cGVzIHRvIGFsbG93LCBmb3IgZXhhbXBsZSwgb25seSBhIAotICAgICAgcGFydGljdWxhciByYW5nZSBvZiB2YWx1ZXMuIEZvciBzdWNoIGEgcmVzdHJpY3Rpb24sIFhNTEJlYW5zIHRhaWxvcnMgdGhlIAotICAgICAgcmVzdWx0aW5nIG5hdHVyYWwgSmF2YSBhbHRlcm5hdGl2ZS4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdGhlIGZvbGxvd2luZyAKLSAgICAgIGVsZW1lbnQgZGVmaW5lZCBpbiBzY2hlbWE6PC9wPgotICAgIDxwcmU+Ci0mbHQ7eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiJmd0OwotICAgICZsdDt4czpzaW1wbGVUeXBlJmd0OwotICAgICAgICAmbHQ7eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciImZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwMDAwIi8mZ3Q7Ci0gICAgICAgICZsdDsveHM6cmVzdHJpY3Rpb24mZ3Q7Ci0gICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwotJmx0Oy94czplbGVtZW50Jmd0OwotPC9wcmU+Ci0gICAgPHA+VGhlIHR5cGUgaXMgcmVzdHJpY3RlZCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czppbnRlZ2VyPC9zcGFuPiwgCi0gICAgICBidXQgYmVjYXVzZSB0aGUgbnVtYmVyJ3MgcmFuZ2UgaXMgbGltaXRlZCB0byBiZXR3ZWVuIDEgYW5kIDEwMDAwMDAsIGl0IHdpbGwgCi0gICAgICBmaXQgaW50byBhIEphdmEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmludDwvc3Bhbj4uIEEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+IAotICAgICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9zcGFuPiB3b3VsZCBiZSB0b28gYmlnIAotICAgICAgZm9yIHRoZSBuZWVkLiBJbiBvdGhlciB3b3JkcywgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXROdW1iZXI8L3NwYW4+IAotICAgICAgbWV0aG9kIGdlbmVyYXRlZCBmb3IgdGhpcyB0eXBlIHdpbGwgcmV0dXJuIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnQ8L3NwYW4+LCAKLSAgICAgIHJhdGhlciB0aGFuIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkJpZ0ludGVnZXI8L3NwYW4+IG9yIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+LjwvcD4KLSAgICA8cD5CeSB0aGUgc2FtZSB0b2tlbiwgYW4gbG9uZyBjYW4gYmUgY29tcGlsZWQgdG8gYW4gaW50IGlmIHRoZSB0b3RhbERpZ2l0cyAKLSAgICAgIGF0dHJpYnV0ZSBpcyAmbHQ7PTksIG9yIHRoZSBtaW4gYW5kIG1heCBhdHRyaWJ1dGUgdmFsdWVzIGFyZSB3aXRoaW4gMzItYml0IAotICAgICAgMnMgY29tcGxlbWVudCByYW5nZS48L3A+Ci0gICAgPHA+VGhlIHNpbmdsZSBwcmltaXRpdmUgWE1MIHR5cGUgeHM6ZGVjaW1hbCBjYW4gYmUgcmVzdHJpY3RlZCBpbiBzZXZlcmFsIHdheXMgCi0gICAgICB0aGF0IGluZmx1ZW5jZSB0aGUgcmVzdWx0aW5nIG5hdHVyYWwgSmF2YSB0eXBlLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlOjwvcD4KLSAgPC9kaXY+Ci08L2Rpdj4KLTx1bD4KLSAgPGxpPgotICAgIDxkaXY+Ci0gICAgICA8ZGl2PkNvbXBpbGVkIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkJpZ0ludGVnZXI8L3NwYW4+IGlmIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZnJhY3Rpb25EaWdpdDwvc3Bhbj4gCi0gICAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gMC4gPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8ZGl2PgotICAgICAgPGRpdj5Db21waWxlZCB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5sb25nPC9zcGFuPiBpZiBpdHMgdG90YWxEaWdpdHMgCi0gICAgICAgIGF0dHJpYnV0ZSBpcyAmbHQ7PTE4LCBvciB0aGUgbWluIGFuZCBtYXggYXJlIHdpdGhpbiA2NC1iaXQgMnMgY29tcGxlbWVudCAKLSAgICAgICAgcmFuZ2UuPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvbGk+Ci08L3VsPgotPGRpdj4KLSAgPGRpdj4KLSAgICA8aDM+RW51bWVyYXRpb25zPC9oMz4KLSAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gZGVyaXZlIGEgbmV3IHR5cGUgYnkgcmVzdHJpY3RpbmcgYSBidWlsdC1pbiB0eXBlIHNvIAotICAgICAgdGhhdCBvbmx5IGEgZmluaXRlIHNldCBvZiB2YWx1ZXMgYXJlIGFsbG93YWJsZS4gV2hlcmUgc2NoZW1hIGRvZXMgdGhpcyBieSAKLSAgICAgIHJlc3RyaWN0aW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzdHJpbmc8L3NwYW4+LCBYTUxCZWFucyBnZW5lcmF0ZXMgCi0gICAgICBhIHNwZWNpYWwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkVudW08L3NwYW4+IHR5cGUuIFdpdGggYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkVudW08L3NwYW4+LCAKLSAgICAgIHlvdSBjYW4gc2VsZWN0IHRoZSBlbnVtZXJhdGVkIHZhbHVlIGVpdGhlciBieSBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlN0cmluZzwvc3Bhbj4gCi0gICAgICB2YWx1ZSBvciBieSBhIG51bWVyaWMgaW5kZXguIFRoZSBpbmRleCdzIHZhbHVlIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlN0cmluZzwvc3Bhbj4gdmFsdWUncyBvcmRlciBpbiB0aGUgc2NoZW1hLiBIYXZpbmcgCi0gICAgICBhbiBpbmRleCBjYW4gYmUgdXNlZnVsIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuPC9wPgotICAgIDxwPkZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYSBkb2N1bWVudCBjb250YWluaW5nIHByaWNlIGVsZW1lbnRzIHdob3NlIAotICAgICAgdHlwZSB3YXMgdGhlIHByaWNlVHlwZSBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc2NoZW1hIHNuaXBwZXQ6PC9wPgotICAgIDxwcmU+Jmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7cHJpY2VUeXBlJnF1b3Q7Jmd0OwotICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtpdGVtJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6aXRlbVR5cGUmcXVvdDsgbWluT2NjdXJzPSZxdW90OzAmcXVvdDsgCi0gICAgICAgICAgICAgIG1heE9jY3Vycz0mcXVvdDt1bmJvdW5kZWQmcXVvdDsvJmd0OwotICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0gICAgJmx0O3hzOmF0dHJpYnV0ZSBuYW1lPSZxdW90O3RocmVzaG9sZCZxdW90OyZndDsKLSAgICAgICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6cmVzdHJpY3Rpb24gYmFzZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSZxdW90O0JlbG93MTBEb2xsYXJzJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9JnF1b3Q7QmV0d2VlbjEwQW5kMjBEb2xsYXJzJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9JnF1b3Q7QWJvdmUyMERvbGxhcnMmcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0Oy94czpyZXN0cmljdGlvbiZndDsKLSAgICAgICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwotICAgICZsdDsveHM6YXR0cmlidXRlJmd0OwotJmx0Oy94czpjb21wbGV4VHlwZSZndDs8L3ByZT4KLSAgICA8cD5Vc2luZyB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLCB5b3Ugd291bGQgYmUgYWJsZSB0byB3cml0ZSB0aGUgZm9sbG93aW5nIAotICAgICAgSmF2YSBjb2RlIHRvICZxdW90O3N3aXRjaCZxdW90OyBvbiB0aGUgdGhyZXNob2xkIGF0dHJpYnV0ZSdzIGVudW1lcmF0aW9uOjwvcD4KLSAgICA8cHJlPgotLyoKLSAqIFVzZSB0aGUgaW50VmFsdWUgbWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSBFbnVtIHR5cGUgdG8gZGV0ZXJtaW5lIHRoZSB0aHJlc2hvbGQKLSAqIGF0dHJpYnV0ZSdzIGN1cnJlbnQgZW51bWVyYXRpb24gdmFsdWUuCi0gKi8KLXN3aXRjaChwcmljZUVsZW1lbnRzW2ldLmdldFRocmVzaG9sZCgpLmludFZhbHVlKCkpCi17Ci0gICAgLy8gVXNlIHRoZSBUaHJlc2hvbGQgdHlwZSdzIGVudW1lcmF0aW9uIHZhbHVlcyB0byB0ZXN0IGZvciBhbiBhdHRyaWJ1dGUgdmFsdWUuIAotICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQkVMT1dfMTBfRE9MTEFSUzoKLSAgICAgICAgemVyb0J1ZmZlci5hcHBlbmQoaXRlbS5nZXRUaXRsZSgpICsgJnF1b3Q7XG4mcXVvdDspOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFByaWNlVHlwZS5UaHJlc2hvbGQuSU5UX0JFVFdFRU5fMTBfQU5EXzIwX0RPTExBUlM6Ci0gICAgICAgIHRlbkJ1ZmZlci5hcHBlbmQoaXRlbS5nZXRUaXRsZSgpICsgJnF1b3Q7XG4mcXVvdDspOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFByaWNlVHlwZS5UaHJlc2hvbGQuSU5UX0FCT1ZFXzIwX0RPTExBUlM6Ci0gICAgICAgIHR3ZW50eUJ1ZmZlci5hcHBlbmQoaXRlbS5nZXRUaXRsZSgpICsgJnF1b3Q7XG4mcXVvdDspOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7WW8hIFNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkISZxdW90Oyk7Ci0gICAgICAgIGJyZWFrOwotfTwvcHJlPgotICA8L2Rpdj4KLSAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgotICA8cD48YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgU3VwcG9ydCBmb3IgCi0gICAgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPjwvcD4KLTwvZGl2PgotIDwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTkwZTIuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPk1ldGhvZHMgZm9yIFR5cGVzIEdlbmVyYXRlZCBGcm9tIFNjaGVtYTwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPiAKLTxkaXYgaWQ9dG9waWN0aXRsZT4gCi0gIDxwIGNsYXNzPVRpdGxlPk1ldGhvZHMgZm9yIFR5cGVzIEdlbmVyYXRlZCBGcm9tIFNjaGVtYTwvcD4KLTwvZGl2PgotPGRpdiBpZD10b3BpY3RleHQ+Ci0gIDxwPkFzIHlvdSBtYXkgaGF2ZSBzZWVuIGluIDxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgCi0gICAgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPiwgeW91IHVzZSB0aGUgdHlwZXMgZ2VuZXJhdGVkIGZyb20gc2NoZW1hIHRvIGFjY2VzcyAKLSAgICBYTUwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBzY2hlbWEuIElmIHlvdSdyZSBmYW1pbGlhciB3aXRoIHRoZSBKYXZhQmVhbnMgdGVjaG5vbG9neSwgCi0gICAgdGhlIGNvbnZlbnRpb25zIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBBUEkgd2lsbCBiZSByZWNvZ25pemFibGUuIDwvcD4KLSAgPHA+SW4gZ2VuZXJhbCwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHRyZWF0ZWQgYXMgJnF1b3Q7cHJvcGVydGllcyZxdW90OyAKLSAgICBpbiB0aGUgSmF2YUJlYW5zIHNlbnNlLiBJbiBvdGhlciB3b3JkcywgYXMgeW91IHdvdWxkIHdpdGggSmF2YUJlYW5zIHByb3BlcnRpZXMsIAotICAgIHlvdSBtYW5pcHVsYXRlIHBhcnRzIG9mIHRoZSBYTUwgdGhyb3VnaCBhY2Nlc3NvciBtZXRob2RzIHN1Y2ggYXMgZ2V0Q3VzdG9tZXIoKSAKLSAgICAod2hlcmUgeW91IGhhdmUgYSAmcXVvdDtjdXN0b21lciZxdW90OyBlbGVtZW50KSwgc2V0SWQoU3RyaW5nKSAod2hlcmUgeW91IAotICAgIGhhdmUgYW4gJnF1b3Q7aWQmcXVvdDsgYXR0cmlidXRlKSwgYW5kIHNvIG9uLiBIb3dldmVyLCBiZWNhdXNlIHNjaGVtYSBzdHJ1Y3R1cmVzIAotICAgIGNhbiBiZSBzb21ld2hhdCBjb21wbGV4LCBYTUxCZWFucyBwcm92aWRlcyBzZXZlcmFsIG90aGVyIG1ldGhvZCBzdHlsZXMgZm9yIAotICAgIGhhbmRsaW5nIHRob3NlIHN0cnVjdHVyZXMgaW4gWE1MIGluc3RhbmNlcy48L3A+Ci0gIDxkaXY+Ci0gICAgPGgyPlByb3RvdHlwZXMgZm9yIE1ldGhvZHMgaW4gR2VuZXJhdGVkIEludGVyZmFjZXM8L2gyPgotICAgIDxwPlNldmVyYWwgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIGVsZW1lbnQgb3IgYXR0cmlidXRlIHdpdGhpbiB0aGUgCi0gICAgICBjb21wbGV4IHR5cGUuIFRoaXMgdG9waWMgbGlzdHMgZWFjaCBtZXRob2QgdGhhdCBjb3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGEgCi0gICAgICBnaXZlbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gPC9wPgotICAgIDxwPk5vdGUgdGhhdCB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIG1ldGhvZCBpcyBnZW5lcmF0ZWQgaXMgYmFzZWQgb24gaG93IHRoZSAKLSAgICAgIGVsZW1lbnQgb3IgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gc2NoZW1hLiBGb3IgZXhhbXBsZSwgYSBjdXN0b21lciBlbGVtZW50IAotICAgICAgZGVmaW5pdGlvbiB3aXRoIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm1heE9jY3Vyczwvc3Bhbj4gYXR0cmlidXRlIHZhbHVlIAotICAgICAgb2YgMSB3aWxsIHJlc3VsdCBpbiBhIGdldEN1c3RvbWVyIG1ldGhvZCwgYnV0IG5vdCBhIGdldEN1c3RvbWVyQXJyYXkgbWV0aG9kIAotICAgICAgJiM4MjEyOyBhZnRlciBhbGwsIG9ubHkgb25lIGN1c3RvbWVyIGVsZW1lbnQgaXMgcG9zc2libGUgaW4gYW4gaW5zdGFuY2UgCi0gICAgICBkb2N1bWVudC48L3A+Ci0gICAgPHA+Tm90ZSwgdG9vLCB0aGF0IHRoZXJlIG1heSBiZSB0d28gc2V0cyBvZiBwYXJhbGxlbCBtZXRob2RzOiBvbmUgd2hvc2UgcHJvdG90eXBlIAotICAgICAgc3RhcnRzIHdpdGggYW4gJnF1b3Q7eCZxdW90Oy4gQW4gJnF1b3Q7eCZxdW90OyBtZXRob2Qgc3VjaCBhcyB4Z2V0TmFtZSBvciAKLSAgICAgIHhzZXROYW1lIHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgb3IgYXR0cmlidXRlIHdob3NlIHR5cGUgaXMgYSBzaW1wbGUgCi0gICAgICB0eXBlLiBBIHNpbXBsZSB0eXBlIG1heSBiZSBvbmUgb2YgdGhlIDQ0IGJ1aWx0LWluIHNpbXBsZSB0eXBlcyBvciBtYXkgYmUgCi0gICAgICBhIHJlc3RyaWN0aW9uIGluIHNjaGVtYSBvZiBvbmUgb2YgdGhvc2UgYnVpbHQtaW4gdHlwZXMuIE9mIGNvdXJzZSwgYW4gYXR0cmlidXRlIAotICAgICAgd2lsbCBhbHdheXMgYmUgb2YgYSBzaW1wbGUgdHlwZS4gRm9yIGJ1aWx0LWluIHNpbXBsZSB0eXBlcywgYW4gJnF1b3Q7eCZxdW90OyAKLSAgICAgIG1ldGhvZCB3aWxsIGdldCBvciBzZXQgb25lIG9mIHRoZSB0eXBlcyBwcm92aWRlZCB3aXRoIFhNTEJlYW5zLCBzdWNoIGFzIAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFN0cmluZy5odG1sIj5YbWxTdHJpbmc8L2E+PC9zcGFuPiwgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50ZWdlci5odG1sIj5YbWxJbnRlZ2VyPC9hPjwvc3Bhbj4sIAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdEYXkuaHRtbCI+WG1sR0RheTwvYT48L3NwYW4+LCAKLSAgICAgIGFuZCBzbyBvbi4gRm9yIGRlcml2ZWQgdHlwZXMsIHRoZSAmcXVvdDt4JnF1b3Q7IG1ldGhvZCB3aWxsIGdldCBvciBzZXQgYSAKLSAgICAgIGdlbmVyYXRlZCB0eXBlLjwvcD4KLSAgICA8aDM+U2luZ2xlIE9jY3VycmVuY2UgTWV0aG9kczwvaDM+Ci0gICAgPHA+TWV0aG9kcyBnZW5lcmF0ZWQgZm9yIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMgdGhhdCBhbGxvdyBhIHNpbmdsZSBvY2N1cnJlbmNlLiAKLSAgICAgIEFuIGVsZW1lbnQgaXMgc2luZ3VsYXIgaWYgaXQgd2FzIGRlY2xhcmVkIHdpdGggbWF4T2NjdXJzPSZxdW90OzEmcXVvdDsuIAotICAgICAgQW4gYXR0cmlidXRlIGlzIHNpbmd1bGFyIGlmIGl0IHdhcyBub3QgZGVjbGFyZWQgd2l0aCB1c2U9JnF1b3Q7cHJvaGliaXRlZCZxdW90Oy48L3A+Ci0gICAgPHByZT4KLVR5cGUgZ2V0Rm9vKCkKLXZvaWQgc2V0Rm9vKFR5cGUgbmV3VmFsdWUpCi08L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PlJldHVybnMgb3Igc2V0cyB0aGUgdmFsdWUgb2YgRm9vLiBHZW5lcmF0ZWQgd2hlbiBGb28gaXMgYW4gYXR0cmlidXRlLCAKLSAgICAgIG9yIGlzIGFuIGVsZW1lbnQgdGhhdCBjYW4gb2NjdXIgb25seSBvbmNlIGFzIGEgY2hpbGQuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSB4Z2V0Rm9vKCkKLXZvaWQgeHNldEZvbyhYbWxUeXBlIG5ld1ZhbHVlKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSB2YWx1ZSBvZiBGb28gYXMgYW4gWE1MQmVhbiBzaW1wbGUgdHlwZS4gVGhlc2UgbWV0aG9kcyAKLSAgICAgIGFyZSBnZW5lcmF0ZWQgaWYgRm9vJ3MgdHlwZSBpcyBkZWZpbmVkIGluIHNjaGVtYSBhcyBhIHNpbXBsZVR5cGUuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+Ym9vbGVhbiBpc05pbEZvbygpCi12b2lkIHNldE5pbEZvbygpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5EZXRlcm1pbmVzIG9yIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBGb28gZWxlbWVudCBpcyBuaWwgKGluIG90aGVyIHdvcmRzLCAKLSAgICAgICZxdW90O251bGwmcXVvdDsgaW4gc2NoZW1hIHRlcm1zKSwgbWVhbmluZyBpdCBjYW4gYmUgZW1wdHkuIEEgbmlsIGVsZW1lbnQgCi0gICAgICBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOjwvZGl2PgotICAgIDxkaXY+IAotICAgICAgPHByZT4mbHQ7Zm9vLyZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2PlRoZXNlIG1ldGhvZHMgYXJlIG9ubHkgZ2VuZXJhdGVkIHdoZW4gYW4gZWxlbWVudCB0eXBlIGlzIGRlY2xhcmVkIGFzIAotICAgICAgbmlsbGFibGUgaW4gc2NoZW1hICYjODIxMjsgaXQgaGFzIGEgbmlsbGFibGU9JnF1b3Q7dHJ1ZSZxdW90OyBhdHRyaWJ1dGUuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSBhZGROZXdGb28oKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+QWRkcyBhIG5ldyBGb28gYXMgYW4gWE1MQmVhbiBzaW1wbGUgdG8gdGhlIGRvY3VtZW50LCBvciByZXR1cm5zIEZvbydzIAotICAgICAgdmFsdWUgaWYgb25lIGV4aXN0cyBhbHJlYWR5LjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPmJvb2xlYW4gaXNTZXRGb28oKQotdm9pZCB1blNldEZvbygpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IG9yIGF0dHJpYnV0ZSBleGlzdHMgaW4gdGhlIGRvY3VtZW50OyAKLSAgICAgIHJlbW92ZXMgRm9vLiBUaGVzZSBtZXRob2RzIGFyZSBnZW5lcmF0ZWQgZm9yIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICBhcmUgb3B0aW9uYWwuIEluIHNjaGVtYSwgYW5kIG9wdGlvbmFsIGVsZW1lbnQgaGFzIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5taW5PY2N1cnM8L3NwYW4+IAotICAgICAgYXR0cmlidXRlIHNldCB0byAmcXVvdDswJnF1b3Q7OyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgaGFzIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnVzZTwvc3Bhbj4gCi0gICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90O29wdGlvbmFsJnF1b3Q7LjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8aDM+TXVsdGlwbGUgT2NjdXJyZW5jZSBNZXRob2RzPC9oMz4KLSAgICA8cD5NZXRob2RzIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgdGhhdCBhbGxvdyBtdWx0aXBsZSBvY2N1cnJlbmNlcy4gPC9wPgotICAgIDxwPkFuIGVsZW1lbnQgbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGlmIGl0IGhhcyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5tYXhPY2N1cnM8L3NwYW4+IAotICAgICAgYXR0cmlidXRlIHNldCB0byAmcXVvdDt1bmJvdW5kZWQmcXVvdDsgb3IgZ3JlYXRlciB0aGFuIDEuIEF0dHJpYnV0ZXMgY2FuJ3QgCi0gICAgICBvY2N1ciBtdWx0aXBsZSB0aW1lcy48L3A+Ci0gICAgPHByZT5UeXBlW10gZ2V0Rm9vQXJyYXkoKQotdm9pZCBzZXRGb29BcnJheShUeXBlW10gbmV3VmFsdWUpIDwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIGFsbCBvZiB0aGUgRm9vIGVsZW1lbnRzLiA8L2Rpdj4KLSAgICA8ZGl2PiAKLSAgICAgIDxwcmU+Ci0vLyBHZXQgYW4gYXJyYXkgb2YgdGhlIGFsbCBvZiB0aGUgcHVyY2hhc2Utb3JkZXIgZWxlbWVudHMgaXRlbSBjaGlsZHJlbi4KLUl0ZW1bXSBpdGVtcyA9IG15UE8uZ2V0SXRlbUFycmF5KCk7Ci08L3ByZT4KLSAgICA8L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5UeXBlIGdldEZvb0FycmF5KGludCBpbmRleCkKLXZvaWQgc2V0Rm9vQXJyYXkoVHlwZSBuZXdWYWx1ZSwgaW50IGluZGV4KTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSBGb28gY2hpbGQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LjwvZGl2PgotICAgIDxkaXY+IAotICAgICAgPHByZT4vLyBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGhpcmQgaXRlbSBjaGlsZCBlbGVtZW50LgotbXlQTy5zZXRJdGVtKG5ld0l0ZW0sIDIpOzwvcHJlPgotICAgIDwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPmludCBzaXplT2ZGb29BcnJheSgpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5SZXR1cm5zIHRoZSBudW1iZXIgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLjwvZGl2PgotICAgIDxkaXY+IAotICAgICAgPHByZT4vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbSBjaGlsZCBlbGVtZW50cy4KLWludCBpdGVtQ291bnQgPSBteVBPLnNpemVPZkl0ZW1BcnJheSgpOzwvcHJlPgotICAgIDwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPnZvaWQgcmVtb3ZlRm9vKGludCBpbmRleCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PlJlbW92ZXMgdGhlIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZVtdIHhnZXRGb29BcnJheSgpCi12b2lkIHhzZXRGb29BcnJheShYbWxUeXBlW10gYXJyYXlPZk5ld1ZhbHVlcyk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PlJldHVybnMgb3Igc2V0cyBhbGwgb2YgdGhlIEZvbyBlbGVtZW50cyBhcyBYTUxCZWFucyBzaW1wbGUgdHlwZXMuIEdlbmVyYXRlZCAKLSAgICAgIG9ubHkgd2hlbiB0aGUgRm9vIGVsZW1lbnQgaXMgZGVmaW5lZCBhcyBhIHNpbXBsZSB0eXBlLjwvZGl2PgotICAgIDxkaXY+IAotICAgICAgPHByZT4vKgotICogUmV0dXJucyB2YWx1ZXMgb2YgYWxsIHRoZSBwaG9uZSBjaGlsZCBlbGVtZW50cyBvZiBhbiBlbXBsb3llZSBlbGVtZW50LAotICogd2hlcmUgdGhlIHBob25lIGVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBhcyB4czpzdHJpbmcuCi0gKi8KLVhtbFN0cmluZ1tdIGVtcFBob25lcyA9IGN1cnJlbnRFbXBsb3llZS54R2V0UGhvbmVBcnJheSgpOwotPC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSB4Z2V0Rm9vQXJyYXkoaW50IGluZGV4KQotdm9pZCB4c2V0Rm9vQXJyYXkoaW50IGluZGV4LCBYbWxUeXBlIG5ld1ZhbHVlKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSBGb28gZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCB1c2luZyBhbiBYTUxCZWFucyAKLSAgICAgIHNpbXBsZSB0eXBlIHZhbHVlLiBHZW5lcmF0ZWQgZm9yIGFuIGVsZW1lbnQgZGVmaW5lZCBhcyBhIHNpbXBsZSB0eXBlIGluIAotICAgICAgc2NoZW1hLjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPnZvaWQgaW5zZXJ0Rm9vKGludCBpbmRleCwgRm9vVHlwZSBuZXdWYWx1ZSk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2Pkluc2VydHMgdGhlIHNwZWNpZmllZCBGb28gY2hpbGQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPnZvaWQgYWRkRm9vKEZvb1R5cGUgbmV3VmFsdWUpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5BZGRzIHRoZSBzcGVjaWZpZWQgRm9vIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPlhtbFR5cGUgaW5zZXJ0TmV3Rm9vKGludCBpbmRleCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2Pkluc2VydHMgYSBuZXcgRm9vIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHJldHVybmluZyBhbiBYTUxCZWFucyBzaW1wbGUgCi0gICAgICB0eXBlIHJlcHJlc2VudGluZyB0aGUgbmV3IGVsZW1lbnQ7IHJldHVybnMgdGhlIGV4aXN0aW5nIEZvbyBpZiB0aGVyZSdzIGFscmVhZHkgCi0gICAgICBvbmUgYXQgaW5kZXguPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSBhZGROZXdGb28oKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+QWRkcyBhIG5ldyBGb28gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIEZvbyBjaGlsZCBlbGVtZW50cywgCi0gICAgICByZXR1cm5pbmcgYW4gWE1MQmVhbnMgc2ltcGxlIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBuZXdseSBhZGRlZCBlbGVtZW50LjwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPmJvb2xlYW4gaXNOaWxGb29BcnJheShpbnQgaW5kZXgpCi12b2lkIHNldE5pbEZvb0FycmF5KGludCBpbmRleCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PkRldGVybWluZXMgb3Igc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggCi0gICAgICBpcyBuaWwuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICA8L2Rpdj4KLSAgPGRpdiBpZD0idG9waWN0ZXh0Ij48L2Rpdj4KLSAgPHAgY2xhc3M9cmVsYXRlZHRvcGljcz5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgVHlwZXMgR2VuZXJhdGVkIAotICAgIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwgYi92MS9kb2NzL2d1aWRlL2Nvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWU0MTRhLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPk5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29yczwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBjb250ZW50PSJ5b3VyIG5hbWUiIG5hbWU9ImF1dGhvciI+Ci08bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KLTxtZXRhIGNvbnRlbnQ9ImtleXdvcmRzIHRvIGhlbHAgaW4gc2VhcmNoZXMiIG5hbWU9ImtleXdvcmRzIj4KLTxtZXRhIGNvbnRlbnQ9IjEwLzI1LzAyIiBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+IAotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGgxPiBOYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnMgPC9oMT4KLTxkaXYgaWQ9InRvcGljdGV4dCI+IAotICA8cD5YTUwgY3Vyc29ycyBhcmUgYSB3YXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQuIE9uY2UgCi0gICAgeW91IGxvYWQgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIGNyZWF0ZSBhIGN1cnNvciB0byByZXByZXNlbnQgYSBzcGVjaWZpYyAKLSAgICBwbGFjZSBpbiB0aGUgWE1MLiBCZWNhdXNlIHlvdSBjYW4gdXNlIGEgY3Vyc29yIHdpdGggb3Igd2l0aG91dCBhIHNjaGVtYSBjb3JyZXNwb25kaW5nIAotICAgIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIHdheSB0byBoYW5kbGUgWE1MIHdpdGhvdXQgYSBzY2hlbWEuPC9wPgotICA8cD5XaXRoIGFuIFhNTCBjdXJzb3IsIHlvdSBjYW46PC9wPgotPC9kaXY+Ci08VUw+Ci0gIDxsaT4gCi0gICAgPGRpdj48YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVzZSB0aGUgdG9rZW4gbW9kZWw8L2E+IHRvIG1vdmUgCi0gICAgICB0aHJvdWdoIFhNTCBpbiBzbWFsbCBpbmNyZW1lbnRzLCBvciBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHVzaW5nIGEgRE9NLWJhc2VkIAotICAgICAgbW9kZWwuPC9kaXY+Ci0gIDxMST4gCi0gICAgPERJVj5HZXQgYW5kIHNldCB2YWx1ZXMgd2l0aGluIHRoZSBYTUwuPC9ESVY+Ci0gIDxMST4gCi0gICAgPERJVj48YSBocmVmPSIjYWRkaW5nX2VsZW1lbnRzX2F0dHJpYnV0ZXMiPkNoYW5nZSB0aGUgc3RydWN0dXJlPC9hPiBvZiBhbiAKLSAgICAgIFhNTCBkb2N1bWVudCBieSBpbnNlcnRpbmcsIHJlbW92aW5nLCBhbmQgbW92aW5nIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLjwvRElWPgotICA8TEk+IAotICAgIDxESVY+PGEgaHJlZj0iY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sIj5FeGVjdXRlIFhRdWVyeSBleHByZXNzaW9uczwvYT4gCi0gICAgICBhZ2FpbnN0IHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhlIGN1cnNvci48L0RJVj4KLSAgPExJPiAKLSAgICA8RElWPjxhIGhyZWY9ImNvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sIj5JbnNlcnQgYm9va21hcmtzPC9hPiB0byAKLSAgICAgIG1hcmsgbG9jYXRpb25zIGluIFhNTC48L0RJVj4KLTwvVUw+Ci08UD5XaGVuIHlvdSdyZSBmaW5pc2hlZCB1c2luZyBhIGN1cnNvciwgeW91ciBjb2RlIHNob3VsZCBjYWxsIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZGlzcG9zZTwvc3Bhbj4gCi0gIG1ldGhvZC48L1A+Ci08aDI+Q3JlYXRpbmcgYW5kIE1vdmluZyBhIEN1cnNvcjwvaDI+Ci08UD5XaXRoIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBib3VuZCB0byA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPlhtbE9iamVjdDwvYT48L3NwYW4+IAotICAob3IgYSB0eXBlIGluaGVyaXRpbmcgZnJvbSBpdCksIHlvdSBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5IGNhbGxpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uZXdDdXJzb3I8L3NwYW4+IAotICBtZXRob2QuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPlhtbEN1cnNvcjwvYT48L3NwYW4+IAotICBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGN1cnNvci4gRnJvbSBhIGN1cnNvciBzdGFuZHBvaW50LCBhbiBYTUwgZG9jdW1lbnQgaXMgCi0gIGEgY29sbGVjdGlvbiBvZiA8RU0+dG9rZW5zPC9FTT4gdGhhdCByZXByZXNlbnQgdGhlIGtpbmRzIG9mIHRoaW5ncyB0aGF0IGNhbiAKLSAgYXBwZWFyIGluIFhNTC4gVGhlc2UgaW5jbHVkZSZuYnNwO2F0dHJpYnV0ZXMsIHRoZSBzdGFydCBhbmQgZW5kIG9mIGVsZW1lbnRzLCAKLSAgY29tbWVudHMsIGFuZCBzbyBvbi4mbmJzcDtFYWNoIHBpZWNlIG9mIGluZm9ybWF0aW9uIGluIFhNTCBpcyByZXByZXNlbnRlZCBieSAKLSAgYSA8ZW0+dG9rZW4gdHlwZTwvZW0+LjwvUD4KLTxQIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBGb3IgYSBtb3JlIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIAotICBYTUwgdG9rZW5zLCBzZWUgPGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L2E+LjwvUD4KLTxQPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgbG9hZHMgdGhlJm5ic3A7WE1MIGluc3RhbmNlIGRlc2NyaWJlZCBhYm92ZSAKLSAgZnJvbSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GaWxlPC9zcGFuPiBvYmplY3QsIHRoZW4gY3JlYXRlcyBhIG5ldyBjdXJzb3IuIAotICBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvRmlyc3RDaGlsZDwvc3Bhbj4gdGFrZXMgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgCi0gIHRhZyBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJhdGNoV2lkZ2V0T3JkZXI8L3NwYW4+IGRvY3VtZW50IGVsZW1lbnQuIAotICBUaGUgY29kZSB0aGVuIHByaW50cyB0aGUgdHlwZSBmb3IgdGhlIHRva2VuIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgYWxvbmcgCi0gIHdpdGggdGhlIFhNTCB0aGUgY3Vyc29yIHJlcHJlc2VudHOXaW4gb3RoZXIgd29yZHMsIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+VG9rZW4gCi0gIHR5cGU6IFNUQVJUIC88L3NwYW4+IGFuZCB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5iYXRjaFdpZGdldE9yZGVyRWxlbWVudDwvc3Bhbj4gCi0gIGFuZCBpdHMgY29udGVudHMuPC9QPgotPHByZT5wdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0Q3Vyc29yKEZpbGUgb3JkZXJGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIAotewotICAgIEJhdGNoV2lkZ2V0T3JkZXJEb2N1bWVudCB4bWxEb2MgPSBCYXRjaFdpZGdldE9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShvcmRlckZpbGUpOwotICAgIFhtbEN1cnNvciBvcmRlckN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKLSAgICBvcmRlckN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRva2VuIHR5cGU6ICIgKyBvcmRlckN1cnNvci5jdXJyZW50VG9rZW5UeXBlKCkgKwotICAgICAgICAiIC8gIiArIG9yZGVyQ3Vyc29yLnhtbFRleHQoKSk7Ci19Ci08L3ByZT4KLTxwIGNsYXNzPSJub3RlcGFyYSI+PFNUUk9ORz5Ob3RlPC9TVFJPTkc+OiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gCi0gIGludGVyZmFjZSBwcm92aWRlcyBtYW55IG1ldGhvZHMgeW91IGNhbiB1c2UgdG8gcHV0IGEgY3Vyc29yIHdoZXJlIHlvdSB3YW50IGl0LiAKLSAgRm9yIGEgbGlzdCBvZiB0aG9zZSBtZXRob2RzLCBzZWUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPlhtbEN1cnNvciAKLSAgSW50ZXJmYWNlPC9hPi48L3A+Ci08aDI+PGEgbmFtZT0iYWRkaW5nX2VsZW1lbnRzX2F0dHJpYnV0ZXMiIGlkPSJhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+PC9hPkFkZGluZyAKLSAgRWxlbWVudHMgYW5kIEF0dHJpYnV0ZXM8L2gyPgotPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSBwcm92aWRlcyBzZXZlcmFsIG1ldGhvZHMgCi0gIHlvdSBjYW4gdXNlIHRvIGFkZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB0byBYTUwuIDwvcD4KLTxwPk9uZSB3YXkgdG8gYWRkIG5ldyBYTUwgaXMgd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJlZ2luRWxlbWVudDwvc3Bhbj4gCi0gIG1ldGhvZC4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKLSAgYW5kIGRvIGl0IHNvIHRoZSBjdXJzb3IgZW5kcyB1cCBiZXR3ZWVuIHRoZSBuZXcgZWxlbWVudCdzIFNUQVJUIGFuZCBFTkQgdG9rZW5zLiAKLSAgRnJvbSB0aGlzIHBvc2l0aW9uLCB5b3UgY2FuIGluc2VydCBhdHRyaWJ1dGVzICh0aGV5J3JlIGF1dG9tYXRpY2FsbHkgcGxhY2VkIAotICBpbiB0aGUgc3RhcnQgdGFnLCB3aGVyZSB0aGV5IGJlbG9uZykgYW5kIGluc2VydCBhIHZhbHVlLiBIZXJlJ3MgYW4gZXhhbXBsZTo8L3A+Ci08cHJlPgotLy8gQ3JlYXRlIGEgbmV3IGNodW5rIG9mIFhNTC4KLVhtbE9iamVjdCBuZXdYbWwgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotLyogCi0gKiBJbnNlcnQgYSBuZXcgY3Vyc29yIGFuZCBtb3ZlIGl0IHRvIHRoZSBmaXJzdCBTVEFSVCB0b2tlbiAod2hlcmUgdGhlCi0gKiBYTUwgYWN0dWFsbHkgYmVnaW5zLgotICovCi1YbWxDdXJzb3IgY3Vyc29yID0gbmV3WG1sLm5ld0N1cnNvcigpOwotY3Vyc29yLnRvTmV4dFRva2VuKCk7Ci0vLyBCZWdpbiBhIG5ldyBpdGVtIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIFVSSSBpcyAiaHR0cDovL29wZW51cmkub3JnIi4KLWN1cnNvci5iZWdpbkVsZW1lbnQoJnF1b3Q7aXRlbSZxdW90OywgJnF1b3Q7aHR0cDovL29wZW51cmkub3JnLyZxdW90Oyk7Ci0vLyBJbnNlcnQgYW4gSUQgYXR0cmlidXRlIG9uIHRoZSBpdGVtIGVsZW1lbnQsIGFsb25nIHdpdGggYW4gYXR0cmlidXRlIHZhbHVlLgotY3Vyc29yLmluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSgmcXVvdDtpZCZxdW90OywgJnF1b3Q7NDA1NjQwNCZxdW90Oyk7Ci0vLyBJbnNlcnQgImJpY3ljbGUiIGFzIGFuIGVsZW1lbnQgdmFsdWUuCi1jdXJzb3IuaW5zZXJ0Q2hhcnMoJnF1b3Q7YmljeWNsZSZxdW90Oyk7Ci1jdXJzb3IuZGlzcG9zZSgpOwotPC9wcmU+Ci08cD5UaGlzIGV4YW1wbGUgcmVzdWx0cyBpbiBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KLTxwcmU+Jmx0O25zMTppdGVtIGlkPSZxdW90OzQwNTY0MDQmcXVvdDsgeG1sbnM6bnMxPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy8mcXVvdDsmZ3Q7YmljeWNsZSZsdDsvbnMxOml0ZW0mZ3Q7Ci08L3ByZT4KLTxoMj4gVXNpbmcgU3RvcmVkIEN1cnNvciBMb2NhdGlvbnMgd2l0aCBwdXNoKCkgYW5kIHBvcCgpPC9oMj4KLTxkaXYgaWQ9InRvcGljdGV4dCI+IAotICA8cD5XaGVuIHlvdSB3YW50IHRvIG1vdmUgYSBjdXJzb3IgYXJvdW5kLCBidXQgd2FudCB0byBrZWVwIHRyYWNrIG9mIGEgZm9ybWVyIAotICAgIGxvY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlJ3MgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiAKLSAgICBtZXRob2RzLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IG1ldGhvZCBwdXNoZXMgdGhlIGN1cnNvcidzIAotICAgIGN1cnJlbnQgbG9jYXRpb24gb250byBhIHN0YWNrIG9mIGxvY2F0aW9ucyBtYWludGFpbmVkIGZvciB0aGF0IHBhcnRpY3VsYXIgCi0gICAgY3Vyc29yOyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gbWV0aG9kIHJlbW92ZXMgdGhlIGxvY2F0aW9uIAotICAgIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIG1vdmVzIHRoZSBjdXJzb3IgdG8gdGhhdCBsb2NhdGlvbi48L3A+Ci0gIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nICZsdDtlbXBsb3llZSZndDsgZWxlbWVudCwgdXNlZCBpbiB0aGUgCi0gICAgZXhhbXBsZSBiZWxvdy48L3A+Ci0gIDxwcmU+Ci0mbHQ7ZW1wbG95ZWUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bmFtZSZndDtHbGFkeXMgS3Jhdml0eiZsdDsvbmFtZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthZGRyZXNzIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c3RyZWV0Jmd0OzEzMTMgTW9ja2luZ2JpcmQgTGFuZSZsdDsvc3RyZWV0Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7U2VhdHRsZSZsdDsvY2l0eSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdGF0ZSZndDtXQSZsdDsvc3RhdGUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7emlwJmd0Ozk4MTE1Jmx0Oy96aXAmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2FkZHJlc3MmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWRkcmVzcyBsb2NhdGlvbj0mcXVvdDt3b3JrJnF1b3Q7Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0cmVldCZndDsyMDExIDE1Mm5kIEF2ZW51ZSBORSZsdDsvc3RyZWV0Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7UmVkbW9uZCZsdDsvY2l0eSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdGF0ZSZndDtXQSZsdDsvc3RhdGUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7emlwJmd0Ozk4MDUyJmx0Oy96aXAmZ3Q7Ci0mbmJzcDsmbmJzcDsgJm5ic3A7Jmx0Oy9hZGRyZXNzJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7KDQyNSkgNTU1LTY4OTcmbHQ7L3Bob25lJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7KDIwNikgNTU1LTY1OTQmbHQ7L3Bob25lJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O21vYmlsZSZxdW90OyZndDsoMjA2KSA1NTUtNzg5NCZsdDsvcGhvbmUmZ3Q7Ci0mbHQ7L2VtcGxveWVlJmd0OwotPC9wcmU+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgSmF2YSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB5b3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IHRvIHB1dCB0aGUgY3Vyc29yIGJhY2sgdG8gYSBzYXZlZCAKLSAgICBsb2NhdGlvbiBhZnRlciBhIGJpdCBvZiB0cmF2ZWxpbmcuPC9wPgotICA8cHJlPgotLyoqCi0gKiBQYXNzIHRvIHRoZSB0cnlTZWxlY3RQYXRoIG1ldGhvZCBhbiBYbWxPYmplY3QgaW5zdGFuY2UgdGhhdCBjb250YWlucwotICogdGhlIFhNTCBhYm92ZS4KLSAqLwotcHVibGljIHZvaWQgdHJ5U2VsZWN0UGF0aChYbWxPYmplY3QgeG1sKQotewotICAgIC8qIAotICAgICAqIEluc2VydHMgdGhlIGN1cnNvciBhdCB0aGUgU1RBUlRET0MgdG9rZW4gKHRoZSB2ZXJ5IGJlZ2lubmluZywgCi0gICAgICogYmVmb3JlIGFueSBlbGVtZW50cykuCi0gICAgICovCi0gICAgWG1sQ3Vyc29yIGN1cnNvciA9IHhtbC5uZXdDdXJzb3IoKTsKLSAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlICZsdDtlbXBsb3llZSZndDsKLSAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0gICAgLy8gUHVzaGVzIHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uIG9udG8gdGhlIHN0YWNrLgotICAgIGN1cnNvci5wdXNoKCk7Ci0gICAgLy8gTW92ZXMgdGhlIGN1cnNvciB0byBqdXN0IGJlZm9yZSB0aGUgJnF1b3Q7d29yayZxdW90OyAmbHQ7cGhvbmUmZ3Q7IGVsZW1lbnQuICAgICAgCi0gICAgY3Vyc29yLnRvQ2hpbGQoMik7Ci0gICAgLy8gTW92ZXMgdGhlIGN1cnNvciB0byBqdXN0IGJlZm9yZSB0aGUgJnF1b3Q7aG9tZSZxdW90OyAmbHQ7cGhvbmUmZ3Q7IGVsZW1lbnQuCi0gICAgY3Vyc29yLnRvTmV4dFNpYmxpbmcoKTsKLSAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIGJhY2sgdG8ganVzdCBiZWZvcmUgJmx0O2VtcGxveWVlJmd0OwotICAgIGN1cnNvci5wb3AoKTsKLX0KLTwvcHJlPgotICA8cD5PZiBjb3Vyc2UsIHlvdSBjYW4gY2FsbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAotICAgIG11bHRpcGxlIHRpbWVzLiBFYWNoIG5ldyBjYWxsIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gCi0gICAgbWV0aG9kIHB1c2hlcyB0aGUgY3VycmVudCBsb2NhdGlvbiBvbnRvIHRoZSBzdGFjay4gQXMgeW91IGNhbGwgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAotICAgIG1ldGhvZCwgeW91J3JlIGFsd2F5cyBnZXR0aW5nIHdoYXQncyBvbiB0b3Agb2YgdGhlIHN0YWNrLiBTbyBpZiB5b3UgY2FsbGVkIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiB0aHJlZSB0aW1lcyBiZWZvcmUgY2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiAKLSAgICAmIzgyMTI7IDEsIDIsIDMgJiM4MjEyOyBjYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IHRocmVlIAotICAgIHRpbWVzIHdvdWxkIGdldCB0aG9zZSBsb2NhdGlvbnMgaW4gcmV2ZXJzZSBvcmRlciAmIzgyMTI7IDMsIDIsIDEuPC9wPgotICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiAKLSAgICBtZXRob2RzIGNhbiBiZSBoYW5keSBhcyBhbiBhbHRlcm5hdGl2ZSB0byBjcmVhdGluZyBuZXcgY3Vyc29ycyB0aGF0IGFyZSBkZXNpZ25lZCAKLSAgICBzaW1wbHkgdG8gbWFyayBhIHBhcnRpY3VsYXIgbG9jYXRpb24gd2hpbGUgeW91IG1vdmUgYW5vdGhlciBjdXJzb3IgYXJvdW5kLiAKLSAgICBUaGUgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIG1haW50YWluIGEgbG9jYXRpb24gc3RhY2sgdGhyb3VnaCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IGFyZSBmYXIgbGVzcyB0aGFuIHRob3NlIG5lZWRlZCBieSAKLSAgICBjdXJzb3JzLiA8L3A+Ci0gIDxIMT5EaXNwb3Npbmcgb2YgYSBDdXJzb3I8L0gxPgotICA8cD5XaGVuIHlvdSdyZSB0aHJvdWdoIHdpdGggYSBjdXJzb3IsIHlvdXIgY29kZSBzaG91bGQgY2FsbCBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRpc3Bvc2U8L3NwYW4+IAotICAgIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC48L3A+Ci0gIDxwIGNsYXNzPSJyZWxhdGVkdG9waWNzIj5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L2E+PC9wPgotICA8cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvblNlbGVjdGluZ1hNTHdpdGhYUXVlcnlQYXRoWFBhdGguaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUxM2Y4Li4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5TZWxlY3RpbmcgWE1MIHdpdGggWFF1ZXJ5IGFuZCBYUGF0aDwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBjb250ZW50PSJ5b3VyIG5hbWUiIG5hbWU9ImF1dGhvciI+Ci08bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KLTxtZXRhIGNvbnRlbnQ9ImtleXdvcmRzIHRvIGhlbHAgaW4gc2VhcmNoZXMiIG5hbWU9ImtleXdvcmRzIj4KLTxtZXRhIGNvbnRlbnQ9IjEwLzI1LzAyIiBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+IAotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGgxPiBTZWxlY3RpbmcgWE1MIHdpdGggWFF1ZXJ5IGFuZCBYUGF0aDwvaDE+Ci08ZGl2IGlkPSJ0b3BpY3RleHQiPiAKLSAgPHA+WW91IGNhbiB1c2UgWFF1ZXJ5IGFuZCBYUGF0aCB0byByZXRyaWV2ZSBzcGVjaWZpYyBwaWVjZXMgb2YgWE1MIGFzIHlvdSBtaWdodCAKLSAgICByZXRyaWV2ZSBkYXRhIGZyb20gYSBkYXRhYmFzZS4gWFF1ZXJ5IGFuZCBYUGF0aCBwcm92aWRlIGEgc3ludGF4IGZvciBzcGVjaWZ5aW5nIAotICAgIHdoaWNoIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHlvdSdyZSBpbnRlcmVzdGVkIGluLiBUaGUgWE1MQmVhbnMgQVBJIHByb3ZpZGVzIAotICAgIHR3byBtZXRob2RzIGZvciBleGVjdXRpbmcgWFF1ZXJ5IGFuZCBYUGF0aCBleHByZXNzaW9ucywgYW5kIHR3byBkaWZmZXJpbmcgCi0gICAgd2F5cyB0byB1c2UgdGhlbS4gVGhlIG1ldGhvZHMgYXJlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiAKLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4sIGFuZCB5b3UgY2FuIGNhbGwgdGhlbSBmcm9tIAotICAgIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPjwvYT4gCi0gICAgKG9yIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gaXQpIG9yIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPjwvYT4uIAotICAgIFRoZSByZXN1bHRzIGZvciB0aGUgbWV0aG9kcyBkaWZmZXIgc29tZXdoYXQuIDwvcD4KLSAgPGgyPlVzaW5nIHRoZSBzZWxlY3RQYXRoIE1ldGhvZDwvaDI+Ci08L2Rpdj4KLTxkaXY+Ci0gIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4gbWV0aG9kIGlzIHRoZSBtb3N0IGVmZmljaWVudCAKLSAgICB3YXkgdG8gZXhlY3V0ZSBYUGF0aCBleHByZXNzaW9ucy4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiAKLSAgICBtZXRob2QgaXMgb3B0aW1pemVkIGZvciBYUGF0aC4gV2hlbiB5b3UgdXNlIFhQYXRoIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiAKLSAgICBtZXRob2QsIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhbiBhcnJheSBvZiB2YWx1ZXMgZnJvbSB0aGUgPGVtPmN1cnJlbnQgZG9jdW1lbnQ8L2VtPi4gCi0gICAgSW4gY29udHJhc3QsIHdoZW4geW91IHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiwgdGhlIHZhbHVlIAotICAgIHJldHVybmVkIGlzIGEgPGVtPm5ldyBkb2N1bWVudDwvZW0+LjwvcD4KLSAgPGgzPkNhbGxpbmcgZnJvbSBYbWxPYmplY3Q8L2gzPgotICA8cD5XaGVuIGNhbGxlZCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IChvciBhIHR5cGUgdGhhdCAKLSAgICBpbmhlcml0cyBmcm9tIGl0KSwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzLiBJZiB0aGUgZXhwcmVzc2lvbiAKLSAgICBpcyBleGVjdXRlZCBhZ2FpbnN0IHR5cGVzIGdlbmVyYXRlZCBmcm9tIHNjaGVtYSwgdGhlbiB0aGUgdHlwZSBmb3IgdGhlIHJldHVybmVkIAotICAgIGFycmF5IGlzIG9uZSBvZiB0aGUgSmF2YSB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY2hlbWEuIDwvcD4KLSAgPHA+Rm9yIGV4YW1wbGUsIGltYWdpbmUgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBYTUwgY29udGFpbmluZyBlbXBsb3llZSBpbmZvcm1hdGlvbi4gCi0gICAgWW91J3ZlIGNvbXBpbGVkIHRoZSBzY2hlbWEgZGVzY3JpYmluZyB0aGlzIFhNTCBhbmQgdGhlIHR5cGVzIGdlbmVyYXRlZCBmcm9tIAotICAgIHNjaGVtYSBhcmUgYXZhaWxhYmxlIHRvIHlvdXIgY29kZS48L3A+Ci08cHJlPgotJmx0O3hxOmVtcGxveWVlcyB4bWxuczp4cT0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvc2VsZWN0UGF0aCZxdW90OyZndDsKLSAgICAmbHQ7eHE6ZW1wbG95ZWUmZ3Q7Ci0gICAgICAgICZsdDt4cTpuYW1lJmd0O0ZyZWQgSm9uZXMmbHQ7L3hxOm5hbWUmZ3Q7Ci0gICAgICAgICZsdDt4cTphZGRyZXNzIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6c3RyZWV0Jmd0OzkwMCBBdXJvcmEgQXZlLiZsdDsveHE6c3RyZWV0Jmd0OwotICAgICAgICAgICAgJmx0O3hxOmNpdHkmZ3Q7U2VhdHRsZSZsdDsveHE6Y2l0eSZndDsKLSAgICAgICAgICAgICZsdDt4cTpzdGF0ZSZndDtXQSZsdDsveHE6c3RhdGUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6emlwJmd0Ozk4MTE1Jmx0Oy94cTp6aXAmZ3Q7Ci0gICAgICAgICZsdDsveHE6YWRkcmVzcyZndDsKLSAgICAgICAgJmx0O3hxOmFkZHJlc3MgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDt4cTpzdHJlZXQmZ3Q7MjAxMSAxNTJuZCBBdmVudWUgTkUmbHQ7L3hxOnN0cmVldCZndDsKLSAgICAgICAgICAgICZsdDt4cTpjaXR5Jmd0O1JlZG1vbmQmbHQ7L3hxOmNpdHkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6c3RhdGUmZ3Q7V0EmbHQ7L3hxOnN0YXRlJmd0OwotICAgICAgICAgICAgJmx0O3hxOnppcCZndDs5ODA1MiZsdDsveHE6emlwJmd0OwotICAgICAgICAmbHQ7L3hxOmFkZHJlc3MmZ3Q7Ci0gICAgICAgICZsdDt4cTpwaG9uZSBsb2NhdGlvbj0mcXVvdDt3b3JrJnF1b3Q7Jmd0Oyg0MjUpNTU1LTU2NjUmbHQ7L3hxOnBob25lJmd0OwotICAgICAgICAmbHQ7eHE6cGhvbmUgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsoMjA2KTU1NS01NTU1Jmx0Oy94cTpwaG9uZSZndDsKLSAgICAgICAgJmx0O3hxOnBob25lIGxvY2F0aW9uPSZxdW90O21vYmlsZSZxdW90OyZndDsoMjA2KTU1NS00MzIxJmx0Oy94cTpwaG9uZSZndDsKLSAgICAmbHQ7L3hxOmVtcGxveWVlJmd0OwotJmx0Oy94cTplbXBsb3llZXMmZ3Q7Ci08L3ByZT4KLSAgSWYgeW91IHdhbnRlZCB0byBmaW5kIHRoZSBwaG9uZSBudW1iZXJzIHdob3NlIGFyZWEgY29kZSB3YXMgMjA2LCB5b3UgY291bGQgY2FwdHVyZSAKLSAgdGhlIFhQYXRoIGV4cHJlc3Npb24gaW4gdGhpcyB3YXk6IAotICA8cHJlPgotU3RyaW5nIHF1ZXJ5RXhwcmVzc2lvbiA9Ci0gICAgJnF1b3Q7ZGVjbGFyZSBuYW1lc3BhY2UgeHE9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZWxlY3RQYXRoJyZxdW90OyArCi0gICAgJnF1b3Q7JHRoaXMveHE6ZW1wbG95ZWVzL3hxOmVtcGxveWVlL3hxOnBob25lW2NvbnRhaW5zKC4sICcoMjA2KScpXSZxdW90OwotPC9wcmU+Ci0gIDxwPk5vdGljZSBpbiB0aGUgcXVlcnkgZXhwcmVzc2lvbiB0aGF0IHRoZSB2YXJpYWJsZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+JHRoaXM8L3NwYW4+IAotICAgIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29udGV4dCBub2RlICh0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gCi0gICAgdGhhdCB5b3UgYXJlIHF1ZXJ5aW5nIGZyb20pLiBJbiB0aGlzIGV4YW1wbGUgeW91IGFyZSBxdWVyeWluZyBmcm9tIHRoZSBkb2N1bWVudCAKLSAgICBsZXZlbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPi48L3A+Ci0gIDxwPllvdSBjb3VsZCB0aGVuIHByaW50IHRoZSByZXN1bHRzIHdpdGggY29kZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6PC9wPgotICA8cHJlPgotLyogCi0gKiBSZXRyaWV2ZSB0aGUgbWF0Y2hpbmcgcGhvbmUgZWxlbWVudHMgYW5kIGFzc2lnbiB0aGUgcmVzdWx0cyB0byB0aGUgY29ycmVzcG9uZGluZwotICogZ2VuZXJhdGVkIHR5cGUuCi0gKi8KLVBob25lVHlwZVtdIHBob25lcyA9IChQaG9uZVR5cGVbXSllbXBEb2Muc2VsZWN0UGF0aChxdWVyeUV4cHJlc3Npb24pOwotLyoKLSAqIExvb3AgdGhyb3VnaCB0aGUgcmVzdWx0cywgcHJpbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBwaG9uZSBlbGVtZW50LgotICovCi1mb3IgKGludCBpID0gMDsgaSA8IHBob25lcy5sZW5ndGg7IGkrKykKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGhvbmVzW2ldLnN0cmluZ1ZhbHVlKCkpOwotfSAgPC9wcmU+Ci0KLSAgPGgzPkNhbGxpbmcgZnJvbSBYbWxDdXJzb3I8L2gzPgotICA8cD5XaGVuIGNhbGxlZCBmcm9tIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGluc3RhbmNlLCB0aGUgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IG1ldGhvZCByZXRyaWV2ZXMgYSBsaXN0IG9mIHNlbGVjdGlvbnMsIAotICAgIG9yIGxvY2F0aW9ucyBpbiB0aGUgWE1MLiBUaGUgc2VsZWN0aW9ucyBhcmUgcmVtZW1iZXJlZCBieSB0aGUgY3Vyc29yIGluc3RhbmNlLiAKLSAgICBZb3UgY2FuIHVzZSBtZXRob2RzIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvTmV4dFNlbGVjdGlvbjwvc3Bhbj4gCi0gICAgdG8gbmF2aWdhdGUgYW1vbmcgdGhlbS48L3A+Ci0gIDxkaXY+Ci0gICAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiBtZXRob2QgdGFrZXMgYW4gWFBhdGggZXhwcmVzc2lvbi4gCi0gICAgICBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIGFueSByZXN1bHRzLCBlYWNoIG9mIHRob3NlIHJlc3VsdHMgaXMgYWRkZWQgYXMgCi0gICAgICBhIHNlbGVjdGlvbiB0byB0aGUgY3Vyc29yJ3MgbGlzdCBvZiBzZWxlY3Rpb25zLiBZb3UgY2FuIG1vdmUgdGhyb3VnaCB0aGVzZSAKLSAgICAgIHNlbGVjdGlvbnMgaW4gdGhlIHdheSB5b3UgbWlnaHQgdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5qYXZhLnV0aWwuSXRlcmF0b3I8L3NwYW4+IAotICAgICAgbWV0aG9kcyB0byBtb3ZlIHRocm91Z2ggYSBjb2xsZWN0aW9uLjwvcD4KLSAgICA8cD4gRm9yIGV4YW1wbGUsIGZvciBhIHBhdGggc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+JHRoaXMvZW1wbG95ZWVzL2VtcGxveWVlPC9zcGFuPiwgCi0gICAgICB0aGUgcmVzdWx0cyB3b3VsZCBpbmNsdWRlIGEgc2VsZWN0aW9uIGZvciBlYWNoIGVtcGxveWVlIGVsZW1lbnQgZm91bmQgYnkgCi0gICAgICB0aGUgZXhwcmVzc2lvbi4gTm90ZSB0aGF0IHRoZSB2YXJpYWJsZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+JHRoaXM8L3NwYW4+IAotICAgICAgaXMgYWx3YXlzIGJvdW5kIHRvIHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZSwgd2hpY2ggaW4gdGhpcyBleGFtcGxlIGlzIHRoZSAKLSAgICAgIGRvY3VtZW50LiBBZnRlciBjYWxsaW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4gbWV0aG9kLCAKLSAgICAgIHlvdSB3b3VsZCB1c2UgdmFyaW91cyAmcXVvdDtzZWxlY3Rpb24mcXVvdDstcmVsYXRlZCBtZXRob2RzIHRvIHdvcmsgd2l0aCAKLSAgICAgIHRoZSByZXN1bHRzLiBUaGVzZSBtZXRob2RzIGluY2x1ZGU6PC9wPgotICA8L2Rpdj4KLSAgPHVsPgotICAgIDxsaT4gCi0gICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRTZWxlY3Rpb25Db3VudCgpIDwvc3Bhbj50byByZXRyaWV2ZSB0aGUgCi0gICAgICAgIG51bWJlciBvZiBzZWxlY3Rpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeS48L2Rpdj4KLSAgICA8L2xpPgotICAgIDxsaT4gCi0gICAgICA8ZGl2PiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9OZXh0U2VsZWN0aW9uKCk8L3NwYW4+IHRvIG1vdmUgdGhlIGN1cnNvciAKLSAgICAgICAgdG8gdGhlIG5leHQgc2VsZWN0aW9uIGluIHRoZSBsaXN0IChzdWNoIGFzIHRvIHRoZSBvbmUgcG9pbnRpbmcgYXQgdGhlIAotICAgICAgICBuZXh0IGVtcGxveWVlIGVsZW1lbnQgZm91bmQpLjwvZGl2PgotICAgIDwvbGk+Ci0gICAgPGxpPiAKLSAgICAgIDxkaXY+IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1NlbGVjdGlvbihpbnQpPC9zcGFuPiB0byBtb3ZlIHRoZSBjdXJzb3IgCi0gICAgICAgIHRvIHRoZSBzZWxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBpbmRleCAoc3VjaCBhcyB0byB0aGUgdGhpcmQgZW1wbG95ZWUgCi0gICAgICAgIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGlvbikuPC9kaXY+Ci0gICAgPC9saT4KLSAgICA8bGk+IAotICAgICAgPGRpdj4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmhhc05leHRTZWxlY3Rpb24oKTwvc3Bhbj4gdG8gZmluZCBvdXQgaWYgCi0gICAgICAgIHRoZXJlIGFyZSBtb3JlIHNlbGVjdGlvbnMgYWZ0ZXIgdGhlIGN1cnNvcidzIGN1cnJlbnQgcG9zaXRpb24uPC9kaXY+Ci0gICAgPC9saT4KLSAgICA8bGk+IAotICAgICAgPGRpdj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+IGNsZWFyU2VsZWN0aW9ucygpPC9zcGFuPiBjbGVhcnMgdGhlIHNlbGVjdGlvbnMgCi0gICAgICAgIGZyb20gdGhlIGN1cnJlbnQgY3Vyc29yLiBUaGlzIGRvZXNuJ3QgbW9kaWZ5IHRoZSBkb2N1bWVudCAoaW4gb3RoZXIgd29yZHMsIAotICAgICAgICBpdCBkb2Vzbid0IGRlbGV0ZSB0aGUgc2VsZWN0ZWQgWE1MKTsgaXQgbWVyZWx5IGNsZWFycyB0aGUgc2VsZWN0aW9uIGxpc3QgCi0gICAgICAgIHNvIHRoYXQgdGhlIGN1cnNvciBpcyBubyBsb25nZXIga2VlcGluZyB0cmFjayBvZiB0aG9zZSBwb3NpdGlvbnMuPC9kaXY+Ci0gICAgPC9saT4KLSAgPC91bD4KLSAgPGRpdj4KLSAgICA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBtaWdodCB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+LCAKLSAgICAgIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gCi0gICAgICBtZXRob2RzLCB0byBtYW5ldXZlciB0aHJvdWdoIFhNTCwgcmV0cmlldmluZyBzcGVjaWZpYyB2YWx1ZXMuIDwvcD4KLSAgICA8cHJlPgotcHVibGljIHZvaWQgcHJpbnRaaXBzQW5kV29ya1Bob25lcyhYbWxPYmplY3QgeG1sKQotewotICAgIC8vIERlY2xhcmUgdGhlIG5hbWVzcGFjZSB0aGF0IHdpbGwgYmUgdXNlZC4KLSAgICBTdHJpbmcgeHFOYW1lc3BhY2UgPSAKLSAgICAgICAgJnF1b3Q7ZGVjbGFyZSBuYW1lc3BhY2UgeHE9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZWxlY3RQYXRoJyZxdW90OzsKLQotICAgIC8vIEluc2VydCBhIGN1cnNvciBhbmQgbW92ZSBpdCB0byB0aGUgZmlyc3QgZWxlbWVudC4KLSAgICBYbWxDdXJzb3IgY3Vyc29yID0geG1sLm5ld0N1cnNvcigpOwotICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAvKiAKLSAgICAgKiBTYXZlIHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uIGJ5IHB1c2hpbmcgaXQgCi0gICAgICogb250byBhIHN0YWNrIG9mIHNhdmVkIGxvY2F0aW9ucy4KLSAgICAgKi8KLSAgICBjdXJzb3IucHVzaCgpOwotICAgIC8vIFF1ZXJ5IGZvciB6aXAgZWxlbWVudHMuCi0gICAgY3Vyc29yLnNlbGVjdFBhdGgoeHFOYW1lc3BhY2UgKyAmcXVvdDskdGhpcy8veHE6emlwJnF1b3Q7KTsKLSAgICAvKiAKLSAgICAgKiBMb29wIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc2VsZWN0aW9ucywgZ2V0dGluZyB0aGUgdmFsdWUgb2YgCi0gICAgICogZWFjaCBlbGVtZW50LgotICAgICAqLwotICAgIHdoaWxlIChjdXJzb3IudG9OZXh0U2VsZWN0aW9uKCkpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3Vyc29yLmdldFRleHRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgLy8gUG9wIHRoZSBzYXZlZCBsb2NhdGlvbiBvZmYgdGhlIHN0YWNrLgotICAgIGN1cnNvci5wb3AoKTsKLSAgICAvLyBRdWVyeSBhZ2FpbiBmcm9tIHRoZSB0b3AsIHRoaXMgdGltZSBmb3Igd29yayBwaG9uZSBudW1iZXJzLgotICAgIGN1cnNvci5zZWxlY3RQYXRoKHhxTmFtZXNwYWNlICsgJnF1b3Q7JHRoaXMvL3hxOnBob25lW0Bsb2NhdGlvbj0nd29yayddJnF1b3Q7KTsKLSAgICAvKiAKLSAgICAgKiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IHNlbGVjdGlvbiwgdGhlbSBwcmludCB0aGF0IGVsZW1lbnQncwotICAgICAqIHZhbHVlLgotICAgICAqLwotICAgIGN1cnNvci50b05leHRTZWxlY3Rpb24oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3Vyc29yLmdldFRleHRWYWx1ZSgpKTsKLSAgICAvLyBEaXNwb3NlIG9mIHRoZSBjdXJzb3IuCi0gICAgY3Vyc29yLmRpc3Bvc2UoKTsKLX0KLTwvcHJlPgotICAgIDxwPlVzaW5nIHNlbGVjdGlvbnMgaXMgc29tZXdoYXQgbGlrZSB0cmFja2luZyB0aGUgbG9jYXRpb25zIG9mIG11bHRpcGxlIGN1cnNvcnMgCi0gICAgICB3aXRoIGEgc2luZ2xlIGN1cnNvci4gVGhpcyBiZWNvbWVzIGVzcGVjaWFsbHkgY2xlYXIgd2hlbiB5b3UgcmVtb3ZlIHRoZSAKLSAgICAgIFhNTCBhc3NvY2lhdGVkIHdpdGggYSBzZWxlY3Rpb24uIFdoZW4geW91IGRvIHNvIHRoZSBzZWxlY3Rpb24gaXRzZWxmIHJlbWFpbnMgCi0gICAgICBhdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlbW92ZWQgWE1MIHdhcywgYnV0IG5vdyB0aGUgc2VsZWN0aW9uJ3MgbG9jYXRpb24gCi0gICAgICBpcyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIFhNTCB0aGF0IHdhcyBhZnRlciB0aGUgWE1MIHlvdSByZW1vdmVkLiBJbiBvdGhlciAKLSAgICAgIHdvcmRzLCByZW1vdmluZyBYTUwgY3JlYXRlZCBhIGtpbmQgb2YgdmFjdXVtIHRoYXQgd2FzIGZpbGxlZCBieSB0aGUgWE1MIAotICAgICAgYWZ0ZXIgaXQsIHdoaWNoIHNoaWZ0ZWQgdXAgaW50byB0aGUgc3BhY2UgJiM4MjEyOyB1cCBpbnRvIHBvc2l0aW9uIGltbWVkaWF0ZWx5IAotICAgICAgYWZ0ZXIgdGhlIHNlbGVjdGlvbiBsb2NhdGlvbi4gVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIHRoZSBzZWxlY3Rpb24gCi0gICAgICBoYWQgYmVlbiBhbm90aGVyIGN1cnNvci48L3A+Ci0gICAgPHA+RmluYWxseSwgd2hlbiB1c2luZyBzZWxlY3Rpb25zIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBsaXN0IG9mIHNlbGVjdGlvbnMgCi0gICAgICBpcyBpbiBhIHNlbnNlICZxdW90O2xpdmUmcXVvdDsuIFRoZSBjdXJzb3IgeW91J3JlIHdvcmtpbmcgd2l0aCBpcyBrZWVwaW5nIAotICAgICAgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbnMgaW4gdGhlIGxpc3QuIEluIG90aGVyIHdvcmRzLCBiZSBzdXJlIHRvIGNhbGwgdGhlIAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNsZWFyU2VsZWN0aW9uczwvc3Bhbj4gbWV0aG9kIHdoZW4geW91J3JlIGZpbmlzaGVkIAotICAgICAgd2l0aCB0aGUgc2VsZWN0aW9ucywganVzdCBhcyB5b3Ugc2hvdWxkIGNhbGwgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuZGlzcG9zZSgpPC9zcGFuPiAKLSAgICAgIG1ldGhvZCB3aGVuIHlvdSdyZSBmaW5pc2hlZCB1c2luZyB0aGUgY3Vyc29yLjwvcD4KLSAgPC9kaXY+Ci0gIDxoMj5Vc2luZyB0aGUgZXhlY1F1ZXJ5IE1ldGhvZDwvaDI+Ci0gIDxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4gbWV0aG9kIHRvIGV4ZWN1dGUgWFF1ZXJ5IAotICAgIGV4cHJlc3Npb25zIHRoYXQgYXJlIG1vcmUgc29waGlzdGljYXRlZCB0aGFuIHBhdGhzLiBUaGVzZSBleHByZXNzaW9ucyBpbmNsdWRlIAotICAgIG1vcmUgc29waGlzdGljYXRlZCBsb29wcyBhbmQgRkxXUiAoRm9yLCBMZXQsIFdoZXJlLCBhbmQgUmVzdWx0cykgZXhwcmVzc2lvbnMuIAotICA8L3A+Ci0gIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBCZSBzdXJlIHRvIHNlZSB0aGUgc2ltcGxlRXhwcmVzc2lvbnMgCi0gICAgc2FtcGxlIGluIHRoZSBTYW1wbGVzQXBwIGFwcGxpY2F0aW9uIGZvciBhIHNhbXBsaW5nIG9mIFhRdWVyeSBleHByZXNzaW9ucyAKLSAgICBpbiB1c2UuPC9wPgotICA8aDM+Q2FsbGluZyBmcm9tIFhtbE9iamVjdDwvaDM+Ci0gIDxwPlVubGlrZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4sIGNhbGxpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4gCi0gICAgZnJvbSBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiBpbnN0YW5jZSB3aWxsIHJldHVybiBhbiAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiBhcnJheS4gSWYgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IAotICAgIGluc3RhbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgWFF1ZXJ5IG1hdGNoIGEgcmVjb2duaXplZCBYTUxCZWFucyB0eXBlICh0aGUgCi0gICAgbmFtZXNwYWNlIGFuZCB0b3AgbGV2ZWwgZWxlbWVudCBuYW1lIG1hdGNoIHVwIHdpdGggYW4gWE1MQmVhbnMgdHlwZSkgdGhlbiAKLSAgICB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gd2lsbCBiZSB0eXBlZDsgb3RoZXJ3aXNlIHRoZSAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiB3aWxsIGJlIHVudHlwZWQuPC9wPgotICA8aDM+Q2FsbGluZyBmcm9tIFhtbEN1cnNvcjwvaDM+Ci08L2Rpdj4KLSAgCi08ZGl2PiAKLSAgPHA+Q2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiBmcm9tIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IAotICAgIGluc3RhbmNlIHJldHVybnMgYSBuZXcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW5zdGFuY2UuIAotICAgIFRoZSBjdXJzb3IgcmV0dXJuZWQgaXMgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHhtbCBkb2N1bWVudCByZXByZXNlbnRpbmcgCi0gICAgdGhlIHF1ZXJ5IHJlc3VsdHMsIGFuZCB5b3UgY2FuIHVzZSBpdCB0byBtb3ZlIHRocm91Z2ggdGhlIHJlc3VsdHMsIGN1cnNvci1zdHlsZSAKLSAgICAoZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZyAKLSAgICBYTUwgd2l0aCBDdXJzb3JzPC9hPikuIElmIHRoZSBkb2N1bWVudCByZXN1bHRpbmcgZnJvbSB0aGUgcXVlcnkgZXhlY3V0aW9uIAotICAgIHJlcHJlc2VudHMgYSByZWNvZ25pemVkIFhNTEJlYW5zIHR5cGUgKHRoZSBuYW1lc3BhY2UgYW5kIHRvcCBsZXZlbCBlbGVtZW50IAotICAgIG5hbWUgbWF0Y2ggdXAgd2l0aCBhbiBYTUxCZWFucyB0eXBlKSB0aGVuIHRoZSBkb2N1bWVudCByZXN1bHRpbmcgZnJvbSB0aGUgCi0gICAgeHF1ZXJ5IHdpbGwgaGF2ZSB0aGF0IEphdmEgdHlwZTsgb3RoZXJ3aXNlIHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgd2lsbCBiZSAKLSAgICB1bnR5cGVkLjwvcD4KLSAgPGgyPlJlbGF0ZWQgVG9waWNzPC9oMj4KLTwvZGl2PgotPHA+PGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2E+PC9wPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzAyZjQuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgWE1MIFRva2VuczwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPiAKLTxkaXYgaWQ9dG9waWN0aXRsZT4gCi0gIDxwIGNsYXNzPVRpdGxlPlVuZGVyc3RhbmRpbmcgWE1MIFRva2VuczwvcD4KLTwvZGl2PgotPGRpdiBpZD10b3BpY3RleHQ+IAotICA8cD5BbiBYTUwgY3Vyc29yIChhbiBpbnN0YW5jZSBvZiB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+PC9hPiAKLSAgICBpbnRlcmZhY2UpIG1vdmVzIGZyb20gdG9rZW4gdG8gdG9rZW4gYXMgeW91ciBjb2RlIG1vdmVzIHRoZSBjdXJzb3IuIFdoZW4geW91IAotICAgIG1vdmUgYSBjdXJzb3IgdXNpbmcgYSBtZXRob2Qgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9QYXJlbnQ8L3NwYW4+LCAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9GaXJzdEF0dHJpYnV0ZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1ByZXZTaWJsaW5nPC9zcGFuPiwgCi0gICAgYW5kIHNvIG9uLCB0aGUgY3Vyc29yIG1vdmVzIHRvIHRoZSB0b2tlbiBmaXR0aW5nIHRoZSBkZXNjcmlwdGlvbi4gSWYgdGhlcmUgCi0gICAgaXMgbm8gYXBwcm9wcmlhdGUgdG9rZW4gdG8gbW92ZSB0bywgdGhlIGN1cnNvciByZW1haW5zIHdoZXJlIGl0IGlzLCBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmZhbHNlPC9zcGFuPiAKLSAgICBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRpZG4ndCBtb3ZlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnNvciBpcyAKLSAgICBhdCB0aGUgRU5ERE9DIHRva2VuICh0aGUgbGFzdCB0YWcgaW4gdGhlIGRvY3VtZW50KSwgYSBjYWxsIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9OZXh0U2libGluZzwvc3Bhbj4gCi0gICAgbWV0aG9kIHdpbGwgbm90IG1vdmUgdGhlIGN1cnNvciBhbmQgd2lsbCByZXR1cm4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmZhbHNlPC9zcGFuPiAKLSAgICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtb3ZlIHdhcyB1bnN1Y2Nlc3NmdWwuPC9wPgotICA8cD5Ob3RlIHRoYXQgd2hpbGUgeW91IGNhbiBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yLmN1cnJlbnRUb2tlblR5cGU8L3NwYW4+IAotICAgIG1ldGhvZCB0byBmaW5kIG91dCB3aGljaCB0b2tlbiB0eXBlIHRoZSBjdXJzb3IgaXMgYXQsIHlvdSBtaWdodCBmaW5kIGl0IG1vcmUgCi0gICAgY29udmVuaWVudCB0byB1c2UgYSBtZXRob2Qgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXNFbmRkb2M8L3NwYW4+LiAKLSAgICBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlIHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcyAKLSAgICB0aGF0IG1ha2UgaXQgZWFzeSB0byBkaXNjb3ZlciB3aGV0aGVyIHRoZSBjdXJzb3IgeW91J3JlIG1vdmluZyBpcyBhdCB0aGUgdG9rZW4gCi0gICAgeW91J3JlIGxvb2tpbmcgZm9yLiBUaGVzZSBtZXRob2RzLCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pc1N0YXJ0PC9zcGFuPiwgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzQXR0cjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pc1RleHQ8L3NwYW4+LCAKLSAgICBhbmQgc28gb24sIHJldHVybiBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5ib29sZWFuPC9zcGFuPiB2YWx1ZSB0aGF0IGluZGljYXRlcyAKLSAgICB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHRva2VuIHR5cGUgaW4gcXVlc3Rpb24uPC9wPgotICA8UD5Ub2tlbnMgYXJlIHJlcHJlc2VudGVkIGJ5IGNvbnN0YW50cyBpbiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5Ub2tlblR5cGUuaHRtbCI+VG9rZW5UeXBlPC9hPjwvc3Bhbj4gCi0gICAgY2xhc3MsIGFuIGlubmVyIGNsYXNzIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UuIAotICAgIEVhY2ggaGFzIGEgY29uc3RhbnQgeW91IGNhbiB1c2UgaW4gc3dpdGNoIHN0YXRlbWVudHMgdG8gcGVyZm9ybSBieS10b2tlbiBhY3Rpb25zLiAKLSAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSB0b2tlbiB0eXBlczo8L1A+Ci0gIDxUQUJMRSBpZD0iVGFibGUxIj4KLSAgICA8VFI+IAotICAgICAgPFREPjxTVFJPTkc+VG9rZW4gVHlwZTwvU1RST05HPjwvVEQ+Ci0gICAgICA8VEQ+PFNUUk9ORz5Td2l0Y2ggQ29uc3RhbnQ8L1NUUk9ORz48L1REPgotICAgICAgPFREPjxTVFJPTkc+RGVzY3JpcHRpb248L1NUUk9ORz48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5TVEFSVERPQzwvVEQ+Ci0gICAgICA8VEQ+SU5UX1NUQVJURE9DPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIHRoZSBzdGFydCBvZiB0aGUgWE1MLiBBbHdheXMgdGhlIGZpcnN0IHRva2VuLiBUaGUgZG9jdW1lbnQgCi0gICAgICAgIGVsZW1lbnQgaXRzZWxmIGlzIHJlcHJlc2VudGVkIGJ5IGEgU1RBUlQgdG9rZW4sIG5vdCB0aGUgU1RBUlRET0MgdG9rZW4uPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4gCi0gICAgICA8VEQ+RU5ERE9DIDwvVEQ+Ci0gICAgICA8VEQ+SU5UX0VORERPQzwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBYTUwuIEFsd2F5cyB0aGUgbGFzdCB0b2tlbi48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5TVEFSVCA8L1REPgotICAgICAgPFREPklOVF9TVEFSVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5FTkQgPC9URD4KLSAgICAgIDxURD5JTlRfRU5EPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIHRoZSBlbmQgb2YgYW4gZWxlbWVudC4gVGhlIEVORCB0b2tlbiBoYXMgbm8gdmFsdWUsIGJ1dCBtYXJrcyAKLSAgICAgICAgdGhlIGVsZW1lbnQncyBlbmQuPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4gCi0gICAgICA8VEQ+VEVYVDwvVEQ+Ci0gICAgICA8VEQ+SU5UX1RFWFQ8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgdGV4dC48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5BVFRSIDwvVEQ+Ci0gICAgICA8VEQ+SU5UX0FUVFI8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgYW4gYXR0cmlidXRlLiBBVFRSIHRva2VucyBhcmUgYWxsb3dlZCB0byBhcHBlYXIgYWZ0ZXIgYSBTVEFSVERPQyAKLSAgICAgICAgb3IgU1RBUlQgdG9rZW4uPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4gCi0gICAgICA8VEQ+TkFNRVNQQUNFPC9URD4KLSAgICAgIDxURD5JTlRfTkFNRVNQQUNFPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIGEgbmFtZXNwYWNlICh4bWxucykgYXR0cmlidXRlLiBBbHNvIG9ubHkgYWxsb3dlZCBhZnRlciBTVEFSVCAKLSAgICAgICAgb3IgU1RBUlRET0MgdG9rZW5zLjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+IAotICAgICAgPFREPkNPTU1FTlQgPC9URD4KLSAgICAgIDxURD5JTlRfQ09NTUVOVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyBhIGNvbW1lbnQuPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4gCi0gICAgICA8VEQ+UFJPQ0lOU1QgPC9URD4KLSAgICAgIDxURD5JTlRfUFJPQ0lOU1Q8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLjwvVEQ+Ci0gICAgPC9UUj4KLSAgPC9UQUJMRT4KLSAgPFA+QXMgeW91IHVzZSBhIGN1cnNvciB0byBuYXZpZ2F0ZSB0aHJvdWdoIFhNTCwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBjb252ZW5pZW5jZSAKLSAgICBtZXRob2RzIGRlc2NyaWJlZCBhYm92ZSB0byBkaXNjb3ZlciB3aGV0aGVyIHlvdSdyZSBhdCB0aGUgdG9rZW4geW91J3JlIGxvb2tpbmcgCi0gICAgZm9yLCBvciB1c2UgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuY3VycmVudFRva2VuVHlwZTwvc3Bhbj4mbmJzcDttZXRob2QgCi0gICAgdG8gZGlzY292ZXIgdGhlIGN1cnJlbnQgdG9rZW4ncyB0eXBlLiBUaGUgZm9sbG93aW5nIGZpZ3VyZSBpbGx1c3RyYXRlcyBleGFtcGxlIAotICAgIGxvY2F0aW9ucyBmb3IgdG9rZW4gdHlwZXM6PC9QPgotICA8UD48SU1HIHNyYz0iLi4vaW1hZ2VzL2NvbkN1cnNvclRva2VuTG9jYXRpb25zLmdpZiIgd2lkdGg9IjcyNyIgaGVpZ2h0PSI1MzIiPgotICA8aDI+U3dpdGNoaW5nIHRvIFRlc3QgZm9yIFRva2VuIFR5cGVzPC9oMj4KLSAgPHA+SGVyZSdzIGEgYml0IG9mIGNvZGUgaWxsdXN0cmF0aW5nIGhvdyB5b3UgbWlnaHQgdXNlIGEgSmF2YSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3dpdGNoPC9zcGFuPiAKLSAgICBzdGF0ZW1lbnQgdG8gdGVzdCBmb3IgdGhlIFNUQVJUIHRva2VuIHR5cGUuPC9wPgotICA8cHJlPgotLy8gVGFrZSBhbiBpbmNvbWluZyBYbWxPYmplY3QgYW5kIGluc2VydCBhIGN1cnNvci4KLVhtbEN1cnNvciBkb2N1bWVudEN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKLSAKLS8qIAotICogTG9vcCB0aHJvdWdoIHRoZSBkb2N1bWVudCwgcGFzc2luZyB0aGUgY3Vyc29yIHdoZW4gaXQgc3RvcHMgYXQgZWFjaCB0b2tlbiAKLSAqIHRvIGEgZnVuY3Rpb24gZGVzaWduZWQgdG8gZGlzY292ZXIgdGhlIHRva2VuIHR5cGUuIENvbnRpbnVlIHRoZSBsb29wCi0gKiBhcyBsb25nIGF0IHRoZSBjdXJzb3IgaXMgYXQgYSB0b2tlbiAodW50aWwgaXQgcmVhY2hlcyB0aGUgZW5kKS4KLSAqLwotd2hpbGUgKCFkb2N1bWVudEN1cnNvci50b05leHRUb2tlbigpLmlzTm9uZSgpKSAKLXsKLSAgICAvKgotICAgICAqIFVzZSB0aGUgaW50VmFsdWUgbWV0aG9kIHRvIHJldHVybiB0aGUgaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIAotCSAqIGN1cnJlbnQgdG9rZW4gdHlwZS4gSWYgaXQgaXMgdGhlIHZhbHVlIGZvciBJTlRfU1RBUlQsCi0JICogdGhlbiB5b3UgaGF2ZSBhIG1hdGNoLgotCSAqLwotICAgIHN3aXRjaCAoY3Vyc29yLmN1cnJlbnRUb2tlblR5cGUoKS5pbnRWYWx1ZSgpKQotICAgIHsgICAgICAgIAotICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfU1RBUlQ6Ci0gICAgICAgIC8vIFByaW50IG91dCB0aGUgdG9rZW4gdHlwZSBhbmQgYSBtZXNzYWdlLgotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3Vyc29yLmN1cnJlbnRUb2tlblR5cGUoKSArIAotICAgICAgICAgICAgIjsgY3Vyc29yIGlzIGF0IHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LiIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0vLyBCZSBzdXJlIHRvIGRpc3Bvc2Ugb2YgYSBjdXJzb3Igd2hlbiB5b3UncmUgZmluaXNoZWQuCi1kb2N1bWVudEN1cnNvci5kaXNwb3NlKCk7Ci08L3ByZT4KLSAgPHA+VGhlIHNjb3BlIG9mIGFuIFhNTCBjdXJzb3IgaXMgdGhlIFhNTCBkb2N1bWVudCBpbiB3aGljaCBpdCBpcyBjcmVhdGVkLiBGb3IgCi0gICAgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYSBjdXJzb3IgYXQgdGhlIG9yZGVySXRlbSBlbGVtZW50IGluIHRoZSBleGFtcGxlIGVhcmxpZXIgCi0gICAgaW4gdGhpcyB0b3BpYy4gSWYgeW91IHRoZW4gdXNlIHRoYXQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gCi0gICAgaW5zdGFuY2UncyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9OZXh0VG9rZW48L3NwYW4+IG1ldGhvZCB0byBtb3ZlIHRoZSAKLSAgICBjdXJzb3IgdW50aWwgaXQgd29uJ3QgbW92ZSBhbnkgZnVydGhlciwgeW91J2xsIGhhdmUgcmVhY2hlZCB0aGUgRU5ERE9DIHRva2VuLiAKLSAgICBJbiB0aGlzIGV4YW1wbGUsIHRoYXQncyBhdCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPiZsdDsvYmF0Y2hXaWRnZXRPcmRlciZndDs8L3NwYW4+IAotICAgIHRhZy4gSW4gb3RoZXIgd29yZHMsIHRoZSBjdXJzb3IncyBzY29wZSBpcyBub3QgbGltaXRlZCB0byB0aGUgZWxlbWVudCBhdCB3aGljaCAKLSAgICBpdCB3YXMgY3JlYXRlZC48L3A+Ci0gIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+Ci0gIDxwPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5Ub2tlblR5cGUuaHRtbCI+WG1sQ3Vyc29yLlRva2VuVHlwZSAKLSAgICBDbGFzczwvYT48L3A+Ci0gIDxwPjxhIGhyZWY9ImNvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sIj5OYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25Vc2luZ0Jvb2ttYXJrc1RvQW5ub3RhdGVYTUwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyZWU5Ny4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2NvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPlVzaW5nIEJvb2ttYXJrcyB0byBBbm5vdGF0ZSBYTUw8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KLQotPG1ldGEgbmFtZT0iY29tcG9uZW50IiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBjb21wb25lbnQgbWV0YXRhZywgcGxlYXNlIGxpc3Qga2V5d29yZHMgdGhhdCB3aWxsIGhlbHAgYSB1c2VyIHNlYXJjaCBmb3IgdGhpcyB0b3BpYy4gLS0+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4gCi08ZGl2IGlkPXRvcGljdGl0bGU+IAotICA8cCBjbGFzcz1UaXRsZT5Vc2luZyBCb29rbWFya3MgdG8gQW5ub3RhdGUgWE1MPC9wPgotPC9kaXY+Ci08ZGl2IGlkPXRvcGljdGV4dD4gCi0gIDxwPllvdSBjYW4gdXNlIGEgY3Vyc29yIHRvIGluc2VydCBib29rbWFya3MgdGhhdCBhbm5vdGF0ZSBYTUwgd2l0aCBtYXJrZXJzIGNvbnRhaW5pbmcgCi0gICAgaW5mb3JtYXRpb24geW91IGRlc2lnbi4gVGhlc2UgYm9va21hcmtzIGFyZW4ndCB3cml0dGVuIGludG8gdGhlIFhNTCBpdHNlbGYsIAotICAgIGJ1dCBpbiBhIHNlbnNlICJoYW5nIiBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSBpdCB3YXMgaW5zZXJ0ZWQuIEluIHRoaXMgd2F5IAotICAgIHlvdSBjYW4gYXNzb2NpYXRlIGFyYml0cmFyeSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gd2l0aCBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgCi0gICAgWE1MLjwvcD4KLSAgPFA+WW91IGRlc2lnbiB5b3VyIG93biBib29rbWFyayBjbGFzc2VzIGJ5IGV4dGVuZGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLlhtbEJvb2ttYXJrLmh0bWwiPlhtbEJvb2ttYXJrPC9hPjwvc3Bhbj4sIAotICAgIGEgbmVzdGVkIGNsYXNzIG9mIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yPC9hPjwvc3Bhbj4uIAotICAgIFlvdSBjYW4gZGVzaWduIHlvdXIgYm9va21hcmsgY2xhc3MgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB5b3VyIAotICAgIG5lZWRzLiA8L1A+Ci0gIDxQPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPk9yZGVyQm9va21hcms8L3NwYW4+IGlzIAotICAgIGFuIGlubmVyIGNsYXNzIHRoYXQgZXh0ZW5kcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yLlhtbEJvb2ttYXJrPC9zcGFuPi4gCi0gICAgSXQgbWVyZWx5IHN0b3JlcyBhIHBpZWNlIG9mIHRleHQuPC9QPgotICA8UFJFPgotLyogCi0gKiBUaGUgT3JkZXJCb29rbWFyayBjbGFzcyBpbmNsdWRlcyBhIGNvbnN0cnVjdG9yIHRocm91Z2ggd2hpY2ggeW91IHdpbGwgCi0gKiBpbnNlcnQgeW91ciBib29rbWFyaydzIGNvbnRlbnQuIEl0IGFsc28gaW5jbHVkZXMgZ2V0IGFuZCBzZXQgbWV0aG9kcwotICogeW91IGNhbiB1c2UgdG8gcmV0cmlldmUgYW5kIGNoYW5nZSB0aGUgY29udGVudC4KLSAqLwotc3RhdGljIGNsYXNzIE9yZGVyQm9va21hcmsgZXh0ZW5kcyBYbWxDdXJzb3IuWG1sQm9va21hcmsgewotICAgIHB1YmxpYyBPcmRlckJvb2ttYXJrIChTdHJpbmcgdGV4dCkgeyBURVhUID0gdGV4dDsgfQotICAgIHB1YmxpYyBTdHJpbmcgVEVYVDsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7IHJldHVybiBURVhUOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgeyBURVhUID0gbmV3VGV4dDsgfQotfQotPC9QUkU+Ci0gIDxwPllvdSBjYW4gdXNlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvIHN0b3JlIGJvb2ttYXJrcyBhdCBwbGFjZXMgaW4geW91ciAKLSAgICBYTUwuIFRoZSBmb2xsb3dpbmcgZXhjZXJwdCBvZiBjb2RlIGNyZWF0ZXMgYSBjdXJzb3IgYW5kIGFuIGluc3RhbmNlIG9mIHRoZSAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+T3JkZXJCb29rbWFyazwvc3Bhbj4gY2xhc3MuIFRoZW4gaXQgdXNlcyB0aGUgY3Vyc29yIAotICAgIHRvIGluc2VydCB0aGUgYm9va21hcmsgYXQgdGhlIGN1cnNvcidzIGN1cnJlbnQgbG9jYXRpb24uPC9wPgotICA8cHJlPgotICAgIFhtbEN1cnNvciBvcmRlckN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKLSAgICBPcmRlckJvb2ttYXJrIHRoaXNCb29rbWFyayA9IG5ldyBPcmRlckJvb2ttYXJrKCJmb28iKTsKLSAgICBvcmRlckN1cnNvci5zZXRCb29rbWFyayh0aGlzQW5ub3RhdGlvbik7Ci08L3ByZT4KLSAgPHAgY2xhc3M9cmVsYXRlZHRvcGljcz5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29yczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc3NTllLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPkphdmEgVHlwZXMgZm9yIFhNTCBTY2hlbWE8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KLQotPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJ5b3VyIG5hbWUiPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiI+Ci08bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyI+Ci08bWV0YSBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiIGNvbnRlbnQ9IjEwLzI1LzAyIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLQotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGgxPiBYTUxCZWFucyBTdXBwb3J0IGZvciBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2gxPgotPHA+SnVzdCBhcyB3aXRoIHR5cGVzIGluIFhNTCBzY2hlbWEsIHRoZSBYTUxCZWFucyB0eXBlcyBiYXNlZCBvbiBzY2hlbWEgYXJlIGFycmFuZ2VkIAotICBpbiBhIGhpZXJhcmNoeS4gSW4gZ2VuZXJhbCwgdGhlIGhpZXJhcmNoeSBvZiBYTUxCZWFuIHR5cGVzIG1pcnJvcnMgdGhlIGhpZXJhcmNoeSAKLSAgb2YgdGhlIHNjaGVtYSB0eXBlcyB0aGVtc2VsdmVzLiBYTUwgc2NoZW1hIHR5cGVzIGFsbCBpbmhlcml0IGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmFueVR5cGU8L3NwYW4+IAotICAod2hpY2ggaXMgYXQgdGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSk7IFhNTEJlYW5zIHR5cGVzIGluaGVyaXQgZnJvbSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPi48L3A+Ci08cD5JbiBYTUwgc2NoZW1hLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4gaXMgdGhlIHJvb3QgdHlwZSAKLSAgZm9yIHR3byB0eXBlIGNhdGVnb3JpZXM6IGJ1aWx0LWluIGFuZCB1c2VyLWRlcml2ZWQuIEJ1aWx0LWluIHNjaGVtYSB0eXBlcyBhcmUgCi0gIGNvbW1vbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24uIFVzZXItZGVyaXZlZCB0eXBlcyBhcmUgCi0gIHRob3NlIHlvdSBkZWZpbmUgaW4geW91ciBzY2hlbWEuIFRoaXMgdG9waWMgbGlzdHMgdGhlIGJ1aWx0LWluIHR5cGVzIHByb3ZpZGVkIAotICB3aXRoIFhNTEJlYW5zLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdXNlci1kZXJpdmVkIHR5cGVzIGFuZCB0aGUgSmF2YSB0eXBlcyBnZW5lcmF0ZWQgCi0gIGZyb20gdGhlbSwgc2VlIDxhIGhyZWY9ImNvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIj5KYXZhIFR5cGVzIEdlbmVyYXRlZCAKLSAgZnJvbSBVc2VyLURlcml2ZWQgU2NoZW1hIFR5cGVzPC9hPi48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGZpZ3VyZSBpbGx1c3RyYXRlcyB0aGUgaGllcmFyY2h5IG9mIHR5cGVzLCBzaG93aW5nIGJvdGggYnVpbHQtaW4gCi0gIHNjaGVtYSB0eXBlcyBhbmQgdGhlaXIgWE1MQmVhbnMgcGFyYWxsZWxzLiBOb3RpY2UsIHRvbywgdGhhdCBuZWFybHkgYWxsIG9mIHRoZSAKLSAgYnVpbHQtaW4gdHlwZXMgYXJlIGFsc28gYXZhaWxhYmxlIGFzIG5hdHVyYWwgSmF2YSB0eXBlcy48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL2NvblhNTFR5cGVIaWVyYXJjaHkuZ2lmIiB3aWR0aD0iODY1IiBoZWlnaHQ9Ijg4NyI+IDwvcD4KLTxoMT5KYXZhIFR5cGVzIFJlcHJlc2VudGluZyBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2gxPgotPHA+QXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgZmlndXJlIGFib3ZlLCBhbGwgNDYgYnVpbHQtaW4gc2NoZW1hIHR5cGVzIGFyZSByZXByZXNlbnRlZCAKLSAgYnkgYW4gWE1MQmVhbiB0eXBlIHByb3ZpZGVkIHdpdGggWE1MQmVhbnMuIFdoZW4gdXNpbmcgYnVpbHQtaW4gWE1MQmVhbiB0eXBlcywgCi0gIGtlZXAgaW4gbWluZCB0aGF0OjwvcD4KLTx1bD4KLSAgPGxpPiBTaW5jZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiBjb3JyZXNwb25kcyB0byB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmFueVR5cGU8L3NwYW4+LCAKLSAgICBhbGwgSmF2YSBYTUxCZWFuIHR5cGVzIGluaGVyaXQgZnJvbSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPi4gCi0gICAgVGhlcmVmb3JlIGFsbCBYTUxCZWFuIHR5cGVzIHNoYXJlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiAKLSAgICBpbnRlcmZhY2WScyBhYmlsaXR5IHRvIGNyZWF0ZSBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiAKLSAgICBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIG9iamVjdC4gVGhleSBjYW4gYWxzbyByZW5kZXIgdGhlIFhNTCBhcyBzdHJpbmdzIG9yIAotICAgIHN0cmVhbXMuIAotICA8bGk+IAotICAgIDxkaXY+V2hlcmUgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIG5hdHVyYWwgSmF2YSB0eXBlLCB0aGUgWE1MQmVhbnMgdHlwZSBwcm92aWRlcyAKLSAgICAgIGEgd2F5IHRvIGdldCB0aGUgdW5kZXJseWluZyBYTUwncyB2YWx1ZSBhcyB0aGUgbmF0dXJhbCB0eXBlLiBTZWUgdGhlIHRhYmxlIAotICAgICAgaW4gdGhpcyB0b3BpYyBmb3IgaW5mb3JtYXRpb24gb24gaG93IG5hdHVyYWwgSmF2YSB0eXBlcyBtYXAgdG8gWE1MQmVhbnMgCi0gICAgICB0eXBlcy4gPC9kaXY+Ci0gIAotICA8bGk+IFZhbHVlcyBhc3NpZ25lZCB0byBidWlsdC1pbiBYTUxCZWFucyB0eXBlcyBhcmUgdmFsaWRhdGVkIGluIGtlZXBpbmcgd2l0aCAKLSAgICB0aGUgcnVsZXMgb2YgdGhlIHNjaGVtYSB0eXBlIHRoZXkgcmVwcmVzZW50LiBTbywgZm9yIGV4YW1wbGUsIGFuIGF0dGVtcHQgdG8gCi0gICAgYXNzaWduIGEgbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSB0byBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sUG9zaXRpdmVJbnRlZ2VyPC9zcGFuPiAKLSAgICB3aWxsIHRocm93IGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxWYWx1ZU91dE9mUmFuZ2U8L3NwYW4+IGV4Y2VwdGlvbi48L2xpPgotPC91bD4KLTxkaXY+IAotICA8cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBidWlsdC1pbiBzY2hlbWEgdHlwZXMsIGFsb25nIHdpdGggdGhlaXIgWE1MQmVhbnMgCi0gICAgYW5kIG5hdHVyYWwgSmF2YSBwYXJhbGxlbHMuIFVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIG5hdHVyYWwgSmF2YSB0eXBlcyBhcmUgCi0gICAgaW4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5qYXZhLmxhbmc8L3NwYW4+IHBhY2thZ2U7IFhNTEJlYW4gdHlwZXMgYXJlIAotICAgIGluIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+b3JnLmFwYWNoZS54bWxiZWFuczwvc3Bhbj4gcGFja2FnZS48L3A+Ci08L2Rpdj4KLTxkaXYgaWQ9InRvcGljdGV4dCI+IAotICA8dGFibGU+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZCB3aWR0aD0iMzAlIj48c3Ryb25nPkJ1aWx0LUluIFNjaGVtYSBUeXBlPC9zdHJvbmc+PC90ZD4KLSAgICAgIDx0ZCB3aWR0aD0iMzElIj48c3Ryb25nPlhNTEJlYW4gVHlwZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICA8dGQgd2lkdGg9IjM5JSI+PHN0cm9uZz5OYXR1cmFsIEphdmEgVHlwZTwvc3Ryb25nPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPnhzOmFueVR5cGU8L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5odG1sIj5YbWxPYmplY3Q8L2E+PC90ZD4KLSAgICAgIDx0ZD4gPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0PC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdC1hbnlTaW1wbGVUeXBlIiB0YXJnZXQ9Il9ibGFuayI+eHM6YW55U2ltcGxlVHlwZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuaHRtbCI+WG1sQW55U2ltcGxlVHlwZTwvYT48L3RkPgotICAgICAgPHRkPiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiIHRhcmdldD0iX2JsYW5rIj54czphbnlVUkk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlVUkkuaHRtbCI+WG1sQW55VVJJPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYmFzZTY0QmluYXJ5IiB0YXJnZXQ9Il9ibGFuayI+eHM6YmFzZTY0QmluYXJ5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5Lmh0bWwiPlhtbEJhc2U2NEJpbmFyeTwvYT48L3RkPgotICAgICAgPHRkPmJ5dGVbXTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNib29sZWFuIiB0YXJnZXQ9Il9ibGFuayI+eHM6Ym9vbGVhbjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJvb2xlYW4uaHRtbCI+WG1sQm9vbGVhbjwvYT48L3RkPgotICAgICAgPHRkPmJvb2xlYW48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnl0ZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmJ5dGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmh0bWwiPlhtbEJ5dGU8L2E+PC90ZD4KLSAgICAgIDx0ZD5ieXRlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQgaGVpZ2h0PSIxNyI+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGUiIHRhcmdldD0iX2JsYW5rIj54czpkYXRlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5odG1sIj5YbWxEYXRlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmRhdGVUaW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZVRpbWUuaHRtbCI+WG1sRGF0ZVRpbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiIHRhcmdldD0iX2JsYW5rIj54czpkZWNpbWFsPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGVjaW1hbC5odG1sIj5YbWxEZWNpbWFsPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvbWF0aC9CaWdEZWNpbWFsLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLm1hdGguQmlnRGVjaW1hbDwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZG91YmxlIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZG91YmxlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRG91YmxlLmh0bWwiPlhtbERvdWJsZTwvYT48L3RkPgotICAgICAgPHRkPmRvdWJsZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiIgdGFyZ2V0PSJfYmxhbmsiPnhzOmR1cmF0aW9uPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRHVyYXRpb24uaHRtbCI+WG1sRHVyYXRpb248L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb24uaHRtbCI+b3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb248L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIiB0YXJnZXQ9Il9ibGFuayI+eHM6RU5USVRJRVM8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVElFUy5odG1sIj5YbWxFTlRJVElFUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSIgdGFyZ2V0PSJfYmxhbmsiPnhzOkVOVElUWTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUWS5odG1sIj5YbWxFTlRJVFk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmZsb2F0PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmxvYXQuaHRtbCI+WG1sRmxvYXQ8L2E+PC90ZD4KLSAgICAgIDx0ZD5mbG9hdDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnRGF5IiB0YXJnZXQ9Il9ibGFuayI+eHM6Z0RheTwvYT48L3RkPgotICAgICAgPHRkPjxwPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdEYXkuaHRtbCI+WG1sR0RheTwvYT48L3A+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdNb250aC5odG1sIj5YbWxHTW9udGg8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aERheSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdNb250aERheTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdNb250aERheS5odG1sIj5YbWxHTW9udGhEYXk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIiB0YXJnZXQ9Il9ibGFuayI+eHM6Z1llYXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhci5odG1sIj5YbWxHWWVhcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXJNb250aCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdZZWFyTW9udGg8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhck1vbnRoLmh0bWwiPlhtbEdZZWFyTW9udGg8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2hleEJpbmFyeSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmhleEJpbmFyeTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEhleEJpbmFyeS5odG1sIj5YbWxIZXhCaW5hcnk8L2E+PC90ZD4KLSAgICAgIDx0ZD5ieXRlW108L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSUQiIHRhcmdldD0iX2JsYW5rIj54czpJRDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmh0bWwiPlhtbElEPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUYiIHRhcmdldD0iX2JsYW5rIj54czpJRFJFRjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGLmh0bWwiPlhtbElEUkVGPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUZTIiB0YXJnZXQ9Il9ibGFuayI+eHM6SURSRUZTPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUZTLmh0bWwiPlhtbElEUkVGUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmludDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5odG1sIj5YbWxJbnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD5pbnQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOmludGVnZXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmh0bWwiPlhtbEludGVnZXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsYW5ndWFnZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmxhbmd1YWdlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGFuZ3VhZ2UuaHRtbCI+WG1sTGFuZ3VhZ2U8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsb25nIiB0YXJnZXQ9Il9ibGFuayI+eHM6bG9uZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuaHRtbCI+WG1sTG9uZzwvYT48L3RkPgotICAgICAgPHRkPmxvbmc8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5hbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOYW1lLmh0bWwiPlhtbE5hbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOQ05hbWUiIHRhcmdldD0iX2JsYW5rIj54czpOQ05hbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOQ05hbWUuaHRtbCI+WG1sTkNOQU1FPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbmVnYXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6bmVnYXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmh0bWwiPlhtbE5lZ2F0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU4iIHRhcmdldD0iX2JsYW5rIj54czpOTVRPS0VOPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTi5odG1sIj5YbWxOTVRPS0VOPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiIHRhcmdldD0iX2JsYW5rIj54czpOTVRPS0VOUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU5TLmh0bWwiPlhtbE5NVE9LRU5TPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6bm9uTmVnYXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VyLmh0bWwiPlhtbE5vbk5lZ2F0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vblBvc2l0aXZlSW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOm5vblBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5odG1sIj5YbWxOb25Qb3NpdGl2ZUludGVnZXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIiB0YXJnZXQ9Il9ibGFuayI+eHM6bm9ybWFsaXplZFN0cmluZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vcm1hbGl6ZWRTdHJpbmcuaHRtbCI+WG1sTm9ybWFsaXplZFN0cmluZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05PVEFUSU9OIiB0YXJnZXQ9Il9ibGFuayI+eHM6Tk9UQVRJT048L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOT1RBVElPTi5odG1sIj5YbWxOT1RBVElPTjwvYT48L3RkPgotICAgICAgPHRkPiBOb3Qgc3VwcG9ydGVkPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOnBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5odG1sIj5YbWxQb3NpdGl2ZUludGVnZXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOlFOYW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuaHRtbCI+WG1sUU5hbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvMS40L2RvY3MvYXBpL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Nob3J0IiB0YXJnZXQ9Il9ibGFuayI+eHM6c2hvcnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5odG1sIj5YbWxTaG9ydDwvYT48L3RkPgotICAgICAgPHRkPnNob3J0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyIgdGFyZ2V0PSJfYmxhbmsiPnhzOnN0cmluZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFN0cmluZy5odG1sIj5YbWxTdHJpbmc8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0aW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6dGltZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRpbWUuaHRtbCI+WG1sVGltZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iIHRhcmdldD0iX2JsYW5rIj54czp0b2tlbjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuLmh0bWwiPlhtbFRva2VuPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRCeXRlIiB0YXJnZXQ9Il9ibGFuayI+eHM6dW5zaWduZWRCeXRlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmh0bWwiPlhtbFVuc2lnbmVkQnl0ZTwvYT48L3RkPgotICAgICAgPHRkPnNob3J0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkSW50IiB0YXJnZXQ9Il9ibGFuayI+eHM6dW5zaWduZWRJbnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZEludC5odG1sIj5YbWxVbnNpZ25lZEludDwvYT48L3RkPgotICAgICAgPHRkPmxvbmc8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRMb25nIiB0YXJnZXQ9Il9ibGFuayI+eHM6dW5zaWduZWRMb25nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRMb25nLmh0bWwiPlhtbFVuc2lnbmVkTG9uZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkU2hvcnQiIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZFNob3J0PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5odG1sIj5YbWxVbnNpZ25lZFNob3J0PC9hPjwvdGQ+Ci0gICAgICA8dGQ+aW50PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+Ci08ZGl2PiAKLSAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgotICA8cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYgYi92MS9kb2NzL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjZkMzguLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9pbWFnZXMvY29uQ3Vyc29yVG9rZW5Mb2NhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9pbWFnZXMvY29uWE1MVHlwZUhpZXJhcmNoeS5naWYgYi92MS9kb2NzL2ltYWdlcy9jb25YTUxUeXBlSGllcmFyY2h5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwYzMyNi4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2ltYWdlcy9jb25YTUxUeXBlSGllcmFyY2h5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MgYi92MS9kb2NzL3N0eWxlc2hlZXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFkODAzLi4wMDAwMDAwCi0tLSBhL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBKYXZhZG9jIHN0eWxlIHNoZWV0ICovCi0KLS8qIERlZmluZSBjb2xvcnMsIGZvbnRzIGFuZCBvdGhlciBzdHlsZSBhdHRyaWJ1dGVzIGhlcmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzICovCi0KLS8qIFBhZ2UgYmFja2dyb3VuZCBjb2xvciAqLwotYm9keSB7IAkKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGIAotfQotCi1ib2R5IHsKLS8qCXBhZGRpbmc6IDBweCAwcHggMHB4IDE1cHg7ICovCi0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQljb2xvcjogIzAwMDAwOwotCWZvbnQtc2l6ZTogODAlOwotfQotCi0vKiBUYWJsZSBjb2xvcnMgKi8KLS5UYWJsZUhlYWRpbmdDb2xvciAgICAgeyBiYWNrZ3JvdW5kOiAjQ0NDQ0ZGIH0gLyogRGFyayBtYXV2ZSAqLwotLlRhYmxlU3ViSGVhZGluZ0NvbG9yICB7IGJhY2tncm91bmQ6ICNFRUVFRkYgfSAvKiBMaWdodCBtYXV2ZSAqLwotLlRhYmxlUm93Q29sb3IgICAgICAgICB7IGJhY2tncm91bmQ6ICNGRkZGRkYgfSAvKiBXaGl0ZSAqLwotCi0vKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovCi0uRnJhbWVUaXRsZUZvbnQgICB7IGZvbnQtc2l6ZTogMTBwdHM7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW4tc2VyaWYgfQotLkZyYW1lSGVhZGluZ0ZvbnQgeyBmb250LXNpemU6IDEwcHRzOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2FuLXNlcmlmIH0KLS5GcmFtZUl0ZW1Gb250ICAgIHsgZm9udC1zaXplOiAxMHB0czsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbi1zZXJpZiB9Ci0KLS8qIEV4YW1wbGUgb2Ygc21hbGxlciwgc2Fucy1zZXJpZiBmb250IGluIGZyYW1lcyAqLwotLyogLkZyYW1lSXRlbUZvbnQgIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9ICovCi0KLS8qIE5hdmlnYXRpb24gYmFyIGZvbnRzIGFuZCBjb2xvcnMgKi8KLS5OYXZCYXJDZWxsMSAgICB7IGJhY2tncm91bmQtY29sb3I6I0VFRUVGRjt9LyogTGlnaHQgbWF1dmUgKi8KLS5OYXZCYXJDZWxsMVJldiB7IGJhY2tncm91bmQtY29sb3I6IzAwMDA4Qjt9LyogRGFyayBCbHVlICovCi0uTmF2QmFyRm9udDEgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMDt9Ci0uTmF2QmFyRm9udDFSZXYgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6I0ZGRkZGRjt9Ci0KLS5OYXZCYXJDZWxsMiAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7fQotLk5hdkJhckNlbGwzICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9Ci0KZGlmZiAtLWdpdCBhL3YxL2RvY3MveG1sYmVhbnMuY3NzIGIvdjEvZG9jcy94bWxiZWFucy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjIwNjEuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy94bWxiZWFucy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyogIFRoZSBzdHlsZXMgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZCBhcmU6Ci0JLSBUaXRsZTogVGhlIHRpdGxlIG9mIHRoZSB0b3BpYwotCS0gaDEsIGgyLCBoMzogRmlyc3QsIHNlY29uZCwgYW5kIHRoaXJkLWxldmVsIGhlYWRpbmdzIHdpdGhpbiB0aGUgYm9keSBvZiBhIHRvcGljCi0JLSByZWxhdGVkVG9waWNzOiBSZWxhdGVkIFRvcGljcwotCS0gcHJvY1RpdGxlOiBXaXRoaW4gSG93IERvIEk6Li4uIHRvcGljcywgZm9yIGhlYWRpbmdzIHdpdGhpbiB0aGUgYm9keSBvZiBhIHRvcGljIHRoYXQgYXJlIGZvbGxvd2VkIGJ5Ci0JICBidWxsZXRlZCBwcm9jZWR1cmVzICgiVG8gZG8gdGhpcyIpLgotCS0gcHJlOiBGb3IgY29kZSBibG9ja3MKLQktIGxhbmdpbmxpbmU6IEZvciBjb2RlIGZyYWdtZW50cyB3aXRoaW4gYSAobm9uLWNvZGUpIHJlZ3VsYXIgc2VjdGlvbi4KLQktIG5vdGVwYXJhOiBOb3RlcwkgCi0qLwotaDEsCi1oMiwKLWgzLAotaDQsCi1oNSwKLXAsCi1wcm9jdGl0bGUsCi1yZWxhdGVkdG9waWNzIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotLyogVXNlIGgxIGZvciBhbGwgZmlyc3QtbGV2ZWwgaGVhZGluZ3Mgd2l0aGluIHRoZSBib2R5IG9mIGEgdG9waWMuIAotICAgRm9yIHRoZSB0b3BpYyB0aXRsZSwgdXNlIHRoZSBUaXRsZSBzdHlsZS4gKi8KLWgxIHsKLQlmb250LXNpemU6IDEzNSU7Ci0JbWFyZ2luLXRvcDogLjVlbTsKLQltYXJnaW4tYm90dG9tOiAuNWVtOwotfQotCi0vKiBVc2UgaDIgZm9yIGFsbCBzZWNvbmQtbGV2ZWwgaGVhZGluZ3MuICovCi1oMiB7Ci0JZm9udC1zaXplOiAxMjUlOwotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotfQotCi0vKiBVc2UgaDMgZm9yIGFsbCB0aGlyZC1sZXZlbCBoZWFkaW5ncy4gKi8KLWgzIHsKLQlmb250LXNpemU6IDExMCU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFVzZSBoNCBmb3IgYWxsIGZvdXJ0aC1sZXZlbCBoZWFkaW5ncy4gCi0gICBOb3RlOiB0aGlzIHN0eWxlIGxvb2tzIGlkZW50aWNhbCB0byB0aGUgcmVsYXRlZHRvcGljcyBhbmQgcHJvY3RpdGxlIHN0eWxlcy4gKi8KLWg0IHsKLQlmb250LXNpemU6IDEwNSU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFVzZSBoNSBmb3IgYWxsIGZpZnRoLWxldmVsIGhlYWRpbmcuICAKLSAgIEN1cnJlbnRseSwgdGhlcmUgYXJlIG5vIGg1cyBpbiB1c2UgaW4gdGhlIGRvY3VtZW50LiovCi1oNSB7Ci0JZm9udC1zaXplOiAxMDAlOwotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotfQotCi0vKiBVc2UgdGhlIFRpdGxlIHN0eWxlIGZvciB0aGUgdGl0bGUgb2YgYSB0b3BpYy4gKi8KLXAuVGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0MiU7Ci19Ci0KLS8qIFRoaXMgZGVwcmF0ZWQgdGFnIGNyZWF0ZXMgYSBkaXYgdGhhdCBkZXNpZ25hdGVzIHRoZSB0aXRsZS4gKi8KLSN0b3BpY3RpdGxlIHsKLX0KLQotLyogVGhpcyBkZXByZWNhdGVkIHRhZyBjcmVhdGVzIGEgZGl2ZSB0aGF0IGRlc2lnbmF0ZXMgYWxsIGJvZHkgdGV4dC4gKi8KLSN0b3BpY3RleHQgewotfQotCi0vKiBVc2VkIGZvciBmaWd1cmUgY2FwdGlvbnMuKi8KLXAuYXJ0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBCb2xkOwotfQotICAKLS8qIFRoZSBhdHRyaWJ1dGUgc3R5bGUgcmVzZW1ibGVzIHRoZSBuYXZ0aXRsZSBhbmQgcGFydGRlc2Mgc3R5bGVzIGluIHRoYXQgaXQga2VlcHMgdGhlIG5leHQgcGFyYWdyYXBoIAotICAgZmx1c2ggd2l0aCBpdC4gVXNlIGl0IHdoZW4geW91IGxpc3QgdGhlIGF0dHJpYnV0ZXMgb2Ygc3ludGF4IGluIGEgcmVmZXJlbmNlIHRvcGljLgotICAgVGhlIGFyZ3VtZW50IHN0eWxlIHNob3VsZCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgdGhlIHBhcnRkZXNjIHN0eWxlLiAqLwotcC5hdHRyaWJ1dGUgewotCW1hcmdpbi10b3A6IC42ZW07Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCWZvbnQtd2VpZ2h0OiBCb2xkOwotCQotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KLWJvZHkgewotCXBhZGRpbmc6IDBweCAwcHggMHB4IDE1cHg7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQljb2xvcjogIzAwMDAwOwotCWZvbnQtc2l6ZTogODAlOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KLXNwYW4uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotYmxvY2txdW90ZSB7Ci0JbWFyZ2luOiAwZW0gMGVtIDBlbSAyZW07Ci0JcGFkZGluZzogMHB4OwotfQotCi0vKiBVc2UgdGhlIGZpbGVwYXRoIHN0eWxlIHRvIGRlc2lnbmF0ZSBmaWxlIHBhdGhzLiBJdCBpcyBjdXJyZW50bHkgYSBtb25vc3BhY2UgZmlsZS4gKi8KLXNwYW4uZmlsZXBhdGggewotCWZvbnQ6IDEwMCUgQ291cmllciBOZXcgQ291cmllciBtb25vOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBtb25vc3BhY2U7Ci19Ci0KLS8qIFRoZSBsYW5naW5saW5lIHN0eWxlLCBsaWtlIHVzZXJpbnB1dCBhbmQgZmlsZXBhdGgsIGFsc28gcmVuZGVycyB0ZXh0IG1vbm9zcGFjZS4gVXNlIHRoaXMKLSAgIHRvIGRlbm90ZSBhbnkgaW5kaXZpZHVhbCBpbnN0YW5jZSBvZiBjb2RlIGluIHRoZSBjb250ZXh0IG9mIG5vbi1jb2RlZCB0ZXh0LiBGb3IgZXhhbXBsZSwgCi0gICB5b3Ugd291bGQgdXNlIHRoaXMgdG8gZGVub3RlIHRoZSBuYW1lIG9mIGEgY2xhc3Mgd2hlbiB5b3UncmUgZGVzY3JpYmluZyBpdCBpbiB0aGUgcGFyYWdyYXBoIHRoYXQKLSAgIHByZWNlZGVzIGEgY29kZSBzYW1wbGUuIFRvIGRlbm90ZSBhIGNvZGUgc2FtcGxlLCBob3dldmVyLCB1c2UgdGhlIDxwcmU+IHRhZy4gKi8KLXNwYW4ubGFuZ2lubGluZSB7Ci0JZm9udDogMTAwJSBDb3VyaWVyIE5ldyBDb3VyaWVyIG1vbm87Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKLX0KLQotLyogVGhlIGxpc3RwbGFpbiBzdHlsZSBuYXJyb3dzIHRoZSBtYXJnaW4gYmV0d2VlbiB0aGUgZm9ybWF0dGVkIGxpbmUgYW5kIHRoZSBvbmUgYmVmb3JlIGl0LgotICAgSXQgaXMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgc2Vjb25kIHBhcmFncmFwaCBpbiBhIGxpc3QgaXRlbSwgYWxvbmcgd2l0aCB0aGUgaW5kZW50IGFuZAotICAgdW5pbmRlbnQgYnV0dG9ucyBpbiBEcmVhbXdlYXZlci4gKi8KLXAubGlzdHBsYWluIHsKLQltYXJnaW4tdG9wOiAwLjdlbTsKLQltYXJnaW4tYm90dG9tOiAwOwotCXBhZGRpbmc6IDBlbTsKLX0KLQotLyogQWxsIHRleHQgaW4gdGhlIG5hdnRpdGxlIHN0eWxlIHNob3VsZCBpbmNsdWRlIGEgbGluayB0byBhbm90aGVyIHRvcGljLgotICAgVGhlIG5hdnRpdGxlIHN0eWxlIGlzIHVzZWQgaW4gbmF2aWdhdGlvbmFsIG5vZGUgdG9waWNzLCBpbiBDbGFzcyByZWZlcmVuY2UKLSAgIHRvcGljcywgYW5kIGluIE1ldGhvZCByZWZlcmVuY2UgdG9waWNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlICJUb3BpY3MgCi0gICBJbmNsdWRlZCBpbiB0aGlzIFNlY3Rpb24iIHNlY3Rpb24gb2YgYSBuYXZpZ2F0aW9uIHRvcGljLCB5b3UgaW5jbHVkZSB0aGUgbGlua3MgdG8gYWxsIG9mIAotICAgdGhlIHRvcGljcyBpbiB0aGF0IGNoYXB0ZXIsIGFsb25nIHdpdGggYSBicmllZiBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdSdsbCBmaW5kIGluIGVhY2guIFVzZSB0aGUKLSAgIG5hdnRpdGxlIHN0eWxlIGZvciB0aGUgbGlua2VkIHRleHQuIEl0IGRpZmZlcnMgZnJvbSBhIG5vcm1hbCBwYXJhZ3JhcGggc3R5bGUgaW4gdGhhdCBpdCBkb2VzIG5vdCAKLSAgIGluY2x1ZGUgYW4gZXh0cmEgcGFyYWdyYXBoIGJyZWFrIGJldHdlZW4gdGhlIGxpbmsgYW5kIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0LiAqLwotcC5uYXZ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci19Ci0KLS8qIFRoZSBuYXZkZXNjIHN0eWxlIGlzIHVzZWQgaW4gbmF2aWdhdGlvbmFsIG5vZGUgdG9waWNzLCBpbiBDbGFzcyByZWZlcmVuY2UKLSAgIHRvcGljcywgYW5kIGluIE1ldGhvZCByZWZlcmVuY2UgdG9waWNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlICJUb3BpY3MgSW5jbHVkZWQgaW4gdGhpcyBTZWN0aW9uIiAKLSAgIHNlY3Rpb24gb2YgYSBuYXZpZ2F0aW9uIHRvcGljLCB5b3UgaW5jbHVkZSB0aGUgbGlua3MgdG8gYWxsIG9mIHRoZSB0b3BpY3MgaW4gdGhhdCBjaGFwdGVyLAotICAgYWxvbmcgd2l0aCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91J2xsIGZpbmQgaW4gZWFjaC4gVXNlIHRoaXMgc3R5bGUgZm9yIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0LiAKLSAgIEl0IGluZGVudHMgdGhlIHRleHQgb25lIHRhYiBzdG9wIGFuZCBrZWVwcyB0aGUgbWFyZ2luIGJldHdlZW4gdGhpcyBzdHlsZSBhbmQgdGhlIG5hdnRpdGxlIHN0eWxlIHNtYWxsLiAgKi8KLXAubmF2ZGVzYyB7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCW1hcmdpbi1sZWZ0OiAxLjllbTsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS8qIFRoZSBub3RlcGFyYSBzdHlsZSBpbmRlbnRzIHlvdXIgdGV4dCB0byB0aGUgdGFiIHN0b3AgZm9yIG5vdGUKLSAgIHRleHQuIFlvdSBzaG91bGQgYWx3YXlzIGJlZ2luIE5vdGUgdGV4dCB3aXRoIHRoZSB3b3JkICJOb3RlOiIgaW4KLSAgIGJvbGRmYWNlLiAqLwotcC5ub3RlcGFyYSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLQltYXJnaW4tcmlnaHQ6IDJlbTsKLQltYXJnaW4tYm90dG9tOiAxLjVlbTsKLX0KLQotLyogVGhlIHBhcnRuYW1lIHN0eWxlIHJlc2VtYmxlcyB0aGUgbmF2dGl0bGUgc3R5bGUgaW4gdGhhdCBpdCBrZWVwcyB0aGUgbmV4dCBwYXJhZ3JhcGggZmx1c2ggd2l0aCBpdC4gCi0gICBZb3UgdXNlIGl0IHdoZW4geW91IGxpc3QgdGhlIHBhcmFtZXRlcnMgaW4gYSByZWZlcmVuY2UgdG9waWMuIEl0IGlzIGFsc28gdXNlZCBjdXJyZW50bHkgaW4gdGhlIAotICAgZ2xvc3NhcnkgdG8gZGVzaWduYXRlIGdsb3NzYXJ5IGVudHJpZXMuIEl0IHJlbmRlcnMgdGV4dCBpdGFsaWMuCi0gICBUaGUgcGFydG5hbWUgc3R5bGUgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSB0aGUgcGFydGRlc2Mgc3R5bGUuKi8KLXAucGFydG5hbWUgewotCW1hcmdpbi10b3A6IC42ZW07Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLyogVXNlIHRoZSBwYXJ0ZGVzYyBzdHlsZSB3aGVuIHlvdSBkZXNjcmliZSB0aGUgZnVuY3Rpb24gb2YgdGhlIHByb3BlcnRpZXMsIHBhcmFtZXRlcnMsIG9yIGV4Y2VwdGlvbnMgCi0gICBsaXN0ZWQgaW4gYSByZWZlcmVuY2UgdG9waWMuIEl0IGlzIGFsc28gdXNlZCBjdXJyZW50bHkgaW4gdGhlIGdsb3NzYXJ5IHRvIGRlc2lnbmF0ZSBnbG9zc2FyeSAKLSAgIGRlZmluaXRpb25zLiBUaGUgc3R5bGUgaW5kZW50cyB0aGUgZGVzY3JpcHRpb24gc2xpZ2h0bHkuCi0gICBUaGUgcGFydGRlc2Mgc3R5bGUgc2hvdWxkIGFsd2F5cyBmb2xsb3cgdGhlIHBhcnRuYW1lIG9yIGF0dHJpYnV0ZSBzdHlsZS4qLwotcC5wYXJ0ZGVzYyB7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCW1hcmdpbi1sZWZ0OiAxLjllbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0KLX0KLQotLyogVGhlIHBvaW50IG9mIHRoZSBwcm9jdGl0bGUgc3R5bGUgaXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50IG9mIHRoZSByZWxhdGVkdG9waWNzIHN0eWxlLiAgCi0gICBJdCBhcHBsaWVzIHRvIGFsbCBoZWFkaW5ncyB0aGF0IGJlZ2luIHdpdGggIlRvIFtkbyBzb21ldGhpbmddIi4gSXQgbG9va3MgaWRlbnRpY2FsIHRvIHRoZSBoNCBzdHlsZS4gICovCi1wLnByb2N0aXRsZSB7Ci0JZm9udC1zaXplOiAxMTAlOwotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotCWZvbnQtd2VpZ2h0OiBCb2xkOwotCi19Ci0KLS8qIFVzZSB0aGUgcmVsYXRlZHRvcGljcyBzdHlsZSwgZm9yIHRoZSB3b3JkcyAiUmVsYXRlZCBUb3BpY3MiIGF0IHRoZSBlbmQgb2YgYSB0b3BpYy4gCi0gICBJdCBsb29rcyBpZGVudGljYWwgdG8gdGhlIGg0IHN0eWxlLiAqLwotcC5yZWxhdGVkdG9waWNzIHsKLQlmb250LXNpemU6IDEyMCU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0KLS8qIFRoZSBzeW50YXggc3R5bGUgcmVuZGVycyB0ZXh0IGJvbGQuIFVzZSBpdCB0byBzdHlsZSBhbGwgc3ludGF4IGxpbmVzIHVuZGVyIHRoZQotICAgU3ludGF4IGhlYWRpbmcgb2YgcmVmZXJlbmNlIHRvcGljcy4gKi8KLXAuc3ludGF4IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0KLS8qIFVzZSB0aGUgc3ludGF4aW5kZW50IHN0eWxlIHRvIGluZGVudCBzdWItcHJvcGVydGllcyBvZiBzeW50YXggZGVjbGFyYXRpb25zLiAqLwotcC5zeW50YXhpbmRlbnQgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JbGluZS1oZWlnaHQ6IG5vcm1hbDsKLQlmb250LXdlaWdodDogQm9sZDsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCW1hcmdpbi1ib3R0b206IDBweDsKLX0KLQotCi1wLmZpbGV1cmwgewotCWZvbnQtc2l6ZTogOHB0OwotfQotCi1wLm1vZGlmaWVkZGF0ZSB7Ci0JZm9udC1zaXplOiA4cHQ7Ci19Ci0KLS8qIFRoZSBzeW50YXhwYXJ0bmFtZSBjaGFyYWN0ZXIgc3R5bGUgcmVuZGVycyB0ZXh0IGl0YWxpYy4gVXNlIGl0IHRvIGRlc2lnbmF0ZSAKLSAgIHN5bnRheCBlbGVtZW50cyBpbiByZWZlcmVuY2UgdG9waWNzLiovCi1zcGFuLnN5bnRheHBhcnRuYW1lIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLX0KLQotLyogVGhlc2Ugc3BlY2lmaWNhdGlvbnMgZGljdGF0ZSB0aGUgbWFyZ2lucyBhbmQgd2lkdGggb2YgdGFibGVzLiAqLwotdGFibGUgewotCXdpZHRoOiA5MCU7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAuM2VtOwotfQotCi0vKiBUaGUgYmFja2dyb3VuZCBvZiBoZWFkZXIgY2VsbHMgaXMgZ3JleSwgYW5kIHRoZSB0ZXh0IGlzIGJvdHRvbS1hbGlnbmVkLiAqLwotdGggewotCXBhZGRpbmctbGVmdDogOHB4OwotCXBhZGRpbmctcmlnaHQ6IDhweDsKLQliYWNrZ3JvdW5kOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JZm9udC1zaXplOiA4MCU7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JdmVydGljYWwtYWxpZ246IGJvdHRvbTsKLX0KLQotLyogVGhlIHRleHQgaW4gbm9ybWFsIHRhYmxlIGNlbGxzIGlzIHRvcC1hbGlnbmVkLiAqLwotdGQgewotCXBhZGRpbmctbGVmdDogOHB4OwotCXBhZGRpbmctcmlnaHQ6IDhweDsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCXZlcnRpY2FsLWFsaWduOiB0b3A7Ci0JZm9udC1zaXplOiA4MCU7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qIFRoaXMgc3R5bGUgY3JlYXRlcyBzcGFjZSBhYm92ZSBhbmQgYmVsb3cgdGFibGUgdGV4dCBiZXR3ZWVuIHBhcmFncmFwaCBhbmQgdGhlIHRhYmxlIGJvcmRlcnMuICovCi1wLnRhYmxldGV4dCB7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAuNmVtOwotfQotCi0vKiBUaGUgZWRpdG9yIHVzZXMgdGhpcyBzdHlsZSB3aGVuIGNyZWF0aW5nIHRlbXBsYXRlIGd1aWRlcyB0byBkZXNpZ25hdGUgYSBzdHlsZSBhbm5vdGF0aW9uLiAKLSAgIFlvdSBwcm9iYWJseSB3b24ndCB3YW50IHRvIHVzZSBpdCBhbnl3aGVyZSBlbHNlIGluIHRoZSBndWlkZS4gKi8KLXNwYW4udGVtcGxhdGUgewotCWNvbG9yOiAjRkYwMEZGOwkKLX0KLQotYS50b2Mtbm9kZSB7Ci0JZm9udC1zaXplOjExcHg7Ci0JY29sb3I6MDAwMDAwOwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotCW1hcmdpbi1ib3R0b206IDBweDsKLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwotICAgIGZvbnQtZmFtaWx5OiBUYWhvbWE7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOwotICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyAgICAgICAgCi19Ci0KLS8qIFRoZSB1c2VyaW5wdXQgc3R5bGUgcmVuZGVycyB0ZXh0IG1vbm9zcGFjZS5Vc2UgdGhpcyBzdHlsZSB0byBoaWdobGlnaHQgdGV4dCB0aGF0IGEgdXNlciAKLSAgIHR5cGVzIGludG8gYSB0ZXh0IGZpZWxkLiAgKi8KLXNwYW4udXNlcmlucHV0IHsKLQlmb250OiAxMDAlIENvdXJpZXIgTmV3IENvdXJpZXIgbW9ubzsKLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZ3MuICovCi11bCwKLW9sIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOwotCWxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7Ci0JbWFyZ2luLXRvcDogMGVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLX0KLQotLyogU3RhbmRhcmQgSFRNTCB0YWcuICovCi1vbCB7Ci0JbGlzdC1zdHlsZS10eXBlOiAxOwotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotbGkgewotCW1hcmdpbi10b3A6IDEuM2VtOyAKLQltYXJnaW4tYm90dG9tOiAwZW07Ci19Ci0KLWE6bGluayB7Ci0JY29sb3I6ICMzMzY2Q0M7Ci19Ci1hOmhvdmVyIHsKLQl4LXRleHQtdW5kZXJsaW5lOiBub3JtYWw7Ci0JLypiZWdpbiFrYWRvdnt7Ki8gdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IC8qfX1lbmQha2Fkb3YqLyAKLX0KLQotYTphY3RpdmUgewotCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKLQkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi1hOnZpc2l0ZWQgewotCWNvbG9yOiAjODAzMzgwOwotfQotCi1hIHsKLQl4LXRleHQtdW5kZXJsaW5lOiBvZmY7Ci0JeC10ZXh0LW92ZXJsaW5lOiBvZmY7Ci0JeC10ZXh0LWxpbmUtdGhyb3VnaDogb2ZmOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogbm9uZSBub25lIG5vbmU7IC8qfX1lbmQha2Fkb3YqLyAKLX0KLWE6bGluayB7Ci0JY29sb3I6ICMzMzY2Q0M7Ci19Ci0KLWE6aG92ZXIgewotCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKLQkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi1hOmFjdGl2ZSB7Ci0JeC10ZXh0LXVuZGVybGluZTogbm9ybWFsOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKn19ZW5kIWthZG92Ki8gCi19Ci0KLWE6dmlzaXRlZCB7Ci0JY29sb3I6ICMwMDAwNjY7Ci19Ci0KLWRpdi5mb290ZXIgewotfQotCi0uYnV0dG9uY2xhc3MKLXsKLQlmb250LXNpemU6MTBweDsKLQloZWlnaHQ6MjBweDsKLX0KLQotLmZvcm1jbGFzcwotewotCWZvbnQtc2l6ZToxMHB4OwotCWhlaWdodDoxN3B4OwotfQotCi0KLQotCi0vKkRFUFJFQ0FURUQqLwotcC5jb2RlYmxvY2sgewotCWZvbnQtc2l6ZTogMTAwJTsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWxpbmUtaGVpZ2h0OiAxZW07Ci0JeC10ZXh0LXRhYi1zdG9wczogcmVwZWF0IDFpbjsKLQl3aGl0ZS1zcGFjZTogbm93cmFwOwotCWNvbG9yOiAjMDAwMDAwOwotCWN1cnNvcjogdGV4dDsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0JeC10ZXh0LXVuZGVybGluZTogT2ZmOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi0vKiBERVBSRUNBVEVEICovCi1wLmJ1bGxldGluZGVudDEgewotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDA7Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuYnVsbGV0aW5kZW50MiB7Ci0JbWFyZ2luLWxlZnQ6IDUuMWVtOwotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5idWxsZXRpbmRlbnQzIHsKLQltYXJnaW4tbGVmdDogNC4zZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuaW5kZW50MSB7Ci0JbWFyZ2luLWxlZnQ6IDEuNWVtOwotCW1hcmdpbi1yaWdodDogMS45ZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuaW5kZW50MiB7Ci0JbWFyZ2luLWxlZnQ6IDIuOWVtOwotCW1hcmdpbi1yaWdodDogMS45ZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuaW5kZW50MyB7Ci0JbWFyZ2luLWxlZnQ6IDQuM2VtOwotCW1hcmdpbi1yaWdodDogMS45ZW07Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAubnVtYmVyZWRpbmRlbnQxIHsKLQltYXJnaW4tbGVmdDogMi4yZW07Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotfQotCi0vKiBERVBSRUNBVEVEICovCi1wLm51bWJlcmVkaW5kZW50MiB7Ci0JbWFyZ2luLWxlZnQ6IDYuM2VtOwotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5udW1iZXJlZGluZGVudDMgewotCW1hcmdpbi1sZWZ0OiAxMC41ZW07Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotfQkKLQotLyogREVQUkVDQVRFRCAqLwotcC50YWJsZXRpdGxlIHsKLQltYXJnaW4tbGVmdDogMDsKLQlmb250LXdlaWdodDogQm9sZDsKLX0KLQotCi0vKiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgYnkgdGhlIHNlYXJjaCByZXN1bHRzIHBhZ2UgKi8KLQotLnNlYXJjaC1ub2RlIHsKLQlmb250LXNpemU6MTBweDsKLQljb2xvcjowMDAwMDA7Ci19Ci0KLWEuc2VhcmNoLW5vZGUgewotCWZvbnQtc2l6ZToxMHB4OwotCWNvbG9yOjAwMDAwMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwgYi92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzkxZTUuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy94bWxiZWFudGFzay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgICAgICAgICAgICAgICAgICAgIAotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Ci0gIDx0aXRsZT5YTUxCZWFuIFRhc2s8L3RpdGxlPgotPC9oZWFkPgotICA8Ym9keT4KLSAgICAgICAgICAgIAotPGgyPjxhIG5hbWU9InhtbGJlYW4iPlhNTEJlYW48L2E+PC9oMj4KLSAgICAgICAgICAgCi08aDM+RGVzY3JpcHRpb248L2gzPgotICAgICAgICAgICAgICAKLTxwPkNvbXBpbGUgYSBzZXQgb2YgWFNEcyBhbmQvb3IgV1NETHMgaW50byB4YmVhbnMuIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZwotIGFuIFhNTEJlYW4gamFyIGZyb20gLlhTRCBhbmQgLldTREwgZmlsZXMuICZuYnNwO1RoZSB0YXNrIGNhbiBhbHNvIGdlbmVyYXRlCi0gdGhlIHNvdXJjZSBjb2RlIHRoYXQgbWFrZXMgdXAgdGhlIHhiZWFuIHR5cGUgc3lzdGVtIHNwZWNpZmllZCBieSB0aGUgc2NoZW1hCi0gZmlsZXMgaWYgZGVzaXJlZC48L3A+Ci0gICAgICAgICAgICAgIAotPHA+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGFuIGV4dGVybmFsIGxpYnJhcnkgbm90IGluY2x1ZGVkIGluCi10aGUgIEFudCBkaXN0cmlidXRpb24gY2FsbGVkIHhiZWFuLmphci4gJm5ic3A7SXQgY2FuIGJlIGZvdW5kIGluIHRoZSBYTUxCZWFucwotIGRldmVsb3BlciBraXQgYXQgPGEKLSBocmVmPSJodHRwOi8vZGV2MmRldi5iZWEuY29tL3RlY2hub2xvZ2llcy94bWxiZWFucy8iPmh0dHA6Ly9kZXYyZGV2LmJlYS5jb20vdGVjaG5vbG9naWVzL3htbGJlYW5zLzwvYT4uIAotVGhlIGJ1aWxkIHNjcmlwdCB3aWxsIG5lZWQgdG8gaW5jbHVkZSBhIHRhc2tkZWYgZm9yIHhtbGJlYW4sIHdoaWNoIGNvdWxkIGxvb2sKLWxpa2UgdGhpczo8YnI+Ci0gPC9wPgotIAotPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3Rhc2tkZWYgbmFtZT0ieG1sYmVhbiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIi8mZ3Q7PC9wcmU+Ci0gCi08cD4gICA8L3A+Ci0gICAgICAgICAgIAotPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzIAotICBjYW4gYmUgZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgCi0gIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IAotICBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSAKLWluY2x1ZGVkICBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxpPmV4Y2x1ZGU8L2k+IG9yIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIAotaXMgIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgCi13aXRoICBwYXR0ZXJucy4gQW5kIGZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSAKLWNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiAKLSBvbiA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkKLSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdwotdG8gIHdyaXRlIHBhdHRlcm5zLjwvcD4KLSAgICAgICAgICAgCi08cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IAotYW5kIHN1cHBvcnRzIGFsbCAgIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiAoPGNvZGU+ZGlyPC9jb2RlPiAKLSAgYmVjb21lcyA8Y29kZT5iYXNlZGlyPC9jb2RlPikgICBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgCi0gIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gICBhbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Ci0gICAgICAgICAgICAgIAotPGgzPlBhcmFtZXRlcnM8L2gzPgotICAgICAgICAgICAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgICAgIDx0Ym9keT4KLSAgICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNjaGVtYTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgdGhhdCBwb2ludHMgdG8gZWl0aGVyIGFuIGluZGl2aWR1YWwgc2NoZW1hCi0gZmlsZSBvciBhIGRpcmVjdG9yeSBvZiBmaWxlcy4gJm5ic3A7Tm90IGEgcGF0aCByZWZlcmVuY2UuICZuYnNwO0lmIG11bHRpcGxlCi0gc2NoZW1hIGZpbGVzIG5lZWQgdG8gYmUgYnVpbHQgdG9nZXRoZXIsIHVzZSBhIG5leHRlZCBmaWxlc2V0IGluc3RlYWQgb2YKLXNldHRpbmcgIHNjaGVtYS48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCB1bmxlc3MgYSBmaWxlc2V0IGVsZW1lbnQgaXMKLSBuZXN0ZWQuPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBjcmVhdGVkLiZuYnNwOyAKLUZvciBpbnN0YW5jZSwgIm15WE1MQmVhbi5qYXIiIHdpbGwgb3V0cHV0IHRoZSByZXN1bHRzIG9mIHRoaXMgdGFzayBpbnRvIGEgCi1qYXIgd2l0aCB0aGUgc2FtZSBuYW1lLjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAieG1sdHlwZXMuamFyIi48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kb3dubG9hZDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIAotVVJMcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMuJm5ic3A7IERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIGFsbCBpbXBvcnRzIAotYW5kIGluY2x1ZGVzIG11c3QgYmUgY29waWVkIGxvY2FsbHkuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgZmFsc2UuPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBhbnQgdGFyZ2V0Ci13aWxsICBjb250aW51ZSBpZiB0aGUgWE1MQmVhbiBjcmVhdGlvbiBlbmNvdW50ZXJzIGEgYnVpbGQgZXJyb3IuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbHMgdGhlIGFtb3VudCBvZiBidWlsZCBtZXNzYWdlIG91dHB1dC48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGVzeXN0ZW1uYW1lPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgdGhlIFR5cGVTeXN0ZW1Ib2xkZXIKLWNsYXNzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4uJm5ic3A7IE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgdW5zcGVjaWZpZWQuCi1Ob25lIG9mIHRoZSB4bWwgYmVhbnMgYXJlIGdlbmVyYXRlZCBpbiB0aGlzIHBhY2thZ2UuIFVzZSAueHNkY29uZmlnIGZpbGVzCi10byBtb2RpZnkgeG1sIGJlYW4gcGFja2FnZSBvciBjbGFzcyBuYW1lcy48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzZ2VuZGlyPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIGxvY2F0aW9uIHRvIGdlbmVyYXRlIC5jbGFzcyBmaWxlcyBpbnRvLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+c3Jjb25seTxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIHZhbHVlIG9mIHRydWUgbWVhbnMgdGhhdCBvbmx5IHNvdXJjZSB3aWxsIGJlIGdlbmVyYXRlZC48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgZmFsc2UuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNnZW5kaXI8YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmphdmEgZmlsZXMgaW50by48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGlmIHNjaGVtYXMgaW4gdGhlIGZpbGVzZXQKLWltcG9ydCBkZWZpbml0aW9ucyB0aGF0IGFyZSBzdXBwbGllZCBieSBvdGhlciBjb21waWxlZCB4bWwgYmVhbnMgSkFSIGZpbGVzLAotb3IgaWYgLmphdmEgZmlsZXMgYXJlIGluIHRoZSBzY2hlbWEgZmlsZXNldC4gIEFsc28gc3VwcG9ydHMgYSBuZXN0ZWQgY2xhc3NwYXRoLjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BZGRzIGEgY2xhc3NwYXRoLCBnaXZlbiBhcyA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+Ci10byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mCi1maWxlcyAgIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC4gICAgICAgQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotdGFrZW4gICB0byBiZSAgICAgICBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YKLWZpbGVzICAgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLiAgICAgICBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZQotZXhjbHVkZWQgICB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotdGFrZW4gICB0byBiZSAgICAgICBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZAotICBvciBub3QgICAgICAgKCJ5ZXMiLyJubyIpLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGgKLSAgICAgICAgICBkZWJ1ZyBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi4gIElmIHNldCB0bwotICAgICAgICAgIDxjb2RlPm9mZjwvY29kZT4sIDxjb2RlPi1nOm5vbmU8L2NvZGU+IHdpbGwgYmUgcGFzc2VkIG9uIHRoZQotICAgICAgICAgIGNvbW1hbmQgbGluZSBmb3IgY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBpdCAoZm9yIG90aGVyIGNvbXBpbGVycywgbm8KLSAgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2lsbCBiZSB1c2VkKS4gIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwKLSAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmRlYnVnbGV2ZWw8L2NvZGU+IGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHRoZQotICAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudC48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1Z2xldmVsPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPktleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgPGNvZGU+LWc8L2NvZGU+Ci0gICAgICAgICAgICBjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhpcyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQKLSAgICAgICAgICAgIDxjb2RlPm1vZGVybjwvY29kZT4gYW5kIDxjb2RlPmNsYXNzaWModmVyICZndDs9IDEuMik8L2NvZGU+LgotICAgICAgICAgICAgTGVnYWwgdmFsdWVzIGFyZSA8Y29kZT5ub25lPC9jb2RlPiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZQotICAgICAgICAgICAgZm9sbG93aW5nIGtleXdvcmRzOgotICAgICAgICAgICAgPGNvZGU+bGluZXM8L2NvZGU+LCA8Y29kZT52YXJzPC9jb2RlPiwgYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4uCi0gICAgICAgICAgICBJZiA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LAotICAgICAgICAgICAgbm90aGluZyB3aWxsIGJlCi0gICAgICAgICAgICBhcHBlbmRlZCB0byA8Y29kZT4tZzwvY29kZT4uICBJZiA8Y29kZT5kZWJ1ZzwvY29kZT4gaXMgbm90IHR1cm5lZCBvbiwKLSAgICAgICAgICAgIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpbWl6ZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGgKLSAgICAgICAgICAgIG9wdGltaXphdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlQW50UnVudGltZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIEFudCBydW4tdGltZSBsaWJyYXJpZXMgaW4gdGhlCi0gICAgICAgICAgICBjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUphdmFSdW50aW1lPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZGVmYXVsdCBydW4tdGltZQotICAgICAgICAgICAgbGlicmFyaWVzIGZyb20gdGhlIGV4ZWN1dGluZyBWTSBpbiB0aGUgY2xhc3NwYXRoOwotICAgICAgICAgICAgZGVmYXVsdHMgdG8gPGNvZGU+bm88L2NvZGU+LjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBleGVjdXRlIDxjb2RlPmphdmFjPC9jb2RlPiB1c2luZyB0aGUKLSAgICAgICAgICAgIEpESyBjb21waWxlciBleHRlcm5hbGx5OyBkZWZhdWx0cyB0byA8Y29kZT55ZXM8L2NvZGU+LjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4KLSAgICAgICAgICAgIGV4ZWN1dGFibGUgdG8gdXNlIGluIGNhc2Ugb2YgPGNvZGU+Zm9yaz0mcXVvdDt5ZXMmcXVvdDs8L2NvZGU+LgotICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIGNvbXBpbGVyIG9mIHRoZSBKYXZhIHZlcnNpb24gdGhhdCBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgIHJ1bm5pbmcgQW50LiAgSWdub3JlZCBpZiA8Y29kZT5mb3JrPSZxdW90O25vJnF1b3Q7PC9jb2RlPjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeUluaXRpYWxTaXplPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCi0gICAgICAgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cwotICAgICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgotICAgICAgICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCi0gICAgICAgICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeU1heGltdW1TaXplPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCi0gICAgICAgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cwotICAgICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgotICAgICAgICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCi0gICAgICAgICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuCi0gICAgICAgICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICAgICAgICA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHksIGlmIHNldCwgd2lsbCBiZSB1c2VkLgotICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0gd2lsbCBiZSB1c2VkLgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAKLSAgPC90Ym9keT4gICAgIAotPC90YWJsZT4KLSAgICAgICAgICAgICAgICAgCi08aDM+RXhhbXBsZTwvaDM+Ci0gICAgICAgICAgIAotPGJsb2NrcXVvdGU+ICAgICAgICAgICAgICAgQmUgc3VyZSB0byBkZWZpbmUgdGhlIHRhc2sgaW4geW91ciBzY3JpcHQsIGxpa2UgCi10aGlzOjxicj4KLSAgIAotICA8cHJlPiZsdDt0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWE1MQmVhbiIgY2xhc3NwYXRoPSJwYXRoL3RvL3hiZWFuLmphciIvJmd0OzwvcHJlPgotICAgCi0gIDxwcmU+PGJyPiZsdDt4bWxiZWFuIHNjaGVtYT0ic2NoZW1hcyIgZGVzdGZpbGU9IlNjaGVtYXMuamFyIi8mZ3Q7PGJyPjwvcHJlPgotICBCdWlsZHMgYWxsIHRoZSBzY2hlbWFzIGluIHRoZSBzY2hlbWFzIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhIGphciBjYWxsZWQKLSAnU2NoZW1hcy5qYXInLjxicj4KLSAgICAgICAgICAgICAgICAgICAgCi0gIDxwcmU+Jmx0O3htbGJlYW4gc2NoZW1hPSJzY2hlbWFzL291clNjaGVtYS54c2QiIGRvd25sb2FkPSJ0cnVlIi8mZ3Q7PGJyPjwvcHJlPgotICBDb21waWxlcyB0aGUgc2NoZW1hICdvdXJTaGVtYS54c2QnIGludG8gdGhlIGRlZmF1bHQgamFyICd4bWx0eXBlcy5qYXInLiAKLSZuYnNwO0lmICZuYnNwO2FueSBpbXBvcnRzIGFuZCBpbmNsdWRlcyBhcmUgZGVmaW5lZCBieSByZW1vdGUgVVJMcywgdGhleSBhcmUKLWRvd25sb2FkZWQgZHVyaW5nIHRoZSBidWlsZC48YnI+Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICA8aDQ+VXNpbmcgYSBmaWxlc2V0PC9oND4KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIDxwcmU+Jmx0O3htbGJlYW4gY2xhc3NnZW5kaXI9IiR7YnVpbGQuZGlyfSIgY2xhc3NwYXRoPSIke2NsYXNzLnBhdGh9Ijxicj4gICAgICBmYWlsb25lcnJvcj0idHJ1ZSImZ3Q7PGJyPiAgJmx0O2ZpbGVzZXQgYmFzZWRpcj0ic3JjIiBleGNsdWRlcz0iKiovKi54c2QiLyZndDs8YnI+ICAmbHQ7ZmlsZXNldCBiYXNlZGlyPSJzY2hlbWFzIiBpbmNsdWRlcz0iKiovKi4qIi8mZ3Q7PGJyPiZsdDsveG1sYmVhbiZndDs8YnI+PC9wcmU+Ci0gIEdhdGhlcnMgYWxsIHRoZSBmaWxlcyBpbiB0aGUgJ3NyYycgZGlyZWN0b3J5IGV4Y2VwdCAueHNkIGZpbGVzLCBhbG9uZyB3aXRoCi0gZXZlcnkgZmlsZSBpbiB0aGUgJ3NjaGVtYXMnIGRpcmVjdG9yeSBhbmQgY29tcGlsZXMgdGhlbS4gVGhlIGZpbGVzZXQgY2FuCi1pbmNsdWRlIHNjaGVtYSBmaWxlcyB0aGF0IHJlZmVyIHRvIHByZXZpb3VzbHkgY29tcGlsZWQgc2NoZW1hIGNvbXBvbmVudHMuJm5ic3A7Ci1UaGUgZmlsZXNldCBjYW4gYWxzbyBjb250YWluIC5qYXZhIGZpbGVzLiZuYnNwOyBUaGUgY2xhc3NwYXRoIHBhcmFtZXRlciBkZWZpbmVzCi10aGUgY2xhc3NwYXRoIG5lY2Vzc2FyeSB0byByZXNvbHZlIGNvbXBpbGVkIHNjaGVtYSBhbmQgamF2YSByZWZlcmVuY2VzLjxicj4KLSAgPGJyPgotVGhlIGJ1aWx0IGNsYXNzZXMgd2lsbCBnbyBpbnRvICR7YnVpbGQuZGlyfS48YnI+Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICA8cHJlPjwvcHJlPgotICAgICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICAgICAgIAotPGhyPiAgICAgIAotICAgICAgIDxicj4KLSAgICAgICAgPGJyPgotIDxicj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2V4dGVybmFsL2xpYi9qdW5pdC5qYXIgYi92MS9leHRlcm5hbC9saWIvanVuaXQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWU0M2JiLi4wMDAwMDAwCi0tLSBhL3YxL2V4dGVybmFsL2xpYi9qdW5pdC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9leHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIGIvdjEvZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2MWE1Mi4uMDAwMDAwMAotLS0gYS92MS9leHRlcm5hbC9saWIvb2xkeGJlYW4uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0NoYXJzLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vQ2hhcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MWQ1ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vQ2hhcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIENoYXJzCi17Ci0gICAgcHVibGljIFN0cmluZyBhc1N0cmluZyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgc3RyaW5nID09IG51bGwKLSAgICAgICAgICAgICAgICA/IGJ1ZmZlciA9PSBudWxsID8gIiIgOiBuZXcgU3RyaW5nKCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoICkKLSAgICAgICAgICAgICAgICA6IHN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZzsKLQotICAgIHB1YmxpYyBjaGFyW10gYnVmZmVyOwotICAgIHB1YmxpYyBpbnQgICAgb2Zmc2V0OwotICAgIHB1YmxpYyBpbnQgICAgbGVuZ3RoOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0VuY29kaW5nTWFwLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxYjQyYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ01hcAotewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmEySUFOQU1hcHBpbmcgKCBTdHJpbmcgamF2YSApCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZykgX2phdmFfdG9faWFuYS5nZXQoIGphdmEudG9VcHBlckNhc2UoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJQU5BMkphdmFNYXBwaW5nICggU3RyaW5nIGlhbmEgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9pYW5hX3RvX2phdmEuZ2V0KCBpYW5hLnRvVXBwZXJDYXNlKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVuY29kaW5nTWFwICggKSB7IH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBIYXNoTWFwIF9pYW5hX3RvX2phdmEgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2hNYXAgX2phdmFfdG9faWFuYSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGFkZE1hcHBpbmcgKAotICAgICAgICBTdHJpbmcgamF2YSwgU3RyaW5nIGlhbmEsIGJvb2xlYW4gaXNEZWZhdWx0ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhX2lhbmFfdG9famF2YS5jb250YWluc0tleSggaWFuYSApOwotICAgICAgICBhc3NlcnQgamF2YS50b1VwcGVyQ2FzZSgpLmVxdWFscyggamF2YSApOwotICAgICAgICBhc3NlcnQgaWFuYS50b1VwcGVyQ2FzZSgpLmVxdWFscyggaWFuYSApOwotICAgICAgICAKLSAgICAgICAgX2lhbmFfdG9famF2YS5wdXQoIGlhbmEsIGphdmEgKTsKLQotICAgICAgICBpZiAoaXNEZWZhdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGphdmEgKTsKLSAgICAgICAgICAgIF9qYXZhX3RvX2lhbmEucHV0KCBqYXZhLCBpYW5hICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGNvbXBsZXRlTWFwcGluZ3MgKCApCi0gICAgewotICAgICAgICBIYXNoTWFwIG0gPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfaWFuYV90b19qYXZhLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIG0ucHV0KCBfaWFuYV90b19qYXZhLmdldCggaS5uZXh0KCkgKSwgbnVsbCApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBtLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGsgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydCBfamF2YV90b19pYW5hLmNvbnRhaW5zS2V5KCBrICk6IGs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIkFOU0lfWDMuNC0xOTg2IiwgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJBU0NJSSIsICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiQ1AzNjciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIkNTQVNDSUkiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJQk0tMzY3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiSUJNMzY3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIklTTy1JUi02IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJU082NDYtVVMiLCAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiSVNPXzY0Ni5JUlY6MTk5MSIsICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIlVTIiwgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJVUy1BU0NJSSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkJJRzUiLCAgICAgICAgICAiQklHNSIsICAgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJCSUc1IiwgICAgICAgICAgIkNTQklHNSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJDUDAzNyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiQ1NJQk0wMzciLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkVCQ0RJQy1DUC1DQSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJFQkNESUMtQ1AtTkwiLCAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiRUJDRElDLUNQLVVTIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkVCQ0RJQy1DUC1XVCIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJJQk0tMzciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiSUJNMDM3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwMjYiLCAgICAgICAgIkNQMTAyNiIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDI2IiwgICAgICAgICJDU0lCTTEwMjYiLCAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTAyNiIsICAgICAgICAiSUJNLTEwMjYiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwMjYiLCAgICAgICAgIklCTTEwMjYiLCAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDQ3IiwgICAgICAgICJDUDEwNDciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTA0NyIsICAgICAgICAiSUJNLTEwNDciLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwNDciLCAgICAgICAgIklCTTEwNDciLCAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQwIiwgICAgICAgICJDQ1NJRDAxMTQwIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MCIsICAgICAgICAiQ1AwMTE0MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDAiLCAgICAgICAgIklCTS0xMTQwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQwIiwgICAgICAgICJJQk0wMTE0MCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MSIsICAgICAgICAiQ0NTSUQwMTE0MSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDEiLCAgICAgICAgIkNQMDExNDEiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQxIiwgICAgICAgICJJQk0tMTE0MSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MSIsICAgICAgICAiSUJNMDExNDEiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDIiLCAgICAgICAgIkNDU0lEMDExNDIiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQyIiwgICAgICAgICJDUDAxMTQyIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MiIsICAgICAgICAiSUJNLTExNDIiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDIiLCAgICAgICAgIklCTTAxMTQyIiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQzIiwgICAgICAgICJDQ1NJRDAxMTQzIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MyIsICAgICAgICAiQ1AwMTE0MyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDMiLCAgICAgICAgIklCTS0xMTQzIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQzIiwgICAgICAgICJJQk0wMTE0MyIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NCIsICAgICAgICAiQ0NTSUQwMTE0NCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDQiLCAgICAgICAgIkNQMDExNDQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ0IiwgICAgICAgICJJQk0tMTE0NCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NCIsICAgICAgICAiSUJNMDExNDQiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDUiLCAgICAgICAgIkNDU0lEMDExNDUiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ1IiwgICAgICAgICJDUDAxMTQ1IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NSIsICAgICAgICAiSUJNLTExNDUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDUiLCAgICAgICAgIklCTTAxMTQ1IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ2IiwgICAgICAgICJDQ1NJRDAxMTQ2IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NiIsICAgICAgICAiQ1AwMTE0NiIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDYiLCAgICAgICAgIklCTS0xMTQ2IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ2IiwgICAgICAgICJJQk0wMTE0NiIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NyIsICAgICAgICAiQ0NTSUQwMTE0NyIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDciLCAgICAgICAgIkNQMDExNDciLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ3IiwgICAgICAgICJJQk0tMTE0NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NyIsICAgICAgICAiSUJNMDExNDciLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDgiLCAgICAgICAgIkNDU0lEMDExNDgiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ4IiwgICAgICAgICJDUDAxMTQ4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OCIsICAgICAgICAiSUJNLTExNDgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDgiLCAgICAgICAgIklCTTAxMTQ4IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ5IiwgICAgICAgICJDQ1NJRDAxMTQ5IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OSIsICAgICAgICAiQ1AwMTE0OSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDkiLCAgICAgICAgIklCTS0xMTQ5IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ5IiwgICAgICAgICJJQk0wMTE0OSIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MCIsICAgICAgICAiV0lORE9XUy0xMjUwIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MSIsICAgICAgICAiV0lORE9XUy0xMjUxIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MiIsICAgICAgICAiV0lORE9XUy0xMjUyIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1MyIsICAgICAgICAiV0lORE9XUy0xMjUzIiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NCIsICAgICAgICAiV0lORE9XUy0xMjU0IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NSIsICAgICAgICAiV0lORE9XUy0xMjU1IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NiIsICAgICAgICAiV0lORE9XUy0xMjU2IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1NyIsICAgICAgICAiV0lORE9XUy0xMjU3IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTI1OCIsICAgICAgICAiV0lORE9XUy0xMjU4IiwgICAgICAgICAgIHRydWUgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjczIiwgICAgICAgICAiQ1AyNzMiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3MyIsICAgICAgICAgIkNTSUJNMjczIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzMiLCAgICAgICAgICJJQk0tMjczIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjczIiwgICAgICAgICAiSUJNMjczIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIkNQMjc3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJDU0lCTTI3NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiRUJDRElDLUNQLURLIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIkVCQ0RJQy1DUC1OTyIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJJQk0tMjc3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiSUJNMjc3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIkNQMjc4IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJDU0lCTTI3OCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiRUJDRElDLUNQLUZJIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIkVCQ0RJQy1DUC1TRSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJJQk0tMjc4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiSUJNMjc4IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIkNQMjgwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODAiLCAgICAgICAgICJDU0lCTTI4MCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjgwIiwgICAgICAgICAiRUJDRElDLUNQLUlUIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIklCTS0yODAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODAiLCAgICAgICAgICJJQk0yODAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiQ1AyODQiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NCIsICAgICAgICAgIkNTSUJNMjg0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODQiLCAgICAgICAgICJFQkNESUMtQ1AtRVMiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiSUJNLTI4NCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NCIsICAgICAgICAgIklCTTI4NCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJDUDI4NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg1IiwgICAgICAgICAiQ1NJQk0yODUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NSIsICAgICAgICAgIkVCQ0RJQy1DUC1HQiIsICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJJQk0tMjg1IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg1IiwgICAgICAgICAiSUJNMjg1IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIkNQMjkwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTAiLCAgICAgICAgICJDU0lCTTI5MCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjkwIiwgICAgICAgICAiRUJDRElDLUpQLUtBTkEiLCAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIklCTS0yOTAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTAiLCAgICAgICAgICJJQk0yOTAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiQ1AyOTciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5NyIsICAgICAgICAgIkNTSUJNMjk3IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTciLCAgICAgICAgICJFQkNESUMtQ1AtRlIiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiSUJNLTI5NyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5NyIsICAgICAgICAgIklCTTI5NyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJDUDQyMCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDIwIiwgICAgICAgICAiQ1NJQk00MjAiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyMCIsICAgICAgICAgIkVCQ0RJQy1DUC1BUjEiLCAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJJQk0tNDIwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDIwIiwgICAgICAgICAiSUJNNDIwIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIkNQNDI0IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjQiLCAgICAgICAgICJDU0lCTTQyNCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDI0IiwgICAgICAgICAiRUJDRElDLUNQLUhFIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIklCTS00MjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjQiLCAgICAgICAgICJJQk00MjQiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiNDM3IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQzNyIsICAgICAgICAgIkNQNDM3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MzciLCAgICAgICAgICJDU1BDOENPREVQQUdFNDM3IiwgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiSUJNLTQzNyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQzNyIsICAgICAgICAgIklCTTQzNyIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJDUDUwMCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiQ1NJQk01MDAiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIkVCQ0RJQy1DUC1CRSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJFQkNESUMtQ1AtQ0giLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiSUJNLTUwMCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIklCTTUwMCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A3NzUiLCAgICAgICAgICJDUDc3NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNzc1IiwgICAgICAgICAiQ1NQQzc3NUJBTFRJQyIsICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDc3NSIsICAgICAgICAgIklCTS03NzUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A3NzUiLCAgICAgICAgICJJQk03NzUiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiODUwIiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MCIsICAgICAgICAgIkNQODUwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTAiLCAgICAgICAgICJDU1BDODUwTVVMVElMSU5HVUFMIiwgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiSUJNLTg1MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MCIsICAgICAgICAgIklCTTg1MCIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICI4NTIiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUyIiwgICAgICAgICAiQ1A4NTIiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MiIsICAgICAgICAgIkNTUENQODUyIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICJJQk0tODUyIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUyIiwgICAgICAgICAiSUJNODUyIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIjg1NSIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTUiLCAgICAgICAgICJDUDg1NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU1IiwgICAgICAgICAiQ1NJQk04NTUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIklCTS04NTUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTUiLCAgICAgICAgICJJQk04NTUiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiODU3IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NyIsICAgICAgICAgIkNQODU3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTciLCAgICAgICAgICJDU0lCTTg1NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiSUJNLTg1NyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NyIsICAgICAgICAgIklCTTg1NyIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTgiLCAgICAgICAgICJDQ1NJRDAwODU4IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU4IiwgICAgICAgICAiQ1AwMDg1OCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1OCIsICAgICAgICAgIklCTS04NTgiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTgiLCAgICAgICAgICJJQk0wMDg1OCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiODYwIiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MCIsICAgICAgICAgIkNQODYwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjAiLCAgICAgICAgICJDU0lCTTg2MCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiSUJNLTg2MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MCIsICAgICAgICAgIklCTTg2MCIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICI4NjEiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiQ1AtSVMiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIkNQODYxIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICJDU0lCTTg2MSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiSUJNLTg2MSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIklCTTg2MSIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICI4NjIiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYyIiwgICAgICAgICAiQ1A4NjIiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MiIsICAgICAgICAgIkNTUEM4NjJMQVRJTkhFQlJFVyIsICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICJJQk0tODYyIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYyIiwgICAgICAgICAiSUJNODYyIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIjg2MyIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjMiLCAgICAgICAgICJDUDg2MyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYzIiwgICAgICAgICAiQ1NJQk04NjMiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIklCTS04NjMiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjMiLCAgICAgICAgICJJQk04NjMiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY0IiwgICAgICAgICAiQ1A4NjQiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NCIsICAgICAgICAgIkNTSUJNODY0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjQiLCAgICAgICAgICJJQk0tODY0IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY0IiwgICAgICAgICAiSUJNODY0IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIjg2NSIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjUiLCAgICAgICAgICJDUDg2NSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY1IiwgICAgICAgICAiQ1NJQk04NjUiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIklCTS04NjUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjUiLCAgICAgICAgICJJQk04NjUiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiODY2IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NiIsICAgICAgICAgIkNQODY2IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjYiLCAgICAgICAgICJDU0lCTTg2NiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiSUJNLTg2NiIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NiIsICAgICAgICAgIklCTTg2NiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJDUC1BUiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY4IiwgICAgICAgICAiQ1A4NjgiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OCIsICAgICAgICAgIkNTSUJNODY4IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJJQk0tODY4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY4IiwgICAgICAgICAiSUJNODY4IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIkNQLUdSIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjkiLCAgICAgICAgICJDUDg2OSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY5IiwgICAgICAgICAiQ1NJQk04NjkiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIklCTS04NjkiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjkiLCAgICAgICAgICJJQk04NjkiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiQ1A4NzAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIkNTSUJNODcwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJFQkNESUMtQ1AtUk9FQ0UiLCAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiRUJDRElDLUNQLVlVIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIklCTS04NzAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJJQk04NzAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiQ1A4NzEiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MSIsICAgICAgICAgIkNTSUJNODcxIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzEiLCAgICAgICAgICJFQkNESUMtQ1AtSVMiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiSUJNLTg3MSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MSIsICAgICAgICAgIklCTTg3MSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJDUDkxOCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTE4IiwgICAgICAgICAiQ1NJQk05MTgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkxOCIsICAgICAgICAgIkVCQ0RJQy1DUC1BUjIiLCAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJJQk0tOTE4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTE4IiwgICAgICAgICAiSUJNOTE4IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIkNDU0lEMDA5MjQiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MjQiLCAgICAgICAgICJDUDAwOTI0IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTI0IiwgICAgICAgICAiRUJDRElDLUxBVElOOS0tRVVSTyIsICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIklCTS05MjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MjQiLCAgICAgICAgICJJQk0wMDkyNCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkVVQ0pJUyIsICAgICAgICAiQ1NFVUNQS0RGTVRKQVBBTkVTRSIsICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJFVUNKSVMiLCAgICAgICAgIkVVQy1KUCIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiRVVDSklTIiwgICAgICAgICJFWFRFTkRFRF9VTklYX0NPREVfUEFDS0VEX0ZPUk1BVF9GT1JfSkFQQU5FU0UiLCBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiR0IxODAzMCIsICAgICAgICJHQjE4MDMwIiwgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkdCMjMxMiIsICAgICAgICAiQ1NHQjIzMTIiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJHQjIzMTIiLCAgICAgICAgIkdCMjMxMiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPMjAyMkNOIiwgICAgICJJU08tMjAyMi1DTiIsICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzIwMjJLUiIsICAgICAiQ1NJU08yMDIyS1IiLCAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU08yMDIyS1IiLCAgICAgIklTTy0yMDIyLUtSIiwgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJDUDgxOSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiQ1NJU09MQVRJTjEiLCAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklCTS04MTkiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJJQk04MTkiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiSVNPLTg4NTktMSIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklTTy1JUi0xMDAiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJJU09fODg1OS0xIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiTDEiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIkxBVElOMSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJDU0lTT0xBVElOMiIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiSVNPLTg4NTktMiIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIklTTy1JUi0xMDEiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJJU09fODg1OS0yIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiTDIiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIkxBVElOMiIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJDU0lTT0xBVElOMyIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiSVNPLTg4NTktMyIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIklTTy1JUi0xMDkiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJJU09fODg1OS0zIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiTDMiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIkxBVElOMyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJDU0lTT0xBVElONCIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiSVNPLTg4NTktNCIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIklTTy1JUi0xMTAiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJJU09fODg1OS00IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiTDQiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIkxBVElONCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJDU0lTT0xBVElOQ1lSSUxMSUMiLCAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNSIsICAgICAiQ1lSSUxMSUMiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzUiLCAgICAgIklTTy04ODU5LTUiLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJJU08tSVItMTQ0IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNSIsICAgICAiSVNPXzg4NTktNSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIkFSQUJJQyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJBU01PLTcwOCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiQ1NJU09MQVRJTkFSQUJJQyIsICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIkVDTUEtMTE0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJJU08tODg1OS02IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiSVNPLUlSLTEyNyIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIklTT184ODU5LTYiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJDU0lTT0xBVElOR1JFRUsiLCAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiRUNNQS0xMTgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIkVMT1RfOTI4IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJHUkVFSyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiR1JFRUs4IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIklTTy04ODU5LTciLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJJU08tSVItMTI2IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiSVNPXzg4NTktNyIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIkNTSVNPTEFUSU5IRUJSRVciLCAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJIRUJSRVciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiSVNPLTg4NTktOCIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIklTTy04ODU5LTgtSSIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJJU08tSVItMTM4IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiSVNPXzg4NTktOCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIkNTSVNPTEFUSU41IiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJJU08tODg1OS05IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiSVNPLUlSLTE0OCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIklTT184ODU5LTkiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJMNSIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiTEFUSU41IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMiLCAgICAgICAgICAgIkNTSVNPMjAyMkpQIiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTIiwgICAgICAgICAgICJJU08tMjAyMi1KUCIsICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDEiLCAgICAgICAiQ1NJU08xM0pJU0M2MjIwSlAiLCAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjAxIiwgICAgICAgIlgwMjAxIiwgICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwOCIsICAgICAgICJDU0lTTzg3SklTWDAyMDgiLCAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDgiLCAgICAgICAiSVNPLUlSLTg3IiwgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjA4IiwgICAgICAgIlgwMjA4IiwgICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwOCIsICAgICAgICJYMDIwOERCSUpJU19YMDIwOC0xOTgzIiwgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMTIiLCAgICAgICAiQ1NJU08xNTlKSVNYMDIxMjE5OTAiLCAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjEyIiwgICAgICAgIklTTy1JUi0xNTkiLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIxMiIsICAgICAgICJYMDIxMiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIktPSThfUiIsICAgICAgICAiQ1NLT0k4UiIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJLT0k4X1IiLCAgICAgICAgIktPSTgtUiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiS1NDNTYwMSIsICAgICAgICJFVUMtS1IiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIk1TOTMyIiwgICAgICAgICAiQ1NXSU5ET1dTMzFKIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJNUzkzMiIsICAgICAgICAgIldJTkRPV1MtMzFKIiwgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiU0pJUyIsICAgICAgICAgICJDU1NISUZUSklTIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIlNKSVMiLCAgICAgICAgICAiTVNfS0FOSkkiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJTSklTIiwgICAgICAgICAgIlNISUZUX0pJUyIsICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVElTNjIwIiwgICAgICAgICJUSVMtNjIwIiwgICAgICAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVU5JQ09ERSIsICAgICAgICJVVEYtMTYiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIlVOSUNPREVCSUciLCAgICAiVVRGLTE2QkUiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJVTklDT0RFTElUVExFIiwgIlVURi0xNkxFIiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVVRGOCIsICAgICAgICAgICJVVEYtOCIsICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLQotICAgICAgICBhc3NlcnQgY29tcGxldGVNYXBwaW5ncygpOwotICAgIH07Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjlmYTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dlbmVyaWNYbWxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uUmVmZXJlbmNlUmVzb2x2ZXI7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIFhNTElucHV0U3RyZWFtCi17Ci0gICAgcHVibGljIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSAoICkKLSAgICB7Ci0gICAgICAgIF9tYXN0ZXIgPSB0aGlzOwotICAgICAgICBfZWxlbWVudENvdW50ID0gMTsgLy8gR28gYWxsIHRoZSB3YXkKLSAgICB9Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSAoIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBtYXN0ZXIgKQotICAgIHsKLSAgICAgICAgKF9tYXN0ZXIgPSBtYXN0ZXIpLmVuc3VyZUluaXQoKTsKLSAgICAgICAgX25leHRFdmVudCA9IG1hc3Rlci5fbmV4dEV2ZW50OwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vIFRoZSBzb3VyY2UgZm9yIGFsbCBldmVudHMKLSAgICAvLwotCi0gICAgcHJvdGVjdGVkIFhNTEV2ZW50IG5leHRFdmVudCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJuZXh0RXZlbnQgbm90IG92ZXJyaWRkZW4iICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIGNsYXNzIEV2ZW50SXRlbQotICAgIHsKLSAgICAgICAgRXZlbnRJdGVtICggWE1MRXZlbnQgZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ldmVudCA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50ICAgICBnZXRUeXBlICggKSB7IHJldHVybiBfZXZlbnQuZ2V0VHlwZSgpOyB9Ci0gICAgICAgIGJvb2xlYW4gaGFzTmFtZSAoICkgeyByZXR1cm4gX2V2ZW50Lmhhc05hbWUoKTsgfQotICAgICAgICBYTUxOYW1lIGdldE5hbWUgKCApIHsgcmV0dXJuIF9ldmVudC5nZXROYW1lKCk7IH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFhNTEV2ZW50IF9ldmVudDsKLSAgICAgICAgCi0gICAgICAgIEV2ZW50SXRlbSBfbmV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5pdCAoICkKLSAgICB7Ci0gICAgICAgIGlmICghX21hc3Rlci5faW5pdGlhbGl6ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9tYXN0ZXIuX25leHRFdmVudCA9IGdldE5leHRFdmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYTUxTdHJlYW1FeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgX21hc3Rlci5faW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFdmVudEl0ZW0gZ2V0TmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYTUxFdmVudCBlID0gbmV4dEV2ZW50KCk7Ci0KLSAgICAgICAgcmV0dXJuIGUgPT0gbnVsbCA/IG51bGwgOiBuZXcgRXZlbnRJdGVtKCBlICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEV2ZW50IG5leHQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIEV2ZW50SXRlbSBjdXJyZW50RXZlbnQgPSBfbmV4dEV2ZW50OwotCi0gICAgICAgIGlmIChfbmV4dEV2ZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dEV2ZW50Ll9uZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgX25leHRFdmVudC5fbmV4dCA9IF9tYXN0ZXIuZ2V0TmV4dEV2ZW50KCk7Ci0KLSAgICAgICAgICAgIF9uZXh0RXZlbnQgPSBfbmV4dEV2ZW50Ll9uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRFdmVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRFdmVudC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgtLV9lbGVtZW50Q291bnQgPD0gMCkKLSAgICAgICAgICAgICAgICBfbmV4dEV2ZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJyZW50RXZlbnQuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQpCi0gICAgICAgICAgICBfZWxlbWVudENvdW50Kys7Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRFdmVudC5fZXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIF9uZXh0RXZlbnQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBza2lwICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBuZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2tpcEVsZW1lbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHR5cGUgPSBuZXh0KCkuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UKQotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFhNTEV2ZW50LkVORF9FTEVNRU5UICYmIC0tY291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYTUxFdmVudCBwZWVrICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX25leHRFdmVudC5fZXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2tpcCAoIGludCBldmVudFR5cGUgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCA7IF9uZXh0RXZlbnQgIT0gbnVsbCA7IG5leHQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dEV2ZW50LmdldFR5cGUoKSA9PSBldmVudFR5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2tpcCAoIFhNTE5hbWUgbmFtZSApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuaGFzTmFtZSgpICYmIF9uZXh0RXZlbnQuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNraXAgKCBYTUxOYW1lIG5hbWUsIGludCBldmVudFR5cGUgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCA7IF9uZXh0RXZlbnQgIT0gbnVsbCA7IG5leHQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dEV2ZW50LmdldFR5cGUoKSA9PSBldmVudFR5cGUgJiYKLSAgICAgICAgICAgICAgICAgIF9uZXh0RXZlbnQuaGFzTmFtZSgpICYmCi0gICAgICAgICAgICAgICAgICAgIF9uZXh0RXZlbnQuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBnZXRTdWJTdHJlYW0gKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBzdWJTdHJlYW0gPSBuZXcgR2VuZXJpY1htbElucHV0U3RyZWFtKCB0aGlzICk7Ci0KLSAgICAgICAgc3ViU3RyZWFtLnNraXAoIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKTsKLQotICAgICAgICByZXR1cm4gc3ViU3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBCVUdCVUcgLSBjYW4gSSBkbyBhbnl0aGluZyBoZXJlLCByZWFsbHk/Ci0gICAgICAgIC8vIFNIb3VsZCBJIGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlbiBzdWIgc3RyZWFtcz8KLSAgICAgICAgLy8gSSBoYXZlIG5vIGRlc3RydWN0b3IsIGhvdyBjYW4gSSBjbG9zZSBwcm9wZXJseT8KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVmZXJlbmNlUmVzb2x2ZXIgZ2V0UmVmZXJlbmNlUmVzb2x2ZXIgKCApCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBpbXBsIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVJlc29sdmVyICggUmVmZXJlbmNlUmVzb2x2ZXIgcmVzb2x2ZXIgKQotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJOb3QgaW1wbCIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICBfaW5pdGlhbGl6ZWQ7Ci0gICAgcHJpdmF0ZSBFdmVudEl0ZW0gICAgICAgICAgICAgX25leHRFdmVudDsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICBfZWxlbWVudENvdW50OwotICAgIHByaXZhdGUgR2VuZXJpY1htbElucHV0U3RyZWFtIF9tYXN0ZXI7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2xvYmFsTG9jay5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dsb2JhbExvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzOWJmMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2xvYmFsTG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi0vKioKLSAqIFdoZW5ldmVyIG11bHRpcGxlIGxvY2tzIG11c3QgYmUgYWNxdWlyZWQgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotICogWE1MIEJlYW5zLCB0aGlzIEdsb2JhbExvY2sgaXMgYWNxdWlyZWQgZmlyc3QsIGFuZCB0aGVuIHJlbGVhc2VkIHdoZW4gYWxsCi0gKiB0aGUgYWN1dGFsbHktbmVlZGVkIGxvY2tzIGhhdmUgYmVlbiBhY3F1aXJlZC4gIFRoaXMgcHJldmVudHMgZGVhZGxvY2tzLgotICovIAotcHVibGljIGNsYXNzIEdsb2JhbExvY2sKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNdXRleCBHTE9CQUxfTVVURVggPSBuZXcgTXV0ZXgoKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWNxdWlyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7IEdMT0JBTF9NVVRFWC5hY3F1aXJlKCk7IH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BY3F1aXJlKCkgeyBHTE9CQUxfTVVURVgudHJ5VG9BY3F1aXJlKCk7IH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZSgpIHsgR0xPQkFMX01VVEVYLnJlbGVhc2UoKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI3OTA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JT1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci0KLXB1YmxpYyBjbGFzcyBJT1V0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbXBsZXRlbHkoSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy9pZiBib3RoIGFyZSBmaWxlIHN0cmVhbXMsIHVzZSBjaGFubmVsIElPCi0gICAgICAgIGlmICgob3V0cHV0IGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgJiYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUlucHV0U3RyZWFtKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwgdGFyZ2V0ID0gKChGaWxlT3V0cHV0U3RyZWFtKSBvdXRwdXQpLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBzb3VyY2UgPSAoKEZpbGVJbnB1dFN0cmVhbSkgaW5wdXQpLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2UudHJhbnNmZXJUbygwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7IC8qIGZhaWxvdmVyIHRvIGJ5dGUgc3RyZWFtIHZlcnNpb24gKi8gfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07Ci0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gaW5wdXQucmVhZChidWYpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmLCAwLCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgeyBpbnB1dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9Ci0gICAgICAgIHRyeSB7IG91dHB1dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlDb21wbGV0ZWx5KFVSSSBpbnB1dCwgVVJJIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoaW5wdXQpOwotICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG5vdEFGaWxlKQotICAgICAgICAgICAge30KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZShvdXRwdXQpOwotICAgICAgICAgICAgRmlsZSBkaXIgPSBvdXQuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgZGlyLm1rZGlycygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbiA9IGlucHV0LnRvVVJMKCkub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGluLCBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGNvcHkgdG8gIiArIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eUNvbnN0cmFpbnQuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhZmI3Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lci5FdmVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBJZGVudGl0eSBjb25zdHJhaW50IGVuZ2luZS4gUGVyZm9ybXMgc3RyZWFtaW5nIHZhbGlkYXRpb24gb2YgaWRlbnRpdHkgY29uc3RyYWludHMuCi0gKiBUaGlzIGluY2x1ZGVzIGtleSwga2V5cmVmLCAmIHVuaXF1ZSwgYXMgd2VsbCBhcyBJRCAmIElEUmVmLgotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlDb25zdHJhaW50IHsKLQotICAgIHByaXZhdGUgQ29uc3RyYWludFN0YXRlIF9jb25zdHJhaW50U3RhY2s7Ci0gICAgcHJpdmF0ZSBFbGVtZW50U3RhdGUgX2VsZW1lbnRTdGFjazsKLSAgICBwcml2YXRlIENvbGxlY3Rpb24gX2Vycm9yTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pbnZhbGlkOwotICAgIHByaXZhdGUgYm9vbGVhbiBfdHJhY2tJZHJlZnM7IC8vIFdlIG9ubHkgdHJhY2sgaWRyZWZzIGlmIHZhbGlkYXRpbmcgZnJvbSB0aGUgcm9vdCBlbGVtZW50Ci0KLSAgICBwdWJsaWMgSWRlbnRpdHlDb25zdHJhaW50KENvbGxlY3Rpb24gIGVycm9yTGlzdGVuZXIsIGJvb2xlYW4gdHJhY2tJZHJlZnMpIHsKLSAgICAgICAgX2Vycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOwotICAgICAgICBfdHJhY2tJZHJlZnMgPSB0cmFja0lkcmVmczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGljcykgewotCi0gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBzdGF0ZSBmb3IgdGhlIGVsZW1lbnQKLSAgICAgICAgbmV3U3RhdGUoKTsKLQotICAgICAgICAvLyBGaXJzdCBkaXNwYXRjaCB0aGlzIGVsZW1lbnQgZXZlbnQKLSAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfY29uc3RyYWludFN0YWNrIDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQpCi0gICAgICAgICAgICBjcy5lbGVtZW50KGUsIHN0KTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU2VsZWN0b3JTdGF0ZSBmb3IgZWFjaCBuZXcgSWRlbnRpdHkgQ29uc3RyYWludAotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaWNzICE9IG51bGwgJiYgaSA8IGljcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBuZXdDb25zdHJhaW50U3RhdGUoaWNzW2ldLCBlLCBzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKSB7Ci0gICAgICAgIC8vIFBvcCB0aGUgZWxlbWVudCBzdGF0ZSBzdGFjayBhbmQgYW55IGNvbnN0cmFpbnRzIGF0IHRoaXMgZGVwdGgKLSAgICAgICAgaWYgKF9lbGVtZW50U3RhY2suX2hhc0NvbnN0cmFpbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsICYmIGNzICE9IF9lbGVtZW50U3RhY2suX3NhdmVQb2ludCA7IGNzID0gY3MuX25leHQpCi0gICAgICAgICAgICAgICAgY3MucmVtb3ZlKCBlICk7Ci0KLSAgICAgICAgICAgIF9jb25zdHJhaW50U3RhY2sgPSBfZWxlbWVudFN0YWNrLl9zYXZlUG9pbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBfZWxlbWVudFN0YWNrID0gX2VsZW1lbnRTdGFjay5fbmV4dDsKLQotICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXZlbnQKLSAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfY29uc3RyYWludFN0YWNrIDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQpCi0gICAgICAgICAgICBjcy5lbmRFbGVtZW50KGUpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfY29uc3RyYWludFN0YWNrIDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQpCi0gICAgICAgICAgICBjcy5hdHRyKGUsIG5hbWUsIHN0LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGV4dChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZW1wdHlDb250ZW50KSB7Ci0gICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX2NvbnN0cmFpbnRTdGFjayA7IGNzICE9IG51bGwgOyBjcyA9IGNzLl9uZXh0KQotICAgICAgICAgICAgY3MudGV4dChlLCBzdCwgdmFsdWUsIGVtcHR5Q29udGVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuICFfaW52YWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbmV3Q29uc3RyYWludFN0YXRlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpYywgRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkKLSAgICB7Ci0gICAgICAgIGlmIChpYy5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKQotICAgICAgICAgICAgbmV3IEtleXJlZlN0YXRlKGljLCBlLCBzdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5ldyBTZWxlY3RvclN0YXRlKGljLCBlLCBzdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkSWRTdGF0ZXMoKQotICAgIHsKLSAgICAgICAgLy8gQ29uc3RydWN0IHN0YXRlcyB0byBob2xkIHRoZSB2YWx1ZXMgZm9yIElEcyBhbmQgSURSZWZzCi0gICAgICAgIElkU3RhdGUgaWRzID0gbmV3IElkU3RhdGUoKTsKLSAgICAgICAgaWYgKF90cmFja0lkcmVmcykKLSAgICAgICAgICAgIG5ldyBJZFJlZlN0YXRlKGlkcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5ld1N0YXRlKCkgewotICAgICAgICBib29sZWFuIGZpcnN0VGltZSA9IF9lbGVtZW50U3RhY2sgPT0gbnVsbDsKLQotICAgICAgICBFbGVtZW50U3RhdGUgc3QgPSBuZXcgRWxlbWVudFN0YXRlKCk7Ci0gICAgICAgIHN0Ll9uZXh0ID0gX2VsZW1lbnRTdGFjazsKLSAgICAgICAgX2VsZW1lbnRTdGFjayA9IHN0OwotCi0gICAgICAgIGlmIChmaXJzdFRpbWUpCi0gICAgICAgICAgICBidWlsZElkU3RhdGVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIF9pbnZhbGlkID0gdHJ1ZTsKLQotICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGV2ZW50ICE9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyLmFkZCgKLSAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JDdXJzb3IoIG1zZywgZXZlbnQuZ2V0TG9jYXRpb25Bc0N1cnNvcigpICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRTYXZlUG9pbnQoIENvbnN0cmFpbnRTdGF0ZSBjcyApCi0gICAgewotICAgICAgICBpZiAoISBfZWxlbWVudFN0YWNrLl9oYXNDb25zdHJhaW50cykKLSAgICAgICAgICAgIF9lbGVtZW50U3RhY2suX3NhdmVQb2ludCA9IGNzOwotCi0gICAgICAgIF9lbGVtZW50U3RhY2suX2hhc0NvbnN0cmFpbnRzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxPYmplY3QgbmV3VmFsdWUoU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzdC5uZXdWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgYml0IGhhY2t5LiBuZXdWYWx1ZSB0aHJvd3MgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIHdoaWNoIGlzIAotICAgICAgICAgICAgLy8gdW5jaGVja2VkIGFuZCBkZWNsYXJlZCBpbiB0eXBlaW1wbC4gSSBjYW4gb25seSBjYXRjaCBpdHMgcGFyZW50IGNsYXNzLCAKLSAgICAgICAgICAgIC8vIHR5cGVpbXBsIGlzIGJ1aWx0IGFmdGVyIGNvbW1vbi4KLQotICAgICAgICAgICAgLy8gSWdub3JlIHRoZXNlIGV4Y2VwdGlvbnMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGVtLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNpbXBsZSB0eXBlIGZvciBzY2hlbWEgdHlwZS4gSWYgdGhlIHNjaGVtYSB0eXBlIGlzIGFscmVhZHkKLSAgICAgKiBzaW1wbGUsIGp1c3QgcmV0dXJuIGl0LiBJZiBpdCBpcyBhIGNvbXBsZXggdHlwZSB3aXRoIHNpbXBsZSBjb250ZW50LAotICAgICAqIHJldHVybiB0aGUgc2ltcGxlIHR5cGUgaXQgZXh0ZW5kcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgU2NoZW1hVHlwZSBnZXRTaW1wbGVUeXBlKFNjaGVtYVR5cGUgc3QpIAotICAgIHsKLSAgICAgICAgYXNzZXJ0IHN0LmlzU2ltcGxlVHlwZSgpIHx8IHN0LmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCA6IAotICAgICAgICAgICAgc3QgKyAiIGRvZXMgbm90IGhhdmUgc2ltcGxlIGNvbnRlbnQuIjsKLQotICAgICAgICB3aGlsZSAoISBzdC5pc1NpbXBsZVR5cGUoKSApCi0gICAgICAgICAgICBzdCA9IHN0LmdldEJhc2VUeXBlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHN0OwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGhhc1NpbXBsZUNvbnRlbnQoU2NoZW1hVHlwZSBzdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdC5pc1NpbXBsZVR5cGUoKSB8fCBzdC5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnN0cmFpbnRTdGF0ZSB7Ci0gICAgICAgIENvbnN0cmFpbnRTdGF0ZSBfbmV4dDsKLQotICAgICAgICBDb25zdHJhaW50U3RhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRTYXZlUG9pbnQoX2NvbnN0cmFpbnRTdGFjayk7Ci0gICAgICAgICAgICBfbmV4dCA9IF9jb25zdHJhaW50U3RhY2s7Ci0gICAgICAgICAgICBfY29uc3RyYWludFN0YWNrID0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGFic3RyYWN0IHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0KTsKLSAgICAgICAgYWJzdHJhY3Qgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpOwotICAgICAgICBhYnN0cmFjdCB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKTsKLSAgICAgICAgYWJzdHJhY3Qgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpOwotICAgICAgICBhYnN0cmFjdCB2b2lkIHJlbW92ZShFdmVudCBlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBTZWxlY3RvclN0YXRlIGV4dGVuZHMgQ29uc3RyYWludFN0YXRlIHsKLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IF9jb25zdHJhaW50OwotICAgICAgICBTZXQgX3ZhbHVlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQgX2NvbnRleHQ7Ci0KLSAgICAgICAgU2VsZWN0b3JTdGF0ZShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgY29uc3RyYWludCwgRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgewotICAgICAgICAgICAgX2NvbnN0cmFpbnQgPSBjb25zdHJhaW50OwotICAgICAgICAgICAgX2NvbnRleHQgPSBuZXcgWFBhdGguRXhlY3V0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgX2NvbnRleHQuaW5pdCgoWFBhdGgpX2NvbnN0cmFpbnQuZ2V0U2VsZWN0b3JQYXRoKCkpOwotCi0gICAgICAgICAgICBpZiAoICggX2NvbnRleHQuc3RhcnQoKSAmIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQuSElUICkgIT0gMCApCi0gICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTdGF0ZShlLCBzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEZpZWxkcyhYbWxPYmplY3RMaXN0IGZpZWxkcywgRXZlbnQgZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY29uc3RyYWludC5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKQotICAgICAgICAgICAgICAgIF92YWx1ZXMuYWRkKGZpZWxkcyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChfdmFsdWVzLmNvbnRhaW5zKGZpZWxkcykpIAotICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiRHVwbGljYXRlIGtleSAnIiArIGZpZWxkcyArICInIGZvciBrZXkgb3IgdW5pcXVlIGNvbnN0cmFpbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShfY29uc3RyYWludC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfdmFsdWVzLmFkZChmaWVsZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICggX2NvbnRleHQuZWxlbWVudChlLmdldE5hbWUoKSkgJiBYUGF0aC5FeGVjdXRpb25Db250ZXh0LkhJVCkgIT0gMCApCi0gICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTdGF0ZShlLCBzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LmVuZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjcmVhdGVGaWVsZFN0YXRlKEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIHsKLSAgICAgICAgICAgIG5ldyBGaWVsZFN0YXRlKHRoaXMsIGUsIHN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVtb3ZlKEV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIEJ1YmJsZSB1cCBrZXksIHVuaXF1ZSB2YWx1ZXMgdG8ga2V5cmVmcwotICAgICAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfbmV4dCA7IGNzICE9IG51bGwgOyBjcyA9IGNzLl9uZXh0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3MgaW5zdGFuY2VvZiBLZXlyZWZTdGF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEtleXJlZlN0YXRlIGtyID0gKEtleXJlZlN0YXRlKWNzOwotICAgICAgICAgICAgICAgICAgICBpZiAoa3IuX2NvbnN0cmFpbnQuZ2V0UmVmZXJlbmNlZEtleSgpID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgICAgICBrci5hZGRLZXlWYWx1ZXMoX3ZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkge30KLSAgICAgICAgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpIHt9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEtleXJlZlN0YXRlIGV4dGVuZHMgU2VsZWN0b3JTdGF0ZSB7Ci0gICAgICAgIFNldCBfa2V5VmFsdWVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBLZXlyZWZTdGF0ZShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgY29uc3RyYWludCwgRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgewotICAgICAgICAgICAgc3VwZXIoY29uc3RyYWludCwgZSwgc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRLZXlWYWx1ZXMoZmluYWwgU2V0IHZhbHVlcykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQlVHOiByZW1vdmUgZHVwbGljYXRlcwotICAgICAgICAgICAgX2tleVZhbHVlcy5hZGRBbGwodmFsdWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVtb3ZlKEV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkga2V5cyBhdCB0aGUgc2FtZSBzdGFjayBsZXZlbCBhcyB0aGlzCi0gICAgICAgICAgICAvLyB0aGF0IG1heSBjb250cmlidXRlIGtleSB2YWx1ZXMgdG8gbWUKLSAgICAgICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX25leHQgOyBjcyAhPSBudWxsICYmIGNzICE9IF9lbGVtZW50U3RhY2suX3NhdmVQb2ludCA7IGNzID0gY3MuX25leHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNzIGluc3RhbmNlb2YgU2VsZWN0b3JTdGF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yU3RhdGUgc2VsID0gKFNlbGVjdG9yU3RhdGUpY3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWwuX2NvbnN0cmFpbnQgPT0gX2NvbnN0cmFpbnQuZ2V0UmVmZXJlbmNlZEtleSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5VmFsdWVzKHNlbC5fdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8gdmFsaWRhdGUgYWxsIHZhbHVlcyBoYXZlIGJlZW4gc2VlbgotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IF92YWx1ZXMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIFhtbE9iamVjdExpc3QgZmllbGRzID0gKFhtbE9iamVjdExpc3QpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChmaWVsZHMudW5maWxsZWQoKSA8IDAgJiYgISBfa2V5VmFsdWVzLmNvbnRhaW5zKGZpZWxkcykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIktleSAnIiArIGZpZWxkcyArICInIG5vdCBmb3VuZCAoa2V5UmVmICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoX2NvbnN0cmFpbnQuZ2V0TmFtZSgpKSArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgRmllbGRTdGF0ZSBleHRlbmRzIENvbnN0cmFpbnRTdGF0ZSB7Ci0gICAgICAgIFNlbGVjdG9yU3RhdGUgX3NlbGVjdG9yOwotICAgICAgICBYUGF0aC5FeGVjdXRpb25Db250ZXh0W10gX2NvbnRleHRzOwotICAgICAgICBib29sZWFuW10gX25lZWRzVmFsdWU7Ci0gICAgICAgIFhtbE9iamVjdExpc3QgX3ZhbHVlOwotCi0gICAgICAgIEZpZWxkU3RhdGUoU2VsZWN0b3JTdGF0ZSBzZWxlY3RvciwgRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgewotCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIG5ldyBGaWVsZCBTdGF0ZSBmb3I6ICIgKyBlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIF9zZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGljID0gc2VsZWN0b3IuX2NvbnN0cmFpbnQ7Ci0KLSAgICAgICAgICAgIGludCBmaWVsZENvdW50ID0gaWMuZ2V0RmllbGRzKCkubGVuZ3RoOwotICAgICAgICAgICAgX2NvbnRleHRzID0gbmV3IFhQYXRoLkV4ZWN1dGlvbkNvbnRleHRbZmllbGRDb3VudF07Ci0gICAgICAgICAgICBfbmVlZHNWYWx1ZSA9IG5ldyBib29sZWFuW2ZpZWxkQ291bnRdOwotICAgICAgICAgICAgX3ZhbHVlID0gbmV3IFhtbE9iamVjdExpc3QoZmllbGRDb3VudCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGZpZWxkQ291bnQgOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRleHRzW2ldID0gbmV3IFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBfY29udGV4dHNbaV0uaW5pdCgoWFBhdGgpaWMuZ2V0RmllbGRQYXRoKGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoICggX2NvbnRleHRzW2ldLnN0YXJ0KCkgJiBYUGF0aC5FeGVjdXRpb25Db250ZXh0LkhJVCApICE9IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJoaXQgZm9yIGVsZW1lbnQ6ICIgKyBlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNTaW1wbGVDb250ZW50KHN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiSWRlbnRpdHkgY29uc3RyYWludCBmaWVsZCBtdXN0IGhhdmUgc2ltcGxlIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzVmFsdWVbaV0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9jb250ZXh0cy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoX25lZWRzVmFsdWVbaV0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIklkZW50aXR5IGNvbnN0cmFpbnQgZmllbGQgbXVzdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIF9uZWVkc1ZhbHVlW2ldID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfY29udGV4dHMubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAoIF9jb250ZXh0c1tpXS5lbGVtZW50KGUuZ2V0TmFtZSgpKSAmIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQuSElUKSAhPSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIGhhc1NpbXBsZUNvbnRlbnQoc3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJZGVudGl0eSBjb25zdHJhaW50IGZpZWxkIG11c3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNWYWx1ZVtpXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkgewotCi0gICAgICAgICAgICAvLyBOdWxsIHZhbHVlIGluZGljYXRlcyBwcmV2aW91c2x5IHJlcG9ydGVkIHZhbGlkYXRpb24gcHJvYmxlbQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2NvbnRleHRzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICggX2NvbnRleHRzW2ldLmF0dHIobmFtZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBvID0gbmV3VmFsdWUoc3QsIHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXQgPSBfdmFsdWUuc2V0KG8sIGkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghIHNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiTXVsdGlwbGUgaW5zdGFuY2VzIG9mIGZpZWxkIHdpdGggeHBhdGg6ICciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX3NlbGVjdG9yLl9jb25zdHJhaW50LmdldEZpZWxkcygpW2ldICsgIicgZm9yIGEgc2VsZWN0b3IiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpIHsKLQotICAgICAgICAgICAgLy8gTnVsbCB2YWx1ZSBpbmRpY2F0ZXMgcHJldmlvdXNseSByZXBvcnRlZCB2YWxpZGF0aW9uIHByb2JsZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmICFlbXB0eUNvbnRlbnQpIHJldHVybjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2NvbnRleHRzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICggX25lZWRzVmFsdWVbaV0gKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5Q29udGVudCB8fCAhaGFzU2ltcGxlQ29udGVudChzdCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiSWRlbnRpdHkgY29uc3RyYWludCBmaWVsZCBtdXN0IGhhdmUgc2ltcGxlIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgc2ltcGxlVHlwZSA9IGdldFNpbXBsZVR5cGUoc3QpOwotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgbyA9IG5ld1ZhbHVlKHNpbXBsZVR5cGUsIHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXQgPSBfdmFsdWUuc2V0KG8sIGkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghIHNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiTXVsdGlwbGUgaW5zdGFuY2VzIG9mIGZpZWxkIHdpdGggeHBhdGg6ICciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX3NlbGVjdG9yLl9jb25zdHJhaW50LmdldEZpZWxkcygpW2ldICsgIicgZm9yIGEgc2VsZWN0b3IiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgLy8gcmVzZXQgYW55ICBfbmVlZHNWYWx1ZSBmbGFncyAKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGF0IGlmIHdlIGRpZG4ndCBzZWUgdGhlIHRleHQsIGl0IHdhcyBiZWNhdXNlIG9mIGFub3RoZXIgdmFsaWRhdGlvbgotICAgICAgICAgICAgLy8gZXJyb3IsIHNvIGRvbid0IGVtaXQgYW5vdGhlciBvbmUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfbmVlZHNWYWx1ZS5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRleHRzW2ldLmVuZCgpOwotICAgICAgICAgICAgICAgIF9uZWVkc1ZhbHVlW2ldID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVtb3ZlKEV2ZW50IGUpIAotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWSAmJgotICAgICAgICAgICAgICAgIF92YWx1ZS51bmZpbGxlZCgpID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGtleXMgbXVzdCBoYXZlIGFsbCB2YWx1ZXMgc3VwcGxpZWQKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIktleSAiICsgUU5hbWVIZWxwZXIucHJldHR5KF9zZWxlY3Rvci5fY29uc3RyYWludC5nZXROYW1lKCkpICsgIiBpcyBtaXNzaW5nIGZpZWxkIHdpdGggeHBhdGg6ICciICsgX3NlbGVjdG9yLl9jb25zdHJhaW50LmdldEZpZWxkcygpW192YWx1ZS51bmZpbGxlZCgpXSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRmluaXNoZWQuIEFkZCB0aGVzZSBmaWVsZHMgdG8gdGhlIHNlbGVjdG9yIHN0YXRlCi0gICAgICAgICAgICAgICAgX3NlbGVjdG9yLmFkZEZpZWxkcyhfdmFsdWUsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgSWRTdGF0ZSBleHRlbmRzIENvbnN0cmFpbnRTdGF0ZQotICAgIHsKLSAgICAgICAgU2V0IF92YWx1ZXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0gICAgICAgIElkU3RhdGUoKSB7IH0KLQotICAgICAgICB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVWYWx1ZShlLCBzdCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbXB0eUNvbnRlbnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBoYW5kbGVWYWx1ZShlLCBzdCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVZhbHVlKEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvLyBOdWxsIHZhbHVlIGluZGljYXRlcyBwcmV2aW91c2x5IHJlcG9ydGVkIHZhbGlkYXRpb24gcHJvYmxlbQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKHN0ID09IG51bGwgfHwgc3QuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFhtbElELnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCB4bWxWYWx1ZSA9IG5ldyBYbWxPYmplY3RMaXN0KDEpOwotICAgICAgICAgICAgICAgIFhtbE9iamVjdCBvID0gbmV3VmFsdWUoWG1sSUQudHlwZSwgdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICB4bWxWYWx1ZS5zZXQobywgMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3ZhbHVlcy5jb250YWlucyh4bWxWYWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiRHVwbGljYXRlIElEIHZhbHVlICciICsgdmFsdWUgKyAiJyIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoeG1sVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpIHt9Ci0gICAgICAgIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKXt9Ci0gICAgICAgIHZvaWQgcmVtb3ZlKEV2ZW50IGUpe30KLQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBJZFJlZlN0YXRlIGV4dGVuZHMgQ29uc3RyYWludFN0YXRlCi0gICAgewotICAgICAgICBJZFN0YXRlIF9pZHM7Ci0gICAgICAgIExpc3QgX3ZhbHVlczsKLQotICAgICAgICBJZFJlZlN0YXRlKElkU3RhdGUgaWRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaWRzID0gaWRzOwotICAgICAgICAgICAgX3ZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVWYWx1ZShFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE51bGwgdmFsdWUgaW5kaWNhdGVzIHByZXZpb3VzbHkgcmVwb3J0ZWQgdmFsaWRhdGlvbiBwcm9ibGVtCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoc3QgPT0gbnVsbCB8fCBzdC5pc05vVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFhtbElEUkVGUy50eXBlLmlzQXNzaWduYWJsZUZyb20oc3QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbElEUkVGUyBsdiA9IChYbWxJRFJFRlMpbmV3VmFsdWUoWG1sSURSRUZTLnR5cGUsIHZhbHVlKTsKLQotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgaWYgKGx2ID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgICAgIExpc3QgbCA9IGx2LnhnZXRMaXN0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCBvbmUgdmFsdWUgZm9yIGVhY2ggaWRyZWYgaW4gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsLnNpemUoKSA7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdExpc3QgeG1sVmFsdWUgPSBuZXcgWG1sT2JqZWN0TGlzdCgxKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sSURSRUYgaWRyZWYgPSAoWG1sSURSRUYpbC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFZhbHVlLnNldChpZHJlZiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuYWRkKHhtbFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChYbWxJRFJFRi50eXBlLmlzQXNzaWduYWJsZUZyb20oc3QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbE9iamVjdExpc3QgeG1sVmFsdWUgPSBuZXcgWG1sT2JqZWN0TGlzdCgxKTsKLSAgICAgICAgICAgICAgICBYbWxJRFJFRiBpZHJlZiA9IChYbWxJRFJFRilzdC5uZXdWYWx1ZSh2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgIGlmIChpZHJlZiA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICB4bWxWYWx1ZS5zZXQoaWRyZWYsIDApOwotICAgICAgICAgICAgICAgIF92YWx1ZXMuYWRkKHhtbFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVWYWx1ZShlLCBzdCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgdGV4dChFdmVudCBlLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZW1wdHlDb250ZW50KSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVtcHR5Q29udGVudCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgCi0gICAgICAgIHsgCi0gICAgICAgICAgICAvLyBWYWxpZGF0ZSBlYWNoIHJlZiBoYXMgYSBjb3JyZXNwb25kaW5nIElECi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gX3ZhbHVlcy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghIF9pZHMuX3ZhbHVlcy5jb250YWlucyhvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiSUQgbm90IGZvdW5kIGZvciBJRFJlZiB2YWx1ZSAnIiArIG8gKyAiJyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgeyB9Ci0gICAgICAgIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKSB7IH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbGVtZW50U3RhdGUgewotICAgICAgICBFbGVtZW50U3RhdGUgX25leHQ7Ci0gICAgICAgIGJvb2xlYW4gX2hhc0NvbnN0cmFpbnRzOwotICAgICAgICBDb25zdHJhaW50U3RhdGUgX3NhdmVQb2ludDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTGV2ZW5zaHRlaW4uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9MZXZlbnNodGVpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDE4MWU5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9MZXZlbnNodGVpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotcHVibGljIGNsYXNzIExldmVuc2h0ZWluCi17Ci0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgLy8gR2V0IG1pbmltdW0gb2YgdGhyZWUgdmFsdWVzCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWluaW11bShpbnQgYSwgaW50IGIsIGludCBjKQotICAgIHsKLSAgICAgICAgaW50IG1pID0gYTsKLSAgICAgICAgaWYgKGIgPCBtaSkKLSAgICAgICAgICAgIG1pID0gYjsKLSAgICAgICAgaWYgKGMgPCBtaSkKLSAgICAgICAgICAgIG1pID0gYzsKLSAgICAgICAgcmV0dXJuIG1pOwotICAgIH0KLQotICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBDb21wdXRlIExldmVuc2h0ZWluIGRpc3RhbmNlCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIHB1YmxpYyBzdGF0aWMgaW50IGRpc3RhbmNlKFN0cmluZyBzLCBTdHJpbmcgdCkKLSAgICB7Ci0gICAgICAgIGludCBkW11bXTsgLy8gbWF0cml4Ci0gICAgICAgIGludCBuOyAvLyBsZW5ndGggb2YgcwotICAgICAgICBpbnQgbTsgLy8gbGVuZ3RoIG9mIHQKLSAgICAgICAgaW50IGk7IC8vIGl0ZXJhdGVzIHRocm91Z2ggcwotICAgICAgICBpbnQgajsgLy8gaXRlcmF0ZXMgdGhyb3VnaCB0Ci0gICAgICAgIGNoYXIgc19pOyAvLyBpdGggY2hhcmFjdGVyIG9mIHMKLSAgICAgICAgY2hhciB0X2o7IC8vIGp0aCBjaGFyYWN0ZXIgb2YgdAotICAgICAgICBpbnQgY29zdDsgLy8gY29zdAotCi0gICAgICAgIC8vIFN0ZXAgMQotICAgICAgICBuID0gcy5sZW5ndGgoKTsKLSAgICAgICAgbSA9IHQubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChuID09IDApCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgaWYgKG0gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICBkID0gbmV3IGludFtuKzFdW20rMV07Ci0KLSAgICAgICAgLy8gU3RlcCAyCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgaSsrKQotICAgICAgICAgICAgZFtpXVswXSA9IGk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPD0gbTsgaisrKQotICAgICAgICAgICAgZFswXVtqXSA9IGo7Ci0KLSAgICAgICAgLy8gU3RlcCAzCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzX2kgPSBzLmNoYXJBdCAoaSAtIDEpOwotCi0gICAgICAgICAgICAvLyBTdGVwIDQKLSAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gbTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRfaiA9IHQuY2hhckF0KGogLSAxKTsKLQotICAgICAgICAgICAgICAgIC8vIFN0ZXAgNQotICAgICAgICAgICAgICAgIGlmIChzX2kgPT0gdF9qKQotICAgICAgICAgICAgICAgICAgICBjb3N0ID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNvc3QgPSAxOwotCi0gICAgICAgICAgICAgICAgLy8gU3RlcCA2Ci0gICAgICAgICAgICAgICAgZFtpXVtqXSA9IG1pbmltdW0oZFtpLTFdW2pdKzEsIGRbaV1bai0xXSsxLCBkW2ktMV1bai0xXSArIGNvc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RlcCA3Ci0gICAgICAgIHJldHVybiBkW25dW21dOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL011dGV4LmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTXV0ZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5Njc0NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTXV0ZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLXB1YmxpYyBjbGFzcyBNdXRleAotewotICAgIHByaXZhdGUgVGhyZWFkICBvd25lciAgICAgID0gbnVsbDsgIC8vIE93bmVyIG9mIG11dGV4LCBudWxsIGlmIG5vYm9keQotICAgIHByaXZhdGUgaW50ICAgICBsb2NrX2NvdW50ID0gMDsKLQotICAgIC8qKgotICAgICAqIEFjcXVpcmUgdGhlIG11dGV4LiBUaGUgbXV0ZXggY2FuIGJlIGFjcXVpcmVkIG11bHRpcGxlIHRpbWVzCi0gICAgICogYnkgdGhlIHNhbWUgdGhyZWFkLCBwcm92aWRlZCB0aGF0IGl0IGlzIHJlbGVhc2VkIGFzIG1hbnkKLSAgICAgKiB0aW1lcyBhcyBpdCBpcyBhY3F1aXJlZC4gVGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcyB1bnRpbAotICAgICAqIGl0IGhhcyBhY3F1aXJlZCB0aGUgbXV0ZXguIChUaGVyZSBpcyBubyB0aW1lb3V0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNxdWlyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgd2hpbGUgKHRyeVRvQWNxdWlyZSgpID09IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndhaXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIG11dGV4LiBSZXR1cm5zIGZhbHNlIChhbmQgZG9lcyBub3QKLSAgICAgKiBibG9jaykgaWYgaXQgY2FuJ3QgZ2V0IGl0LgotICAgICAqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHRyeVRvQWNxdWlyZSgpCi0gICAgewotICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBtdXRleC4gUmV0dXJuIHRydWUgaWYgeW91IGdvdCBpdC4KLQotICAgICAgICBpZiggb3duZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgICAgIGxvY2tfY291bnQgPSAxOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggb3duZXIgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICsrbG9ja19jb3VudDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIG11dGV4LiBUaGUgbXV0ZXggaGFzIHRvIGJlIHJlbGVhc2VkIGFzIG1hbnkgdGltZXMKLSAgICAgKiBhcyBpdCB3YXMgYWNxdWlyZWQgdG8gYWN0dWFsbHkgdW5sb2NrIHRoZSByZXNvdXJjZS4gVGhlIG11dGV4Ci0gICAgICogbXVzdCBiZSByZWxlYXNlZCBieSB0aGUgdGhyZWFkIHRoYXQgYWNxdWlyZWQgaXQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIChhIFJ1bnRpbWVFeGNlcHRpb24pIGlmIGEgdGhyZWFkCi0gICAgICogICAgICBvdGhlciB0aGFuIHRoZSBjdXJyZW50IG93bmVyIHRyaWVzIHRvIHJlbGVhc2UgdGhlIG11dGV4LgotICAgICAqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKQotICAgIHsKLSAgICAgICAgaWYgKG93bmVyICE9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaHJlYWQgY2FsbGluZyByZWxlYXNlKCkgZG9lc24ndCBvd24gbXV0ZXgiKTsKLQotICAgICAgICBpZiAoLS1sb2NrX2NvdW50IDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyID0gbnVsbDsKLSAgICAgICAgICAgIG5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9OYW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjBjYzZiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9OYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE5hbWVVdGlsCi17Ci0gICAgLy8gcHVuY3R1YXRpb24gY2hhcmFjdGVycwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBIWVBIRU4gPSAnXHUwMDJEJzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgUEVSSU9EID0gJ1x1MDAyRSc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIENPTE9OICA9ICdcdTAwM0EnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBVU0NPUkUgPSAnXHUwMDVGJzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgRE9UICAgID0gJ1x1MDBCNyc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIFRFTEVJQSA9ICdcdTAzODcnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBBWUFIICAgPSAnXHUwNkREJzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgRUxISVpCID0gJ1x1MDZERSc7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgamF2YVdvcmRzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgbmV3IFN0cmluZ1tdCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgImFic3RyYWN0IiwKLSAgICAgICAgICAgICAgImJvb2xlYW4iLAotICAgICAgICAgICAgICAiYnJlYWsiLAotICAgICAgICAgICAgICAiYnl0ZSIsCi0gICAgICAgICAgICAgICJjYXNlIiwKLSAgICAgICAgICAgICAgImNhdGNoIiwKLSAgICAgICAgICAgICAgImNoYXIiLAotICAgICAgICAgICAgICAiY2xhc3MiLAotICAgICAgICAgICAgICAiY29uc3QiLAotICAgICAgICAgICAgICAiY29udGludWUiLAotICAgICAgICAgICAgICAiZGVmYXVsdCIsCi0gICAgICAgICAgICAgICJkbyIsCi0gICAgICAgICAgICAgICJkb3VibGUiLAotICAgICAgICAgICAgICAiZWxzZSIsCi0gICAgICAgICAgICAgICJleHRlbmRzIiwKLSAgICAgICAgICAgICAgImZhbHNlIiwgLy8gbm90IGEga2V5d29yZAotICAgICAgICAgICAgICAiZmluYWwiLAotICAgICAgICAgICAgICAiZmluYWxseSIsCi0gICAgICAgICAgICAgICJmbG9hdCIsCi0gICAgICAgICAgICAgICJmb3IiLAotICAgICAgICAgICAgICAiZ290byIsCi0gICAgICAgICAgICAgICJpZiIsCi0gICAgICAgICAgICAgICJpbXBsZW1lbnRzIiwKLSAgICAgICAgICAgICAgImltcG9ydCIsCi0gICAgICAgICAgICAgICJpbnN0YW5jZW9mIiwKLSAgICAgICAgICAgICAgImludCIsCi0gICAgICAgICAgICAgICJpbnRlcmZhY2UiLAotICAgICAgICAgICAgICAibG9uZyIsCi0gICAgICAgICAgICAgICJuYXRpdmUiLAotICAgICAgICAgICAgICAibmV3IiwKLSAgICAgICAgICAgICAgIm51bGwiLCAvLyBub3QgYSBrZXl3b3JkCi0gICAgICAgICAgICAgICJwYWNrYWdlIiwKLSAgICAgICAgICAgICAgInByaXZhdGUiLAotICAgICAgICAgICAgICAicHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgInB1YmxpYyIsCi0gICAgICAgICAgICAgICJyZXR1cm4iLAotICAgICAgICAgICAgICAic2hvcnQiLAotICAgICAgICAgICAgICAic3RhdGljIiwKLSAgICAgICAgICAgICAgInN1cGVyIiwKLSAgICAgICAgICAgICAgInN3aXRjaCIsCi0gICAgICAgICAgICAgICJzeW5jaHJvbml6ZWQiLAotICAgICAgICAgICAgICAidGhpcyIsCi0gICAgICAgICAgICAgICJ0aHJlYWRzYWZlIiwKLSAgICAgICAgICAgICAgInRocm93IiwKLSAgICAgICAgICAgICAgInRocm93cyIsCi0gICAgICAgICAgICAgICJ0cmFuc2llbnQiLAotICAgICAgICAgICAgICAidHJ1ZSIsIC8vIG5vdCBhIGtleXdvcmQKLSAgICAgICAgICAgICAgInRyeSIsCi0gICAgICAgICAgICAgICJ2b2lkIiwKLSAgICAgICAgICAgICAgInZvbGF0aWxlIiwKLSAgICAgICAgICAgICAgIndoaWxlIiwKLSAgICAgICAgfQotICAgICkpOwotCi0gICAgLyoKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgamF2YU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgbmV3IFN0cmluZ1tdCi0gICAgICAgIHsKLSAgICAgICAgICAgICJDaGFyU2VxdWVuY2UiLAotICAgICAgICAgICAgIkNsb25lYWJsZSIsCi0gICAgICAgICAgICAiQ29tcGFyYWJsZSIsCi0gICAgICAgICAgICAiUnVubmFibGUiLAotCi0gICAgICAgICAgICAiQm9vbGVhbiIsCi0gICAgICAgICAgICAiQnl0ZSIsCi0gICAgICAgICAgICAiQ2hhcmFjdGVyIiwKLSAgICAgICAgICAgICJDbGFzcyIsCi0gICAgICAgICAgICAiQ2xhc3NMb2FkZXIiLAotICAgICAgICAgICAgIkNvbXBpbGVyIiwKLSAgICAgICAgICAgICJEb3VibGUiLAotICAgICAgICAgICAgIkZsb2F0IiwKLSAgICAgICAgICAgICJJbmhlcml0YWJsZVRocmVhZExvY2FsIiwKLSAgICAgICAgICAgICJJbnRlZ2VyIiwKLSAgICAgICAgICAgICJMb25nIiwKLSAgICAgICAgICAgICJNYXRoIiwKLSAgICAgICAgICAgICJOdW1iZXIiLAotICAgICAgICAgICAgIk9iamVjdCIsCi0gICAgICAgICAgICAiUGFja2FnZSIsCi0gICAgICAgICAgICAiUHJvY2VzcyIsCi0gICAgICAgICAgICAiUnVudGltZSIsCi0gICAgICAgICAgICAiUnVudGltZVBlcm1pc3Npb24iLAotICAgICAgICAgICAgIlNlY3VyaXR5TWFuYWdlciIsCi0gICAgICAgICAgICAiU2hvcnQiLAotICAgICAgICAgICAgIlN0YWNrVHJhY2VFbGVtZW50IiwKLSAgICAgICAgICAgICJTdHJpY3RNYXRoIiwKLSAgICAgICAgICAgICJTdHJpbmciLAotICAgICAgICAgICAgIlN0cmluZ0J1ZmZlciIsCi0gICAgICAgICAgICAiU3lzdGVtIiwKLSAgICAgICAgICAgICJUaHJlYWQiLAotICAgICAgICAgICAgIlRocmVhZEdyb3VwIiwKLSAgICAgICAgICAgICJUaHJlYWRMb2NhbCIsCi0gICAgICAgICAgICAiVGhyb3dhYmxlIiwKLSAgICAgICAgICAgICJWb2lkIiwKLQotICAgICAgICAgICAgIkFyaXRobWV0aWNFeGNlcHRpb24iLAotICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQXJyYXlTdG9yZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQ2xhc3NDYXN0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24iLAotICAgICAgICAgICAgIk5vU3VjaEZpZWxkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFeGNlcHRpb24iLAotICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOdW1iZXJGb3JtYXRFeGNlcHRpb24iLAotICAgICAgICAgICAgIlJ1bnRpbWVFeGNlcHRpb24iLAotICAgICAgICAgICAgIlNlY3VyaXR5RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsCi0KLSAgICAgICAgICAgICJBYnN0cmFjdE1ldGhvZEVycm9yIiwKLSAgICAgICAgICAgICJBc3NlcnRpb25FcnJvciIsCi0gICAgICAgICAgICAiQ2xhc3NDaXJjdWxhcml0eUVycm9yIiwKLSAgICAgICAgICAgICJDbGFzc0Zvcm1hdEVycm9yIiwKLSAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXJyb3IiLAotICAgICAgICAgICAgIkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IiLAotICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FcnJvciIsCi0gICAgICAgICAgICAiSW50ZXJuYWxFcnJvciIsCi0gICAgICAgICAgICAiTGlua2FnZUVycm9yIiwKLSAgICAgICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvciIsCi0gICAgICAgICAgICAiTm9TdWNoRmllbGRFcnJvciIsCi0gICAgICAgICAgICAiTm9TdWNoTWV0aG9kRXJyb3IiLAotICAgICAgICAgICAgIk91dE9mTWVtb3J5RXJyb3IiLAotICAgICAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvciIsCi0gICAgICAgICAgICAiVGhyZWFkRGVhdGgiLAotICAgICAgICAgICAgIlVua25vd25FcnJvciIsCi0gICAgICAgICAgICAiVW5zYXRpc2ZpZWRMaW5rRXJyb3IiLAotICAgICAgICAgICAgIlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IiLAotICAgICAgICAgICAgIlZlcmlmeUVycm9yIiwKLSAgICAgICAgICAgICJWaXJ0dWFsTWFjaGluZUVycm9yIiwKLSAgICAgICAgfQotICAgICkpOwotICAgICovCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgamF2YU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgbmV3IFN0cmluZ1tdCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIDEuIGFsbCB0aGUgSmF2YS5sYW5nIGNsYXNzZXMgWzEuNC4xIEpES10uCi0gICAgICAgICAgICAiQ2hhclNlcXVlbmNlIiwKLSAgICAgICAgICAgICJDbG9uZWFibGUiLAotICAgICAgICAgICAgIkNvbXBhcmFibGUiLAotICAgICAgICAgICAgIlJ1bm5hYmxlIiwKLQotICAgICAgICAgICAgIkJvb2xlYW4iLAotICAgICAgICAgICAgIkJ5dGUiLAotICAgICAgICAgICAgIkNoYXJhY3RlciIsCi0gICAgICAgICAgICAiQ2xhc3MiLAotICAgICAgICAgICAgIkNsYXNzTG9hZGVyIiwKLSAgICAgICAgICAgICJDb21waWxlciIsCi0gICAgICAgICAgICAiRG91YmxlIiwKLSAgICAgICAgICAgICJGbG9hdCIsCi0gICAgICAgICAgICAiSW5oZXJpdGFibGVUaHJlYWRMb2NhbCIsCi0gICAgICAgICAgICAiSW50ZWdlciIsCi0gICAgICAgICAgICAiTG9uZyIsCi0gICAgICAgICAgICAiTWF0aCIsCi0gICAgICAgICAgICAiTnVtYmVyIiwKLSAgICAgICAgICAgICJPYmplY3QiLAotICAgICAgICAgICAgIlBhY2thZ2UiLAotICAgICAgICAgICAgIlByb2Nlc3MiLAotICAgICAgICAgICAgIlJ1bnRpbWUiLAotICAgICAgICAgICAgIlJ1bnRpbWVQZXJtaXNzaW9uIiwKLSAgICAgICAgICAgICJTZWN1cml0eU1hbmFnZXIiLAotICAgICAgICAgICAgIlNob3J0IiwKLSAgICAgICAgICAgICJTdGFja1RyYWNlRWxlbWVudCIsCi0gICAgICAgICAgICAiU3RyaWN0TWF0aCIsCi0gICAgICAgICAgICAiU3RyaW5nIiwKLSAgICAgICAgICAgICJTdHJpbmdCdWZmZXIiLAotICAgICAgICAgICAgIlN5c3RlbSIsCi0gICAgICAgICAgICAiVGhyZWFkIiwKLSAgICAgICAgICAgICJUaHJlYWRHcm91cCIsCi0gICAgICAgICAgICAiVGhyZWFkTG9jYWwiLAotICAgICAgICAgICAgIlRocm93YWJsZSIsCi0gICAgICAgICAgICAiVm9pZCIsCi0KLSAgICAgICAgICAgICJBcml0aG1ldGljRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAotICAgICAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb24iLAotICAgICAgICAgICAgIkNsYXNzQ2FzdEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iLAotICAgICAgICAgICAgIkV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb24iLAotICAgICAgICAgICAgIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTnVtYmVyRm9ybWF0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJSdW50aW1lRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJTZWN1cml0eUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLAotCi0gICAgICAgICAgICAiQWJzdHJhY3RNZXRob2RFcnJvciIsCi0gICAgICAgICAgICAiQXNzZXJ0aW9uRXJyb3IiLAotICAgICAgICAgICAgIkNsYXNzQ2lyY3VsYXJpdHlFcnJvciIsCi0gICAgICAgICAgICAiQ2xhc3NGb3JtYXRFcnJvciIsCi0gICAgICAgICAgICAiRXJyb3IiLAotICAgICAgICAgICAgIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciIsCi0gICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0Vycm9yIiwKLSAgICAgICAgICAgICJJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIiwKLSAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXJyb3IiLAotICAgICAgICAgICAgIkludGVybmFsRXJyb3IiLAotICAgICAgICAgICAgIkxpbmthZ2VFcnJvciIsCi0gICAgICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3IiLAotICAgICAgICAgICAgIk5vU3VjaEZpZWxkRXJyb3IiLAotICAgICAgICAgICAgIk5vU3VjaE1ldGhvZEVycm9yIiwKLSAgICAgICAgICAgICJPdXRPZk1lbW9yeUVycm9yIiwKLSAgICAgICAgICAgICJTdGFja092ZXJmbG93RXJyb3IiLAotICAgICAgICAgICAgIlRocmVhZERlYXRoIiwKLSAgICAgICAgICAgICJVbmtub3duRXJyb3IiLAotICAgICAgICAgICAgIlVuc2F0aXNmaWVkTGlua0Vycm9yIiwKLSAgICAgICAgICAgICJVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIiwKLSAgICAgICAgICAgICJWZXJpZnlFcnJvciIsCi0gICAgICAgICAgICAiVmlydHVhbE1hY2hpbmVFcnJvciIsCi0KLSAgICAgICAgICAgIC8vIDIuIG90aGVyIGNsYXNzZXMgdXNlZCBhcyBwcmltaXRpdmUgdHlwZXMgYnkgeG1sIGJlYW5zCi0gICAgICAgICAgICAiQmlnSW50ZWdlciIsCi0gICAgICAgICAgICAiQmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAiRW51bSIsCi0gICAgICAgICAgICAiRGF0ZSIsCi0gICAgICAgICAgICAiR0RhdGUiLAotICAgICAgICAgICAgIkdEdXJhdGlvbiIsCi0gICAgICAgICAgICAiUU5hbWUiLAotICAgICAgICAgICAgIkxpc3QiLAotCi0gICAgICAgICAgICAvLyAzLiB0aGUgdG9wIGZldyBvcmcuYXBhY2hlLnhtbGJlYW5zIG5hbWVzCi0gICAgICAgICAgICAiWG1sT2JqZWN0IiwKLSAgICAgICAgICAgICJYbWxDdXJzb3IiLAotICAgICAgICAgICAgIlhtbEJlYW5zIiwKLSAgICAgICAgICAgICJTY2hlbWFUeXBlIiwKLSAgICAgICAgfQotICAgICkpOwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhSWRlbnRpZmllcihTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBpZiAoaWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlkIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgaW50IGxlbiA9IGlkLmxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGphdmFXb3Jkcy5jb250YWlucyhpZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGlkLmNoYXJBdCgwKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoaWQuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpBWFJQQ0NsYXNzTmFtZSggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLicsICdfJyk7Ci0gICAgICAgIG5hbWUgPSB1cHBlcmNhc2VGaXJzdExldHRlciggbmFtZSApOwotCi0gICAgICAgIGlmIChpc1ZhbGlkSmF2YUlkZW50aWZlcihuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIl8iICsgbmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpBWFJQQ01ldGhvZE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuJywnXycpOwotICAgICAgICBuYW1lID0gbG93ZXJjYXNlRmlyc3RMZXR0ZXIobmFtZSk7Ci0KLSAgICAgICAgaWYgKGlzVmFsaWRKYXZhSWRlbnRpZmVyKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiXyIgKyBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGdldFhNTE5hbWVGcm9tQ2xhc3MoQ2xhc3MgY2xhenopCi0gICAgewotICAgICAgICBTdHJpbmcgdXJpID0gTmFtZVV0aWwuZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2UoY2xhenopOwotICAgICAgICBTdHJpbmcgbG5hbWUgPSBOYW1lVXRpbC5nZXRSb290Q2xhc3NOYW1lRnJvbUNsYXNzKGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgICAgIFhNTE5hbWUgeHNkX25hbWUgPSBuZXcgTmFtZSh1cmksIGxuYW1lKTsKLSAgICAgICAgcmV0dXJuIHhzZF9uYW1lOwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRnJvbVFOYW1lKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGphdmFfdHlwZSA9IHVwcGVyQ2FtZWxDYXNlKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBTdHJpbmcgdXJpID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBqYXZhX3BrZyA9IG51bGw7Ci0KLSAgICAgICAgamF2YV9wa2cgPSBnZXRQYWNrYWdlRnJvbU5hbWVzcGFjZSh1cmkpOwotCi0gICAgICAgIGlmIChqYXZhX3BrZyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGphdmFfcGtnICsgIi4iICsgamF2YV90eXBlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gamF2YV90eXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX05TX1BSRUZJWD0iamF2YToiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX1BSRUZJWCA9ICJqYXZhLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VGcm9tUGFja2FnZShmaW5hbCBDbGFzcyBjbGF6eikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJfY2xhenogPSBjbGF6ejsKLQotICAgICAgICB3aGlsZSAoY3Vycl9jbGF6ei5pc0FycmF5KCkpCi0gICAgICAgICAgICBjdXJyX2NsYXp6ID0gY3Vycl9jbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotICAgICAgICBpbnQgbGFzdGRvdCA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBwa2dfbmFtZSA9IGxhc3Rkb3QgPCAwID8gIiIgOiBmdWxsbmFtZS5zdWJzdHJpbmcoMCwgbGFzdGRvdCk7Ci0KLSAgICAgICAgLy9zcGVjaWFsIGNhc2UgZm9yIGJ1aWx0aW4gdHlwZXMKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKGN1cnJfY2xhenouaXNQcmltaXRpdmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcGtnX25hbWUgPSBjLmdldEphdmFMYW5ndWFnZU5hbWVzcGFjZVVyaSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBrZ19uYW1lLnN0YXJ0c1dpdGgoTEFOR19QUkVGSVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVtX3N0ciA9IHBrZ19uYW1lLnN1YnN0cmluZyhMQU5HX1BSRUZJWC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBwa2dfbmFtZSA9IGMuZ2V0SmF2YUxhbmd1YWdlTmFtZXNwYWNlVXJpKCkgKyAiLiIgKyByZW1fc3RyOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIHJldHVybiBKQVZBX05TX1BSRUZJWCArIHBrZ19uYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmlTY2hlbWVDaGFyKGNoYXIgY2gpCi0gICAgewotICAgICAgICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSd6JyB8fAotICAgICAgICAgICAgY2ggPj0gJ0EnICYmIGNoIDw9J1onIHx8Ci0gICAgICAgICAgICBjaCA+PSAnMCcgJiYgY2ggPD0nOScgfHwKLSAgICAgICAgICAgIGNoID09ICctJyB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJysnKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXJpQWxwaGFDaGFyKGNoYXIgY2gpCi0gICAgewotICAgICAgICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSd6JyB8fCBjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZFNjaGVtZUNvbG9uKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpbnQgbGVuID0gdXJpLmxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmICghaXNVcmlBbHBoYUNoYXIodXJpLmNoYXJBdCgwKSkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICBpZiAoIWlzVXJpU2NoZW1lQ2hhcih1cmkuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGkgPT0gbGVuKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAodXJpLmNoYXJBdChpKSAhPSAnOicpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBqbHM3N1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYnVmLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgYnVmLnNldENoYXJBdChpLCAnXycpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWYubGVuZ3RoKCkgPT0gMCB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChidWYuY2hhckF0KDApKSkKLSAgICAgICAgICAgIGJ1Zi5pbnNlcnQoMCwgJ18nKTsKLSAgICAgICAgaWYgKGlzSmF2YVJlc2VydmVkV29yZChuYW1lKSkKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ18nKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Qgc3BsaXRETlMoU3RyaW5nIGRucykKLSAgICB7Ci0gICAgICAgIC8vIEpBWEIgc2F5czogb25seSBzcGxpdCtyZXZlcnNlIEROUyBpZiBUTEQgbWF0Y2hlcyBrbm93biBUTERzIG9yIElTTyAzMTY2Ci0gICAgICAgIC8vIFdlIGFyZSBpZ25vcmluZyB0aGlzIG5vdyAoVEgpCi0KLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaW50IGVuZCA9IGRucy5sZW5ndGgoKTsKLSAgICAgICAgaW50IGJlZ2luID0gZG5zLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGZvciAoIDsgYmVnaW4gIT0gLTEgOyBiZWdpbi0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZG5zLmNoYXJBdChiZWdpbikgPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChqbHM3N1N0cmluZyhkbnMuc3Vic3RyaW5nKGJlZ2luICsgMSwgZW5kKSkpOwotICAgICAgICAgICAgICAgIGVuZCA9IGJlZ2luOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hZGQoamxzNzdTdHJpbmcoZG5zLnN1YnN0cmluZygwLCBlbmQpKSk7Ci0KLSAgICAgICAgLy8gSkFYQiBkcmFmdCBleGFtcGxlIGltcGxpZXMgcmVtb3ZhbCBvZiB3d3cKLSAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPj0gMyAmJgotICAgICAgICAgICAgICAgICgoU3RyaW5nKXJlc3VsdC5nZXQocmVzdWx0LnNpemUoKSAtIDEpKS50b0xvd2VyQ2FzZSgpLmVxdWFscygid3d3IikpCi0gICAgICAgICAgICByZXN1bHQucmVtb3ZlKHJlc3VsdC5zaXplKCkgLSAxKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcm9jZXNzRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgLy8gSkFYQiBzYXlzOiBzdHJpcCAyIG9yIDMgbGV0dGVyIGV4dGVuc2lvbiBvciAiLmh0bWwiCi0KLSAgICAgICAgaW50IGkgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAoaSA+IDAgJiYgKAotICAgICAgICAgICAgICAgIGkgKyAxICsgMiA9PSBmaWxlbmFtZS5sZW5ndGgoKSB8fAotICAgICAgICAgICAgICAgIGkgKyAxICsgMyA9PSBmaWxlbmFtZS5sZW5ndGgoKSB8fAotICAgICAgICAgICAgICAgIGZpbGVuYW1lLnN1YnN0cmluZyhpICsgMSkudG9Mb3dlckNhc2UoKSA9PSAiaHRtbCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IG5vIG5hbWVzcGFjZSAtPiBwYWNrYWdlICJub05hbWVzcGFjZSIKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICJub05hbWVzcGFjZSI7Ci0KLSAgICAgICAgLy8gYXBwbHkgZHJhZnQgSkFYQiBydWxlcwotICAgICAgICBpbnQgbGVuID0gdXJpLmxlbmd0aCgpOwotICAgICAgICBpbnQgaSA9IGZpbmRTY2hlbWVDb2xvbih1cmkpOwotICAgICAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCBpID49IDAgJiYgdXJpLnN1YnN0cmluZygwLCBpKS5lcXVhbHMoImphdmEiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9ICBBcnJheXMuYXNMaXN0KHVyaS5zdWJzdHJpbmcoaSArIDEpLnNwbGl0KCJcXC4iKSk7Ci0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBvdXRlcjogZm9yIChpID0gaSArIDE7IGkgPCBsZW47ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodXJpLmNoYXJBdChpKSA9PSAnLycpCi0gICAgICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gbGVuKSBicmVhayBvdXRlcjsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBpOwotICAgICAgICAgICAgICAgIHdoaWxlICh1cmkuY2hhckF0KGkpICE9ICcvJykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW4pIGJyZWFrOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodXJpLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA+IDEpCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldChyZXN1bHQuc2l6ZSgpIC0gMSwgcHJvY2Vzc0ZpbGVuYW1lKChTdHJpbmcpcmVzdWx0LmdldChyZXN1bHQuc2l6ZSgpIC0gMSkpKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3Qgc3BsaXRkbnMgPSBzcGxpdEROUygoU3RyaW5nKXJlc3VsdC5nZXQoMCkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUoMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCgwLCBzcGxpdGRucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG5vbkphdmFLZXl3b3JkKGxvd2VyQ2FtZWxDYXNlKChTdHJpbmcpaXQubmV4dCgpKSkpOwotICAgICAgICAgICAgYnVmLmFwcGVuZCgnLicpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYuc3Vic3RyaW5nKDAsIGJ1Zi5sZW5ndGgoKSAtIDEpOyAvLyBjaG9wIG9mZiBleHRyYSBkb3QKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVwcGVyQ2FzZVVuZGVyYmFyKGFyZ3NbaV0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdXBwZXItY2FzZS1hbmQtdW5kZXJiYXIgc3RyaW5nIHVzaW5nIHRoZSBKQVhCIHJ1bGVzLgotICAgICAqIEFsd2F5cyBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyIHRoYXQgaXMgYSB2YWxpZAotICAgICAqIGphdmEgaWRlbnRpZmllciBzdGFydC4gKElmIEpBWEIgcnVsZXMgZG9uJ3QgcHJvZHVjZQotICAgICAqIG9uZSwgdGhlbiAiWF8iIGlzIHByZXBlbmRlZC4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXBwZXJDYXNlVW5kZXJiYXIoU3RyaW5nIHhtbF9uYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgTGlzdCB3b3JkcyA9IHNwbGl0V29yZHMoeG1sX25hbWUpOwotCi0gICAgICAgIGZpbmFsIGludCBzeiA9IHdvcmRzLnNpemUoKSAtIDE7Ci0gICAgICAgIGlmIChzeiA+PSAwICYmICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KCgoU3RyaW5nKXdvcmRzLmdldCgwKSkuY2hhckF0KDApKSkKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlhfIik7Ci0KLSAgICAgICAgZm9yKGludCBpID0gMCA7IGkgPCBzeiA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgoU3RyaW5nKXdvcmRzLmdldChpKSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKFVTQ09SRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3ogPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgoU3RyaW5nKXdvcmRzLmdldChzeikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy91cGNhc2UgZW50aXJlIGJ1ZmZlcgotICAgICAgICBmaW5hbCBpbnQgbGVuID0gYnVmLmxlbmd0aCgpOwotICAgICAgICBmb3IoaW50IGogPSAwIDsgaiA8IGxlbiA7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjID0gYnVmLmNoYXJBdChqKTsKLSAgICAgICAgICAgIGJ1Zi5zZXRDaGFyQXQoaiwgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY2FtZWwtY2FzZWQgc3RyaW5nIHVzaW5nIHRoZSBKQVhCIHJ1bGVzLgotICAgICAqIEFsd2F5cyBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyIHRoYXQgaXMgYSB2YWxpZAotICAgICAqIGphdmEgaWRlbnRpZmllciBzdGFydC4gKElmIEpBWEIgcnVsZXMgZG9uJ3QgcHJvZHVjZQotICAgICAqIG9uZSwgdGhlbiAiWCIgaXMgcHJlcGVuZGVkLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cHBlckNhbWVsQ2FzZShTdHJpbmcgeG1sX25hbWUpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBMaXN0IHdvcmRzID0gc3BsaXRXb3Jkcyh4bWxfbmFtZSk7Ci0KLSAgICAgICAgaWYgKHdvcmRzLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCgoKFN0cmluZyl3b3Jkcy5nZXQoMCkpLmNoYXJBdCgwKSkpCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiWCIpOwotCi0gICAgICAgICAgICBJdGVyYXRvciBpdHIgPSB3b3Jkcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUoaXRyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKChTdHJpbmcpaXRyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjYW1lbC1jYXNlZCBzdHJpbmcgdXNpbmcgdGhlIEpBWEIgcnVsZXMsCi0gICAgICogd2hlcmUgdGhlIGZpcnN0IGNvbXBvbmVudCBpcyBsb3dlcmNhc2VkLiBOb3RlIHRoYXQKLSAgICAgKiBpZiB0aGUgZmlyc3QgY29tcG9uZW50IGlzIGFuIGFjcm9ueW0sIHRoZSB3aG9sZQotICAgICAqIHRoaWducyBnZXRzIGxvd2VyY2FzZWQuCi0gICAgICogQWx3YXlzIHN0YXJ0cyB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciB0aGF0IGlzIGEgdmFsaWQKLSAgICAgKiBqYXZhIGlkZW50aWZpZXIgc3RhcnQuIChJZiBKQVhCIHJ1bGVzIGRvbid0IHByb2R1Y2UKLSAgICAgKiBvbmUsIHRoZW4gIngiIGlzIHByZXBlbmRlZC4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG93ZXJDYW1lbENhc2UoU3RyaW5nIHhtbF9uYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgTGlzdCB3b3JkcyA9IHNwbGl0V29yZHMoeG1sX25hbWUpOwotCi0gICAgICAgIGlmICh3b3Jkcy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlyc3QgPSAoKFN0cmluZyl3b3Jkcy5nZXQoMCkpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBjaGFyIGYgPSBmaXJzdC5jaGFyQXQoMCk7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoZikpCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgieCIpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChmaXJzdCk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHdvcmRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBpdHIubmV4dCgpOyAvLyBza2lwIGFscmVhZHktbG93ZXJjYXNlZCB3b3JkCi0gICAgICAgICAgICB3aGlsZShpdHIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKFN0cmluZylpdHIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXBwZXJDYXNlRmlyc3RMZXR0ZXIoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzLmNoYXJBdCgwKSkpCi0gICAgICAgICAgICByZXR1cm4gczsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzKTsKLSAgICAgICAgYnVmLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYnVmLmNoYXJBdCgwKSkpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgICBzcGxpdCBhbiB4bWwgbmFtZSBpbnRvIHdvcmRzIHZpYSBKQVhCIGFwcHJvYWNoLCB1cGNhc2luZyBmaXJzdAotICAgICAgIGxldHRlciBvZiBlYWNoIHdvcmQgYXMgbmVlZGVkLCBpZiB1cGNhc2UgaXMgdHJ1ZQotCi0gICAgICAgbmNuYW1lIGlzIHhtbCBuY25hbWUgKGkuZS4gbm8gY29sb25zKS4KLSAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ2FwcGVkKExpc3QgbGlzdCwgU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIGlmIChzdHIubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgbGlzdC5hZGQodXBwZXJDYXNlRmlyc3RMZXR0ZXIoc3RyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHNwbGl0V29yZHMoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBsZW4gPSBuYW1lLmxlbmd0aCgpOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgcHJlZml4ID0gU1RBUlQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjdXJyZW50ID0gZ2V0Q2hhckNsYXNzKG5hbWUuY2hhckF0KGkpKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggIT0gUFVOQ1QgJiYgY3VycmVudCA9PSBQVU5DVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRDYXBwZWQobGlzdCwgbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQgPSBnZXRDaGFyQ2xhc3MobmFtZS5jaGFyQXQoaSkpKSA9PSBQVU5DVCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW4pIHJldHVybiBsaXN0OwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChwcmVmaXggPT0gRElHSVQpICE9IChjdXJyZW50ID09IERJR0lUKSB8fAotICAgICAgICAgICAgICAgICAgICAgKHByZWZpeCA9PSBMT1dFUiAmJiBjdXJyZW50ICE9IExPV0VSKSB8fAotICAgICAgICAgICAgICAgICAgICAgKGlzTGV0dGVyKHByZWZpeCkgIT0gaXNMZXR0ZXIoY3VycmVudCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENhcHBlZChsaXN0LCBuYW1lLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeCA9PSBVUFBFUiAmJiBjdXJyZW50ID09IExPV0VSICYmIGkgPiBzdGFydCArIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkQ2FwcGVkKGxpc3QsIG5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpIC0gMSkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmVmaXggPSBjdXJyZW50OwotICAgICAgICB9Ci0gICAgICAgIGFkZENhcHBlZChsaXN0LCBuYW1lLnN1YnN0cmluZyhzdGFydCkpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvL2NoYXIgY2xhc3NlcwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFSVCA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFBVTkNUID0gMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElHSVQgPSAyOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVJLID0gMzsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVVBQRVIgPSA0OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBMT1dFUj0gNTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTk9DQVNFPSA2OwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q2hhckNsYXNzKGNoYXIgYykKLSAgICB7Ci0gICAgICAgIC8vb3JkZXJpbmcgaXMgaW1wb3J0YW50IGhlcmUuCi0gICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKGMpKQotICAgICAgICAgICAgcmV0dXJuIFBVTkNUOwotICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjKSkKLSAgICAgICAgICAgIHJldHVybiBESUdJVDsKLSAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKQotICAgICAgICAgICAgcmV0dXJuIFVQUEVSOwotICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpCi0gICAgICAgICAgICByZXR1cm4gTE9XRVI7Ci0gICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSkKLSAgICAgICAgICAgIHJldHVybiBOT0NBU0U7Ci0gICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLSAgICAgICAgICAgIHJldHVybiBNQVJLOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gUFVOQ1Q7IC8vIG5vdCBjb3ZlcmVkIGJ5IEpBWEI6IHRyZWF0IGl0IGFzIHB1bmN0dWF0aW9uCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xldHRlcihpbnQgc3RhdGUpCi0gICAgewotICAgICAgICByZXR1cm4gKHN0YXRlPT1VUFBFUgotICAgICAgICAgICAgICB8fCBzdGF0ZT09TE9XRVIKLSAgICAgICAgICAgICAgfHwgc3RhdGU9PU5PQ0FTRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVuY3R1YXRpb24oY2hhciBjKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChjID09IEhZUEhFTgotICAgICAgICAgICAgICB8fCBjID09IFBFUklPRAotICAgICAgICAgICAgICB8fCBjID09IENPTE9OCi0gICAgICAgICAgICAgIHx8IGMgPT0gVVNDT1JFCi0gICAgICAgICAgICAgIHx8IGMgPT0gRE9UCi0gICAgICAgICAgICAgIHx8IGMgPT0gVEVMRUlBCi0gICAgICAgICAgICAgIHx8IGMgPT0gQVlBSAotICAgICAgICAgICAgICB8fCBjID09IEVMSElaQik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZW5kZWQgdG8gYmUgYXBwbGllZCB0byBhIGxvd2VyY2FzZS1zdGFydGluZyBpZGVudGlmaWVyIHRoYXQKLSAgICAgKiBtYXkgY29sbGlkZSB3aXRoIGEgSmF2YSBrZXl3b3JkLiAgSWYgaXQgZG9lcyBjb2xsaWRlLCB0aGlzCi0gICAgICogcHJlcGVuZHMgdGhlIGxldHRlciAieCIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9uSmF2YUtleXdvcmQoU3RyaW5nIHdvcmQpCi0gICAgewotICAgICAgICBpZiAoaXNKYXZhUmVzZXJ2ZWRXb3JkKHdvcmQpKQotICAgICAgICAgICAgcmV0dXJuICd4JyArIHdvcmQ7Ci0gICAgICAgIHJldHVybiB3b3JkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVuZGVkIHRvIGJlIGFwcGxpZWQgdG8gYW4gdXBwZXJjYXNlLXN0YXJ0aW5nIGlkZW50aWZpZXIgdGhhdAotICAgICAqIG1heSBjb2xsaWRlIHdpdGggYSBqYXZhLmxhbmcuKiBjbGFzc25hbWUuICBJZiBpdCBkb2VzIGNvbGxpZGUsIHRoaXMKLSAgICAgKiBwcmVwZW5kcyB0aGUgbGV0dGVyICJYIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub25KYXZhQ29tbW9uQ2xhc3NOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGlzSmF2YUNvbW1vbkNsYXNzTmFtZShuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiAiWCIgKyBuYW1lOwotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc2VydmVkV29yZChTdHJpbmcgd29yZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc0phdmFSZXNlcnZlZFdvcmQod29yZCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phdmFSZXNlcnZlZFdvcmQoU3RyaW5nIHdvcmQsIGJvb2xlYW4gaWdub3JlX2Nhc2UpCi0gICAgewotICAgICAgICBpZiAoaWdub3JlX2Nhc2UpCi0gICAgICAgICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gamF2YVdvcmRzLmNvbnRhaW5zKHdvcmQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFDb21tb25DbGFzc05hbWUoU3RyaW5nIHdvcmQpCi0gICAgewotICAgICAgICByZXR1cm4gamF2YU5hbWVzLmNvbnRhaW5zKHdvcmQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QYXJzZVV0aWwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QYXJzZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0MjlhOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUGFyc2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLS8qKgotICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQotICogRGF0ZTogTm92IDI1LCAyMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltSW5pdGlhbFBsdXMoU3RyaW5nIHhtbCkKLSAgICB7Ci0gICAgICAgIGlmICh4bWwhPW51bGwgJiYgeG1sLmNoYXJBdCgwKSA9PSAnKycpIHsKLSAgICAgICAgICAgIHJldHVybiB4bWwuc3Vic3RyaW5nKDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHhtbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QcmVmaXhSZXNvbHZlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ByZWZpeFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOGZkYTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ByZWZpeFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZml4UmVzb2x2ZXIKLXsKLSAgICAvKioKLSAgICAgKiBDYWxlZCB3aGVuIHRoZSB1c2VyIGhhcyBhIHByZWZpeCBhbmQgbmVlZHMgdG8gbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIG5hbWVzcGFjZSBVUkkuIElmIHRoZSBwcmVmaXggaXMgbm90IGRlZmluZWQgaW4gdGhpcyBjb250ZXh0LCB0aGVuIHRoaXMKLSAgICAgKiBtZXRob2QgbWF5IHJldHVybiBudWxsLiAgVGhlIG5vLW5hbWVzcGFjZSBpcyByZXByZXNlbnRlZCBieSB0aGUgZW1wdHkKLSAgICAgKiBzdHJpbmcgcmV0dXJuIHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgcHJlZml4IGlzIG51bGwgb3IgIiIsIHRoZW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIGJlaW5nCi0gICAgICogcmVxdWVzdGVkLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUHVzaGVkSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWE5NmEzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHVzaGVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbQotewotICAgIHByaXZhdGUgc3RhdGljIGludCBkZWZhdWx0QnVmZmVyU2l6ZSA9IDIwNDg7Ci0gICAgcHJvdGVjdGVkIGJ5dGUgYnVmW107Ci0gICAgcHJvdGVjdGVkIGludCB3cml0ZXBvczsKLSAgICBwcm90ZWN0ZWQgaW50IHJlYWRwb3M7Ci0gICAgcHJvdGVjdGVkIGludCBtYXJrcG9zID0gLTE7Ci0gICAgcHJvdGVjdGVkIGludCBtYXJrbGltaXQ7Ci0gICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgSW50ZXJuYWxPdXRwdXRTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIG1vcmUgYnl0ZXMgbmVlZCB0byBiZSB3cml0dGVuIGludG8gdGhpcyBzdHJlYW0KLSAgICAgKiAoYXMgYW4gT3V0cHV0U3RyZWFtKS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG11c3Qgd3JpdGUgYXQgbGVhc3Qgb25lIGJ5dGUgaWYgdGhlIHN0cmVhbSBpcwotICAgICAqIG5vdCBlbmRlZCwgYW5kIGl0IG11c3Qgbm90IHdyaXRlIGFueSBieXRlcyBpZiB0aGUgc3RyZWFtIGhhcwotICAgICAqIGFscmVhZHkgZW5kZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZmlsbChpbnQgcmVxdWVzdGVkQnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmtlZCBvdXRwdXQgc3RyZWFtLgotICAgICAqCi0gICAgICogVGhpcyBpcyB0aGUgb3V0cHV0IHN0cmVhbSB0aGF0IG11c3QgYmUgd3JpdHRlbiB0byB3aGVuZXZlcgotICAgICAqIHRoZSBmaWxsIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHVzaGVkSW5wdXRTdHJlYW0oKQotICAgIHsKLSAgICAgICAgdGhpcyhkZWZhdWx0QnVmZmVyU2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFB1c2hlZElucHV0U3RyZWFtKGludCBzaXplKQotICAgIHsKLSAgICAgICAgaWYgKHNpemUgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWdhdGl2ZSBpbml0aWFsIGJ1ZmZlciBzaXplIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgcm9vbSBmb3IgY2IgbW9yZSBieXRlcyBvZiBkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNoaWZ0KGludCBjYikKLSAgICB7Ci0gICAgICAgIGludCBzYXZlcG9zID0gcmVhZHBvczsKLSAgICAgICAgaWYgKG1hcmtwb3MgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZHBvcyAtIG1hcmtwb3MgPiBtYXJrbGltaXQpCi0gICAgICAgICAgICAgICAgbWFya3BvcyA9IC0xOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNhdmVwb3MgPSBtYXJrcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemUgPSB3cml0ZXBvcyAtIHNhdmVwb3M7Ci0KLSAgICAgICAgaWYgKHNhdmVwb3MgPiAwICYmIGJ1Zi5sZW5ndGggLSBzaXplID49IGNiICYmIHNpemUgPD0gY2IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBzYXZlcG9zLCBidWYsIDAsIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG5ld2NvdW50ID0gc2l6ZSArIGNiOwotICAgICAgICAgICAgYnl0ZSBuZXdidWZbXSA9IG5ldyBieXRlW01hdGgubWF4KGJ1Zi5sZW5ndGggPDwgMSwgbmV3Y291bnQpXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBzYXZlcG9zLCBuZXdidWYsIDAsIHNpemUpOwotICAgICAgICAgICAgYnVmID0gbmV3YnVmOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNhdmVwb3MgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkcG9zIC09IHNhdmVwb3M7Ci0gICAgICAgICAgICBpZiAobWFya3BvcyA+IDApCi0gICAgICAgICAgICAgICAgbWFya3BvcyAtPSBzYXZlcG9zOwotICAgICAgICAgICAgd3JpdGVwb3MgLT0gc2F2ZXBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChyZWFkcG9zID49IHdyaXRlcG9zKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxsKDEpOwotICAgICAgICAgICAgaWYgKHJlYWRwb3MgPj0gd3JpdGVwb3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZbcmVhZHBvcysrXSAmIDB4ZmY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LCByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcKLSAgICAgKiBzdHJlYW0gYXQgbW9zdCBvbmNlIGlmIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBhdmFpbCA9IHdyaXRlcG9zIC0gcmVhZHBvczsKLSAgICAgICAgaWYgKGF2YWlsIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxsKGxlbiAtIGF2YWlsKTsKLSAgICAgICAgICAgIGF2YWlsID0gd3JpdGVwb3MgLSByZWFkcG9zOwotICAgICAgICAgICAgaWYgKGF2YWlsIDw9IDApIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpbnQgY250ID0gKGF2YWlsIDwgbGVuKSA/IGF2YWlsIDogbGVuOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgcmVhZHBvcywgYiwgb2ZmLCBjbnQpOwotICAgICAgICByZWFkcG9zICs9IGNudDsKLSAgICAgICAgcmV0dXJuIGNudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKG4gPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGxvbmcgYXZhaWwgPSB3cml0ZXBvcyAtIHJlYWRwb3M7Ci0KLSAgICAgICAgaWYgKGF2YWlsIDwgbikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmlsbCBpbiBidWZmZXIgdG8gc2F2ZSBieXRlcyBmb3IgcmVzZXQKLSAgICAgICAgICAgIGxvbmcgcmVxID0gbiAtIGF2YWlsOwotICAgICAgICAgICAgaWYgKHJlcSA+IEludGVnZXIuTUFYX1ZBTFVFKQotICAgICAgICAgICAgICAgIHJlcSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgZmlsbCgoaW50KXJlcSk7Ci0gICAgICAgICAgICBhdmFpbCA9IHdyaXRlcG9zIC0gcmVhZHBvczsKLSAgICAgICAgICAgIGlmIChhdmFpbCA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBza2lwcGVkID0gKGF2YWlsIDwgbikgPyBhdmFpbCA6IG47Ci0gICAgICAgIHJlYWRwb3MgKz0gc2tpcHBlZDsKLSAgICAgICAgcmV0dXJuIHNraXBwZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYXZhaWxhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cml0ZXBvcyAtIHJlYWRwb3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkKLSAgICB7Ci0gICAgICAgIG1hcmtsaW1pdCA9IHJlYWRsaW1pdDsKLSAgICAgICAgbWFya3BvcyA9IHJlYWRwb3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobWFya3BvcyA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlc2V0dGluZyB0byBpbnZhbGlkIG1hcmsiKTsKLSAgICAgICAgcmVhZHBvcyA9IG1hcmtwb3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEludGVybmFsT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtCi0gICAgewotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod3JpdGVwb3MgKyAxID4gYnVmLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaGlmdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zlt3cml0ZXBvc10gPSAoYnl0ZSliOwotICAgICAgICAgICAgd3JpdGVwb3MgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAotICAgICAgICAgICAgICAgICgob2ZmICsgbGVuKSA+IGIubGVuZ3RoKSB8fCAoKG9mZiArIGxlbikgPCAwKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAod3JpdGVwb3MgKyBsZW4gPiBidWYubGVuZ3RoKQotICAgICAgICAgICAgICAgIHNoaWZ0KGxlbik7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWYsIHdyaXRlcG9zLCBsZW4pOwotICAgICAgICAgICAgd3JpdGVwb3MgKz0gbGVuOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1FOYW1lSGVscGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkODdiMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcwotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLQotcHVibGljIGNsYXNzIFFOYW1lSGVscGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFdFTExfS05PV05fUFJFRklYRVMgPSBidWlsZFdLUCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGdldFhNTE5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICBpZiAocW5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBYTUxOYW1lSGVscGVyLmZvckxOUyggcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBmb3JMTlMoU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSwgbG9jYWxuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGZvckxOKFN0cmluZyBsb2NhbG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCIiLCBsb2NhbG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZm9yUHJldHR5KFN0cmluZyBwcmV0dHksIGludCBvZmZzZXQpCi0gICAgewotICAgICAgICBpbnQgYXQgPSBwcmV0dHkuaW5kZXhPZignQCcsIG9mZnNldCk7Ci0gICAgICAgIGlmIChhdCA8IDApCi0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCIiLCBwcmV0dHkuc3Vic3RyaW5nKG9mZnNldCkpOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHByZXR0eS5zdWJzdHJpbmcoYXQgKyAxKSwgcHJldHR5LnN1YnN0cmluZyhvZmZzZXQsIGF0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldHR5KFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLQotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpICsgIkAiICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4ZGlnaXRzID0gbmV3IGNoYXJbXQotICAgICAgICB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYWZlKGludCBjKQotICAgIHsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRoaXMgcHJvZHVjZXMgYSBzdHJpbmcgd2hpY2ggaXMgYSBzYWZlIGZpbGVuYW1lIGZyb20gdGhlIGdpdmVuIHN0cmluZyBzLgotICAgIC8vIFRvIG1ha2UgaXQgYSBzYWZlIGZpbGVuYW1lLCB0aGUgZm9sbG93aW5nIHR3byB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQ6Ci0gICAgLy8KLSAgICAvLyAxLiBGaXJzdCBhbGwgbm9uLWFzY2lpLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nCi0gICAgLy8gICAgdGhlaXIgVVRGOCBieXRlIHNlcXVlbmNlLCBpbiB0aGUgZm9ybSBfeHhfeHhfeHgsIGZvciBleGFtcGxlLAotICAgIC8vICAgICJIZWxsb18yMFRoZXJlIiBmb3IgIkhlbGxvIFRoZXJlIi4gIChPYnZpb3VzbHksIGEgc2luZ2xlIHVuaWNvZGUKLSAgICAvLyAgICBjaGFyYWN0ZXIgbWF5IGV4cGFuZCBpbnRvIGFzIG1hbnkgYXMgdGhyZWUgZXNjYXBlIHBhdHRlcm5zLikKLSAgICAvLyAgICBJZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyA2NCBjaGFyYWN0ZXJzIG9yIGZld2VyLCB0aGF0J3MgdGhlIHJlc3VsdC4KLSAgICAvLwotICAgIC8vIDIuIElmIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnMsIHRoZW4gaXQgaXMKLSAgICAvLyAgICBkaXNjYXJkZWQuICBJbnN0ZWFkLCB0aGUgU0hBMSBhbGdvcml0aG0gaXMgcnVuIG9uIHRoZSBvcmlnaW5hbAotICAgIC8vICAgIHN0cmluZydzIFVURjggcmVwcmVzZW50YXRpb24sIGFuZCB0aGVuIHRoZSByZXN1bHRpbmcgMjAtYnl0ZSBtZXNzYWdlCi0gICAgLy8gICAgZGlnZXN0IGlzIHR1cm5lZCBpbnRvIGEgNDAtY2hhcmFjdGVyIGhleCBzdHJpbmc7IHRoZW4gIlVSSV9TSEFfMV8iIGlzCi0gICAgLy8gICAgcHJlcGVuZGVkLgotICAgIC8vCi0gICAgLy8gVGhlIHJlYXNvbiBmb3IgdGhlICJzaG9ydGVuaW5nIiBpcyB0byBhdm9pZCBmaWxlbmFtZXMgbG9uZ2VyIHRoYW4gYWJvdXQKLSAgICAvLyAyNTYgY2hhcmFjdGVycywgd2hpY2ggYXJlIHByb2hpYml0ZWQgb24gV2luZG93cyBOVC4KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9OQU1FX0xFTkdUSCA9IDY0OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaGV4c2FmZShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoaXNTYWZlKGNoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gdXRmOCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1dGY4ID0gcy5zdWJzdHJpbmcoaSwgaSArIDEpLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHV0ZjgubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ18nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzWyh1dGY4W2pdID4+IDQpICYgMHhGXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1t1dGY4W2pdICYgMHhGXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gVVRGLTggaSBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIl9CQURfVVRGOF9DSEFSIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2hvcnQgZW5vdWdoPyBEb25lIQotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpIDw9IE1BWF9OQU1FX0xFTkdUSCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQotICAgICAgICAvLyB0b28gbG9uZz8gdXNlIFNIQTEKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEiKTsKLSAgICAgICAgICAgIGJ5dGVbXSBpbnB1dEJ5dGVzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0Qnl0ZXMgPSBzLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGlzIGFsd2F5cyBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICBpbnB1dEJ5dGVzID0gbmV3IGJ5dGVbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gZGlnZXN0ID0gbWQuZGlnZXN0KGlucHV0Qnl0ZXMpOwotICAgICAgICAgICAgYXNzZXJ0KGRpZ2VzdC5sZW5ndGggPT0gMjApOyAvLyBTSEExIDE2MCBiaXRzID09IDIwIGJ5dGVzCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJVUklfU0hBXzFfIik7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpZ2VzdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1soZGlnZXN0W2pdID4+IDQpICYgMHhGXSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbZGlnZXN0W2pdICYgMHhGXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVc2luZyBpbiBhIEpESyB3aXRob3V0IGFuIFNIQSBpbXBsZW1lbnRhdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaGV4c2FmZWRpcihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIl9ub25zLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICByZXR1cm4gaGV4c2FmZShuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSArICIvIiArIGhleHNhZmUobmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkV0tQKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCAieG1sIik7Ci0gICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInhzIik7Ci0gICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIsICJ3c2RsIik7Ci0gICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgInNvYXBlbmMiKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAic29hcGVudiIpOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGFibGUoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkYWJsZShzVHlwZSwgV0VMTF9LTk9XTl9QUkVGSVhFUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGFibGUoU2NoZW1hVHlwZSBzVHlwZSwgTWFwIG5zUHJlZml4KQotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZGFibGUoc1R5cGUuZ2V0TmFtZSgpLCBuc1ByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiYXR0cmlidXRlIHR5cGUgIiArIHJlYWRhYmxlKHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCksIG5zUHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImRvY3VtZW50IHR5cGUgIiArIHJlYWRhYmxlKHNUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSwgbnNQcmVmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzTm9UeXBlKCkgfHwgc1R5cGUuZ2V0T3V0ZXJUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkIHR5cGUiOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBvdXRlclR5cGUgPSBzVHlwZS5nZXRPdXRlclR5cGUoKTsKLSAgICAgICAgU2NoZW1hRmllbGQgY29udGFpbmVyID0gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKTsKLQotICAgICAgICBpZiAob3V0ZXJUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gInR5cGUgb2YgYXR0cmlidXRlICIgKyByZWFkYWJsZShjb250YWluZXIuZ2V0TmFtZSgpLCBuc1ByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob3V0ZXJUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAidHlwZSBvZiBlbGVtZW50ICIgKyByZWFkYWJsZShjb250YWluZXIuZ2V0TmFtZSgpLCBuc1ByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb250YWluZXIuaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gInR5cGUgb2YgIiArIGNvbnRhaW5lci5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiIGF0dHJpYnV0ZSBpbiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0eXBlIG9mICIgKyBjb250YWluZXIuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgIiBlbGVtZW50IGluICIgKyByZWFkYWJsZShvdXRlclR5cGUsIG5zUHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRlclR5cGUuZ2V0QmFzZVR5cGUoKSA9PSBzVHlwZSkKLSAgICAgICAgICAgIHJldHVybiAiYmFzZSB0eXBlIG9mICIgKyByZWFkYWJsZShvdXRlclR5cGUsIG5zUHJlZml4KTsKLSAgICAgICAgZWxzZSBpZiAob3V0ZXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICByZXR1cm4gIml0ZW0gdHlwZSBvZiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7Ci0gICAgICAgIGVsc2UgaWYgKG91dGVyVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKLSAgICAgICAgICAgIHJldHVybiAibWVtYmVyIHR5cGUgIiArIHNUeXBlLmdldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCgpICsgIiBvZiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAiaW5uZXIgdHlwZSBpbiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGFibGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkYWJsZShuYW1lLCBXRUxMX0tOT1dOX1BSRUZJWEVTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkYWJsZShRTmFtZSBuYW1lLCBNYXAgcHJlZml4ZXMpCi0gICAgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKXByZWZpeGVzLmdldChuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpICsgIiBpbiBuYW1lc3BhY2UgIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3VnZ2VzdFByZWZpeChTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpV0VMTF9LTk9XTl9QUkVGSVhFUy5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICBpbnQgbGVuID0gbmFtZXNwYWNlLmxlbmd0aCgpOwotICAgICAgICBpbnQgaSA9IG5hbWVzcGFjZS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICBpZiAoaSA+IDAgJiYgaSA9PSBuYW1lc3BhY2UubGVuZ3RoKCkgLSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW4gPSBpOwotICAgICAgICAgICAgaSA9IG5hbWVzcGFjZS5sYXN0SW5kZXhPZignLycsIGkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGkgKz0gMTsgLy8gc2tpcCAnLycsIGFsc28gY292ZXJzIC0xIGNhc2UuCi0KLSAgICAgICAgaWYgKG5hbWVzcGFjZS5zdGFydHNXaXRoKCJ3d3cuIiwgaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgKz0gNDsgLy8gInd3dy4iLmxlbmd0aCgpCi0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoaSA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNOQ05hbWVTdGFydChuYW1lc3BhY2UuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGVuZCA9IGkgKyAxOyBlbmQgPCBsZW47IGVuZCArPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNOQ05hbWUobmFtZXNwYWNlLmNoYXJBdChlbmQpKSB8fCAhQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChuYW1lc3BhY2UuY2hhckF0KGVuZCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbiA9IGVuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZWZpeGVzIHN0YXJ0aW5nIHdpdGggInhtbCIgYXJlIGZvcmJpZGRlbiwgc28gY2hhbmdlICJ4bWxzIiAtPiAieHMiCi0gICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPj0gaSArIDMgJiYgc3RhcnRzV2l0aFhtbChuYW1lc3BhY2UsIGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID49IGkgKyA0KQotICAgICAgICAgICAgICAgIHJldHVybiAieCIgKyBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobmFtZXNwYWNlLmNoYXJBdChpICsgMykpOwotICAgICAgICAgICAgcmV0dXJuICJucyI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGVuIC0gaSA+IDQpIC8vIGZvdXIgb3IgbGVzcz8gbGVhdmUgaXQuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc1Zvd2VsKG5hbWVzcGFjZS5jaGFyQXQoaSArIDIpKSAmJiAhaXNWb3dlbChuYW1lc3BhY2UuY2hhckF0KGkgKyAzKSkpCi0gICAgICAgICAgICAgICAgbGVuID0gaSArIDQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGVuID0gaSArIDM7IC8vIG1vcmUgdGhhbiBmb3VyPyB0cnVuY2F0ZSB0byAzLgotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG47Ci0KLSAgICAgICAgaWYgKGxlbiAtIGkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAibnMiOwotCi0gICAgICAgIHJldHVybiBuYW1lc3BhY2Uuc3Vic3RyaW5nKGksIGxlbikudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGhYbWwoU3RyaW5nIHMsIGludCBpKQotICAgIHsKLSAgICAgICAgaWYgKHMubGVuZ3RoKCkgPCBpICsgMykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAocy5jaGFyQXQoaSkgIT0gJ1gnICYmIHMuY2hhckF0KGkpICE9ICd4JykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKHMuY2hhckF0KGkgKyAxKSAhPSAnTScgJiYgcy5jaGFyQXQoaSArIDEpICE9ICdtJykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKHMuY2hhckF0KGkgKyAyKSAhPSAnTCcgJiYgcy5jaGFyQXQoaSArIDIpICE9ICdsJykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVm93ZWwoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgIGNhc2UgJ0UnOgotICAgICAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICBjYXNlICdPJzoKLSAgICAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lc3BhY2UoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIHdoaWxlIChzVHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1R5cGUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNUeXBlLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpICE9IG51bGwgJiYgc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIHNUeXBlID0gc1R5cGUuZ2V0T3V0ZXJUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9SZWFkZXJJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1JlYWRlcklucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzgyZjUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1JlYWRlcklucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWFkZXJJbnB1dFN0cmVhbSBleHRlbmRzIFB1c2hlZElucHV0U3RyZWFtCi17Ci0gICAgcHJpdmF0ZSBSZWFkZXIgcmVhZGVyOwotICAgIHByaXZhdGUgV3JpdGVyIHdyaXRlcjsKLSAgICBwcml2YXRlIGNoYXJbXSBidWY7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgZGVmYXVsdEJ1ZmZlclNpemUgPSAyMDQ4OwotCi0gICAgcHVibGljIFJlYWRlcklucHV0U3RyZWFtKFJlYWRlciByZWFkZXIsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRoaXMocmVhZGVyLCBlbmNvZGluZywgZGVmYXVsdEJ1ZmZlclNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWFkZXJJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZW5jb2RpbmcsIGludCBidWZmZXJTaXplKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ1ZmZlciBzaXplIDw9IDAiKTsKLQotICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKLSAgICAgICAgdGhpcy53cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGdldE91dHB1dFN0cmVhbSgpLCBlbmNvZGluZyk7Ci0gICAgICAgIGJ1ZiA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGwoaW50IHJlcXVlc3RlZEJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaGFycyA9IHJlYWRlci5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICBpZiAoY2hhcnMgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZiwgMCwgY2hhcnMpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGF2YWlsYWJsZSgpIDw9IDApOyAvLyBsb29wIGZvciBzYWZldHksIGluIGNhc2UgZW5jb2RpbmcgZGlkbid0IHByb2R1Y2UgYW55IGJ5dGVzIHlldAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmY2Y4ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotCi1wdWJsaWMgY2xhc3MgU25pZmZlZFhtbElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbQotewotICAgIC8vIFdlIGRvbid0IHNuaWZmIG1vcmUgdGhhbiAxOTIgYnl0ZXMuCi0gICAgcHVibGljIHN0YXRpYyBpbnQgTUFYX1NOSUZGRURfQllURVMgPSAxOTI7Ci0KLSAgICBwdWJsaWMgU25pZmZlZFhtbElucHV0U3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlcihzdHJlYW0pOwotCi0gICAgICAgIC8vIHJlYWQgYnl0ZSBvcmRlciBtYXJrcyBhbmQgZGV0ZWN0IEVCQ0RJQyBldGMKLSAgICAgICAgX2VuY29kaW5nID0gc25pZmZGb3VyQnl0ZXMoKTsKLQotICAgICAgICBpZiAoX2VuY29kaW5nICE9IG51bGwgJiYgX2VuY29kaW5nLmVxdWFscygiSUJNMDM3IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpcnN0IGZvdXIgYnl0ZXMgc3VnZ2VzdCBFQkNESUMgd2l0aCA8P3htIGF0IHN0YXJ0Ci0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzbmlmZkZvclhtbERlY2woX2VuY29kaW5nKTsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIF9lbmNvZGluZyA9IGVuY29kaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9lbmNvZGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYXZlbid0IHlldCBkZXRlcm1pbmVkIGVuY29kaW5nOiBzbmlmZiBmb3IgPD94bWwgZW5jb2Rpbmc9Ii4uLiI/PgotICAgICAgICAgICAgLy8gYXNzdW1pbmcgd2UgY2FuIHJlYWQgaXQgYXMgVVRGLTguCi0gICAgICAgICAgICBfZW5jb2RpbmcgPSBzbmlmZkZvclhtbERlY2woIlVURi04Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2VuY29kaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBYTUwgc3BlYyBzYXlzIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICAgICAgICAgIC8vICgxKSAiSW4gdGhlIGFic2VuY2Ugb2YgZXh0ZXJuYWwgY2hhcmFjdGVyIGVuY29kaW5nIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAvLyAoc3VjaCBhcyBNSU1FIGhlYWRlcnMpLCBwYXJzZWQgZW50aXRpZXMgd2hpY2ggYXJlIHN0b3JlZCBpbiBhbgotICAgICAgICAgICAgLy8gZW5jb2Rpbmcgb3RoZXIgdGhhbiBVVEYtOCBvciBVVEYtMTYgbXVzdCBiZWdpbiB3aXRoIGEgdGV4dAotICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gKHNlZSA0LjMuMSBUaGUgVGV4dCBEZWNsYXJhdGlvbikgY29udGFpbmluZyBhbgotICAgICAgICAgICAgLy8gZW5jb2RpbmcgZGVjbGFyYXRpb246IgotCi0gICAgICAgICAgICAvLyAoMikgIkluIHRoZSBhYnNlbmNlIG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IGFuIGV4dGVybmFsCi0gICAgICAgICAgICAvLyB0cmFuc3BvcnQgcHJvdG9jb2wgKGUuZy4gSFRUUCBvciBNSU1FKSwgaXQgaXMgYW4gZXJyb3IKLSAgICAgICAgICAgIC8vIGZvciBhbiBlbnRpdHkgaW5jbHVkaW5nIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uIHRvIGJlCi0gICAgICAgICAgICAvLyBwcmVzZW50ZWQgdG8gdGhlIFhNTCBwcm9jZXNzb3IgaW4gYW4gZW5jb2Rpbmcgb3RoZXIgdGhhbgotICAgICAgICAgICAgLy8gdGhhdCBuYW1lZCBpbiB0aGUgZGVjbGFyYXRpb24sIG9yIGZvciBhbiBlbnRpdHkgd2hpY2ggYmVnaW5zCi0gICAgICAgICAgICAvLyB3aXRoIG5laXRoZXIgYSBCeXRlIE9yZGVyIE1hcmsgbm9yIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAvLyB0byB1c2UgYW4gZW5jb2Rpbmcgb3RoZXIgdGhhbiBVVEYtOC4iCi0KLSAgICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIHVzaW5nIGEgc25pZmZlZCBzdHJlYW0sIHdlIGRvIG5vdCBoYXZlIGV4dGVybmFsCi0gICAgICAgICAgICAvLyBjaGFyYWN0ZXIgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0KLSAgICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIGhlcmUsIHdlIGFsc28gZG9uJ3QgaGF2ZSBhIHJlY29nbml6ZWQgYnl0ZSBvcmRlcgotICAgICAgICAgICAgLy8gbWFyayBvciBhbiBleHBsaWNpdCBlbmNvZGluZyBkZWNsYXJhdGlvbiB0aGF0IGNhbiBiZSByZWFkIGluCi0gICAgICAgICAgICAvLyBlaXRoZXIgQVNDSUkgb3IgRUJESUMgc3R5bGUuCi0KLSAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbXVzdCB1c2UgVVRGLTguCi0KLSAgICAgICAgICAgIF9lbmNvZGluZyA9ICJVVEYtOCI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZWFkQXNNdWNoQXNQb3NzaWJsZShieXRlW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgdG90YWwgPSAwOwotICAgICAgICB3aGlsZSAodG90YWwgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWQoYnVmLCBzdGFydEF0ICsgdG90YWwsIGxlbiAtIHRvdGFsKTsKLSAgICAgICAgICAgIGlmIChjb3VudCA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB0b3RhbCArPSBjb3VudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc25pZmZGb3VyQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1hcmsoNCk7Ci0gICAgICAgIGludCBza2lwID0gMDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0XTsKLSAgICAgICAgICAgIGlmIChyZWFkQXNNdWNoQXNQb3NzaWJsZShidWYsIDAsIDQpIDwgNCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGxvbmcgcmVzdWx0ID0gMHhGRjAwMDAwMCAmIChidWZbMF0gPDwgMjQpIHwgMHgwMEZGMDAwMCAmIChidWZbMV0gPDwgMTYpIHwgMHgwMDAwRkYwMCAmIChidWZbMl0gPDwgOCkgfCAweDAwMDAwMEZGICYgYnVmWzNdOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ID09IDB4MDAwMEZFRkYpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVQ1MtNCI7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHhGRkZFMDAwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVDUy00IjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDAwMDAwMDNDKQotICAgICAgICAgICAgICAgIHJldHVybiAiVUNTLTRCRSI7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHgzQzAwMDAwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVDUy00TEUiOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDB4MDAzQzAwM0YpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtMTZCRSI7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHgzQzAwM0YwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNkxFIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDNDM0Y3ODZEKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBsb29rcyBsaWtlIFVTLUFTQ0lJIHdpdGggPD94bWw6IHNuaWZmCi0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHg0QzZGQTc5NCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIklCTTAzNyI7IC8vIFNuaWZmIGZvciBlYmRpYyBjb2RlcGFnZQotICAgICAgICAgICAgZWxzZSBpZiAoKHJlc3VsdCAmIDB4RkZGRjAwMDApID09IDB4RkVGRjAwMDApCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtMTYiOwotICAgICAgICAgICAgZWxzZSBpZiAoKHJlc3VsdCAmIDB4RkZGRjAwMDApID09IDB4RkZGRTAwMDApCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtMTYiOwotICAgICAgICAgICAgZWxzZSBpZiAoKHJlc3VsdCAmIDB4RkZGRkZGMDApID09IDB4RUZCQkJGMDApCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBlbHNlIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZSwgc28gd2UnbGwgcHJpbWUgaXQKLSAgICAvLyB3aXRoIHRoZSBjb21tb24gY2hhcnNldHMuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MSA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MiA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTMgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkJFIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTQgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkxFIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTUgPSBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NiA9IENoYXJzZXQuZm9yTmFtZSgiVVMtQVNDSUkiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NyA9IENoYXJzZXQuZm9yTmFtZSgiQ3AxMjUyIik7Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNuaWZmRm9yWG1sRGVjbChTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFyayhNQVhfU05JRkZFRF9CWVRFUyk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZWJ1ZiA9IG5ldyBieXRlW01BWF9TTklGRkVEX0JZVEVTXTsKLSAgICAgICAgICAgIGludCBieXRlbGltaXQgPSByZWFkQXNNdWNoQXNQb3NzaWJsZShieXRlYnVmLCAwLCBNQVhfU05JRkZFRF9CWVRFUyk7Ci0KLSAgICAgICAgICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZS4KLSAgICAgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlYnVmLCAwLCBieXRlbGltaXQpLCBjaGFyc2V0KTsKLSAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltieXRlbGltaXRdOwotICAgICAgICAgICAgaW50IGxpbWl0ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChsaW1pdCA8IGJ5dGVsaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkZXIucmVhZChidWYsIGxpbWl0LCBieXRlbGltaXQgLSBsaW1pdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgbGltaXQgKz0gY291bnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBleHRyYWN0WG1sRGVjbEVuY29kaW5nKGJ1ZiwgMCwgbGltaXQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF9lbmNvZGluZzsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFhtbERlY2xFbmNvZGluZyhjaGFyW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIGludCBsaW1pdCA9IG9mZnNldCArIHNpemU7Ci0gICAgICAgIGludCB4bWxwaSA9IGZpcnN0SW5kZXhPZigiPD94bWwiLCBidWYsIG9mZnNldCwgbGltaXQpOwotICAgICAgICBpZiAoeG1scGkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSB4bWxwaSArIDU7Ci0gICAgICAgICAgICBTY2FubmVkQXR0cmlidXRlIGF0dHIgPSBuZXcgU2Nhbm5lZEF0dHJpYnV0ZSgpOwotICAgICAgICAgICAgd2hpbGUgKGkgPCBsaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpID0gc2NhbkF0dHJpYnV0ZShidWYsIGksIGxpbWl0LCBhdHRyKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIGlmIChhdHRyLm5hbWUuZXF1YWxzKCJlbmNvZGluZyIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci52YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmlyc3RJbmRleE9mKFN0cmluZyBzLCBjaGFyW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxpbWl0KQotICAgIHsKLSAgICAgICAgYXNzZXJ0KHMubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgY2hhcltdIGxvb2tGb3IgPSBzLnRvQ2hhckFycmF5KCk7Ci0KLSAgICAgICAgY2hhciBmaXJzdGNoYXIgPSBsb29rRm9yWzBdOwotICAgICAgICBzZWFyY2hpbmc6IGZvciAobGltaXQgLT0gbG9va0Zvci5sZW5ndGg7IHN0YXJ0QXQgPCBsaW1pdDsgc3RhcnRBdCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYnVmW3N0YXJ0QXRdID09IGZpcnN0Y2hhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxvb2tGb3IubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmW3N0YXJ0QXQgKyBpXSAhPSBsb29rRm9yW2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2hpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0QXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHROb25tYXRjaGluZ0J5dGUoY2hhcltdIGxvb2tGb3IsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCi0gICAgewotICAgICAgICBzZWFyY2hpbmc6IGZvciAoOyBzdGFydEF0IDwgbGltaXQ7IHN0YXJ0QXQrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRoaXNjaGFyID0gYnVmW3N0YXJ0QXRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29rRm9yLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmICh0aGlzY2hhciA9PSBsb29rRm9yW2ldKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2hpbmc7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRNYXRjaGluZ0J5dGUoY2hhcltdIGxvb2tGb3IsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCi0gICAgewotICAgICAgICBzZWFyY2hpbmc6IGZvciAoOyBzdGFydEF0IDwgbGltaXQ7IHN0YXJ0QXQrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRoaXNjaGFyID0gYnVmW3N0YXJ0QXRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29rRm9yLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmICh0aGlzY2hhciA9PSBsb29rRm9yW2ldKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRNYXRjaGluZ0J5dGUoY2hhciBsb29rRm9yLCBjaGFyW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxpbWl0KQotICAgIHsKLSAgICAgICAgc2VhcmNoaW5nOiBmb3IgKDsgc3RhcnRBdCA8IGxpbWl0OyBzdGFydEF0KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChidWZbc3RhcnRBdF0gPT0gbG9va0ZvcikKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBXSElURVNQQUNFID0gbmV3IGNoYXJbXSB7ICcgJywgJ1xyJywgJ1x0JywgJ1xuJyB9OwotICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBOT1ROQU1FID0gbmV3IGNoYXJbXSB7ICc9JywgJyAnLCAnXHInLCAnXHQnLCAnXG4nLCAnPycsICc+JywgJzwnLCAnXCcnLCAnXCInIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY2FubmVkQXR0cmlidXRlCi0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNjYW5BdHRyaWJ1dGUoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCwgU2Nhbm5lZEF0dHJpYnV0ZSBhdHRyKQotICAgIHsKLSAgICAgICAgaW50IG5hbWVTdGFydCA9IG5leHROb25tYXRjaGluZ0J5dGUoV0hJVEVTUEFDRSwgYnVmLCBzdGFydEF0LCBsaW1pdCk7Ci0gICAgICAgIGlmIChuYW1lU3RhcnQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpbnQgbmFtZUVuZCA9IG5leHRNYXRjaGluZ0J5dGUoTk9UTkFNRSwgYnVmLCBuYW1lU3RhcnQsIGxpbWl0KTsKLSAgICAgICAgaWYgKG5hbWVFbmQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpbnQgZXF1YWxzID0gbmV4dE5vbm1hdGNoaW5nQnl0ZShXSElURVNQQUNFLCBidWYsIG5hbWVFbmQsIGxpbWl0KTsKLSAgICAgICAgaWYgKGVxdWFscyA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChidWZbZXF1YWxzXSAhPSAnPScpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCB2YWxRdW90ZSA9IG5leHROb25tYXRjaGluZ0J5dGUoV0hJVEVTUEFDRSwgYnVmLCBlcXVhbHMgKyAxLCBsaW1pdCk7Ci0gICAgICAgIGlmIChidWZbdmFsUXVvdGVdICE9ICdcJycgJiYgYnVmW3ZhbFF1b3RlXSAhPSAnXCInKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpbnQgdmFsRW5kcXVvdGUgPSBuZXh0TWF0Y2hpbmdCeXRlKGJ1Zlt2YWxRdW90ZV0sIGJ1ZiwgdmFsUXVvdGUgKyAxLCBsaW1pdCk7Ci0gICAgICAgIGlmICh2YWxFbmRxdW90ZSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGF0dHIubmFtZSA9IG5ldyBTdHJpbmcoYnVmLCBuYW1lU3RhcnQsIG5hbWVFbmQgLSBuYW1lU3RhcnQpOwotICAgICAgICBhdHRyLnZhbHVlID0gbmV3IFN0cmluZyhidWYsIHZhbFF1b3RlICsgMSwgdmFsRW5kcXVvdGUgLSB2YWxRdW90ZSAtIDEpOwotICAgICAgICByZXR1cm4gdmFsRW5kcXVvdGUgKyAxOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmM0NjE5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLQotcHVibGljIGNsYXNzIFNuaWZmZWRYbWxSZWFkZXIgZXh0ZW5kcyBCdWZmZXJlZFJlYWRlcgotewotICAgIC8vIFdlIGRvbid0IHNuaWZmIG1vcmUgdGhhbiAxOTIgYnl0ZXMuCi0gICAgcHVibGljIHN0YXRpYyBpbnQgTUFYX1NOSUZGRURfQ0hBUlMgPSAxOTI7Ci0KLSAgICBwdWJsaWMgU25pZmZlZFhtbFJlYWRlcihSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyKHJlYWRlcik7Ci0gICAgICAgIF9lbmNvZGluZyA9IHNuaWZmRm9yWG1sRGVjbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJlYWRBc011Y2hBc1Bvc3NpYmxlKGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCB0b3RhbCA9IDA7Ci0gICAgICAgIHdoaWxlICh0b3RhbCA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZChidWYsIHN0YXJ0QXQgKyB0b3RhbCwgbGVuIC0gdG90YWwpOwotICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHRvdGFsICs9IGNvdW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICAvLyBCVUdCVUcgaW4gSkRLOiBDaGFyc2V0LmZvck5hbWUgaXMgbm90IHRocmVhZHNhZmUsIHNvIHdlJ2xsIHByaW1lIGl0Ci0gICAgLy8gd2l0aCB0aGUgY29tbW9uIGNoYXJzZXRzLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTEgPSBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTIgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNiIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkzID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTZCRSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk0ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTZMRSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk1ID0gQ2hhcnNldC5mb3JOYW1lKCJJU08tODg1OS0xIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTYgPSBDaGFyc2V0LmZvck5hbWUoIlVTLUFTQ0lJIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTcgPSBDaGFyc2V0LmZvck5hbWUoIkNwMTI1MiIpOwotCi0KLSAgICBwcml2YXRlIFN0cmluZyBzbmlmZkZvclhtbERlY2woKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1hcmsoTUFYX1NOSUZGRURfQ0hBUlMpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW01BWF9TTklGRkVEX0NIQVJTXTsKLSAgICAgICAgICAgIGludCBsaW1pdCA9IHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ1ZiwgMCwgTUFYX1NOSUZGRURfQ0hBUlMpOwotICAgICAgICAgICAgcmV0dXJuIFNuaWZmZWRYbWxJbnB1dFN0cmVhbS5leHRyYWN0WG1sRGVjbEVuY29kaW5nKGJ1ZiwgMCwgbGltaXQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF9lbmNvZGluZzsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbmNvZGluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWI4MGMyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25Db250ZXh0Ci17Ci0gICAgcHVibGljIHZvaWQgaW52YWxpZCAoIFN0cmluZyBtZXNzYWdlICk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRvckxpc3RlbmVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5ZWJlMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogRmlyc3QgZXZlbnQgbXVzdCBiZSBhIEJFR0lOIHdpdGggbm8gbmFtZSAodG8gY29tbXVuaWNhdGUgYW55IHhzaQotICogaW5mb3JtYXRpb24pLiAgQkVHSU4gYW5kIEVORCBuZWVkIHRvIG1hdGNoLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdG9yTGlzdGVuZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUdJTiAgICA9IDE7IC8vIEJlZ2luIGVsZW1lbnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkQgICAgICA9IDI7IC8vIEVuZCBlbGVtZW50Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVCAgICAgPSAzOyAvLyBUZXh0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUiAgICAgPSA0OyAvLyBBdHRyIChub24tbmFtZXNwYWNlcywgbm9uIHhzaSBvbmx5KQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOREFUVFJTID0gNTsgLy8gYWZ0ZXIgQkVHSU4sIGFmdGVyIGF0dHJzCi0KLSAgICB2b2lkIG5leHRFdmVudCAoIGludCBraW5kLCBFdmVudCBldmVudCApOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRXZlbnQgZXh0ZW5kcyBQcmVmaXhSZXNvbHZlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VSVkUgPSAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFICA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTExBUFNFID0gMzsKLQotICAgICAgICBYbWxDdXJzb3IgZ2V0TG9jYXRpb25Bc0N1cnNvciAoICk7Ci0KLSAgICAgICAgYm9vbGVhbiBnZXRYc2lUeXBlICAoIENoYXJzIGNoYXJzICk7IC8vIEJFR0lOIHhzaTp0eXBlCi0gICAgICAgIGJvb2xlYW4gZ2V0WHNpTmlsICAgKCBDaGFycyBjaGFycyApOyAvLyBCRUdJTiB4c2k6bmlsCi0gICAgICAgIGJvb2xlYW4gZ2V0WHNpTG9jICAgKCBDaGFycyBjaGFycyApOyAvLyBCRUdJTiB4c2k6c2NoZW1hTG9jYXRpb24KLSAgICAgICAgYm9vbGVhbiBnZXRYc2lOb0xvYyAoIENoYXJzIGNoYXJzICk7IC8vIEJFR0lOIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIE9uIFNUQVJUIGFuZCBBVFRSCi0gICAgICAgIFFOYW1lIGdldE5hbWUgKCApOwotICAgICAgICAKLSAgICAgICAgLy8gT24gVEVYVCBhbmQgQVRUUgotICAgICAgICB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycyApOwotICAgICAgICB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycywgaW50IHdzciApOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiB0ZXh0SXNXaGl0ZXNwYWNlICggKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hCZWFuRGVidWcuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YQmVhbkRlYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTYzN2UuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hCZWFuRGVidWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhCZWFuRGVidWcKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFDRV9TQ0hFTUFfTE9BRElORyA9IDB4MDAwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0cmFjZVByb3AgPSAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmRlYnVnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0UHJvcCA9ICIiOyAvLyAiVFJBQ0VfU0NIRU1BX0xPQURJTkciOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9lbmFibGVkID0gaW5pdGlhbGl6ZUJpdHNGcm9tUHJvcGVydHkoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX2luZGVudCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9pbmRlbnRzcGFjZSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZUJpdHNGcm9tUHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgaW50IGJpdHMgPSAwOwotICAgICAgICBTdHJpbmcgcHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSh0cmFjZVByb3AsIGRlZmF1bHRQcm9wKTsKLSAgICAgICAgaWYgKHByb3AuaW5kZXhPZigiVFJBQ0VfU0NIRU1BX0xPQURJTkciKSA+PSAwKQotICAgICAgICAgICAgYml0cyB8PSBUUkFDRV9TQ0hFTUFfTE9BRElORzsKLSAgICAgICAgcmV0dXJuIGJpdHM7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGUoaW50IGJpdHMpCi0gICAgewotICAgICAgICBfZW5hYmxlZCA9IF9lbmFibGVkIHwgYml0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZShpbnQgYml0cykKLSAgICB7Ci0gICAgICAgIF9lbmFibGVkID0gX2VuYWJsZWQgJiB+Yml0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGJpdHMsIFN0cmluZyBtZXNzYWdlLCBpbnQgaW5kZW50KQotICAgIHsKLSAgICAgICAgaWYgKHRlc3QoYml0cykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoWEJlYW5EZWJ1Zy5jbGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZW50IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgX2luZGVudCArPSBpbmRlbnQ7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BhY2VzID0gX2luZGVudCA8IDAgPyAiIiA6IF9pbmRlbnQgPiBfaW5kZW50c3BhY2UubGVuZ3RoKCkgPyBfaW5kZW50c3BhY2UgOiBfaW5kZW50c3BhY2Uuc3Vic3RyaW5nKDAsIF9pbmRlbnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2dtZXNzYWdlID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiAiICsgc3BhY2VzICsgbWVzc2FnZSArICJcbiI7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludChsb2dtZXNzYWdlKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbmRlbnQgPiAwKQotICAgICAgICAgICAgICAgICAgICBfaW5kZW50ICs9IGluZGVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KGludCBiaXRzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChfZW5hYmxlZCAmIGJpdHMpICE9IDA7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBQcmludFN0cmVhbSBfZXJyOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvZyhTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGxvZyhtZXNzYWdlLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvZ1N0YWNrVHJhY2UoU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICBsb2cobWVzc2FnZSwgbmV3IFRocm93YWJsZSgpKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBTdHJpbmcgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgc3RhY2tUcmFjZSkKLSAgICB7Ci0gICAgICAgIGlmIChfZXJyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUgZGlhZ25vc3RpY0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ4bWxiZWFuZGVidWciLCAiLmxvZyIpOwotICAgICAgICAgICAgICAgIF9lcnIgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZGlhZ25vc3RpY0ZpbGUpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRpYWdub3N0aWMgWE1MIEJlYW4gZGVidWcgbG9nIGZpbGUgY3JlYXRlZDogIiArIGRpYWdub3N0aWNGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9lcnIgPSBTeXN0ZW0uZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9lcnIucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgaWYgKHN0YWNrVHJhY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhY2tUcmFjZS5wcmludFN0YWNrVHJhY2UoX2Vycik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAgIGxvZyh0LmdldE1lc3NhZ2UoKSwgdCk7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxDaGFyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWE1MQ2hhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE3ODllLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxDaGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMgWE1MIGNoYXJhY3RlciBwcm9wZXJ0aWVzLiBUaGUgZGF0YQotICogaW4gdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNoYXJhY3RlciBpcyBhIHZhbGlkCi0gKiBYTUwgY2hhcmFjdGVyIG9yIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZSwgbmFtZSBzdGFydCwgb3IgbmFtZQotICogY2hhcmFjdGVyLgotICogPHA+Ci0gKiBBIHNlcmllcyBvZiBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBzdXBwbGllZCB0byBlYXNlIHRoZSBidXJkZW4KLSAqIG9mIHRoZSBkZXZlbG9wZXIuIEJlY2F1c2UgaW5saW5pbmcgdGhlIGNoZWNrcyBjYW4gaW1wcm92ZSBwZXIKLSAqIGNoYXJhY3RlciBwZXJmb3JtYW5jZSwgdGhlIHRhYmxlcyBvZiBjaGFyYWN0ZXIgcHJvcGVydGllcyBhcmUKLSAqIHB1YmxpYy4gVXNpbmcgdGhlIGNoYXJhY3RlciBhcyBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5DSEFSUzwvY29kZT4KLSAqIGFycmF5IGFuZCBhcHBseWluZyB0aGUgYXBwcm9wcmlhdGUgbWFzayBmbGFnIChlLmcuCi0gKiA8Y29kZT5NQVNLX1ZBTElEPC9jb2RlPiksIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzIGNhbGxpbmcgdGhlCi0gKiBjb252ZW5pZW5jZSBtZXRob2RzLiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiBjaGVjayB0aGUgY29tbWVudHMKLSAqIGZvciB0aGUgPGNvZGU+aXNWYWxpZDwvY29kZT4gbWV0aG9kIGZvciBkZXRhaWxzLgotICoKLSAqIEBhdXRob3IgR2xlbm4gTWFyY3ksIElCTQotICogQGF1dGhvciBBbmR5IENsYXJrLCBJQk0KLSAqIEBhdXRob3IgRXJpYyBZZSwgSUJNCi0gKiBAYXV0aG9yIEFybmF1ZCAgTGUgSG9ycywgSUJNCi0gKiBAYXV0aG9yIFJhaHVsIFNyaXZhc3RhdmEsIFN1biBNaWNyb3N5c3RlbXMgSW5jLgotICoKLSAqIEB2ZXJzaW9uICRJZDogWE1MQ2hhci5qYXZhLHYgMS4yIDIwMDMvMDkvMjQgMjM6MzE6MDUgZXJpY3ZhcyBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2hhciB7Ci0KLSAgICAvLwotICAgIC8vIENvbnN0YW50cwotICAgIC8vCi0KLSAgICAvKiogQ2hhcmFjdGVyIGZsYWdzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDSEFSUyA9IG5ldyBieXRlWzEgPDwgMTZdOwotCi0gICAgLyoqIFZhbGlkIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfVkFMSUQgPSAweDAxOwotCi0gICAgLyoqIFNwYWNlIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfU1BBQ0UgPSAweDAyOwotCi0gICAgLyoqIE5hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FX1NUQVJUID0gMHgwNDsKLQotICAgIC8qKiBOYW1lIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkFNRSA9IDB4MDg7Ci0KLSAgICAvKiogUHViaWQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19QVUJJRCA9IDB4MTA7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIENvbnRlbnQgY2hhcmFjdGVyIG1hc2suIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUgdGhvc2UgdGhhdCBjYW4KLSAgICAgKiBiZSBjb25zaWRlcmVkIHRoZSBzdGFydCBvZiBtYXJrdXAsIHN1Y2ggYXMgJyZsdDsnIGFuZCAnJmFtcDsnLiAKLSAgICAgKiBUaGUgdmFyaW91cyBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgc3BlY2lhbCBhcyB3ZWxsLgotICAgICAqIEFsbCBvdGhlciB2YWxpZCBYTUwgY2hhcmFjdGVycyBjYW4gYmUgY29uc2lkZXJlZCBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGZvciB0aGUgaW5uZXIgbG9vcCBvZiBjaGFyYWN0ZXIgc2Nhbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19DT05URU5UID0gMHgyMDsKLQotICAgIC8qKiBOQ05hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQ05BTUVfU1RBUlQgPSAweDQwOwotCi0gICAgLyoqIE5DTmFtZSBjaGFyYWN0ZXIgbWFzay4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRSA9IDB4ODA7Ci0KLSAgICAvLwotICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbgotICAgIC8vCi0KLSAgICBzdGF0aWMgewotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfAotICAgICAgICAvLyAgICAgICAgICAgICAgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGNoYXJSYW5nZVtdID0geyAKLSAgICAgICAgICAgIDB4MDAwOSwgMHgwMDBBLCAweDAwMEQsIDB4MDAwRCwgMHgwMDIwLCAweEQ3RkYsIDB4RTAwMCwgMHhGRkZELAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFszXSBTIDo6PSAoI3gyMCB8ICN4OSB8ICN4RCB8ICN4QSkrCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IHNwYWNlQ2hhcltdID0geyAKLSAgICAgICAgICAgIDB4MDAyMCwgMHgwMDA5LCAweDAwMEQsIDB4MDAwQSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbmFtZUNoYXJbXSA9IHsgCi0gICAgICAgICAgICAweDAwMkQsIDB4MDAyRSwgLy8gJy0nIGFuZCAnLicKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbmFtZVN0YXJ0Q2hhcltdID0geyAKLSAgICAgICAgICAgIDB4MDAzQSwgMHgwMDVGLCAvLyAnOicgYW5kICdfJwotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgMHhEIHwgMHhBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgcHViaWRDaGFyW10gPSB7Ci0gICAgICAgICAgICAweDAwMEEsIDB4MDAwRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAzRCwKLSAgICAgICAgICAgIDB4MDA1RgotICAgICAgICB9OwotCi0gICAgICAgIGludCBwdWJpZFJhbmdlW10gPSB7Ci0gICAgICAgICAgICAweDAwMjcsIDB4MDAzQiwgMHgwMDNGLCAweDAwNUEsIDB4MDA2MSwgMHgwMDdBCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzg0XSBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbGV0dGVyUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgIC8vIEJhc2VDaGFyCi0gICAgICAgICAgICAweDAwNDEsIDB4MDA1QSwgMHgwMDYxLCAweDAwN0EsIDB4MDBDMCwgMHgwMEQ2LCAweDAwRDgsIDB4MDBGNiwKLSAgICAgICAgICAgIDB4MDBGOCwgMHgwMTMxLCAweDAxMzQsIDB4MDEzRSwgMHgwMTQxLCAweDAxNDgsIDB4MDE0QSwgMHgwMTdFLAotICAgICAgICAgICAgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsCi0gICAgICAgICAgICAweDAyNTAsIDB4MDJBOCwgMHgwMkJCLCAweDAyQzEsIDB4MDM4OCwgMHgwMzhBLCAweDAzOEUsIDB4MDNBMSwKLSAgICAgICAgICAgIDB4MDNBMywgMHgwM0NFLCAweDAzRDAsIDB4MDNENiwgMHgwM0UyLCAweDAzRjMsIDB4MDQwMSwgMHgwNDBDLAotICAgICAgICAgICAgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsCi0gICAgICAgICAgICAweDA0QzcsIDB4MDRDOCwgMHgwNENCLCAweDA0Q0MsIDB4MDREMCwgMHgwNEVCLCAweDA0RUUsIDB4MDRGNSwKLSAgICAgICAgICAgIDB4MDRGOCwgMHgwNEY5LCAweDA1MzEsIDB4MDU1NiwgMHgwNTYxLCAweDA1ODYsIDB4MDVEMCwgMHgwNUVBLAotICAgICAgICAgICAgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsCi0gICAgICAgICAgICAweDA2QkEsIDB4MDZCRSwgMHgwNkMwLCAweDA2Q0UsIDB4MDZEMCwgMHgwNkQzLCAweDA2RTUsIDB4MDZFNiwKLSAgICAgICAgICAgIDB4MDkwNSwgMHgwOTM5LCAweDA5NTgsIDB4MDk2MSwgMHgwOTg1LCAweDA5OEMsIDB4MDk4RiwgMHgwOTkwLAotICAgICAgICAgICAgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsCi0gICAgICAgICAgICAweDA5REYsIDB4MDlFMSwgMHgwOUYwLCAweDA5RjEsIDB4MEEwNSwgMHgwQTBBLCAweDBBMEYsIDB4MEExMCwKLSAgICAgICAgICAgIDB4MEExMywgMHgwQTI4LCAweDBBMkEsIDB4MEEzMCwgMHgwQTMyLCAweDBBMzMsIDB4MEEzNSwgMHgwQTM2LAotICAgICAgICAgICAgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsCi0gICAgICAgICAgICAweDBBOEYsIDB4MEE5MSwgMHgwQTkzLCAweDBBQTgsIDB4MEFBQSwgMHgwQUIwLCAweDBBQjIsIDB4MEFCMywKLSAgICAgICAgICAgIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LAotICAgICAgICAgICAgMHgwQjJBLCAweDBCMzAsIDB4MEIzMiwgMHgwQjMzLCAweDBCMzYsIDB4MEIzOSwgMHgwQjVDLCAweDBCNUQsCi0gICAgICAgICAgICAweDBCNUYsIDB4MEI2MSwgMHgwQjg1LCAweDBCOEEsIDB4MEI4RSwgMHgwQjkwLCAweDBCOTIsIDB4MEI5NSwKLSAgICAgICAgICAgIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLAotICAgICAgICAgICAgMHgwQkFFLCAweDBCQjUsIDB4MEJCNywgMHgwQkI5LCAweDBDMDUsIDB4MEMwQywgMHgwQzBFLCAweDBDMTAsCi0gICAgICAgICAgICAweDBDMTIsIDB4MEMyOCwgMHgwQzJBLCAweDBDMzMsIDB4MEMzNSwgMHgwQzM5LCAweDBDNjAsIDB4MEM2MSwKLSAgICAgICAgICAgIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLAotICAgICAgICAgICAgMHgwQ0I1LCAweDBDQjksIDB4MENFMCwgMHgwQ0UxLCAweDBEMDUsIDB4MEQwQywgMHgwRDBFLCAweDBEMTAsCi0gICAgICAgICAgICAweDBEMTIsIDB4MEQyOCwgMHgwRDJBLCAweDBEMzksIDB4MEQ2MCwgMHgwRDYxLCAweDBFMDEsIDB4MEUyRSwKLSAgICAgICAgICAgIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LAotICAgICAgICAgICAgMHgwRTk0LCAweDBFOTcsIDB4MEU5OSwgMHgwRTlGLCAweDBFQTEsIDB4MEVBMywgMHgwRUFBLCAweDBFQUIsCi0gICAgICAgICAgICAweDBFQUQsIDB4MEVBRSwgMHgwRUIyLCAweDBFQjMsIDB4MEVDMCwgMHgwRUM0LCAweDBGNDAsIDB4MEY0NywKLSAgICAgICAgICAgIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLAotICAgICAgICAgICAgMHgxMTA1LCAweDExMDcsIDB4MTEwQiwgMHgxMTBDLCAweDExMEUsIDB4MTExMiwgMHgxMTU0LCAweDExNTUsCi0gICAgICAgICAgICAweDExNUYsIDB4MTE2MSwgMHgxMTZELCAweDExNkUsIDB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwKLSAgICAgICAgICAgIDB4MTFCNywgMHgxMUI4LCAweDExQkMsIDB4MTFDMiwgMHgxRTAwLCAweDFFOUIsIDB4MUVBMCwgMHgxRUY5LAotICAgICAgICAgICAgMHgxRjAwLCAweDFGMTUsIDB4MUYxOCwgMHgxRjFELCAweDFGMjAsIDB4MUY0NSwgMHgxRjQ4LCAweDFGNEQsCi0gICAgICAgICAgICAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywKLSAgICAgICAgICAgIDB4MUZDMiwgMHgxRkM0LCAweDFGQzYsIDB4MUZDQywgMHgxRkQwLCAweDFGRDMsIDB4MUZENiwgMHgxRkRCLAotICAgICAgICAgICAgMHgxRkUwLCAweDFGRUMsIDB4MUZGMiwgMHgxRkY0LCAweDFGRjYsIDB4MUZGQywgMHgyMTJBLCAweDIxMkIsCi0gICAgICAgICAgICAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywKLSAgICAgICAgICAgIDB4QUMwMCwgMHhEN0EzLAotICAgICAgICAgICAgLy8gSWRlb2dyYXBoaWMKLSAgICAgICAgICAgIDB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLSAgICAgICAgfTsKLSAgICAgICAgaW50IGxldHRlckNoYXJbXSA9IHsKLSAgICAgICAgICAgIC8vIEJhc2VDaGFyCi0gICAgICAgICAgICAweDAzODYsIDB4MDM4QywgMHgwM0RBLCAweDAzREMsIDB4MDNERSwgMHgwM0UwLCAweDA1NTksIDB4MDZENSwKLSAgICAgICAgICAgIDB4MDkzRCwgMHgwOUIyLCAweDBBNUUsIDB4MEE4RCwgMHgwQUJELCAweDBBRTAsIDB4MEIzRCwgMHgwQjlDLAotICAgICAgICAgICAgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsCi0gICAgICAgICAgICAweDBFQkQsIDB4MTEwMCwgMHgxMTA5LCAweDExM0MsIDB4MTEzRSwgMHgxMTQwLCAweDExNEMsIDB4MTE0RSwKLSAgICAgICAgICAgIDB4MTE1MCwgMHgxMTU5LCAweDExNjMsIDB4MTE2NSwgMHgxMTY3LCAweDExNjksIDB4MTE3NSwgMHgxMTlFLAotICAgICAgICAgICAgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsCi0gICAgICAgICAgICAweDFGNUQsIDB4MUZCRSwgMHgyMTI2LCAweDIxMkUsCi0gICAgICAgICAgICAvLyBJZGVvZ3JhcGhpYwotICAgICAgICAgICAgMHgzMDA3LAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4N10gQ29tYmluaW5nQ2hhciA6Oj0gLi4uCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJSYW5nZVtdID0gewotICAgICAgICAgICAgMHgwMzAwLCAweDAzNDUsIDB4MDM2MCwgMHgwMzYxLCAweDA0ODMsIDB4MDQ4NiwgMHgwNTkxLCAweDA1QTEsCi0gICAgICAgICAgICAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwKLSAgICAgICAgICAgIDB4MDZENiwgMHgwNkRDLCAweDA2REQsIDB4MDZERiwgMHgwNkUwLCAweDA2RTQsIDB4MDZFNywgMHgwNkU4LAotICAgICAgICAgICAgMHgwNkVBLCAweDA2RUQsIDB4MDkwMSwgMHgwOTAzLCAweDA5M0UsIDB4MDk0QywgMHgwOTUxLCAweDA5NTQsCi0gICAgICAgICAgICAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwKLSAgICAgICAgICAgIDB4MDlDQiwgMHgwOUNELCAweDA5RTIsIDB4MDlFMywgMHgwQTQwLCAweDBBNDIsIDB4MEE0NywgMHgwQTQ4LAotICAgICAgICAgICAgMHgwQTRCLCAweDBBNEQsIDB4MEE3MCwgMHgwQTcxLCAweDBBODEsIDB4MEE4MywgMHgwQUJFLCAweDBBQzUsCi0gICAgICAgICAgICAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywKLSAgICAgICAgICAgIDB4MEI0NywgMHgwQjQ4LCAweDBCNEIsIDB4MEI0RCwgMHgwQjU2LCAweDBCNTcsIDB4MEI4MiwgMHgwQjgzLAotICAgICAgICAgICAgMHgwQkJFLCAweDBCQzIsIDB4MEJDNiwgMHgwQkM4LCAweDBCQ0EsIDB4MEJDRCwgMHgwQzAxLCAweDBDMDMsCi0gICAgICAgICAgICAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwKLSAgICAgICAgICAgIDB4MEM4MiwgMHgwQzgzLCAweDBDQkUsIDB4MENDNCwgMHgwQ0M2LCAweDBDQzgsIDB4MENDQSwgMHgwQ0NELAotICAgICAgICAgICAgMHgwQ0Q1LCAweDBDRDYsIDB4MEQwMiwgMHgwRDAzLCAweDBEM0UsIDB4MEQ0MywgMHgwRDQ2LCAweDBENDgsCi0gICAgICAgICAgICAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwKLSAgICAgICAgICAgIDB4MEVCQiwgMHgwRUJDLCAweDBFQzgsIDB4MEVDRCwgMHgwRjE4LCAweDBGMTksIDB4MEY3MSwgMHgwRjg0LAotICAgICAgICAgICAgMHgwRjg2LCAweDBGOEIsIDB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsCi0gICAgICAgICAgICAweDIwRDAsIDB4MjBEQywgMHgzMDJBLCAweDMwMkYsCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJDaGFyW10gPSB7Ci0gICAgICAgICAgICAweDA1QkYsIDB4MDVDNCwgMHgwNjcwLCAweDA5M0MsIDB4MDk0RCwgMHgwOUJDLCAweDA5QkUsIDB4MDlCRiwKLSAgICAgICAgICAgIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LAotICAgICAgICAgICAgMHgwRDU3LCAweDBFMzEsIDB4MEVCMSwgMHgwRjM1LCAweDBGMzcsIDB4MEYzOSwgMHgwRjNFLCAweDBGM0YsCi0gICAgICAgICAgICAweDBGOTcsIDB4MEZCOSwgMHgyMEUxLCAweDMwOTksIDB4MzA5QSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODhdIERpZ2l0IDo6PSAuLi4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgZGlnaXRSYW5nZVtdID0gewotICAgICAgICAgICAgMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsCi0gICAgICAgICAgICAweDA5RTYsIDB4MDlFRiwgMHgwQTY2LCAweDBBNkYsIDB4MEFFNiwgMHgwQUVGLCAweDBCNjYsIDB4MEI2RiwKLSAgICAgICAgICAgIDB4MEJFNywgMHgwQkVGLCAweDBDNjYsIDB4MEM2RiwgMHgwQ0U2LCAweDBDRUYsIDB4MEQ2NiwgMHgwRDZGLAotICAgICAgICAgICAgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODldIEV4dGVuZGVyIDo6PSAuLi4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgZXh0ZW5kZXJSYW5nZVtdID0gewotICAgICAgICAgICAgMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgZXh0ZW5kZXJDaGFyW10gPSB7Ci0gICAgICAgICAgICAweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBTcGVjaWFsQ2hhciA6Oj0gJzwnLCAnJicsICdcbicsICdccicsICddJwotICAgICAgICAvLwotCi0gICAgICAgIGludCBzcGVjaWFsQ2hhcltdID0gewotICAgICAgICAgICAgJzwnLCAnJicsICdcbicsICdccicsICddJywKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBJbml0aWFsaXplCi0gICAgICAgIC8vCi0KLSAgICAgICAgLy8gc2V0IHZhbGlkIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBjaGFyUmFuZ2VbaV07IGogPD0gY2hhclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19WQUxJRCB8IE1BU0tfQ09OVEVOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFsQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbc3BlY2lhbENoYXJbaV1dID0gKGJ5dGUpKENIQVJTW3NwZWNpYWxDaGFyW2ldXSAmIH5NQVNLX0NPTlRFTlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHNwYWNlIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZUNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW3NwYWNlQ2hhcltpXV0gfD0gTUFTS19TUEFDRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBuYW1lIHN0YXJ0IGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lU3RhcnRDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tuYW1lU3RhcnRDaGFyW2ldXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGxldHRlclJhbmdlW2ldOyBqIDw9IGxldHRlclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV0dGVyQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbbGV0dGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgbmFtZSBjaGFyYWN0ZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZUNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW25hbWVDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0UmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBkaWdpdFJhbmdlW2ldOyBqIDw9IGRpZ2l0UmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbWJpbmluZ0NoYXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGNvbWJpbmluZ0NoYXJSYW5nZVtpXTsgaiA8PSBjb21iaW5pbmdDaGFyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbWJpbmluZ0NoYXJDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tjb21iaW5pbmdDaGFyQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gZXh0ZW5kZXJSYW5nZVtpXTsgaiA8PSBleHRlbmRlclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlckNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW2V4dGVuZGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgJzonIGZyb20gYWxsb3dhYmxlIE1BU0tfTkNOQU1FX1NUQVJUIGFuZCBNQVNLX05DTkFNRSBjaGFycwotICAgICAgICBDSEFSU1snOiddICY9IH4oTUFTS19OQ05BTUVfU1RBUlQgfCBNQVNLX05DTkFNRSk7Ci0KLSAgICAgICAgLy8gc2V0IFB1YmlkIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJpZENoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW3B1YmlkQ2hhcltpXV0gfD0gTUFTS19QVUJJRDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmlkUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBwdWJpZFJhbmdlW2ldOyBqIDw9IHB1YmlkUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX1BVQklEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IC8vIDxjbGluaXQ+KCkKLQotICAgIC8vCi0gICAgLy8gUHVibGljIHN0YXRpYyBtZXRob2RzCi0gICAgLy8KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBsZW1lbnRhbChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPj0gMHgxMDAwMCAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgKiBzdXJyb2dhdGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGggVGhlIGhpZ2ggc3Vycm9nYXRlLgotICAgICAqIEBwYXJhbSBsIFRoZSBsb3cgc3Vycm9nYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHN1cHBsZW1lbnRhbChjaGFyIGgsIGNoYXIgbCkgewotICAgICAgICByZXR1cm4gKGggLSAweEQ4MDApICogMHg0MDAgKyAobCAtIDB4REMwMCkgKyAweDEwMDAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3VwcGxlbWVudGFsIGNoYXJhY3RlcgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgdG8gInNwbGl0Ii4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNoYXIgaGlnaFN1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKGNoYXIpICgoKGMgLSAweDAwMDEwMDAwKSA+PiAxMCkgKyAweEQ4MDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvdyBzdXJyb2dhdGUgb2YgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciB0byAic3BsaXQiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2hhciBsb3dTdXJyb2dhdGUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjaGFyKSAoKChjIC0gMHgwMDAxMDAwMCkgJiAweDNGRikgKyAweERDMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgaGlnaCBzdXJyb2dhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKDB4RDgwMCA8PSBjICYmIGMgPD0gMHhEQkZGKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGxvdyBzdXJyb2dhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoMHhEQzAwIDw9IGMgJiYgYyA8PSAweERGRkYpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIHZhbGlkLiBUaGlzIG1ldGhvZAotICAgICAqIGFsc28gY2hlY2tzIHRoZSBzdXJyb2dhdGUgY2hhcmFjdGVyIHJhbmdlIGZyb20gMHgxMDAwMCB0byAweDEwRkZGRi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcHJvZ3JhbSBjaG9vc2VzIHRvIGFwcGx5IHRoZSBtYXNrIGRpcmVjdGx5IHRvIHRoZQotICAgICAqIDxjb2RlPkNIQVJTPC9jb2RlPiBhcnJheSwgdGhlbiB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcKLSAgICAgKiB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1ZBTElEKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9IC8vIGlzVmFsaWQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChpbnQgYykgewotICAgICAgICByZXR1cm4gIWlzVmFsaWQoYyk7Ci0gICAgfSAvLyBpc0ludmFsaWQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGVudChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfQ09OVEVOVCkgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7Ci0gICAgfSAvLyBpc0NvbnRlbnQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgbWFya3VwLgotICAgICAqIE1hcmt1cCBjaGFyYWN0ZXJzIGluY2x1ZGUgJyZsdDsnLCAnJmFtcDsnLCBhbmQgJyUnLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXJrdXAoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPT0gJzwnIHx8IGMgPT0gJyYnIHx8IGMgPT0gJyUnOwotICAgIH0gLy8gaXNNYXJrdXAoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBjaGFyYWN0ZXIKLSAgICAgKiBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzNdIGluIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1NQQUNFKSAhPSAwOwotICAgIH0gLy8gaXNTcGFjZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHNwYWNlIGNoYXJhY3RlcgotICAgICAqIGFzIGFtZGVuZGVkIGluIHRoZSBYTUwgMS4xIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTDExU3BhY2UoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1NQQUNFKSAhPSAwKSB8fAotICAgICAgICAgICAgYyA9PSAweDg1IHx8IGMgPT0gMHgyMDI4OwotICAgIH0gLy8gaXNYTUwxMVNwYWNlKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZSBzdGFydAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZVN0YXJ0KGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05BTUVfU1RBUlQpICE9IDA7Ci0gICAgfSAvLyBpc05hbWVTdGFydChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIG5hbWUKLSAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs0XSBpbiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRSkgIT0gMDsKLSAgICB9IC8vIGlzTmFtZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZSBzdGFydAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIE5hbWVzcGFjZXMgaW4gWE1MCi0gICAgICogcmVjb21tZW5kYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZVN0YXJ0KGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05DTkFNRV9TVEFSVCkgIT0gMDsKLSAgICB9IC8vIGlzTkNOYW1lU3RhcnQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBOQ05hbWUKLSAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs1XSBpbiBOYW1lc3BhY2VzIGluIFhNTAotICAgICAqIHJlY29tbWVuZGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOQ05hbWUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FKSAhPSAwOwotICAgIH0gLy8gaXNOQ05hbWUoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBQdWJpZAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzEzXSBpbiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmlkKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1BVQklEKSAhPSAwOwotICAgIH0gLy8gaXNQdWJpZChpbnQpOmJvb2xlYW4KLQotICAgIC8qCi0gICAgICogWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCi0gICAgICovCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTmFtZSBhY2NvcmRpbmcgdG8gWzVdCi0gICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmKCBpc05hbWVTdGFydChjaCkgPT0gZmFsc2UpCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgIGlmKCBpc05hbWUoIGNoICkgPT0gZmFsc2UgKXsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KLSAgICAKLQotICAgIC8qCi0gICAgICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYwotICAgICAqIFs0XSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs0XQotICAgICAqIGZyb20gdGhlIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgc3RyaW5nIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5DTmFtZShTdHJpbmcgbmNOYW1lKSB7Ci0gICAgICAgIGlmIChuY05hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2hhciBjaCA9IG5jTmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmKCBpc05DTmFtZVN0YXJ0KGNoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG5jTmFtZS5sZW5ndGgoKTsgaSsrICkgewotICAgICAgICAgICBjaCA9IG5jTmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgIGlmKCBpc05DTmFtZSggY2ggKSA9PSBmYWxzZSApewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IC8vIGlzVmFsaWROQ05hbWUoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvKgotICAgICAqIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKwotICAgICAqLwotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5tdG9rZW4gYWNjb3JkaW5nIHRvIFs3XQotICAgICAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm10b2tlbiBzdHJpbmcgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRObXRva2VuKFN0cmluZyBubXRva2VuKSB7Ci0gICAgICAgIGlmIChubXRva2VuLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm10b2tlbi5sZW5ndGgoKTsgaSsrICkgewotICAgICAgICAgICBjaGFyIGNoID0gbm10b2tlbi5jaGFyQXQoaSk7Ci0gICAgICAgICAgIGlmKCAgISBpc05hbWUoIGNoICkgKXsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KLQotCi0KLQotCi0gICAgLy8gZW5jb2RpbmdzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBJQU5BIGVuY29kaW5nLgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKLSAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KLSAgICAgKiBJQU5BIGVuY29kaW5nIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWFuYUVuY29kaW5nIFRoZSBJQU5BIGVuY29kaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nIGlhbmFFbmNvZGluZykgewotICAgICAgICBpZiAoaWFuYUVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBpYW5hRW5jb2RpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IGlhbmFFbmNvZGluZy5jaGFyQXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gaWFuYUVuY29kaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA8ICdBJyB8fCBjID4gJ1onKSAmJiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBKYXZhIGVuY29kaW5nLgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKLSAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KLSAgICAgKiBKYXZhIGVuY29kaW5nIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhRW5jb2RpbmcoU3RyaW5nIGphdmFFbmNvZGluZykgewotICAgICAgICBpZiAoamF2YUVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBqYXZhRW5jb2RpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gamF2YUVuY29kaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoYyA8ICcwJyB8fCBjID4gJzknKSAmJiBjICE9ICcuJyAmJiBjICE9ICdfJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAvLyBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyk6Ym9vbGVhbgotCi19IC8vIGNsYXNzIFhNTENoYXIKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxOYW1lSGVscGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWE1MTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc3Njk4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvcgotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MTmFtZUhlbHBlcgotewotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UU5hbWUoWE1MTmFtZSB4bWxOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHhtbE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5mb3JMTlMoIHhtbE5hbWUuZ2V0TG9jYWxOYW1lKCksIHhtbE5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZm9yTE5TKFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbCh1cmksIGxvY2FsbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGZvckxOKFN0cmluZyBsb2NhbG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCIiLCBsb2NhbG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MTmFtZSBmb3JQcmV0dHkoU3RyaW5nIHByZXR0eSwgaW50IG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGludCBhdCA9IHByZXR0eS5pbmRleE9mKCdAJywgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGF0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwoIiIsIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwocHJldHR5LnN1YnN0cmluZyhhdCArIDEpLCBwcmV0dHkuc3Vic3RyaW5nKG9mZnNldCwgYXQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV0dHkoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0KLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVyaSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbE5hbWUoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGRpZ2l0cyA9IG5ldyBjaGFyW10KLSAgICAgICAgeycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FmZShpbnQgYykKLSAgICB7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZXhzYWZlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpc1NhZmUoY2gpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSB1dGY4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHV0ZjggPSBzLnN1YnN0cmluZyhpLCBpICsgMSkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdXRmOC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXycpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbKHV0Zjhbal0gPj4gNCkgJiAweEZdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzW3V0Zjhbal0gJiAweEZdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIl9CQURfVVRGOF9DSEFSIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZXhzYWZlZGlyKFhNTE5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVyaSgpID09IG51bGwgfHwgbmFtZS5nZXROYW1lc3BhY2VVcmkoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICJfbm9ucy8iICsgaGV4c2FmZShuYW1lLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGhleHNhZmUobmFtZS5nZXROYW1lc3BhY2VVcmkoKSkgKyAiLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YUGF0aC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjhmMWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci0KLXB1YmxpYyBjbGFzcyBYUGF0aAotewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFBhdGhDb21waWxlRXhjZXB0aW9uIGV4dGVuZHMgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYUGF0aENvbXBpbGVFeGNlcHRpb24gKCBYbWxFcnJvciBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4ZWN1dGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBFeGVjdXRpb25Db250ZXh0ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISVQgICAgID0gMHgxOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDRU5EID0gMHgyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSUyAgID0gMHg0OwotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdCAoIFhQYXRoIHhwYXRoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF94cGF0aCAhPSB4cGF0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfeHBhdGggPSB4cGF0aDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfcGF0aHMgPSBuZXcgUGF0aENvbnRleHQgWyB4cGF0aC5fc2VsZWN0b3IuX3BhdGhzLmxlbmd0aCBdOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgX3BhdGhzWyBpIF0gPSBuZXcgUGF0aENvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX3N0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICBfcGF0aHNbIGkgXS5pbml0KCB4cGF0aC5fc2VsZWN0b3IuX3BhdGhzWyBpIF0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgc3RhcnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3BhdGhzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IF9wYXRoc1sgaSBdLnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZWxlbWVudCAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfc3RhY2suYWRkKCBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3BhdGhzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IF9wYXRoc1sgaSBdLmVsZW1lbnQoIG5hbWUgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gYXR0ciAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGhpdCA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3BhdGhzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgaGl0ID0gaGl0IHwgX3BhdGhzWyBpIF0uYXR0ciggbmFtZSApOwotCi0gICAgICAgICAgICByZXR1cm4gaGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgZW5kICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3RhY2sucmVtb3ZlKCBfc3RhY2suc2l6ZSgpIC0gMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX3BhdGhzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgX3BhdGhzWyBpIF0uZW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUGF0aENvbnRleHQKLSAgICAgICAgewotICAgICAgICAgICAgUGF0aENvbnRleHQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ByZXYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZvaWQgaW5pdCAoIFN0ZXAgc3RlcHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jdXJyID0gc3RlcHM7Ci0gICAgICAgICAgICAgICAgX3ByZXYuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBRTmFtZSB0b3AgKCBpbnQgaSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChRTmFtZSkgRXhlY3V0aW9uQ29udGV4dC50aGlzLl9zdGFjay5nZXQoIF9zdGFjay5zaXplKCkgLSAxIC0gaSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYmFja3RyYWNrICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfY3VyciAhPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChfY3Vyci5faGFzQmFja3RyYWNrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBfY3Vyci5fYmFja3RyYWNrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXNzZXJ0ICFfY3Vyci5fZGVlcDsKLQotICAgICAgICAgICAgICAgIF9jdXJyID0gX2N1cnIuX3ByZXY7Ci0KLSAgICAgICAgICAgICAgICBzZWFyY2g6IGZvciAoIDsgIV9jdXJyLl9kZWVwIDsgX2N1cnIgPSBfY3Vyci5fcHJldiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IgKCBTdGVwIHMgPSBfY3VyciA7ICFzLl9kZWVwIDsgcyA9IHMuX3ByZXYgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMubWF0Y2goIHRvcCggdCsrICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlYXJjaDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHN0YXJ0ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfY3VyciAhPSBudWxsOwotICAgICAgICAgICAgICAgIGFzc2VydCBfY3Vyci5fcHJldiA9PSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKF9jdXJyLl9uYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY3Vyci5fZmxhZ3M7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3RlcHMgY29uc2lzdCBvbiBvbmx5IGEgdGVybWluYXRvciwgdGhlbiB0aGUgcGF0aCBjYW4KLSAgICAgICAgICAgICAgICAvLyBvbmx5IGJlICcuJy4gIEluIHRoaXMgY2FzZSwgd2UgZ2V0IGEgaGl0LCBidXQgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGVsc2UgdG8gbWF0Y2guICBObyBuZWVkIHRvIGJhY2t0cmFjay4KLQotICAgICAgICAgICAgICAgIF9jdXJyID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIHJldHVybiBISVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBlbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ByZXYuYWRkKCBfY3VyciApOwotCi0gICAgICAgICAgICAgICAgaWYgKF9jdXJyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyLl9uYW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIV9jdXJyLl9hdHRyICYmIF9jdXJyLm1hdGNoKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKF9jdXJyID0gX2N1cnIuX25leHQpLl9uYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnIuX2ZsYWdzOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYmFja3RyYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnIgPT0gbnVsbCA/IEhJVCA6IEhJVCB8IF9jdXJyLl9mbGFnczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmFja3RyYWNrKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIubWF0Y2goIG5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBfY3Vyci5fbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLl9kZWVwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBfY3Vyci5fZmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gYXR0ciAoIFFOYW1lIG5hbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY3VyciAhPSBudWxsICYmIF9jdXJyLl9hdHRyICYmIF9jdXJyLm1hdGNoKCBuYW1lICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvaWQgZW5kICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jdXJyID0gKFN0ZXApIF9wcmV2LnJlbW92ZSggX3ByZXYuc2l6ZSgpIC0gMSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcml2YXRlIFN0ZXAgX2N1cnI7Ci0gICAgICAgICAgICBwcml2YXRlIExpc3QgX3ByZXY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFhQYXRoICAgICAgICAgX3hwYXRoOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCAgICAgX3N0YWNrOwotICAgICAgICBwcml2YXRlIFBhdGhDb250ZXh0W10gX3BhdGhzOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIHN0YXRpYyBYUGF0aCBjb21waWxlWFBhdGggKCBTdHJpbmcgeHBhdGggKQotICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGlsZVhQYXRoKCB4cGF0aCwgIiR0aGlzIiwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFhQYXRoIGNvbXBpbGVYUGF0aCAoIFN0cmluZyB4cGF0aCwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVYUGF0aCggeHBhdGgsIGN1cnJlbnROb2RlVmFyLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYUGF0aCBjb21waWxlWFBhdGggKCBTdHJpbmcgeHBhdGgsIE1hcCBuYW1lc3BhY2VzICkKLSAgICAgICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlWFBhdGgoIHhwYXRoLCAiJHRoaXMiLCBuYW1lc3BhY2VzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggY29tcGlsZVhQYXRoICgKLSAgICAgICAgU3RyaW5nIHhwYXRoLCBTdHJpbmcgY3VycmVudE5vZGVWYXIsIE1hcCBuYW1lc3BhY2VzICkKLSAgICAgICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgbmV3IENvbXBpbGF0aW9uQ29udGV4dCggbmFtZXNwYWNlcywgY3VycmVudE5vZGVWYXIgKS4KLSAgICAgICAgICAgICAgICBjb21waWxlKCB4cGF0aCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBpbGF0aW9uQ29udGV4dAotICAgIHsKLSAgICAgICAgQ29tcGlsYXRpb25Db250ZXh0ICggTWFwIG5hbWVzcGFjZXMsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydAotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZVZhciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCIgKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlVmFyID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID0gIiR0aGlzIjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPSBjdXJyZW50Tm9kZVZhcjsKLQotICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfZXh0ZXJuYWxOYW1lc3BhY2VzID0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VzID09IG51bGwgPyBuZXcgSGFzaE1hcCgpIDogbmFtZXNwYWNlczsKLSAgICAgICAgfQotCi0gICAgICAgIFhQYXRoIGNvbXBpbGUgKCBTdHJpbmcgZXhwciApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX29mZnNldCA9IDA7Ci0gICAgICAgICAgICBfbGluZSA9IDE7Ci0gICAgICAgICAgICBfY29sdW1uID0gMTsKLSAgICAgICAgICAgIF9leHByID0gZXhwcjsKLQotICAgICAgICAgICAgcmV0dXJuIHRva2VuaXplWFBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGN1cnJDaGFyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3VyckNoYXIoIDAgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGN1cnJDaGFyICggaW50IG9mZnNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIF9vZmZzZXQgKyBvZmZzZXQgPj0gX2V4cHIubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgPyAtMQotICAgICAgICAgICAgICAgICAgICA6IF9leHByLmNoYXJBdCggX29mZnNldCArIG9mZnNldCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFkdmFuY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfb2Zmc2V0IDwgX2V4cHIubGVuZ3RoKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF9leHByLmNoYXJBdCggX29mZnNldCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9vZmZzZXQrKzsKLSAgICAgICAgICAgICAgICBfY29sdW1uKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpbmUrKzsKLSAgICAgICAgICAgICAgICAgICAgX2NvbHVtbiA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9vZmZzZXQgKyAxIDwgX2V4cHIubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gX2V4cHIuY2hhckF0KCBfb2Zmc2V0ICsgMSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5leHRDaCA9PSAnXHInIHx8IG5leHRDaCA9PSAnXG4nKSAmJiBjaCAhPSBuZXh0Q2gpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX29mZnNldCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZHZhbmNlICggaW50IGNvdW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNvdW50ID49IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlICggY291bnQtLSA+IDAgKQotICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIGlzV2hpdGVzcGFjZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGlzV2hpdGVzcGFjZSggMCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzV2hpdGVzcGFjZSAoIGludCBvZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBjdXJyQ2hhciggb2Zmc2V0ICk7Ci0gICAgICAgICAgICByZXR1cm4gY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc05DTmFtZVN0YXJ0ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBjdXJyQ2hhcigpID09IC0xCi0gICAgICAgICAgICAgICAgICAgID8gZmFsc2UgOgotICAgICAgICAgICAgICAgICAgICBYTUxDaGFyLmlzTkNOYW1lU3RhcnQoIGN1cnJDaGFyKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc05DTmFtZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgY3VyckNoYXIoKSA9PSAtMQotICAgICAgICAgICAgICAgICAgICA/IGZhbHNlIDoKLSAgICAgICAgICAgICAgICAgICAgWE1MQ2hhci5pc05DTmFtZSggY3VyckNoYXIoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHN0YXJ0c1dpdGggKCBTdHJpbmcgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBzLCAwICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gc3RhcnRzV2l0aCAoIFN0cmluZyBzLCBpbnQgb2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9vZmZzZXQgKyBvZmZzZXQgPj0gX2V4cHIubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gX2V4cHIuc3RhcnRzV2l0aCggcywgX29mZnNldCArIG9mZnNldCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYUGF0aENvbXBpbGVFeGNlcHRpb24gbmV3RXJyb3IgKCBTdHJpbmcgbXNnICkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbXNnLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgX2xpbmUsIF9jb2x1bW4sIF9vZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBuZXcgWFBhdGhDb21waWxlRXhjZXB0aW9uKCBlcnIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBsb29rdXBQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25hbWVzcGFjZXMuY29udGFpbnNLZXkoIHByZWZpeCApKQotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfbmFtZXNwYWNlcy5nZXQoIHByZWZpeCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2V4dGVybmFsTmFtZXNwYWNlcy5jb250YWluc0tleSggcHJlZml4ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9leHRlcm5hbE5hbWVzcGFjZXMuZ2V0KCBwcmVmaXggKTsKLQotICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCAieHMiICkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoICJ4c2kiICkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoICJmbiIgKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8xMS94cXVlcnktZnVuY3Rpb25zIjsKLQotICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJVbmRlZmluZWQgcHJlZml4OiAiICsgcHJlZml4ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VXaGl0ZXNwYWNlICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2F3U3BhY2UgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgIHNhd1NwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNhd1NwYWNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBUb2tlbml6aW5nIHdpbGwgY29uc3VtZSB3aGl0ZXNwYWNlIGZvbGxvd2VkIGJ5IHRoZSB0b2tlbnMsIHNlcGFyYXRlZAotICAgICAgICAvLyBieSB3aGl0ZXNwYWNlLiAgVGhlIHdoaXRlc3BhY2UgZm9sbG93aW5nIHRoZSBsYXN0IHRva2VuIGlzIG5vdAotICAgICAgICAvLyBjb25zdW1lZC4KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB0b2tlbml6ZSAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzLCBvZmZzZXQgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBzLmxlbmd0aCgpOwotCi0gICAgICAgICAgICBhZHZhbmNlKCBvZmZzZXQgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdG9rZW5pemUgKCBTdHJpbmcgczEsIFN0cmluZyBzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzMS5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgczIubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMSwgb2Zmc2V0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvZmZzZXQgKz0gczEubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggczIsIG9mZnNldCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIG9mZnNldCArPSBzMi5sZW5ndGgoKTsKLQotICAgICAgICAgICAgYWR2YW5jZSggb2Zmc2V0ICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRva2VuaXplICggU3RyaW5nIHMxLCBTdHJpbmcgczIsIFN0cmluZyBzMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzMS5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgczIubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgYXNzZXJ0IHMzLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggczEsIG9mZnNldCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IHMxLmxlbmd0aCgpOwotCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMyLCBvZmZzZXQgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBvZmZzZXQgKz0gczIubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggczMsIG9mZnNldCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgb2Zmc2V0ICs9IHMzLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYWR2YW5jZSggb2Zmc2V0ICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW5pemVOQ05hbWUgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2VXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghaXNOQ05hbWVTdGFydCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgbm9uLWNvbG9uaXplZCBuYW1lIiApOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggKGNoYXIpIGN1cnJDaGFyKCkgKTsKLQotICAgICAgICAgICAgZm9yICggYWR2YW5jZSgpIDsgaXNOQ05hbWUoKSA7IGFkdmFuY2UoKSApCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAoY2hhcikgY3VyckNoYXIoKSApOwotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgZ2V0QW55UU5hbWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoICIiLCAiIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFFOYW1lIHRva2VuaXplUU5hbWUgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiKiIgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QW55UU5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIG5jTmFtZSA9IHRva2VuaXplTkNOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmICghdG9rZW5pemUoICI6IiApKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIGxvb2t1cFByZWZpeCggIiIgKSwgbmNOYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgbG9va3VwUHJlZml4KCBuY05hbWUgKSwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5pemUoICIqIiApID8gIiIgOiB0b2tlbml6ZU5DTmFtZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRva2VuaXplUXVvdGVkVXJpICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgcXVvdGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIlwiIiApKQotICAgICAgICAgICAgICAgIHF1b3RlID0gJyInOwotICAgICAgICAgICAgZWxzZSAgaWYgKHRva2VuaXplKCAiJyIgKSkKLSAgICAgICAgICAgICAgICBxdW90ZSA9ICdcJyc7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCBxdW90ZSAoXCIgb3IgJykiICk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VyckNoYXIoKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJQYXRoIHRlcm1pbmF0ZWQgaW4gVVJJIGxpdGVyYWwiICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJDaGFyKCkgPT0gcXVvdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckNoYXIoKSAhPSBxdW90ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIChjaGFyKSBjdXJyQ2hhcigpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RlcCBhZGRTdGVwICggYm9vbGVhbiBkZWVwLCBib29sZWFuIGF0dHIsIFFOYW1lIG5hbWUsIFN0ZXAgc3RlcHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdGVwIHN0ZXAgPSBuZXcgU3RlcCggZGVlcCwgYXR0ciwgbmFtZSApOwotCi0gICAgICAgICAgICBpZiAoc3RlcHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RlcDsKLQotICAgICAgICAgICAgU3RlcCBzID0gc3RlcHM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlICggc3RlcHMuX25leHQgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgc3RlcHMgPSBzdGVwcy5fbmV4dDsKLQotICAgICAgICAgICAgc3RlcHMuX25leHQgPSBzdGVwOwotICAgICAgICAgICAgc3RlcC5fcHJldiA9IHN0ZXBzOwotCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RlcCB0b2tlbml6ZVN0ZXBzICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIi8iICkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJBYnNvbHV0ZSBwYXRocyB1bnN1cHBvcnRlZCIgKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBkZWVwOwotCi0gICAgICAgICAgICBpZiAodG9rZW5pemUoICIkIiwgX2N1cnJlbnROb2RlVmFyLCAiLy8iICkgfHwgdG9rZW5pemUoICIuIiwgIi8vIiApKQotICAgICAgICAgICAgICAgIGRlZXAgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5pemUoICIkIiwgX2N1cnJlbnROb2RlVmFyLCAiLyIgKSB8fCB0b2tlbml6ZSggIi4iLCAiLyIgKSkKLSAgICAgICAgICAgICAgICBkZWVwID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggIiQiLCBfY3VycmVudE5vZGVWYXIgKSB8fCB0b2tlbml6ZSggIi4iICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFN0ZXAoIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRlZXAgPSBmYWxzZTsKLQotICAgICAgICAgICAgU3RlcCBzdGVwcyA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIHN0ZXBzIHJlbW92aW5nIC8uIGFuZCBtZXJnaW5kIC8vLiB3aXRoIHRoZSBuZXh0IHN0ZXAKLQotICAgICAgICAgICAgYm9vbGVhbiBkZWVwRG90ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiYXR0cmlidXRlIiwgIjo6IiApIHx8IHRva2VuaXplKCAiQCIgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZXBzID0gYWRkU3RlcCggZGVlcCwgdHJ1ZSwgdG9rZW5pemVRTmFtZSgpLCBzdGVwcyApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIi4iICkpCi0gICAgICAgICAgICAgICAgICAgIGRlZXBEb3QgPSBkZWVwRG90IHx8IGRlZXA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5pemUoICJjaGlsZCIsICI6OiIgKSAmJiAobmFtZSA9IHRva2VuaXplUU5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBhZGRTdGVwKCBkZWVwLCBmYWxzZSwgbmFtZSwgc3RlcHMgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgobmFtZSA9IHRva2VuaXplUU5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBhZGRTdGVwKCBkZWVwLCBmYWxzZSwgbmFtZSwgc3RlcHMgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIi8vIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVlcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGRlZXBEb3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5pemUoICIvIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlZXBEb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgLy8uIGF0IHRoZSBlbmQgb2YgdGggcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2UKLSAgICAgICAgICAgIC8vIHR3byBwYXRocywgb25lIHdpdGggKiBhdCB0aGUgZW5kIGFuZCBhbm90aGVyIHdpdGggQCogYXQgdGhlIGVuZC4KLQotICAgICAgICAgICAgaWYgKChfbGFzdERlZXBEb3QgPSBkZWVwRG90KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbGFzdERlZXBEb3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN0ZXBzID0gYWRkU3RlcCggdHJ1ZSwgZmFsc2UsIGdldEFueVFOYW1lKCksIHN0ZXBzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBzZW50aW5hbCBzdGVwIChfbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gYWRkU3RlcCggZmFsc2UsIGZhbHNlLCBudWxsLCBzdGVwcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVCYWNrdHJhY2sgKCBTdGVwIHN0ZXBzICkKLSAgICAgICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIENvbXB1dGUgc3RhdGljIGJhY2t0cmFjayBpbmZvcm1hdGlvbgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBJIHVzZSB0aGUgZmFjdCB0aGF0IF9oYXNCYWNrdHJhY2sgaXMgaW5pdGlhbGl6ZWQgdG8KLSAgICAgICAgICAgIC8vIGZhbHNlIGFuZCBfYmFja3RyYWNrIHRvIG51bGwgaW4gdGhlIGZvbGxvd2luZyBjb2RlLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgU3RlcCBzLCB0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBzID0gc3RlcHMgOyBzICE9IG51bGwgOyBzID0gdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc2VnbWVudCBmcm9tIFsgcywgdCApCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggdCA9IHMuX25leHQgOyB0ICE9IG51bGwgJiYgIXQuX2RlZXAgOyApCi0gICAgICAgICAgICAgICAgICAgIHQgPSB0Ll9uZXh0OwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlZ21lbnQgaXMgTk9UIHJvb3RlZCBhdCAvLywgdGhlbiB0aGUgYmFja3RyYWNrIGlzCi0gICAgICAgICAgICAgICAgLy8gbnVsbCBmb3IgdGhlIGVudGlyZSBzZWdtZW50LCBpbmNsdWRpbmcgcG9zc2libGUgYXR0ciBhbmQvb3IKLSAgICAgICAgICAgICAgICAvLyBzZW50aW5hbAotCi0gICAgICAgICAgICAgICAgaWYgKCFzLl9kZWVwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU3RlcCB1ID0gcyA7IHUgIT0gdCA7IHUgPSB1Ll9uZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHUuX2hhc0JhY2t0cmFjayA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc2VxdWVuY2UgWyBzLCB1ICkgb2YgbGVuZ3RoIG4gd2hpY2ggY29udGFpbiBubwotICAgICAgICAgICAgICAgIC8vIHdpbGQgc3RlcHMuCi0KLSAgICAgICAgICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgICAgICAgICAgU3RlcCB1ID0gczsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggdSAhPSB0ICYmIHUuX25hbWUgIT0gbnVsbCAmJiAhdS5pc1dpbGQoKSAmJiAhdS5fYXR0ciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgICAgIHUgPSB1Ll9uZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdywgYXBwbHkgS01QIHRvIFsgcywgdSApIGZvciBmYXN0IGJhY2t0cmFja2luZwotCi0gICAgICAgICAgICAgICAgUU5hbWUgW10gcGF0dGVybiA9IG5ldyBRTmFtZSBbIG4gKyAxIF07Ci0gICAgICAgICAgICAgICAgaW50IFtdIGttcCA9IG5ldyBpbnQgWyBuICsgMSBdOwotCi0gICAgICAgICAgICAgICAgU3RlcCB2ID0gczsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuWyBpIF0gPSB2Ll9uYW1lOwotICAgICAgICAgICAgICAgICAgICB2ID0gdi5fbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXR0ZXJuWyBuIF0gPSBnZXRBbnlRTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIGludCBqID0ga21wWyAwIF0gPSAtMTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggaSA8IG4gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBqID4gLTEgJiYgIXBhdHRlcm5bIGkgXS5lcXVhbHMoIHBhdHRlcm5bIGogXSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSBrbXBbIGogXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVyblsgKytpIF0uZXF1YWxzKCBwYXR0ZXJuWyArK2ogXSApKQotICAgICAgICAgICAgICAgICAgICAgICAga21wWyBpIF0gPSBrbXBbIGogXTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAga21wWyBpIF0gPSBqOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIHYgPSBzIDsgdiAhPSB1IDsgdiA9IHYuX25leHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdi5faGFzQmFja3RyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdi5fYmFja3RyYWNrID0gczsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSBrbXBbIGkgXSA7IGogPiAwIDsgai0tICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuX2JhY2t0cmFjayA9IHYuX2JhY2t0cmFjay5fbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzdWNjZXNzIGJhY2t0cmFjayBhbmQgc3R1ZmYgaXQgaW50byBhbiBhdHRyIGFuZAotICAgICAgICAgICAgICAgIC8vIHNlbnRpbmFsIGlmIHRoZXkgZXhpc3QgZm9yIHRoaXMgc2VnbWVudAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHYgPSBzOwotCi0gICAgICAgICAgICAgICAgaWYgKG4gPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IGttcFsgbiAtIDEgXSA7IGogPiAwIDsgai0tICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2Ll9uZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh1ICE9IHQgJiYgdS5fYXR0cikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHUuX2hhc0JhY2t0cmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHUuX2JhY2t0cmFjayA9IHY7Ci0gICAgICAgICAgICAgICAgICAgIHUgPSB1Ll9uZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh1ICE9IHQgJiYgdS5fbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdS5faGFzQmFja3RyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdS5fYmFja3RyYWNrID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBvZiBhIGRlZXAgc2VnbWVudCBhbHdheXMgYmFja3RyYWNrcyB0byBpdHNlbGYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5fZGVlcDsKLQotICAgICAgICAgICAgICAgIHMuX2hhc0JhY2t0cmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcy5fYmFja3RyYWNrID0gczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB0b2tlbml6ZVBhdGggKCBBcnJheUxpc3QgcGF0aHMgKQotICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfbGFzdERlZXBEb3QgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RlcCBzdGVwcyA9IHRva2VuaXplU3RlcHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29tcHV0ZUJhY2t0cmFjayggc3RlcHMgKTsKLQotICAgICAgICAgICAgcGF0aHMuYWRkKCBzdGVwcyApOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBwYXRoIGVuZGVkIGluIC8vLiwgdGhhdCBwYXRoIHdpbGwgbWF0Y2ggYWxsCi0gICAgICAgICAgICAvLyBlbGVtZW50cywgaGVyZSBJIG1ha2UgYSBwYXRoIHdoaWNoIG1hdGNoZXMgYWxsIGF0dHJpYnV0ZXMuCi0KLSAgICAgICAgICAgIGlmIChfbGFzdERlZXBEb3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Nhd0RlZXBEb3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0ZXAgcyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBTdGVwIHQgPSBzdGVwcyA7IHQgIT0gbnVsbCA7IHQgPSB0Ll9uZXh0ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0Ll9uZXh0ICE9IG51bGwgJiYgdC5fbmV4dC5fbmV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGFkZFN0ZXAoIHQuX2RlZXAsIHRydWUsIHQuX25hbWUsIHMgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGFkZFN0ZXAoIHQuX2RlZXAsIHQuX2F0dHIsIHQuX25hbWUsIHMgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb21wdXRlQmFja3RyYWNrKCBzICk7Ci0KLSAgICAgICAgICAgICAgICBwYXRocy5hZGQoIHMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTZWxlY3RvciB0b2tlbml6ZVNlbGVjdG9yICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgdG9rZW5pemVQYXRoKCBwYXRocyApOwotCi0gICAgICAgICAgICB3aGlsZSAoIHRva2VuaXplKCAifCIgKSApCi0gICAgICAgICAgICAgICAgdG9rZW5pemVQYXRoKCBwYXRocyApOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yKCAoU3RlcFtdKSBwYXRocy50b0FycmF5KCBuZXcgU3RlcCBbIDAgXSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFhQYXRoIHRva2VuaXplWFBhdGggKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5pemUoICJkZWNsYXJlIiwgIm5hbWVzcGFjZSIgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VXaGl0ZXNwYWNlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkV4cGVjdGVkIHByZWZpeCBhZnRlciAnZGVjbGFyZSBuYW1lc3BhY2UnIiApOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB0b2tlbml6ZU5DTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghdG9rZW5pemUoICI9IiApKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCAnPSciICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHRva2VuaXplUXVvdGVkVXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZXMuY29udGFpbnNLZXkoIHByZWZpeCApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVkZWZpbml0aW9uIG9mIG5hbWVzcGFjZSBwcmVmaXg6ICIgKyBwcmVmaXggKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzLnB1dCggcHJlZml4LCB1cmkgKTsKLQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiZGVmYXVsdCIsICJlbGVtZW50IiwgIm5hbWVzcGFjZSIgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdG9rZW5pemUoICI9IiApKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCAnPSciICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gdG9rZW5pemVRdW90ZWRVcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlcy5jb250YWluc0tleSggIiIgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZGVmaW5pdGlvbiBvZiBkZWZhdWx0IGVsZW1lbnQgbmFtZXNwYWNlIiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMucHV0KCAiIiwgdXJpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgcHJlZml4IG1hcHBpbmcgaWYgaXQgaGFzIG5vdCBiZWVuIHJlZGVmaW5lZAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIV9uYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCAiIiApKQotICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzLnB1dCggIiIsICIiICk7Ci0KLSAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gdG9rZW5pemVTZWxlY3RvcigpOwotCi0gICAgICAgICAgICBwYXJzZVdoaXRlc3BhY2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGN1cnJDaGFyKCkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXIgJyIgKyAoY2hhcikgY3VyckNoYXIoKSArICInIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhQYXRoKCBzZWxlY3RvciwgX3Nhd0RlZXBEb3QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9leHByOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBfc2F3RGVlcERvdDsgIC8vIFNhdyBvbmUgb3ZlcmFsbAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2xhc3REZWVwRG90OwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9jdXJyZW50Tm9kZVZhcjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgTWFwIF9uYW1lc3BhY2VzOwotICAgICAgICBwcml2YXRlIE1hcCBfZXh0ZXJuYWxOYW1lc3BhY2VzOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBpbnQgX29mZnNldDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX2xpbmU7Ci0gICAgICAgIHByaXZhdGUgaW50IF9jb2x1bW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3RlcAotICAgIHsKLSAgICAgICAgU3RlcCAoIGJvb2xlYW4gZGVlcCwgYm9vbGVhbiBhdHRyLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgX25hbWUgPSBuYW1lOwotCi0gICAgICAgICAgICBfZGVlcCA9IGRlZXA7Ci0gICAgICAgICAgICBfYXR0ciA9IGF0dHI7Ci0KLSAgICAgICAgICAgIGludCBmbGFncyA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChfZGVlcCB8fCAhX2F0dHIpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRXhlY3V0aW9uQ29udGV4dC5ERVNDRU5EOwotCi0gICAgICAgICAgICBpZiAoX2F0dHIpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRXhlY3V0aW9uQ29udGV4dC5BVFRSUzsKLQotICAgICAgICAgICAgX2ZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzV2lsZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9uYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIG1hdGNoICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IF9uYW1lLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgICAgICBpZiAobG9jYWwubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gX25hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVyaS5lcXVhbHMoIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIF9uYW1lLmVxdWFscyggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBfYXR0cjsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBfZGVlcDsKLQotICAgICAgICBpbnQgX2ZsYWdzOwotICAgICAgICAKLSAgICAgICAgZmluYWwgUU5hbWUgX25hbWU7Ci0KLSAgICAgICAgU3RlcCBfbmV4dCwgX3ByZXY7Ci0KLSAgICAgICAgYm9vbGVhbiBfaGFzQmFja3RyYWNrOwotICAgICAgICBTdGVwICAgIF9iYWNrdHJhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2VsZWN0b3IKLSAgICB7Ci0gICAgICAgIFNlbGVjdG9yICggU3RlcFtdIHBhdGhzICkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhdGhzID0gcGF0aHM7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdGVwW10gX3BhdGhzOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotICAgIAotICAgIHByaXZhdGUgWFBhdGggKCBTZWxlY3RvciBzZWxlY3RvciwgYm9vbGVhbiBzYXdEZWVwRG90ICkKLSAgICB7Ci0gICAgICAgIF9zZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBfc2F3RGVlcERvdCA9IHNhd0RlZXBEb3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2F3RGVlcERvdCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2F3RGVlcERvdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIF9zZWxlY3RvcjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gIF9zYXdEZWVwRG90OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFbmNvZGluZ1NuaWZmZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFbmNvZGluZ1NuaWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MWFlYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRW5jb2RpbmdTbmlmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWG1sRW5jb2RpbmdTbmlmZmVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICBfeG1sZW5jb2Rpbmc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICBfamF2YWVuY29kaW5nOwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gX3N0cmVhbTsKLSAgICBwcml2YXRlIFJlYWRlciAgICAgIF9yZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTbmlmZnMgdGhlIGdpdmVuIFhNTCBzdHJlYW0gZm9yIGVuY29kaW5nIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogQWZ0ZXIgYSBzbmlmZmVyIGlzIGNvbnN0cnVjdGVkLCBpdCBjYW4gcmV0dXJuIGVpdGhlciBhIHN0cmVhbQotICAgICAqICh3aGljaCBpcyBhIGJ1ZmZlcmVkIHN0cmVhbSB3cmFwcGVyIG9mIHRoZSBvcmlnaW5hbCkgb3IgYSByZWFkZXIKLSAgICAgKiAod2hpY2ggYXBwbGllcyB0aGUgcHJvcGVyIGVuY29kaW5nKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJlYW0gICAgICAgICAgIFRoZSBzdHJlYW0gdG8gc25pZmYKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmdPdmVycmlkZSBUaGUgWE1MIChJQU5BKSBuYW1lIGZvciB0aGUgb3ZlcnJpZGluZyBlbmNvZGluZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sRW5jb2RpbmdTbmlmZmVyKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nT3ZlcnJpZGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX3N0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgCi0gICAgICAgIGlmIChlbmNvZGluZ092ZXJyaWRlICE9IG51bGwpCi0gICAgICAgICAgICBfeG1sZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRKYXZhMklBTkFNYXBwaW5nKGVuY29kaW5nT3ZlcnJpZGUpOwotCi0gICAgICAgIGlmIChfeG1sZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IGVuY29kaW5nT3ZlcnJpZGU7Ci0KLSAgICAgICAgaWYgKF94bWxlbmNvZGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTbmlmZmVkWG1sSW5wdXRTdHJlYW0gc25pZmZlZCA9IG5ldyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0oX3N0cmVhbSk7Ci0gICAgICAgICAgICBfeG1sZW5jb2RpbmcgPSBzbmlmZmVkLmdldFhtbEVuY29kaW5nKCk7Ci0gICAgICAgICAgICBhc3NlcnQoX3htbGVuY29kaW5nICE9IG51bGwpOwotICAgICAgICAgICAgX3N0cmVhbSA9IHNuaWZmZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBfamF2YWVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SUFOQTJKYXZhTWFwcGluZyhfeG1sZW5jb2RpbmcpOwotICAgICAgICAKLSAgICAgICAgLy8gd2UgYWxsb3cgeW91IHRvIHVzZSBKYXZhJ3MgZW5jb2RpbmcgbmFtZXMgaW4gWE1MIGV2ZW4gdGhvdWdoIHlvdSdyZQotICAgICAgICAvLyBub3Qgc3VwcG9zZWQgdG8uCi0gICAgICAgIAotICAgICAgICBpZiAoX2phdmFlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX2phdmFlbmNvZGluZyA9IF94bWxlbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTbmlmZnMgdGhlIGdpdmVuIFhNTCBzdHJlYW0gZm9yIGVuY29kaW5nIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogQWZ0ZXIgYSBzbmlmZmVyIGlzIGNvbnN0cnVjdGVkLCBpdCBjYW4gcmV0dXJuIGVpdGhlciBhIHJlYWRlcgotICAgICAqICh3aGljaCBpcyBhIGJ1ZmZlcmVkIHN0cmVhbSB3cmFwcGVyIG9mIHRoZSBvcmlnaW5hbCkgb3IgYSBzdHJlYW0KLSAgICAgKiAod2hpY2ggYXBwbGllcyB0aGUgcHJvcGVyIGVuY29kaW5nKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIgICAgICAgICAgIFRoZSByZWFkZXIgdG8gc25pZmYKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmdEZWZhdWx0ICBUaGUgSmF2YSBuYW1lIGZvciB0aGUgZGVmYXVsdCBlbmNvZGluZyB0byBhcHBseSwgVVRGLTggaWYgbnVsbC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFhtbEVuY29kaW5nU25pZmZlcihSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZW5jb2RpbmdEZWZhdWx0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZW5jb2RpbmdEZWZhdWx0ID09IG51bGwpCi0gICAgICAgICAgICBlbmNvZGluZ0RlZmF1bHQgPSAiVVRGLTgiOwotICAgICAgICAKLSAgICAgICAgU25pZmZlZFhtbFJlYWRlciBzbmlmZmVkUmVhZGVyID0gbmV3IFNuaWZmZWRYbWxSZWFkZXIocmVhZGVyKTsKLSAgICAgICAgX3JlYWRlciA9IHNuaWZmZWRSZWFkZXI7Ci0gICAgICAgIF94bWxlbmNvZGluZyA9IHNuaWZmZWRSZWFkZXIuZ2V0WG1sRW5jb2RpbmcoKTsKLQotICAgICAgICBpZiAoX3htbGVuY29kaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoZW5jb2RpbmdEZWZhdWx0KTsKLSAgICAgICAgICAgIGlmIChfeG1sZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfamF2YWVuY29kaW5nID0gZW5jb2RpbmdEZWZhdWx0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IGVuY29kaW5nRGVmYXVsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfeG1sZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9ICJVVEYtOCI7Ci0gICAgICAgIAotICAgICAgICAvLyB3ZSBhbGxvdyB5b3UgdG8gdXNlIEphdmEncyBlbmNvZGluZyBuYW1lcyBpbiBYTUwgZXZlbiB0aG91Z2ggeW91J3JlCi0gICAgICAgIC8vIG5vdCBzdXBwb3NlZCB0by4KLSAgICAgICAgCi0gICAgICAgIF9qYXZhZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKF94bWxlbmNvZGluZyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoX2phdmFlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX2phdmFlbmNvZGluZyA9IF94bWxlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfeG1sZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9qYXZhZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpCi0gICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF9zdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBfc3RyZWFtOwotICAgICAgICAgICAgX3N0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3JlYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBSZWFkZXJJbnB1dFN0cmVhbSggX3JlYWRlciwgX2phdmFlbmNvZGluZyApOwotICAgICAgICAgICAgX3JlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyICggKQotICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF9yZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IF9yZWFkZXI7Ci0gICAgICAgICAgICBfcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBfc3RyZWFtLCBfamF2YWVuY29kaW5nICk7Ci0gICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JDb250ZXh0LmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZmU0NWQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbEVycm9yQ29udGV4dAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk5PVF9MT0FEX1hTRF9GSUxFICAgICAgICAgICAgICA9ICAgMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5OT1RfTE9BRF9YU0RfQ09ORklHX0ZJTEUgICAgICAgPSAgIDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fU0NIRU1BX0VMRU1FTlQgICAgICAgICAgICAgICAgID0gICAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfVEFSR0VUX05BTUVTUEFDRSAgICAgICA9ICAgNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTE9CQUxfVFlQRV9NSVNTSU5HX05BTUUgICAgICAgICAgPSAgIDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgID0gICA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRFVOREFOVF9ORVNURURfVFlQRSAgICAgICAgICAgICA9ICAgNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX01JU1NJTkdfTkFNRSAgICAgICAgICAgICAgPSAgIDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQgICAgICAgICAgID0gICA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0dST1VQX01JU1NJTkdfTkFNRSAgICAgICAgICA9ICAxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfTUlTU0lOR19OQU1FICAgICAgICAgICAgPSAgMTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0dST1VQX01JU1NJTkdfTkFNRSAgICAgID0gIDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENZQ0xJQ19ERVBFTkRFTkNZICAgICAgICAgICAgICAgICA9ICAxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTklPTl9NRU1CRVJfTk9UX1NJTVBMRSAgICAgICAgICAgPSAgMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVFJJQ1RJT05fUkVEVU5EQU5UX0JBU0UgICAgICAgID0gIDE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RSSUNUSU9OX01JU1NJTkdfQkFTRSAgICAgICAgICA9ICAxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfUkVTVFJJQ1RJT05fTk9UX1NJTVBMRSAgICAgPSAgMTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRE9FU19OT1RfQVBQTFkgICAgICAgICAgICAgID0gIDE4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0RVUExJQ0FURUQgICAgICAgICAgICAgICAgICA9ICAxOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9WQUxVRV9NQUxGT1JNRUQgICAgICAgICAgICAgPSAgMjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRklYRUQgICAgICAgICAgICAgICAgICAgICAgID0gIDIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTEZPUk1FRF9OVU1CRVIgICAgICAgICAgICAgICAgICA9ICAyMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUX01JU1NJTkdfSVRFTSAgICAgICAgICAgICAgICAgPSAgMjI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX05PVF9TSU1QTEUgICAgICAgICAgICAgID0gIDIzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfT0ZfTElTVCAgICAgICAgICAgICAgICAgICAgICA9ICAyNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUX1dISVRFU1BBQ0UgICAgICAgICAgICAgICAgICAgPSAgMjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEVU5EQU5UX0NPTlRFTlRfTU9ERUwgICAgICAgICAgID0gIDI2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfUkVTVFJJQ1RJT05fT1JfRVhURU5TSU9OICA9ICAyNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX0JBU0UgICAgICAgICAgICAgICAgICAgICAgPSAgMjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9SRUZfTk9UX0ZPVU5EICAgICAgICAgICAgID0gIDI5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfRVhUUkFfUkVGICAgICAgICAgICAgICAgICA9ICAzMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfQ09OVEVOVFMgICAgICAgICAgICAgICAgICAgICAgPSAgMzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQTElDSVRfR1JPVVBfTkVFREVEICAgICAgICAgICAgID0gIDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdST1VQX01JU1NJTkdfUkVGICAgICAgICAgICAgICAgICA9ICAzMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9HUk9VUF9OT1RfRk9VTkQgICAgICAgICAgICAgPSAgMzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX01BWF9PQ0NVUlMgICAgICAgICAgICAgICAgICAgID0gIDM1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9SRUZfTk9UX0ZPVU5EICAgICAgICAgICA9ICAzNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfQVRUUklCVVRFX05BTUUgICAgICAgICAgPSAgMzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0FOWV9BVFRSSUJVVEUgICAgICAgICAgID0gIDM4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUF9NSVNTSU5HX1JFRiAgICAgICA9ICAzOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVBfTk9UX0ZPVU5EICAgICAgICAgPSAgNDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9CQVNFX05PVF9DT01QTEVYICAgICAgICAgID0gIDQxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk5PVF9FWFRFTkRfQUxMICAgICAgICAgICAgICAgICA9ICA0MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfQkFTRV9OT1RfU0lNUExFICAgICAgICAgICAgPSAgNDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVJWRURfVFlQRV9OQU1FICAgICAgICAgICAgICAgID0gIDQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElMTEVHQUxfUkVTVFJJQ1RJT04gICAgICAgICAgICAgICA9ICA0NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1NDSEVNQSAgICAgICAgICAgICAgICAgICAgPSAgNDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0dMT0JBTF9FTEVNRU5UICAgICAgICAgID0gIDQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9HTE9CQUxfQVRUUklCVVRFICAgICAgICA9ICA0ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfR0xPQkFMX1RZUEUgICAgICAgICAgICAgPSAgNDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DT05TSVNURU5UX1RZUEUgICAgICAgICAgICAgICAgID0gIDUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX0ZFQVRVUkUgICAgICAgICAgICAgICA9ICA1MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUxGT1JNRURfU0lNUExFX1RZUEVfREVGTiAgICAgICAgPSAgNTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gIDUzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk5PVF9ERVJJVkVfRklOQUwgICAgICAgICAgICAgICA9ICA1NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRENfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgPSAgNTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UgICAgICAgICAgICAgID0gIDU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkRFVEVSTUlOSVNUSUNfTU9ERUwgICAgICAgICAgICA9ICA1NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFICAgICAgICAgPSAgNTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJJQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgID0gIDYwOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yUHJpbnRlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk1NWU2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvclByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotcHVibGljIGNsYXNzIFhtbEVycm9yUHJpbnRlciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotewotICAgIHByaXZhdGUgYm9vbGVhbiBfbm9pc3k7Ci0gICAgcHJpdmF0ZSBVUkkgX2Jhc2VVUkk7Ci0KLSAgICBwdWJsaWMgWG1sRXJyb3JQcmludGVyKGJvb2xlYW4gbm9pc3ksIFVSSSBiYXNlVVJJKQotICAgIHsKLSAgICAgICAgX25vaXN5ID0gbm9pc3k7Ci0gICAgICAgIF9iYXNlVVJJID0gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhtbEVycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFcnJvciBlcnIgPSAoWG1sRXJyb3IpbzsKLSAgICAgICAgICAgIGlmIChlcnIuZ2V0U2V2ZXJpdHkoKSA9PSBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiB8fAotICAgICAgICAgICAgICAgIGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX1dBUk5JTkcpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGVyci50b1N0cmluZyhfYmFzZVVSSSkpOwotICAgICAgICAgICAgZWxzZSBpZiAoX25vaXN5KQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnIudG9TdHJpbmcoX2Jhc2VVUkkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yV2F0Y2hlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTBmMjM2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvcldhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1wdWJsaWMgY2xhc3MgWG1sRXJyb3JXYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCi17Ci0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF91bmRlcmx5aW5nOwotICAgIHByaXZhdGUgWG1sRXJyb3IgX2ZpcnN0RXJyb3I7Ci0KLSAgICBwdWJsaWMgWG1sRXJyb3JXYXRjaGVyKENvbGxlY3Rpb24gdW5kZXJseWluZykKLSAgICB7Ci0gICAgICAgIF91bmRlcmx5aW5nID0gdW5kZXJseWluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAoX2ZpcnN0RXJyb3IgPT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgWG1sRXJyb3IgJiYgKChYbWxFcnJvcilvKS5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKQotICAgICAgICAgICAgX2ZpcnN0RXJyb3IgPSAoWG1sRXJyb3IpbzsKLSAgICAgICAgaWYgKF91bmRlcmx5aW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBfdW5kZXJseWluZy5hZGQobyk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdW5kZXJseWluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQotICAgICAgICByZXR1cm4gX3VuZGVybHlpbmcuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmRlcmx5aW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICByZXR1cm4gX3VuZGVybHlpbmcuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmlyc3RFcnJvciAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxFcnJvciBmaXJzdEVycm9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmlyc3RFcnJvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXZlbnRCYXNlLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXZlbnRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDVjNjIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEV2ZW50QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5ldmVudHMuRWxlbWVudFR5cGVOYW1lczsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIHR5cGUgcGFydCBYTUxFdmVudC4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sRXZlbnRCYXNlIGltcGxlbWVudHMgWE1MRXZlbnQKLXsKLSAgICBwdWJsaWMgWG1sRXZlbnRCYXNlICggKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEV2ZW50QmFzZSAoIGludCB0eXBlICkKLSAgICB7Ci0gICAgICAgIF90eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlICggaW50IHR5cGUgKQotICAgIHsKLSAgICAgICAgX3R5cGUgPSB0eXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFR5cGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlQXNTdHJpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gRWxlbWVudFR5cGVOYW1lcy5nZXROYW1lKCBfdHlwZSApOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5FTkRfRUxFTUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2UgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuRU5USVRZX1JFRkVSRU5DRTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydFByZWZpeE1hcHBpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kUHJlZml4TWFwcGluZyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbmdlUHJlZml4TWFwcGluZyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0luc3RydWN0aW9uICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRGF0YSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5DSEFSQUNURVJfREFUQTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcGFjZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5TUEFDRTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdWxsICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50Lk5VTExfRUxFTUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydERvY3VtZW50ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZERvY3VtZW50ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkVORF9ET0NVTUVOVDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBfdHlwZTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWE0MDkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotCi1wdWJsaWMgY2xhc3MgWG1sTmFtZUltcGwgaW1wbGVtZW50cyBYTUxOYW1lIHsKLQotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVcmk9bnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lPW51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHByZWZpeD1udWxsOwotICBwcml2YXRlIGludCBoYXNoID0gMDsKLQotICBwdWJsaWMgWG1sTmFtZUltcGwgKCkge30KLSAgcHVibGljIFhtbE5hbWVJbXBsIChTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gIH0KLSAgcHVibGljIFhtbE5hbWVJbXBsIChTdHJpbmcgbmFtZXNwYWNlVXJpLFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICBzZXROYW1lc3BhY2VVcmkobmFtZXNwYWNlVXJpKTsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgfQotICBwdWJsaWMgWG1sTmFtZUltcGwgKFN0cmluZyBuYW1lc3BhY2VVcmksCi0gICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCkgewotICAgIHNldE5hbWVzcGFjZVVyaShuYW1lc3BhY2VVcmkpOwotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKSB7IHJldHVybiBuYW1lc3BhY2VVcmk7IH0KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7IHJldHVybiBsb2NhbE5hbWU7IH0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7IHJldHVybiBwcmVmaXg7IH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVcmkoU3RyaW5nIG5hbWVzcGFjZVVyaSkgewotICAgIGhhc2ggPSAwOwotICAgIGlmIChuYW1lc3BhY2VVcmkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVcmkuZXF1YWxzKCIiKSkgcmV0dXJuOwotICAgIHRoaXMubmFtZXNwYWNlVXJpID0gbmFtZXNwYWNlVXJpOyAKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIGxvY2FsTmFtZSkgeyAKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsgCi0gICAgaGFzaCA9IDA7Ci0gIH0KLSAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsgdGhpcy5wcmVmaXggPSBwcmVmaXg7IH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0gICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBsb2NhbE5hbWU7Ci0gIH0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBpZiAoZ2V0TmFtZXNwYWNlVXJpKCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiAiWyciK2dldE5hbWVzcGFjZVVyaSgpKyInXToiK2dldFF1YWxpZmllZE5hbWUoKTsKLSAgICBlbHNlIAotICAgICAgcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IHRtcF9oYXNoID0gaGFzaDsKLSAgICBpZiAodG1wX2hhc2ggPT0gMCkgewotICAgICAgdG1wX2hhc2ggPSAxNzsKLSAgICAgIGlmIChuYW1lc3BhY2VVcmkgIT0gbnVsbCkgewotCXRtcF9oYXNoID0gMzcqdG1wX2hhc2ggKyBuYW1lc3BhY2VVcmkuaGFzaENvZGUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCkgewotCXRtcF9oYXNoID0gMzcqdG1wX2hhc2ggKyBsb2NhbE5hbWUuaGFzaENvZGUoKTsKLSAgICAgIH0KLSAgICAgIGhhc2ggPSB0bXBfaGFzaDsKLSAgICB9Ci0gICAgcmV0dXJuIHRtcF9oYXNoOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICBpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhNTE5hbWUpIHsKLSAgICAgIGZpbmFsIFhNTE5hbWUgbmFtZT0gKFhNTE5hbWUpIG9iajsKLQotICAgICAgZmluYWwgU3RyaW5nIGxuYW1lID0gbG9jYWxOYW1lOwotICAgICAgaWYgKCEobG5hbWU9PW51bGwgPyBuYW1lLmdldExvY2FsTmFtZSgpPT1udWxsIDogCi0JICAgIGxuYW1lLmVxdWFscyhuYW1lLmdldExvY2FsTmFtZSgpKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmaW5hbCBTdHJpbmcgdXJpID0gbmFtZXNwYWNlVXJpOwotICAgICAgcmV0dXJuICh1cmk9PW51bGwgPyBuYW1lLmdldE5hbWVzcGFjZVVyaSgpPT1udWxsIDoKLQkgICAgICB1cmkuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkpKTsKLQkKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sT2JqZWN0TGlzdC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE9iamVjdExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmZGNjMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sT2JqZWN0TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci0KLS8qKgotICogQSBjbGFzcyB0byBob2xkIGFuZCBjb21wYXJlIGEgbGlzdCBvZiBYbWxPYmplY3RzIGZvciB1c2UgYnkga2V5cwotICoga2V5cmVmcyBkdXJpbmcgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFhtbE9iamVjdExpc3QKLXsKLSAgICBwcml2YXRlIGZpbmFsIFhtbE9iamVjdFtdIF9vYmplY3RzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGVtcHR5IG9iamVjdCBsaXN0IG9mIHRoZSBnaXZlbiBmaXhlZCBzaXplLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxPYmplY3RMaXN0KGludCBvYmplY3RDb3VudCkgewotICAgICAgICBfb2JqZWN0cyA9IG5ldyBYbWxPYmplY3Rbb2JqZWN0Q291bnRdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhbiBvYmplY3QgYnkgaW5kZXggdW5sZXNzIGEgdmFsdWUgaGFzIGJlZW4gcHJldmlvdXNseQotICAgICAqIHNldCBhdCB0aGF0IGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNldCwgZmFsc2UgaWYgdGhlIHZhbHVlIGhhcwotICAgICAqIGFscmVhZHkgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXQoWG1sT2JqZWN0IG8sIGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIGlmIChfb2JqZWN0c1tpbmRleF0gIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBfb2JqZWN0c1tpbmRleF0gPSBvOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNldC4gTmVlZGVkIGZvciBrZXlzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGZpbGxlZCgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX29iamVjdHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgaWYgKF9vYmplY3RzW2ldID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhbGwgdmFsdWVzIGhhdmUgYmVlbiBzZXQuIE5lZWRlZCBmb3Iga2V5cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHVuZmlsbGVkKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9vYmplY3RzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIGlmIChfb2JqZWN0c1tpXSA9PSBudWxsKSByZXR1cm4gaTsKLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKCBvIGluc3RhbmNlb2YgWG1sT2JqZWN0TGlzdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgWG1sT2JqZWN0TGlzdCBvdGhlciA9IChYbWxPYmplY3RMaXN0KW87Ci0KLSAgICAgICAgaWYgKG90aGVyLl9vYmplY3RzLmxlbmd0aCAhPSB0aGlzLl9vYmplY3RzLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBtaXNzaW5nIHZhbHVlcwotICAgICAgICAgICAgaWYgKF9vYmplY3RzW2ldID09IG51bGwgfHwgb3RoZXIuX29iamVjdHNbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmICghIF9vYmplY3RzW2ldLnZhbHVlRXF1YWxzKG90aGVyLl9vYmplY3RzW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGludCBoID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBpZiAoX29iamVjdHNbaV0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoID0gMzEgKiBoICsgX29iamVjdHNbaV0udmFsdWVIYXNoQ29kZSgpOwotCi0gICAgICAgIHJldHVybiBoOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJldHR5dHJpbShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGludCBlbmQ7Ci0gICAgICAgIGZvciAoZW5kID0gcy5sZW5ndGgoKTsgZW5kID4gMDsgZW5kIC09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc1NwYWNlKHMuY2hhckF0KGVuZCAtIDEpKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3RhcnQ7Ci0gICAgICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzU3BhY2Uocy5jaGFyQXQoc3RhcnQpKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX29iamVjdHMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKSBiLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgYi5hcHBlbmQocHJldHR5dHJpbSgoKFNpbXBsZVZhbHVlKV9vYmplY3RzW2ldKS5zdHJpbmdWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sV2hpdGVzcGFjZS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbFdoaXRlc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllMmYyYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sV2hpdGVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbFdoaXRlc3BhY2UKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19VTlNQRUNJRklFRCA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfUFJFU0VSVkUgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1JFUExBQ0UgPSBTY2hlbWFUeXBlLldTX1JFUExBQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfQ09MTEFQU0UgPSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGNoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjaCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsbFNwYWNlKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXNTcGFjZSh2LmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbGxhcHNlKHYsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBhbGdvcml0aG0gdXNlZCBieSBhcHBseV93c2Nhbm9uOiBzb21ldGltZXMgdXNlZCBpbiBpbXBscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xsYXBzZShTdHJpbmcgdiwgaW50IHdzcikKLSAgICB7Ci0gICAgICAgIGlmICh3c3IgPT0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRSB8fCB3c3IgPT0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIGlmICh2LmluZGV4T2YoJ1xuJykgPj0gMCkKLSAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xuJywgJyAnKTsKLSAgICAgICAgaWYgKHYuaW5kZXhPZignXHQnKSA+PSAwKQotICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXHQnLCAnICcpOwotICAgICAgICBpZiAodi5pbmRleE9mKCdccicpID49IDApCi0gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdccicsICcgJyk7Ci0KLSAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1JFUExBQ0UpCi0gICAgICAgICAgICByZXR1cm4gdjsKLQotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGludCBsZW4gPSB2Lmxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApCi0gICAgICAgICAgICByZXR1cm4gdjsKLQotICAgICAgICBpbnQgaTsKLQotICAgICAgICAvKiBhIHRyaWNrOiBleGFtaW5lIGV2ZXJ5IG90aGVyIGNoYXJhY3RlciBsb29raW5nIGZvciBwYWlycyBvZiBzcGFjZXMgKi8KLSAgICAgICAgaWYgKHYuY2hhckF0KDApICE9ICcgJykKLSAgICAgICAgewotICAgICAgICAgICAgZXhhbWluZTogewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDI7IGogPCBsZW47IGogKz0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqIC0gMSkgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5jaGFyQXQoaikgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuICYmIHYuY2hhckF0KGogLSAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBqIGlzIHBvaW50aW5nIGF0IHRoZSBmaXJzdCB3cyB0byBiZSByZW1vdmVkLCBvciBwYXN0IGVuZCAqLwotICAgICAgICAgICAgaSA9IGo7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIGogaXMgcG9pbnRpbmcgYXQgdGhlIGxhc3Qgd2hpdGVzcGFjZSBpbiB0aGUgaW5pdGlhbCBydW4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgd2hpbGUgKGogKyAxIDwgdi5sZW5ndGgoKSAmJiB2LmNoYXJBdChqICsgMSkgPT0gJyAnKQotICAgICAgICAgICAgICAgIGogKz0gMTsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhcltdIGNoID0gdi50b0NoYXJBcnJheSgpOwotCi0gICAgICAgIHNoaWZ0ZXI6IGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaiB3YXMgd3Mgb3IgcGFzdCBlbmQgKi8KLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgaWYgKGogPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOwotICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSAhPSAnICcpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBqIHdhcyBub253cyAqLwotICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOwotICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2hpZnRlcjsKLSAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hbaSsrXSA9IGNoW2orK107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaFtqXSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaCwgMCwgKGkgPT0gMCB8fCBjaFtpIC0gMV0gIT0gJyAnKSA/IGkgOiBpIC0gMSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vcmVhZG1lLnR4dCBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI1MTQzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UaGVyZSBhcmUgaXNvbGF0ZWQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdGFrZW4gZnJvbSB0aGUgQXBhY2hlCi1YZXJjZXMtSiAyLjAgcHJvamVjdAotCi1JdCBjb250YWlucyB2ZXJ5IG1pbm9yIG1vZGlmaWNhdGlvbnMgaW5jbHVkaW5nIGEgY2hhbmdlIGluIG5hbWVzcGFjZS4KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZCBiL3YxL3NyYy9jb25maWdzY2hlbWEvc2NoZW1hL3htbGNvbmZpZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2VkNmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp4Yj0iaHR0cDovL3d3dy5iZWEuY29tLzIwMDIvMDkveGJlYW4vY29uZmlnIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMi8wOS94YmVhbi9jb25maWciCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gIAotICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLz4gCi0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iY29uZmlnIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbmZpZyBlbGVtZW50IGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBmb3IgYW4gLnhzZGNvbmZpZyBmaWxlLgotICAgICAgICAgSXQgY29udGFpbnMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGd1aWRlcyB0aGUgeHNkIGNvbXBpbGVyCi0gICAgICAgICB3aGVuIGl0IGdlbmVyYXRlcyBKYXZhIGNsYXNzZXMuIFlvdSBjYW4gc3BlY2lmeSBwYWNrYWdlIG5hbWVzIHRvCi0gICAgICAgICBiZSB1c2VkIGZvciB3aG9sZSB4bWwgbmFtZXNwYWNlczsgeW91IGNhbiBzcGVjaWZ5IGNsYXNzIG5hbWVzCi0gICAgICAgICB0byB1c2UgZm9yIGluZGl2aWR1YWwgc2NoZW1hIHR5cGVzOyBhbmQgeW91IGNhbiBzdXBwbHkgZXh0ZW5zaW9uCi0gICAgICAgICBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbnMgdG8gYmUgZXh0ZW5kZWQgYnkgdGhlIGdlbmVyYXRlZAotICAgICAgICAgSmF2YSBjbGFzc2VzLgotICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCi0gICAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieGI6bnNjb25maWciPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIFNwZWNpZmllcyBjb25maWd1cmF0aW9uIGZvciBhIG5hbWVzcGFjZS4KLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLQotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieGI6cW5hbWVjb25maWciPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIFNwZWNpZmllcyBqYXZhIG1hcHBpbmcgZm9yIGEgcW5hbWUuCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibnNjb25maWciPgotCi0gICAgPHhzOnNlcXVlbmNlPgotCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHBhY2thZ2UgbmFtZSB0byBiZSB1c2VkIGZvciB0eXBlcyBnZW5lcmF0ZWQgaW4gdGhpcwotICAgICAgICAgICAgbmFtZXNwYWNlLgotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHByZWZpeCB0byBiZSB1c2VkIHRvIHByZXBlbmQgdG8gdG9wLWxldmVsIEphdmEgdHlwZSBuYW1lcwotICAgICAgICAgICAgZ2VuZXJhdGVkIGluIHRoaXMgbmFtZXNwYWNlLiAgKFRoZSBwcmVmaXggaXMgbm90IHVzZWQgZm9yCi0gICAgICAgICAgICBpbm5lciBKYXZhIHR5cGUgZGVmaW5pdGlvbnMuKQotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czplbGVtZW50PgotCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdWZmaXgiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHN1ZmZpeCB0byBiZSB1c2VkIHRvIGFwcGVuZCB0byB0b3AtbGV2ZWwgSmF2YSB0eXBlIG5hbWVzCi0gICAgICAgICAgICBnZW5lcmF0ZWQgaW4gdGhpcyBuYW1lc3BhY2UuIChUaGUgc3VmZml4IGlzIG5vdCB1c2VkIGZvcgotICAgICAgICAgICAgaW5uZXIgSmF2YSB0eXBlIGRlZmluaXRpb25zLikKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwveHM6c2VxdWVuY2U+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ieHM6bmFtZXNwYWNlTGlzdCI+Ci0gICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgQSBsaXN0IG9mIGFueSBudW1iZXIgb2YgbmFtZXNwYWNlIFVSSXMgb3IgIyNsb2NhbCBmb3IgdGhlIG5vLW5hbWVzcGFjZSwKLSAgICAgICAgICBvciAjI2FueSBmb3IgYWxsIG5hbWVzcGFjZXMuCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLQotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZWNvbmZpZyI+Ci0gICAgPHhzOnNlcXVlbmNlLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhbmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibmFtZXNwYWNlTGlzdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICBBIGxpc3Qgb2YgbmFtZXNwYWNlIFVSSXMsIHdpdGggIyNsb2NhbCBmb3Igbm8tdXJpOyBvciAjI2FueSBmb3IgYWxsIFVSSXMuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnVuaW9uPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2FueSIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpsaXN0PgotICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmFueVVSSSI+Ci0gICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjbG9jYWwiLz4KLSAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzOnVuaW9uPgotICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgIDwveHM6bGlzdD4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6dW5pb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gIAotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9Db21wb25lbnRJbmZvLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9Db21wb25lbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTFhNTEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvQ29tcG9uZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRJbmZvCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxKYXZhSW50Zk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxKYXZhSW1wbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Nob3J0SmF2YUludGZOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9zaG9ydEphdmFJbXBsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfYmFzZUludGZOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9iYXNlSW1wbE5hbWU7Ci0gICAgcHJpdmF0ZSBpbnQgX3N1cGVyQ3RyQXJnQ291bnQ7Ci0KLSAgICAvLyBydW50aW1lIHN1cHBvcnQKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gICAgIF9pbXBsTm90QXZhaWxhYmxlOwotICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xhc3MgICAgICAgX2phdmFJbXBsQ2xhc3M7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDb25zdHJ1Y3RvciBfamF2YUltcGxDb25zdHJ1Y3RvcjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbEphdmFJbnRmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9mdWxsSmF2YUludGZOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRKYXZhSW50Zk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBfc2hvcnRKYXZhSW50Zk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbEphdmFJbnRmTmFtZShTdHJpbmcgaW50Zk5hbWUpIHsKLSAgICAgICAgX2Z1bGxKYXZhSW50Zk5hbWUgPSBpbnRmTmFtZTsKLQotICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChfZnVsbEphdmFJbnRmTmFtZS5sYXN0SW5kZXhPZignJCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnVsbEphdmFJbnRmTmFtZS5sYXN0SW5kZXhPZignLicpKSArIDE7Ci0KLSAgICAgICAgX3Nob3J0SmF2YUludGZOYW1lID0gX2Z1bGxKYXZhSW50Zk5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxKYXZhSW1wbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBfZnVsbEphdmFJbXBsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0SmF2YUltcGxOYW1lKCkgewotICAgICAgICByZXR1cm4gX3Nob3J0SmF2YUltcGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxKYXZhSW1wbE5hbWUoU3RyaW5nIGltcGxOYW1lKSB7Ci0gICAgICAgIF9mdWxsSmF2YUltcGxOYW1lID0gaW1wbE5hbWU7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gTWF0aC5tYXgoX2Z1bGxKYXZhSW1wbE5hbWUubGFzdEluZGV4T2YoJyQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z1bGxKYXZhSW1wbE5hbWUubGFzdEluZGV4T2YoJy4nKSkgKyAxOwotCi0gICAgICAgIF9zaG9ydEphdmFJbXBsTmFtZSA9IF9mdWxsSmF2YUltcGxOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZUludGZOYW1lKFN0cmluZyBiYXNlVHlwZSkKLSAgICB7Ci0gICAgICAgIF9iYXNlSW50Zk5hbWUgPSBiYXNlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VJbnRmTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2Jhc2VJbnRmTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlSW1wbE5hbWUoU3RyaW5nIGJhc2V0eXBlKQotICAgIHsKLSAgICAgICAgX2Jhc2VJbXBsTmFtZSA9IGJhc2V0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUltcGxOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmFzZUltcGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3VwZXJDdHJBcmdDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIF9zdXBlckN0ckFyZ0NvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN1cGVyQ3RyQXJnQ291bnQoaW50IGNvdW50KSB7Ci0gICAgICAgIF9zdXBlckN0ckFyZ0NvdW50ID0gY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldEphdmFJbXBsQ2xhc3MoQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgaWYgKF9pbXBsTm90QXZhaWxhYmxlKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaWYgKF9qYXZhSW1wbENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEZ1bGxKYXZhSW1wbE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfamF2YUltcGxDbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0RnVsbEphdmFJbXBsTmFtZSgpLCBmYWxzZSwgY2wpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX2ltcGxOb3RBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIF9pbXBsTm90QXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUltcGxDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uc3RydWN0b3IgZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcihDbGFzc0xvYWRlciBjbCkKLSAgICB7Ci0gICAgICAgIGlmIChfamF2YUltcGxDb25zdHJ1Y3RvciA9PSBudWxsICYmICFfaW1wbE5vdEF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgaW1wbCA9IGdldEphdmFJbXBsQ2xhc3MoY2wpOwotICAgICAgICAgICAgaWYgKGltcGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfamF2YUltcGxDb25zdHJ1Y3RvciA9IGltcGwuZ2V0Q29uc3RydWN0b3IobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUltcGxDb25zdHJ1Y3RvcjsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0VsZW1lbnRJbmZvLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9FbGVtZW50SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWUwZDNlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0VsZW1lbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbXBpbGVyOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluZm8gZXh0ZW5kcyBDb21wb25lbnRJbmZvIHsKLSAgICBwdWJsaWMgc3RhdGljIGludCBOT19WQUxVRSA9IC0xOwotICAgIHByaXZhdGUgaW50IF92YWx1ZVR5cGUgPSBOT19WQUxVRTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlVHlwZShpbnQgdmFsdWVUeXBlKQotICAgIHsKLSAgICAgICAgX3ZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlVHlwZTsKLSAgICB9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJDb2RlR2VuZXJhdG9yLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9KYXhiQ29kZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBiODQ3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJDb2RlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OYW1lVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5KYXhiQ29uZmlnRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkpheGJDb25maWdEb2N1bWVudC5KYXhiQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5KYXhiQ29uZmlnRG9jdW1lbnQuSmF4YkNvbmZpZy5HbG9iYWxFbGVtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuSmF4YkNvbmZpZ0RvY3VtZW50LkpheGJDb25maWcuR2xvYmFsVHlwZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkdsb2JhbFR5cGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXhiQ29kZUdlbmVyYXRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFNjaGVtYVR5cGVTeXN0ZW0gc3RzLCBMaXN0IHNvdXJjZWZpbGVzLCBGaWxlIHNvdXJjZWRpciwgRmlsZSBjbGFzc2VzZGlyLCBYbWxFcnJvcldhdGNoZXIgZXJyb3JzKQotICAgIHsKLSAgICAgICAgTWFwIGNvbXBvbmVudERhdGEgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBNYXAgcGFja2FnZURhdGEgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBib29sZWFuIGZhaWx1cmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoICEgSmF4YkphdmFpemVyLmphdmFpemUoc3RzLCBjb21wb25lbnREYXRhLCBwYWNrYWdlRGF0YSwgZXJyb3JzKSApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSmF4YkNvbmZpZ0RvY3VtZW50IGRvYyA9IEpheGJDb25maWdEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIEpheGJDb25maWcgcm9vdCA9IGRvYy5hZGROZXdKYXhiQ29uZmlnKCk7Ci0gICAgICAgIEdsb2JhbEVsZW1lbnRzIGVsdHMgPSByb290LmFkZE5ld0dsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICAgIEdsb2JhbFR5cGVzIHR5cGVzID0gcm9vdC5hZGROZXdHbG9iYWxUeXBlcygpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwYWNrYWdlRGF0YS52YWx1ZXMoKS5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWNrYWdlSW5mbyBwaSA9IChQYWNrYWdlSW5mbykgaXQubmV4dCgpOwotCi0gICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBGaXJzdCBjb25zdHJ1Y3QgdGhlIGpheGIucHJvcGVydGllcyBmaWxlIGZvciB0aGlzIHBhY2thZ2UKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBwaS5nZXRQYWNrYWdlTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi9qYXhiLnByb3BlcnRpZXMiOwotICAgICAgICAgICAgICAgIEZpbGUgc291cmNlZmlsZSA9IG5ldyBGaWxlKGNsYXNzZXNkaXIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBzb3VyY2VmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNvdXJjZWZpbGUpOwotICAgICAgICAgICAgICAgIEpheGJDb2RlUHJpbnRlci5wcmludFBhY2thZ2VQcm9wZXJ0aWVzKHdyaXRlciwgcGkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICBmYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7IGlmICh3cml0ZXIgIT0gbnVsbCkgd3JpdGVyLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGdlbmVyYXRlIE9iamVjdEZhY3RvcnkgY2xhc3MKLQotCi0gICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlcyAmIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIHNjaGVtYSBjb21wb25lbnRzCi0gICAgICAgICAgICBMaXN0IGFsbENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhbGxDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0cy5nbG9iYWxFbGVtZW50cygpKSk7Ci0gICAgICAgICAgICBhbGxDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0cy5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBhbGxDb21wb25lbnRzLnNpemUoKSA7IGkgPCBsZW4gOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50IHNjID0gKFNjaGVtYUNvbXBvbmVudClhbGxDb21wb25lbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRJbmZvIGNpID0gKENvbXBvbmVudEluZm8pY29tcG9uZW50RGF0YS5nZXQoc2MpOwotCi0gICAgICAgICAgICAgICAgYWRkQ29tcG9uZW50VG9Db25maWcoc2MsIGNpLCByb290KTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBjaSAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY2kuZ2V0RnVsbEphdmFJbnRmTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIjsKLQotICAgICAgICAgICAgICAgIC8vIHByaW50IHRoZSBqYXZhIGludGVyZmFjZQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBzb3VyY2VmaWxlID0gbmV3IEZpbGUoc291cmNlZGlyLCAgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2VmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihzb3VyY2VmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgSmF4YkNvZGVQcmludGVyLnByaW50SmF2YUludGVyZmFjZSh3cml0ZXIsIHNjLCBjaSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGQoc291cmNlZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBwcmludCB0aGUgamF2YSBpbXBsCi0KLQotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gY2kuZ2V0RnVsbEphdmFJbXBsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIHNvdXJjZWZpbGUgPSBuZXcgRmlsZShzb3VyY2VkaXIsICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNvdXJjZWZpbGUpOwotICAgICAgICAgICAgICAgICAgICBKYXhiQ29kZVByaW50ZXIucHJpbnRKYXZhSW1wbCh3cml0ZXIsIHNjLCBjaSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGQoc291cmNlZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNhdmUgb3V0IHRoZSBqYXhiIGNvbmZpZyBmaWxlCi0KLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLSAgICAgICAgdHJ5IAotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGaXJzdCBjb25zdHJ1Y3QgdGhlIGpheGIucHJvcGVydGllcyBmaWxlIGZvciB0aGlzIHBhY2thZ2UKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHN0cy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiL0pheGJDb25maWcueG1sIjsKLSAgICAgICAgICAgIEZpbGUgc291cmNlZmlsZSA9IG5ldyBGaWxlKGNsYXNzZXNkaXIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZWZpbGUpOwotICAgICAgICAgICAgZG9jLnNhdmUob3MpOwotICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIG9zID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7IGlmIChvcyAhPSBudWxsKSBvcy5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhZGRDb21wb25lbnRUb0NvbmZpZyhTY2hlbWFDb21wb25lbnQgc2MsIENvbXBvbmVudEluZm8gY2ksIEpheGJDb25maWcgY29uZmlnKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChzYy5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgR2xvYmFsRWxlbWVudCBlbHQgPSBjb25maWcuZ2V0R2xvYmFsRWxlbWVudHMoKS5hZGROZXdHbG9iYWxFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZWx0LnNldFFuYW1lKHNjLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZWx0LnNldEphdmFJbXBsKGNpLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9KYXhiQ29kZVByaW50ZXIuamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJDb2RlUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTBiZmNkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJDb2RlUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OYW1lVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEpheGJDb2RlUHJpbnRlcgotewotICAgIFdyaXRlciBfd3JpdGVyOwotICAgIGludCBfaW5kZW50OwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgPT0gbnVsbCA/ICJcbiIgOiBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9JTkRFTlQgPSA0MDsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9TUEFDRVMgPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBJTkRFTlRfSU5DUkVNRU5UID0gNDsKLQotICAgIHB1YmxpYyBKYXhiQ29kZVByaW50ZXIoV3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIF93cml0ZXIgPSB3cml0ZXI7Ci0gICAgICAgIF9pbmRlbnQgPSAwOwotICAgIH0KLQotICAgIHZvaWQgaW5kZW50KCkKLSAgICB7Ci0gICAgICAgIF9pbmRlbnQgKz0gSU5ERU5UX0lOQ1JFTUVOVDsKLSAgICB9Ci0KLSAgICB2b2lkIG91dGRlbnQoKQotICAgIHsKLSAgICAgICAgX2luZGVudCAtPSBJTkRFTlRfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHZvaWQgc3RhcnRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICB9Ci0gICAgdm9pZCBlbmRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotCi0gICAgdm9pZCBlbWl0KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBpbmRlbnQgPSBfaW5kZW50OwotICAgICAgICBpZiAoaW5kZW50ID4gTUFYX0lOREVOVCAvIDIpCi0gICAgICAgICAgICBpbmRlbnQgPSBNQVhfSU5ERU5UIC8gNCArIGluZGVudCAvIDI7Ci0gICAgICAgIGlmIChpbmRlbnQgPiBNQVhfSU5ERU5UKQotICAgICAgICAgICAgaW5kZW50ID0gTUFYX0lOREVOVDsKLSAgICAgICAgX3dyaXRlci53cml0ZShNQVhfU1BBQ0VTLnN1YnN0cmluZygwLCBpbmRlbnQpKTsKLSAgICAgICAgX3dyaXRlci53cml0ZShzKTsKLSAgICAgICAgX3dyaXRlci53cml0ZShMSU5FX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50UGFja2FnZVByb3BlcnRpZXMoV3JpdGVyIHcsIFBhY2thZ2VJbmZvIHBpKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEpheGJDb2RlUHJpbnRlciBwID0gbmV3IEpheGJDb2RlUHJpbnRlcih3KTsKLSAgICAgICAgcC5wcmludFBhY2thZ2VQcm9wZXJ0aWVzKHBpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRKYXZhSW50ZXJmYWNlKFdyaXRlciB3LCBTY2hlbWFDb21wb25lbnQgc2MsIENvbXBvbmVudEluZm8gY2kpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSmF4YkNvZGVQcmludGVyIHAgPSBuZXcgSmF4YkNvZGVQcmludGVyKHcpOwotCi0gICAgICAgIHN3aXRjaCAoc2MuZ2V0Q29tcG9uZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgIHAucHJpbnRFbGVtZW50KChTY2hlbWFHbG9iYWxFbGVtZW50KXNjLCAoRWxlbWVudEluZm8pY2kpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEphdmFJbXBsKFdyaXRlciB3LCBTY2hlbWFDb21wb25lbnQgc2MsIENvbXBvbmVudEluZm8gY2kpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSmF4YkNvZGVQcmludGVyIHAgPSBuZXcgSmF4YkNvZGVQcmludGVyKHcpOwotCi0gICAgICAgIHN3aXRjaCAoc2MuZ2V0Q29tcG9uZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgIHAucHJpbnRFbGVtZW50SW1wbCgoU2NoZW1hR2xvYmFsRWxlbWVudClzYywgKEVsZW1lbnRJbmZvKWNpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UGFja2FnZVByb3BlcnRpZXMoUGFja2FnZUluZm8gcGkpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiIyIgKyBuZXcgRGF0ZSgpKTsKLSAgICAgICAgZW1pdCgiamF2YXgueG1sLmJpbmQuY29udGV4dC5mYWN0b3J5PW9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLnJ1bnRpbWUuQ29udGV4dEltcGwiKTsKLSAgICAgICAgZW1pdCgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuVHlwZVN5c3RlbUhvbGRlcj0iICsgcGkuZ2V0SW5kZXhDbGFzc05hbWUoKSk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQsIEVsZW1lbnRJbmZvIGVpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHByaW50VG9wQ29tbWVudChlbHQsIGVpLCB0cnVlKTsKLSAgICAgICAgcHJpbnRQYWNrYWdlKGVsdCwgZWksIHRydWUpOwotICAgICAgICBwcmludEVsZW1lbnRCb2R5KGVsdCwgZWkpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRFbGVtZW50SW1wbChTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCwgRWxlbWVudEluZm8gZWkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHJpbnRUb3BDb21tZW50KGVsdCwgZWksIGZhbHNlKTsKLSAgICAgICAgcHJpbnRQYWNrYWdlKGVsdCwgZWksIGZhbHNlKTsKLSAgICAgICAgcHJpbnRFbGVtZW50SW1wbEJvZHkoZWx0LCBlaSk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFRvcENvbW1lbnQoU2NoZW1hQ29tcG9uZW50IHNjLCBDb21wb25lbnRJbmZvIGNpLCBib29sZWFuIGludGYpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiLyoiKTsKLSAgICAgICAgZW1pdCgiICogWE1MIFR5cGU6ICAiICsgc2MuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgZW1pdCgiICogTmFtZXNwYWNlOiAiICsgc2MuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgZW1pdCgiICogSmF2YSB0eXBlOiAiICsgKCBpbnRmID8gY2kuZ2V0RnVsbEphdmFJbnRmTmFtZSgpIDogY2kuZ2V0RnVsbEphdmFJbXBsTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIiAqIik7Ci0gICAgICAgIGVtaXQoIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0gZG8gbm90IG1vZGlmeS4iKTsKLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRQYWNrYWdlKFNjaGVtYUNvbXBvbmVudCBzYywgQ29tcG9uZW50SW5mbyBjaSwgYm9vbGVhbiBpbnRmKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBmcWpuOwotICAgICAgICBpZiAoaW50ZikKLSAgICAgICAgICAgIGZxam4gPSBjaS5nZXRGdWxsSmF2YUludGZOYW1lKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZxam4gPSBjaS5nZXRGdWxsSmF2YUltcGxOYW1lKCk7Ci0KLSAgICAgICAgaW50IGxhc3Rkb3QgPSBmcWpuLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGFzc2VydCBsYXN0ZG90ID49IDA7Ci0KLSAgICAgICAgU3RyaW5nIHBrZyA9IGZxam4uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOwotICAgICAgICBlbWl0KCJwYWNrYWdlICIgKyBwa2cgKyAiOyIpOwotICAgICAgICBlbWl0KCIiKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50RWxlbWVudEJvZHkoU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQsIEVsZW1lbnRJbmZvIGVpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHByaW50SW5uZXJFbGVtZW50SmF2YURvYyhlbHQsIGVpKTsKLSAgICAgICAgc3RhcnRJbnRlcmZhY2UoZWx0LCBlaSk7Ci0gICAgICAgIHN0YXJ0QmxvY2soKTsKLQotICAgICAgICBpZiAoZWkuZ2V0VmFsdWVUeXBlKCkgIT0gRWxlbWVudEluZm8uTk9fVkFMVUUpCi0gICAgICAgICAgICBwcmludFByb3BlcnR5KCJWYWx1ZSIsIGphdmFUeXBlRm9yQ29kZShlaS5nZXRWYWx1ZVR5cGUoKSksIG51bGwsIGZhbHNlLCBlbHQuZ2V0RGVmYXVsdFRleHQoKSk7Ci0KLSAgICAgICAgZW5kQmxvY2soKTsKLQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRFbGVtZW50SW1wbEJvZHkoU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQsIEVsZW1lbnRJbmZvIGVpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoInB1YmxpYyBjbGFzcyAiICsgZWkuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSArICIgZXh0ZW5kcyAiICsgZWkuZ2V0QmFzZUltcGxOYW1lKCkpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZW1pdCgiaW1wbGVtZW50cyAiICsgZWkuZ2V0RnVsbEphdmFJbnRmTmFtZSgpICsgIiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QiKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgIHByaW50RWxlbWVudENvbnN0cnVjdG9yKGVsdCwgZWkpOwotCi0gICAgICAgIGlmIChlaS5nZXRWYWx1ZVR5cGUoKSAhPSBFbGVtZW50SW5mby5OT19WQUxVRSkKLSAgICAgICAgICAgIHByaW50UHJvcGVydHlJbXBsKCJWYWx1ZSIsIGphdmFUeXBlRm9yQ29kZShlaS5nZXRWYWx1ZVR5cGUoKSksIGVpLmdldFZhbHVlVHlwZSgpLCBudWxsLCBmYWxzZSwgZWx0LmdldERlZmF1bHRUZXh0KCksIHRydWUpOwotCi0gICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwcmV0dHlRTmFtZShRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgKz0gIihAIiArIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIikiOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRKYXZhRG9jKFN0cmluZyBjb21tZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgZW1pdCgiICogIiArIGNvbW1lbnQpOwotICAgICAgICBlbWl0KCIgKi8iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50SW5uZXJFbGVtZW50SmF2YURvYyhTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCwgRWxlbWVudEluZm8gZWkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgIGVtaXQoIiAqIEphdmEgY29udGVudCBjbGFzcyBmb3IgYSByb290IGVsZW1lbnQgZGVjbGFyYXRpb24iKTsKLSAgICAgICAgZW1pdCgiICogY29udGFpbmluZyBvbmUgIiArIHByZXR0eVFOYW1lKGVsdC5nZXROYW1lKCkpICsgIiBlbGVtZW50LiIpOwotICAgICAgICBlbWl0KCIgKi8iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0SW50ZXJmYWNlKFNjaGVtYUNvbXBvbmVudCBzYywgQ29tcG9uZW50SW5mbyBjaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gY2kuZ2V0U2hvcnRKYXZhSW50Zk5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGV4dGVuZCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHNjLmdldENvbXBvbmVudFR5cGUoKSA9PSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVCkKLSAgICAgICAgICAgIGV4dGVuZCA9ICJqYXZheC54bWwuYmluZC5FbGVtZW50IjsKLQotICAgICAgICBpZiAoY2kuZ2V0QmFzZUludGZOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4dGVuZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNpLmdldEJhc2VJbnRmTmFtZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGV4dGVuZCArPSAiLCAiICsgY2kuZ2V0QmFzZUludGZOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCJwdWJsaWMgaW50ZXJmYWNlICIgKyBzaG9ydE5hbWUgKyAoZXh0ZW5kICE9IG51bGwgPyAiIGV4dGVuZHMgIiArIGV4dGVuZCA6ICIiKSk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFByb3BlcnR5KFN0cmluZyBwcm9wbmFtZSwgU3RyaW5nIGphdmF0eXBlLCBTdHJpbmcgY29sbGVjdGlvbnR5cGUsIGJvb2xlYW4gbmlsbGFibGUsIFN0cmluZyBkZWZhdWx0dGV4dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBwcmludEphdmFEb2MoIkdldHMgdGhlICIgKyBwcm9wbmFtZSArICIgcHJvcGVydHkiKTsKLSAgICAgICAgZW1pdChqYXZhdHlwZSArICIgZ2V0IiArIHByb3BuYW1lICsgIigpOyIpOwotCi0gICAgICAgIFN0cmluZyBzYWZlVmFyTmFtZSA9IE5hbWVVdGlsLm5vbkphdmFLZXl3b3JkKE5hbWVVdGlsLmxvd2VyQ2FtZWxDYXNlKHByb3BuYW1lKSk7Ci0KLSAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIHRoZSAiICsgcHJvcG5hbWUgKyAiIHByb3BlcnR5Iik7Ci0gICAgICAgIGVtaXQoInZvaWQgc2V0IiArIHByb3BuYW1lICsgIigiICsgamF2YXR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRQcm9wZXJ0eUltcGwoU3RyaW5nIHByb3BuYW1lLCBTdHJpbmcgamF2YXR5cGUsIGludCBqYXZhVHlwZUNvZGUsIFN0cmluZyBjb2xsZWN0aW9udHlwZSwgYm9vbGVhbiBuaWxsYWJsZSwgU3RyaW5nIGRlZmF1bHR0ZXh0LCBib29sZWFuIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoInB1YmxpYyAiICsgamF2YXR5cGUgKyAiIGdldCIgKyBwcm9wbmFtZSArICIoKSIpOwotICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgIGVtaXQoInJldHVybiAiICsgamdldE1ldGhvZE5hbWVGb3JKYXZhVHlwZUNvZGUoamF2YVR5cGVDb2RlKSArICI7Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIDsgLy8gVE9ETwotICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgIFN0cmluZyBzYWZlVmFyTmFtZSA9IE5hbWVVdGlsLm5vbkphdmFLZXl3b3JkKE5hbWVVdGlsLmxvd2VyQ2FtZWxDYXNlKHByb3BuYW1lKSk7Ci0KLSAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0IiArIHByb3BuYW1lICsgIigiICsgamF2YXR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgZW1pdCgic2V0KCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICA7IC8vIFRPRE8KLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50RWxlbWVudENvbnN0cnVjdG9yKFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0LCBFbGVtZW50SW5mbyBlaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvKgotICAgICAgICBTdHJpbmcgc3VwZXJhcmdzID0gIiI7Ci0gICAgICAgIGlmIChlaS5nZXRTdXBlckN0ckFyZ0NvdW50KCkgPT0gMSkKLSAgICAgICAgICAgIHN1cGVyYXJncyA9ICJzVHlwZSI7Ci0gICAgICAgIGVsc2UgaWYgKGVpLmdldFN1cGVyQ3RyQXJnQ291bnQoKSA9PSAyKQotICAgICAgICAgICAgc3VwZXJhcmdzID0gInNUeXBlLCBmYWxzZSI7Ci0gICAgICAgICAgICAqLwotCi0gICAgICAgIGVtaXQoInB1YmxpYyAiICsgZWkuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSArICIoKSIpOwotICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgIC8vIGVtaXQoInN1cGVyKCIgKyBzdXBlcmFyZ3MgKyAiKTsiKTsKLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgamdldE1ldGhvZE5hbWVGb3JKYXZhVHlwZUNvZGUoaW50IGphdmFUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKGphdmFUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW5WYWx1ZSgpIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmxvYXRWYWx1ZSgpIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImRvdWJsZVZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGVWYWx1ZSgpIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJzaG9ydFZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiAiaW50VmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAibG9uZ1ZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJiaWdEZWNpbWFsVmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJpZ0ludGVnZXJWYWx1ZSgpIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInN0cmluZ1ZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGVBcnJheVZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJjYWxlbmRhclZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJxTmFtZVZhbHVlKCkiOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5saXN0VmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAoIiArIHR5cGUgKyAiKXRhcmdldC5lbnVtVmFsdWUoKTsiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBqYXZhVHlwZUZvckNvZGUoaW50IGphdmFUeXBlQ29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoamF2YVR5cGVDb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmxvYXQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiAic2hvcnQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImxvbmciOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLm1hdGguQmlnRGVjaW1hbCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLm1hdGguQmlnSW50ZWdlciI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEudXRpbC5DYWxlbmRhciI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9KYXhiSmF2YWl6ZXIuamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJKYXZhaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzMxYzgyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJKYXZhaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUNvZGVQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXhiSmF2YWl6ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF2YWl6ZShTY2hlbWFUeXBlU3lzdGVtIHN0cywgTWFwIGNvbXBvbmVudERhdGEsIE1hcCBwYWNrYWdlcywgWG1sRXJyb3JXYXRjaGVyIGVycm9ycykKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3QgYWxsQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYWxsQ29tcG9uZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHMuZ2xvYmFsRWxlbWVudHMoKSkpOwotICAgICAgICBhbGxDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0cy5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgYXNzaWduR2xvYmFsTmFtZXMoYWxsQ29tcG9uZW50cywgY29tcG9uZW50RGF0YSwgcGFja2FnZXMpOwotCi0gICAgICAgIC8vIE5vdyBmdWxseSBqYXZhaXplIGV2ZXJ5dGhpbmcgZGVlcGx5Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgLCBsZW4gPSBhbGxDb21wb25lbnRzLnNpemUoKSA7IGkgPCBsZW4gOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudCBzYyA9IChTY2hlbWFDb21wb25lbnQpYWxsQ29tcG9uZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBqYXZhaXplQ29tcG9uZW50KHNjLCBjb21wb25lbnREYXRhLCBwYWNrYWdlcyk7Ci0gICAgICAgICAgICAvLyBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9UT0RPOiBjaGVjayBmb3IgYW55IHJlYWwgZXJyb3JzOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25HbG9iYWxOYW1lcyhMaXN0IGFsbENvbXBvbmVudHMsIE1hcCBjb21wb25lbnREYXRhLCBNYXAgcGFja2FnZXMpCi0gICAgewotICAgICAgICBTZXQgdXNlZE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCAsIGxlbiA9IGFsbENvbXBvbmVudHMuc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50IHNjID0gKFNjaGVtYUNvbXBvbmVudClhbGxDb21wb25lbnRzLmdldChpKTsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBzYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIENvbXBvbmVudEluZm8gY2kgPSBnZXRDb21wb25lbnRJbmZvKHNjLCBjb21wb25lbnREYXRhKTsKLQotICAgICAgICAgICAgY2kuc2V0RnVsbEphdmFJbnRmTmFtZShwaWNrRnVsbEphdmFJbnRmTmFtZSh1c2VkTmFtZXMsIG5hbWUpKTsKLSAgICAgICAgICAgIGNpLnNldEZ1bGxKYXZhSW1wbE5hbWUocGlja0Z1bGxKYXZhSW1wbE5hbWUodXNlZE5hbWVzLCBjaS5nZXRGdWxsSmF2YUludGZOYW1lKCkpKTsKLQotICAgICAgICAgICAgLy8gQ29uc3RydWN0IGEgbmV3IFBhY2thZ2VJbmZvIG9iamVjdCBmb3IgZWFjaCB1bmlxdWUgcGFja2FnZSBuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcGtnbmFtZSA9IGdldFBhY2thZ2VOYW1lKGNpLmdldEZ1bGxKYXZhSW50Zk5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoISBwYWNrYWdlcy5jb250YWluc0tleShwa2duYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYWNrYWdlSW5mbyBwaSA9IG5ldyBQYWNrYWdlSW5mbyhwa2duYW1lKTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXQocGtnbmFtZSwgcGkpOwotICAgICAgICAgICAgICAgIHBpLnNldEluZGV4Q2xhc3NOYW1lKFNjaGVtYVR5cGVDb2RlUHJpbnRlci5pbmRleENsYXNzRm9yU3lzdGVtKHNjLmdldFR5cGVTeXN0ZW0oKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBqYXZhaXplQ29tcG9uZW50KFNjaGVtYUNvbXBvbmVudCBzYywgTWFwIGNvbXBvbmVudERhdGEsIE1hcCBwYWNrYWdlcykKLSAgICB7Ci0gICAgICAgIHN3aXRjaChzYy5nZXRDb21wb25lbnRUeXBlKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgIGphdmFpemVFbGVtZW50KChTY2hlbWFHbG9iYWxFbGVtZW50KXNjLCBjb21wb25lbnREYXRhLCBwYWNrYWdlcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6Ci0gICAgICAgICAgICAgICAgamF2YWl6ZVR5cGUoKFNjaGVtYVR5cGUpc2MsIGNvbXBvbmVudERhdGEsIHBhY2thZ2VzKTsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldEphdmFJbXBsQ2xhc3MoU2NoZW1hVHlwZSBzVHlwZSwgQ29tcG9uZW50SW5mbyBjaSkgewotICAgICAgICBTY2hlbWFUeXBlIHBUeXBlID0gc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpOwotICAgICAgICBib29sZWFuIGlzQnVpbHRpbiA9IHNUeXBlLmlzQnVpbHRpblR5cGUoKTsKLSAgICAgICAgU3RyaW5nIGJhc2VjbGFzcyA9IG51bGw7Ci0gICAgICAgIGludCBhcmdjb3VudCA9IGlzQnVpbHRpbiA/IDAgOiAyOwotCi0gICAgICAgIHN3aXRjaCAocFR5cGUuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sQW55U2ltcGxlVHlwZUltcGwiOwotICAgICAgICAgICAgICAgIGlmIChwVHlwZSAhPSBzVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgYXJnY291bnQgPSAyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIGlmICghaXNCdWlsdGluKQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICBpZiAoIWlzQnVpbHRpbikKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFCYXNlNjRIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJhc2U2NEhvbGRlciI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFIZXhCaW5hcnlIb2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIGlmICghaXNCdWlsdGluKQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVVyaUhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhUU5hbWVIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVFOYW1lSG9sZGVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhTm90YXRpb25Ib2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YU5vdGF0aW9uSG9sZGVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRmxvYXRIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIGlmICghaXNCdWlsdGluKQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURvdWJsZUhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRG91YmxlSG9sZGVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocFR5cGUgIT0gc1R5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0hvbGRlckV4IjsKLSAgICAgICAgICAgICAgICAgICAgYXJnY291bnQgPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0hvbGRlciI7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2NvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhR0RhdGVIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgYXJnY291bnQgPSAyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhR0R1cmF0aW9uSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGFyZ2NvdW50ID0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIC8vIERlY2ltYWwgdHlwZXMgYXJlIGhhbmRsZWQgYmVsb3cKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogInVucmVjb2duaXplZCBwcmltaXRpdmUgdHlwZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGJhc2VjbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmdjb3VudCA9IDI7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURlY2ltYWxIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSOgotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSW50ZWdlckhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xPTkc6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFMb25nSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFJbnRIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgc1R5cGUgPSBzVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2kuc2V0QmFzZUltcGxOYW1lKGJhc2VjbGFzcyk7Ci0gICAgICAgIGNpLnNldFN1cGVyQ3RyQXJnQ291bnQoYXJnY291bnQpOwotCi0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgamF2YWl6ZUVsZW1lbnQoU2NoZW1hTG9jYWxFbGVtZW50IGVsdCwgTWFwIGNvbXBvbmVudERhdGEsIE1hcCBwYWNrYWdlcykKLSAgICB7Ci0gICAgICAgIC8vIFRPRE86IGRlYWwgd2l0aCBsb2NhbCBlbGVtZW50cyAtIG9ubHkgZ2VuIGludGVyZmFjZSB3aGVuIHBhcnQgb2YgYSAKLSAgICAgICAgLy8gZ2VuZXJhbCBjb250ZW50IG1vZGVsLiBTZWUgNS43LjEKLQotICAgICAgICBpZiAoISAoIGVsdCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEVsZW1lbnQpICkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBFbGVtZW50SW5mbyBlaSA9IChFbGVtZW50SW5mbyljb21wb25lbnREYXRhLmdldChlbHQpOwotICAgICAgICBQYWNrYWdlSW5mbyBwaSA9IGdldFBhY2thZ2VJbmZvKHBhY2thZ2VzLCBlaS5nZXRGdWxsSmF2YUludGZOYW1lKCkpOwotCi0gICAgICAgIC8vIFRPRE86IGRlYWwgd2l0aCBhbm9ueW1vdXMgY29tcGxleCB0eXBlIGRlZmluaXRpb24gc2VlIDUuNy4yCi0gICAgICAgIGlmIChlbHQuZ2V0VHlwZSgpLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5OT1RfQ09NUExFWF9UWVBFICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgd2hvc2UgdHlwZSBkZWZpbml0aW9uIGlzIGNvbXBsZXgsIHRoZSBKYXZhIEVsZW1lbnQgaW50ZXJmYWNlCi0gICAgICAgICAgICAvLyBleHRlbmRzIHRoZSBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICAgICAgVHlwZUluZm8gdGkgPSAoVHlwZUluZm8pY29tcG9uZW50RGF0YS5nZXQoZWx0LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBlaS5zZXRCYXNlSW50Zk5hbWUodGkuZ2V0RnVsbEphdmFJbnRmTmFtZSgpKTsKLSAgICAgICAgICAgIGVpLnNldEJhc2VJbXBsTmFtZSh0aS5nZXRGdWxsSmF2YUltcGxOYW1lKCkpOwotICAgICAgICAgICAgZWkuc2V0U3VwZXJDdHJBcmdDb3VudCgxKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgd2hvc2UgdHlwZSBkZWZpbml0aW9uIGlzIHNpbXBsZSwgVGhlIGdlbmVyYXRlZCBlbGVtZW50Ci0gICAgICAgICAgICAvLyBpbnRlcmZhY2UgaGFzIGEgSmF2YSBzaW1wbGUgY29udGVudC1wcm9wZXJ0eSBuYW1lZCAidmFsdWUiCi0gICAgICAgICAgICBlaS5zZXRWYWx1ZVR5cGUoIGdldEphdmFQcm9wZXJ0eVR5cGUoZWx0LmdldFR5cGUoKSwgZWx0LmlzTmlsbGFibGUoKSkgKTsKLSAgICAgICAgICAgIHNldEphdmFJbXBsQ2xhc3MoZWx0LmdldFR5cGUoKSwgZWkpOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGphdmFpemVUeXBlKFNjaGVtYVR5cGUgc3QsIE1hcCBjb21wb25lbnREYXRhLCBNYXAgcGFja2FnZXMpCi0gICAgewotICAgICAgICBUeXBlSW5mbyB0aSA9IChUeXBlSW5mbyljb21wb25lbnREYXRhLmdldChzdCk7Ci0KLSAgICAgICAgaWYgKHN0LmdldEJhc2VUeXBlKCkuZXF1YWxzKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGkKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgc3RhdGljIENvbXBvbmVudEluZm8gZ2V0Q29tcG9uZW50SW5mbyhTY2hlbWFDb21wb25lbnQgc2MsIE1hcCBjb21wb25lbnREYXRhKQotICAgIHsKLSAgICAgICAgQ29tcG9uZW50SW5mbyBjaSA9IChDb21wb25lbnRJbmZvKWNvbXBvbmVudERhdGEuZ2V0KHNjKTsKLSAgICAgICAgaWYgKGNpICE9IG51bGwpIHJldHVybiBjaTsKLQotICAgICAgICAvLyBDb3VsZCBub3QgZmluZCAtIGNyZWF0ZSBhIG5ldyByZWNvcmQKLSAgICAgICAgc3dpdGNoIChzYy5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgY2kgPSBuZXcgRWxlbWVudEluZm8oKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICBjaSA9IG5ldyBUeXBlSW5mbygpOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBoYW5kbGUgY29tcG9uZW50IG9mIHR5cGU6ICIgKyBzYy5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tcG9uZW50RGF0YS5wdXQoc2MsIGNpKTsKLSAgICAgICAgcmV0dXJuIGNpOwotICAgIH0KLQotICAgIHN0YXRpYyBQYWNrYWdlSW5mbyBnZXRQYWNrYWdlSW5mbyhNYXAgcGFja2FnZXMsIFN0cmluZyBmcWNuKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBrZ25hbWUgPSBnZXRQYWNrYWdlTmFtZShmcWNuKTsKLSAgICAgICAgcmV0dXJuIChQYWNrYWdlSW5mbylwYWNrYWdlcy5nZXQocGtnbmFtZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgZnFjbikKLSAgICB7Ci0gICAgICAgIC8vIHJlbW92ZSBjbGFzcyBuYW1lCi0gICAgICAgIGludCBsYXN0ZG90ID0gZnFjbi5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAobGFzdGRvdCA8IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIG91dGVyIHBhY2thZ2UgbmFtZXMKLSAgICAgICAgcmV0dXJuIGZxY24uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0Z1bGxKYXZhSW50Zk5hbWUoU2V0IHVzZWROYW1lcywgUU5hbWUgcU5hbWUpCi0gICAgewotICAgICAgICAvLyBCVUdCVUc6IFRoaXMgdXRpbCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IEpBWEIgbmFtaW5nIHJ1bGVzCi0gICAgICAgIFN0cmluZyBuYW1lID0gTmFtZVV0aWwuZ2V0Q2xhc3NOYW1lRnJvbVFOYW1lKHFOYW1lKTsKLQotICAgICAgICBpZiAodXNlZE5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmFtZSBjb2xsaXNpb24gb24gcW5hbWU6ICIgKyBxTmFtZSk7Ci0KLSAgICAgICAgaWYgKHJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lKG5hbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUU5hbWUgIiArIHFOYW1lICsgIiBjb25mbGljdHMgd2l0aCBnZW5lcmF0ZWQgSkFYQiBjbGFzcyBuYW1lLiIpOwotICAgICAgICAgICAgCi0gICAgICAgIHVzZWROYW1lcy5hZGQobmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwaWNrRnVsbEphdmFJbXBsTmFtZShTZXQgdXNlZE5hbWVzLCBTdHJpbmcgaW50Zk5hbWUpCi0gICAgewotICAgICAgICAvLyBTdHJpcCBvZmYgdGhlIHBhY2thZ2UgZnJvbSB0aGUgY2xhc3MgbmFtZSBzbyB3ZSBjYW4gcmVwbGFjZSBpdAotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gaW50Zk5hbWU7Ci0gICAgICAgIFN0cmluZyBwa2dOYW1lID0gbnVsbDsKLSAgICAgICAgaW50IGluZGV4ID0gaW50Zk5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGludGZOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgICAgcGtnTmFtZSA9IGludGZOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3JtIHRoZSBuZXcgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZnJvbSB0aGUgbmV3IHBhY2thZ2UgbmFtZQotICAgICAgICAvLyBhbmQgdGhlIG9sZCBjbGFzcyBuYW1lCi0gICAgICAgIFN0cmluZyBuYW1lID0gcGtnTmFtZSArICIuaW1wbC4iICsgY2xhc3NOYW1lICsgIkltcGwiOwotCi0gICAgICAgIGlmICh1c2VkTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJRTmFtZSBjb25mbGljdCIpOwotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKFNjaGVtYVR5cGUgeG1sdHlwZSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICghIHhtbHR5cGUuaXNCdWlsdGluVHlwZSgpKQotICAgICAgICAgICAgeG1sdHlwZSA9IHhtbHR5cGUuZ2V0QmFzZVR5cGUoKTsKLQotICAgICAgICByZXR1cm4geG1sdHlwZS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldEphdmFQcm9wZXJ0eVR5cGUoU2NoZW1hVHlwZSB4bWx0eXBlLCBib29sZWFuIG5pbGxhYmxlKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHhtbHR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk5PVF9DT01QTEVYX1RZUEU7Ci0KLSAgICAgICAgLy8gVE9ETzogaGFuZGxlIGxpc3RzLCB1bmlvbnMsIGVudW1zCi0KLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoeG1sdHlwZS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xPTkc6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NIT1JUOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CWVRFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB4bWx0eXBlID0geG1sdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gcmVzZXJ2ZWRHbG9iYWxDbGFzc05hbWUoU3RyaW5nIGZxY24pCi0gICAgewotICAgICAgICBpbnQgaSA9IGZxY24ubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gZnFjbi5zdWJzdHJpbmcoaSArIDEpOwotCi0gICAgICAgIGlmIChsYXN0U2VnbWVudC5lcXVhbHMoIk9iamVjdEZhY3RvcnkiKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9QYWNrYWdlSW5mby5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvUGFja2FnZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4MWRmNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9QYWNrYWdlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VJbmZvIAotewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfaW5kZXhDbGFzc05hbWU7Ci0KLSAgICAvKiogQSBsaXN0IG9mIHRoZSBjb21wb25lbnRzIGluIHRoaXMgcGFja2FnZSB0aGF0IHdpbGwgbmVlZCBhIGZhY3RvcnkgbWV0aG9kICovCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0IF9jb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIFBhY2thZ2VJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSkKLSAgICB7Ci0gICAgICAgIF9wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWN0b3J5Q29tcG9uZW50KENvbXBvbmVudEluZm8gY2kpCi0gICAgewotICAgICAgICBfY29tcG9uZW50cy5hZGQoY2kpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGZhY3RvcnlDb21wb25lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29tcG9uZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRleENsYXNzTmFtZShTdHJpbmcgaW5kZXhDbGFzc05hbWUpCi0gICAgewotICAgICAgICBfaW5kZXhDbGFzc05hbWUgPSBpbmRleENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluZGV4Q2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW5kZXhDbGFzc05hbWU7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL1R5cGVJbmZvLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9UeXBlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWEwMTVhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL1R5cGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbXBpbGVyOwotCi1wdWJsaWMgY2xhc3MgVHlwZUluZm8gZXh0ZW5kcyBDb21wb25lbnRJbmZvIHsKLQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL0NvbnRleHRJbXBsLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL0NvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDI2MDAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9Db250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXIuRWxlbWVudEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXIuVHlwZUluZm87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuSmF4YkNvbmZpZ0RvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5KYXhiQ29uZmlnRG9jdW1lbnQuSmF4YkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuSmF4YkNvbmZpZ0RvY3VtZW50LkpheGJDb25maWcuR2xvYmFsRWxlbWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkpheGJDb25maWdEb2N1bWVudC5KYXhiQ29uZmlnLkdsb2JhbFR5cGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5HbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5HbG9iYWxUeXBlOwotCi1wdWJsaWMgY2xhc3MgQ29udGV4dEltcGwgZXh0ZW5kcyBKQVhCQ29udGV4dCBpbXBsZW1lbnRzIFR5cGVTdG9yZUZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXIgX3N0bDsKLSAgICBwcml2YXRlIE1hcCBfZ2xvYmFsRWxlbWVudHM7Ci0KLSAgICBwdWJsaWMgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyIGNyZWF0ZVVubWFyc2hhbGxlcigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVbm1hcnNoYWxsZXJJbXBsKF9zdGwsIHRoaXMpOwotICAgIH0KLSAgICBwdWJsaWMgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlciBjcmVhdGVNYXJzaGFsbGVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE1hcnNoYWxsZXJJbXBsKCk7Ci0gICAgfQotICAgIHB1YmxpYyBqYXZheC54bWwuYmluZC5WYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvckltcGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBjcmVhdGVFbGVtZW50VXNlcihTY2hlbWFUeXBlIHBhcmVudFR5cGUsIFFOYW1lIG5hbWUsIFFOYW1lIHhzaVR5cGUpIAotICAgIHsKLSAgICAgICAgaWYgKHBhcmVudFR5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudEluZm8gZWkgPSAoRWxlbWVudEluZm8pX2dsb2JhbEVsZW1lbnRzLmdldChuYW1lKTsKLSAgICAgICAgICAgIGlmIChlaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RyID0gZWkuZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcihwYXJlbnRUeXBlLmdldFR5cGVTeXN0ZW0oKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFR5cGVTdG9yZVVzZXIpY3RyLm5ld0luc3RhbmNlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZUF0dHJpYnV0ZVVzZXIoU2NoZW1hVHlwZSBwYXJlbnRUeXBlLCBRTmFtZSBuYW1lKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIENvbnRleHRJbXBsKFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBNYXAgZ2xvYmFsRWxlbWVudHMpCi0gICAgewotICAgICAgICBfc3RsID0gc3RsOwotICAgICAgICBfZ2xvYmFsRWxlbWVudHMgPSBnbG9iYWxFbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEpBWEJDb250ZXh0IGNyZWF0ZUNvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGF0eXBlQ29udmVydGVyLnNldERhdGF0eXBlQ29udmVydGVyKAotICAgICAgICAgICAgRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLmluc3RhbmNlKTsKLQotCi0gICAgICAgIFN0cmluZ1tdIHBrZ3MgPSBjb250ZXh0UGF0aC5zcGxpdCgiOiIpOwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXJbXSBzdGxzID0gbmV3IFNjaGVtYVR5cGVMb2FkZXJbcGtncy5sZW5ndGggKyAxXTsKLSAgICAgICAgc3Rsc1swXSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCk7Ci0KLSAgICAgICAgTWFwIGdsb2JhbEVsZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBwa2dzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcHMgPSBwa2dzW2ldLnJlcGxhY2UoJy4nLCAnLycpICsgIi9qYXhiLnByb3BlcnRpZXMiOwotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgICAgICBwLmxvYWQoY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShwcm9wcykpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleENsYXNzTmFtZSA9IHAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLlR5cGVTeXN0ZW1Ib2xkZXIiKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbmRleENsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbigiVGhpcyBwYWNrYWdlIHdhcyBub3QgY3JlYXRlZCB3aXRoIHRoaXMgSmF4YiBpbXBsLiIpOwotCi0gICAgICAgICAgICAgICAgRmllbGQgZiA9IENsYXNzLmZvck5hbWUoaW5kZXhDbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcikuZ2V0RmllbGQoInR5cGVTeXN0ZW0iKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN0cyA9IChTY2hlbWFUeXBlU3lzdGVtKWYuZ2V0KG51bGwpOwotICAgICAgICAgICAgICAgIHN0bHNbaSArIDFdID0gc3RzOwotCi0gICAgICAgICAgICAgICAgLy8gTm93IGxvYWQgdGhlIEpheGIgQ29uZmlnIGluZm8KLSAgICAgICAgICAgICAgICBsb2FkSmF4YkNvbmZpZyhjbGFzc0xvYWRlciwgc3RzLCBnbG9iYWxFbGVtZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbigiIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKCJUaGlzIHBhY2thZ2Ugd2FzIG5vdCBjcmVhdGVkIHdpdGggdGhpcyBqYXhiIGltcGwuIiwgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oIlRoaXMgcGFja2FnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGlzIGpheGIgaW1wbC4iLCAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKCJUaGlzIHBhY2thZ2Ugd2FzIG5vdCBjcmVhdGVkIHdpdGggdGhpcyBqYXhiIGltcGwuIiwgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKCJUaGlzIHBhY2thZ2Ugd2FzIG5vdCBjcmVhdGVkIHdpdGggdGhpcyBqYXhiIGltcGwuIiwgIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IENvbnRleHRJbXBsKFhtbEJlYW5zLnR5cGVMb2FkZXJVbmlvbihzdGxzKSwgZ2xvYmFsRWxlbWVudHMpOwotCi0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgbG9hZEpheGJDb25maWcoQ2xhc3NMb2FkZXIgY2wsIFNjaGVtYVR5cGVTeXN0ZW0gc3RzLCBNYXAgZ2xvYmFsRWxlbWVudHMpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBzdHMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi9KYXhiQ29uZmlnLnhtbCI7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSk7Ci0KLSAgICAgICAgSmF4YkNvbmZpZyBjb25maWcgPSBKYXhiQ29uZmlnRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShpcykuZ2V0SmF4YkNvbmZpZygpOwotICAgICAgICBHbG9iYWxFbGVtZW50W10gZWx0cyA9IGNvbmZpZy5nZXRHbG9iYWxFbGVtZW50cygpLmdldEdsb2JhbEVsZW1lbnRBcnJheSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGVsdHMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50SW5mbyBlaSA9IG5ldyBFbGVtZW50SW5mbygpOwotICAgICAgICAgICAgZWkuc2V0RnVsbEphdmFJbXBsTmFtZShlbHRzW2ldLmdldEphdmFJbXBsKCkpOwotICAgICAgICAgICAgZ2xvYmFsRWxlbWVudHMucHV0KGVsdHNbaV0uZ2V0UW5hbWUoKSwgZWkpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL0RhdGF0eXBlQ29udmVydGVySW1wbC5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9EYXRhdHlwZUNvbnZlcnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzYTNlMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL0RhdGF0eXBlQ29udmVydGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIucnVudGltZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW50ZXJmYWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxUaW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhR0RhdGVIb2xkZXJFeDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFCYXNlNjRIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUludGVnZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRG91YmxlSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhUU5hbWVIb2xkZXI7Ci0KLQotLyogCi0gICBJbXBsZW1lbnRhdGlvbiBub3RlOgotCi0gICBUaGUgcGFyc2UgbWV0aG9kcyBhbGwgcmV0dXJuIG51bGwgd2hlbiBwb3NzaWJsZSBhbmQgdGhyb3cgTlBFIHdoZW4gdGhlCi0gICByZXR1cm4gdHlwZSBpcyBhIHNjYWxhci4gSSBkb24ndCBrbm93IHdoeSB0aGV5IGRvIHRoaXMsIGJ1dCB0aGF0J3Mgd2hhdAotICAgdGhlIEpBWEIgMS4wIFJJIGRvZXMsIHNvIEknbSBjb3B5aW5nLiBJdCBzZWVtcyB0aGVzZSBzaG91bGQgaGF2ZSBkZWNsYXJlZAotICAgZXhjZXB0aW9ucywgYnV0IHRoZXkgZG9uJ3QuCi0gICAKLSovCi0gICAKLQotcHVibGljIGNsYXNzIERhdGF0eXBlQ29udmVydGVySW1wbCBpbXBsZW1lbnRzIERhdGF0eXBlQ29udmVydGVySW50ZXJmYWNlCi17Ci0KLSAgICBwcml2YXRlIERhdGF0eXBlQ29udmVydGVySW1wbCgpIHt9Ci0gICAgcHVibGljIHN0YXRpYyBEYXRhdHlwZUNvbnZlcnRlckltcGwgaW5zdGFuY2UgPSBuZXcgRGF0YXR5cGVDb252ZXJ0ZXJJbXBsKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50RGVjaW1hbChqYXZhLm1hdGguQmlnRGVjaW1hbCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50UU5hbWUoUU5hbWUgdmFsdWUsIE5hbWVzcGFjZUNvbnRleHQgbnNjKQotICAgIHsKLSAgICAgICAgaWYgKG5zYyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbHBhcnQgPSB2YWx1ZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHZhbHVlLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBuc2MuZ2V0UHJlZml4KHVyaSk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgICAgICAgLy8gdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk5hbWVzcGFjZSB1cmkgJyIgKyB1cmkgKyAiJyBub3QgYm91bmQgaW4gY3VycmVudCBjb250ZXh0Iik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxwYXJ0OwotCi0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRGbG9hdChmbG9hdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmxvYXRIb2xkZXIuc2VyaWFsaXplKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50RG91YmxlKGRvdWJsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRG91YmxlSG9sZGVyLnNlcmlhbGl6ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRCeXRlKGJ5dGUgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gQnl0ZS50b1N0cmluZyh2YWx1ZSk7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnREYXRlVGltZShqYXZhLnV0aWwuQ2FsZW5kYXIgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdEYXRlKHZhbHVlKS50b1N0cmluZygpOwotCi0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRCYXNlNjRCaW5hcnkoYnl0ZVtdIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZSh2YWx1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRIZXhCaW5hcnkoYnl0ZVtdIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZSh2YWx1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRVbnNpZ25lZEludChsb25nIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRVbnNpZ25lZFNob3J0KGludCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50VGltZShqYXZhLnV0aWwuQ2FsZW5kYXIgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdEYXRlKHZhbHVlKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnREYXRlKGphdmEudXRpbC5DYWxlbmRhciB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0RhdGUodmFsdWUpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludEFueVNpbXBsZVR5cGUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRTdHJpbmcoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50SW50ZWdlcihqYXZhLm1hdGguQmlnSW50ZWdlciBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50SW50KGludCBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludExvbmcobG9uZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludFNob3J0KHNob3J0IHMpCi0gICAgewotICAgICAgICByZXR1cm4gU2hvcnQudG9TdHJpbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwYXJzZVN0cmluZyhTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEudXRpbC5DYWxlbmRhciBwYXJzZURhdGVUaW1lKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgR0RhdGUgZGF0ZSA9IEphdmFHRGF0ZUhvbGRlckV4LmxleChzLCBYbWxEYXRlVGltZS50eXBlLCBfZXZjKTsKLSAgICAgICAgcmV0dXJuIGRhdGUuZ2V0Q2FsZW5kYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIHBhcnNlQmFzZTY0QmluYXJ5KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFCYXNlNjRIb2xkZXIubGV4KHMsIF9ldmMpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gcGFyc2VIZXhCaW5hcnkoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUhleEJpbmFyeUhvbGRlci5sZXgocywgX2V2Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcGFyc2VVbnNpZ25lZEludChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiBMb25nLnBhcnNlTG9uZyhQYXJzZVV0aWwudHJpbUluaXRpYWxQbHVzKHMpKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpbnZhbGlkIHVuc2lnbmVkIGludCAiICsgcyk7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHBhcnNlVW5zaWduZWRTaG9ydChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImludmFsaWQgdW5zaWduZWQgc2hvcnQgIiArIHMpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEudXRpbC5DYWxlbmRhciBwYXJzZVRpbWUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBHRGF0ZSBkYXRlID0gSmF2YUdEYXRlSG9sZGVyRXgubGV4KHMsIFhtbFRpbWUudHlwZSwgX2V2Yyk7Ci0gICAgICAgIHJldHVybiBkYXRlLmdldENhbGVuZGFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIHBhcnNlSW50ZWdlcihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhSW50ZWdlckhvbGRlci5sZXgocywgX2V2Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIHBhcnNlRGVjaW1hbChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgQmlnRGVjaW1hbChzKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgcmV0dXJuIG51bGw7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHBhcnNlSW50KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoUGFyc2VVdGlsLnRyaW1Jbml0aWFsUGx1cyhzKSk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW52YWxpZCBpbnQgIiArIHMpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcGFyc2VMb25nKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIExvbmcucGFyc2VMb25nKFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImludmFsaWQgbG9uZyAiICsgcyk7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgcGFyc2VTaG9ydChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiBTaG9ydC5wYXJzZVNob3J0KHMpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImludmFsaWQgc2hvcnQgIiArIHMpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHBhcnNlRmxvYXQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUZsb2F0SG9sZGVyLnZhbGlkYXRlTGV4aWNhbChzLCBfZXZjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIHBhcnNlRG91YmxlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFEb3VibGVIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHMsIF9ldmMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBhcnNlQm9vbGVhbihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhQm9vbGVhbkhvbGRlci52YWxpZGF0ZUxleGljYWwocywgX2V2Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGUgcGFyc2VCeXRlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIEJ5dGUucGFyc2VCeXRlKHMpOyB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW52YWxpZCBieXRlICIgKyBzKTsgfQotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBwYXJzZVFOYW1lKFN0cmluZyBzLCBOYW1lc3BhY2VDb250ZXh0IGMpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YVFOYW1lSG9sZGVyLnZhbGlkYXRlTGV4aWNhbChzLCBfZXZjLCAKLSAgICAgICAgICAgIG5ldyBOYW1lc3BhY2VDb250ZXh0V3JhcHBlcihjKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEudXRpbC5DYWxlbmRhciBwYXJzZURhdGUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUdEYXRlSG9sZGVyRXgubGV4KHMsIFhtbERhdGUudHlwZSwgX2V2YykuZ2V0Q2FsZW5kYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHBhcnNlQW55U2ltcGxlVHlwZShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWxpZGF0aW9uQ29udGV4dCBfZXZjID0gbmV3IEV4Y2VwdGlvblZhbGlkYXRpb25Db250ZXh0KCk7Ci0gICAgLyoqCi0gICAgICogVXNlIF9ldmMgd2hlbiB5b3Ugd2FudCB0byB0aHJvdyBhbiBFeGNlcHRpb24gd2hlbgotICAgICAqIHBhcnNpbmcgYSBzaW1wbGUgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFeGNlcHRpb25WYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIFZhbGlkYXRpb25Db250ZXh0Ci0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkKFN0cmluZyBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvTWFyc2hhbGxlckltcGwuamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvTWFyc2hhbGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZDk3Yy4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL01hcnNoYWxsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5oZWxwZXJzLkFic3RyYWN0TWFyc2hhbGxlckltcGw7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuaGVscGVycy5EZWZhdWx0VmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLQotcHVibGljIGNsYXNzIE1hcnNoYWxsZXJJbXBsIGltcGxlbWVudHMgTWFyc2hhbGxlcgotewotICAgIHByaXZhdGUgVmFsaWRhdGlvbkV2ZW50SGFuZGxlciBfaGFuZGxlciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvbkV2ZW50SGFuZGxlcigpOwotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBfb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZU91dGVyKCk7Ci0KLQotICAgIHN0YXRpYyBNYXAgSkFYQl9UT19YQkVBTl9QUk9QRVJUWV9NQVA7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgSkFYQl9UT19YQkVBTl9QUk9QRVJUWV9NQVAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBKQVhCX1RPX1hCRUFOX1BST1BFUlRZX01BUC5wdXQoSkFYQl9FTkNPRElORywgWG1sT3B0aW9ucy5DSEFSQUNURVJfRU5DT0RJTkcpOwotICAgICAgICBKQVhCX1RPX1hCRUFOX1BST1BFUlRZX01BUC5wdXQoSkFYQl9GT1JNQVRURURfT1VUUFVULCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldFhiZWFuUHJvcEZvckpheGJQcm9wKFN0cmluZyBqYXhiTmFtZSkgewotICAgICAgICByZXR1cm4gKFN0cmluZylKQVhCX1RPX1hCRUFOX1BST1BFUlRZX01BUC5nZXQoamF4Yk5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wLCBPYmplY3QgdmFsdWUpCi0gICAgICAgIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHhiZWFuUHJvcCA9IGdldFhiZWFuUHJvcEZvckpheGJQcm9wKHByb3ApOwotICAgICAgICBpZiAoeGJlYW5Qcm9wID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvcGVydHlFeGNlcHRpb24ocHJvcCArICIgaXMgdW5zdXBwb3J0ZWQuIik7Ci0KLSAgICAgICAgX29wdGlvbnMucHV0KHhiZWFuUHJvcCwgdmFsdWUpOwotCi0gICAgfQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3ApCi0gICAgICAgIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHhiZWFuUHJvcCA9IGdldFhiZWFuUHJvcEZvckpheGJQcm9wKHByb3ApOwotICAgICAgICBpZiAoeGJlYW5Qcm9wID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvcGVydHlFeGNlcHRpb24ocHJvcCArICIgaXMgdW5zdXBwb3J0ZWQuIik7Ci0KLSAgICAgICAgcmV0dXJuIF9vcHRpb25zLmdldCh4YmVhblByb3ApOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2hhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFZhbGlkYXRpb25FdmVudEhhbmRsZXIgaGFuZGxlcikKLSAgICB7Ci0gICAgICAgIF9oYW5kbGVyID0gaGFuZGxlcjsKLSAgICB9Ci0KLSAgICB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iaiwgQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoKQotICAgICAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiwgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHhtbG9iaiA9IGdldFhtbE9iamVjdChvYmopOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4bWxvYmouc2F2ZShjaCwgIGxoLCBfb3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iaiwgQ29udGVudEhhbmRsZXIgY2gpCi0gICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtYXJzaGFsKG9iaiwgY2gsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iaiwgTm9kZSBub2RlKQotICAgICAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiwgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCBPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiwgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHhtbG9iaiA9IGdldFhtbE9iamVjdChvYmopOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4bWxvYmouc2F2ZShvdXQsIF9vcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmosICBXcml0ZXIgb3V0KQotICAgICAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiwgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHhtbG9iaiA9IGdldFhtbE9iamVjdChvYmopOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4bWxvYmouc2F2ZShvdXQsICBfb3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCByZXN1bHQpCi0gICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgU0FYUmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTQVhSZXN1bHQgc2F4cmVzdWx0ID0gKFNBWFJlc3VsdClyZXN1bHQ7Ci0gICAgICAgICAgICBtYXJzaGFsKG9iaiwgc2F4cmVzdWx0LmdldEhhbmRsZXIoKSwgc2F4cmVzdWx0LmdldExleGljYWxIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIERPTVJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgRE9NUmVzdWx0IGRvbXJlc3VsdCA9IChET01SZXN1bHQpcmVzdWx0OwotICAgICAgICAgICAgbWFyc2hhbChvYmosIGRvbXJlc3VsdC5nZXROb2RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFN0cmVhbVJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHNyID0gKFN0cmVhbVJlc3VsdClyZXN1bHQ7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBzci5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIFdyaXRlciB3ID0gc3IuZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1hcnNoYWwob2JqLCBvcyk7Ci0gICAgICAgICAgICBlbHNlIGlmICh3ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWFyc2hhbChvYmosIHcpOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiaW52YWxpZCBSZXN1bHQgcGFyYW1ldGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oImludmFsaWQgUmVzdWx0IHBhcmFtZXRlciIpOwotICAgIH0KLQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5vZGUoT2JqZWN0IG8pCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sT2JqZWN0IGdldFhtbE9iamVjdChPYmplY3Qgb2JqKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghICggb2JqIGluc3RhbmNlb2YgWG1sT2JqZWN0ICkgKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkNhbm5vdCBtYXJzaGFsIG9iamVjdC4gSXQgd2FzIG5vdCBjcmVhdGVkIGJ5IHRoaXMgSkFYQiBwcm92aWRlci4iKTsKLQotICAgICAgICByZXR1cm4gKFhtbE9iamVjdClvYmo7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9OYW1lc3BhY2VDb250ZXh0V3JhcHBlci5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9OYW1lc3BhY2VDb250ZXh0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFhZjk4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvTmFtZXNwYWNlQ29udGV4dFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIucnVudGltZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlTWFuYWdlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VDb250ZXh0V3JhcHBlciBpbXBsZW1lbnRzIE5hbWVzcGFjZU1hbmFnZXIKLXsKLSAgICBwcml2YXRlIE5hbWVzcGFjZUNvbnRleHQgX2NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dFdyYXBwZXIoTmFtZXNwYWNlQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpKFN0cmluZyBuc3VyaSwgU3RyaW5nIHN1Z2dlc3RlZF9wcmVmaXgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbnRleHQuZ2V0UHJlZml4KG5zdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvVW5tYXJzaGFsbGVySW1wbC5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9Vbm1hcnNoYWxsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZmMwYTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9Vbm1hcnNoYWxsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlckhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5oZWxwZXJzLkRlZmF1bHRWYWxpZGF0aW9uRXZlbnRIYW5kbGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFVubWFyc2hhbGxlckltcGwgaW1wbGVtZW50cyBVbm1hcnNoYWxsZXIKLXsKLSAgICBwcml2YXRlIGZpbmFsIFNjaGVtYVR5cGVMb2FkZXIgX3N0bDsKLQotICAgIGJvb2xlYW4gX3ZhbGlkYXRpbmcgPSBmYWxzZTsKLSAgICBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIF9oYW5kbGVyID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uRXZlbnRIYW5kbGVyKCk7Ci0gICAgcHJpdmF0ZSBYbWxPcHRpb25zIF9vcHRpb25zOwotCi0gICAgVW5tYXJzaGFsbGVySW1wbChTY2hlbWFUeXBlTG9hZGVyIHN0bCwgQ29udGV4dEltcGwgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzdGwgIT0gbnVsbDsKLSAgICAgICAgX3N0bCA9IHN0bDsKLQotICAgICAgICBfb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIF9vcHRpb25zLnB1dChUeXBlU3RvcmVGYWN0b3J5LktFWSwgIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiB2YWxpZGF0aW5nKQotICAgIHsKLSAgICAgICAgX3ZhbGlkYXRpbmcgPSB2YWxpZGF0aW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbGlkYXRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFZhbGlkYXRpb25FdmVudEhhbmRsZXIgaGFuZGxlcikgCi0gICAgewotICAgICAgICBfaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFZhbGlkYXRpb25FdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gX2hhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3AsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgUHJvcGVydHlFeGNlcHRpb24ocHJvcCwgIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wKSB0aHJvd3MgUHJvcGVydHlFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBQcm9wZXJ0eUV4Y2VwdGlvbihwcm9wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChGaWxlIGYpCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgbzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG8gPSBfc3RsLnBhcnNlKGYsICBudWxsLCAgX29wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbyA9IHBvc3RQcm9jZXNzKG8pOwotICAgICAgICByZXR1cm4gbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChVUkwgdXJsKQotICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOWUkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChJbnB1dFN0cmVhbSBpcykKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBvOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbyA9IF9zdGwucGFyc2UoaXMsICBudWxsLCAgX29wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbyA9IHBvc3RQcm9jZXNzKG8pOwotICAgICAgICByZXR1cm4gbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChSZWFkZXIgcikKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBvOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbyA9IF9zdGwucGFyc2UociwgIG51bGwsICBfb3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvID0gcG9zdFByb2Nlc3Mobyk7Ci0gICAgICAgIHJldHVybiBvOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKElucHV0U291cmNlIHMpCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocy5nZXRCeXRlU3RyZWFtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB1bm1hcnNoYWwocy5nZXRCeXRlU3RyZWFtKCkpOwotICAgICAgICBlbHNlIGlmIChzLmdldENoYXJhY3RlclN0cmVhbSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdW5tYXJzaGFsKHMuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbigiSW52YWxpZCBpbnB1dCBzb3VyY2UuIik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoTm9kZSBub2RlKQotICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IG87Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvID0gX3N0bC5wYXJzZShub2RlLCAgbnVsbCwgIF9vcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbyA9IHBvc3RQcm9jZXNzKG8pOwotICAgICAgICByZXR1cm4gbzsKLQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKFNvdXJjZSBzb3VyY2UpCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5ZSSIpOwotICAgIH0KLQotICAgIFhtbE9iamVjdCBwb3N0UHJvY2VzcyhYbWxPYmplY3QgbykgdGhyb3dzIFVubWFyc2hhbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0aW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFZhbGlkYXRvckltcGwudmFsaWRhdGVJbXBsKG8sIF9oYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5tYXJzaGFsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBYbWxDdXJzb3IgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGlmIChjLnRvRmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIHNpbWlsYXIgdG8gb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyCi0gICAgcHVibGljIFVubWFyc2hhbGxlckhhbmRsZXIgZ2V0VW5tYXJzaGFsbGVySGFuZGxlcigpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5ZSSIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9WYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbC5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9WYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmU2YTU0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvVmFsaWRhdGlvbkxvY2F0b3JFdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRMb2NhdG9yOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkxvY2F0b3JFdmVudEltcGwgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXZlbnRMb2NhdG9yIAotewotICAgIGludCBfbGluZU51bWJlcjsKLSAgICBpbnQgX2NvbHVtbk51bWJlcjsKLSAgICBpbnQgX29mZnNldDsKLSAgICBVUkwgX3VybDsKLSAgICBYbWxPYmplY3QgX29iamVjdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvbkxvY2F0b3JFdmVudEltcGwgY3JlYXRlKFhtbEVycm9yIGVycm9yKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbChlcnJvci5nZXRMaW5lKCksIGVycm9yLmdldENvbHVtbigpLAotICAgICAgICAgICAgZXJyb3IuZ2V0T2Zmc2V0KCksIGVycm9yLmdldE9iamVjdExvY2F0aW9uKCksIGVycm9yLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbChpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlciwKLSAgICAgICAgaW50IG9mZnNldCwgWG1sT2JqZWN0IG9iamVjdCwgU3RyaW5nIHNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICBfbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgICAgIF9jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0gICAgICAgIF9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIF9vYmplY3QgPSBvYmplY3Q7Ci0KLSAgICAgICAgdHJ5IHsgX3VybCA9IG5ldyBVUkwoc291cmNlTmFtZSk7IH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7fQotCi0gICAgfQotCi0gICAgcHVibGljIGphdmEubmV0LlVSTCBnZXRVUkwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91cmw7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfb2Zmc2V0OwotICAgIH0KLSAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9saW5lTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gX29iamVjdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvVmFsaWRhdG9ySW1wbC5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9WYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTk3NDQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9WYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmhlbHBlcnMuRGVmYXVsdFZhbGlkYXRpb25FdmVudEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuaGVscGVycy5WYWxpZGF0aW9uRXZlbnRJbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JJbXBsIGltcGxlbWVudHMgVmFsaWRhdG9yIAotewotICAgIFZhbGlkYXRpb25FdmVudEhhbmRsZXIgX2hhbmRsZXIgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25FdmVudEhhbmRsZXIoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIGhhbmRsZXIpIAotICAgIHsKLSAgICAgICAgX2hhbmRsZXIgPSBoYW5kbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIF9oYW5kbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB0aHJvd3MgUHJvcGVydHlFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBQcm9wZXJ0eUV4Y2VwdGlvbihwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFByb3BlcnR5RXhjZXB0aW9uKHByb3BlcnR5LCAgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAoISAoIG8gaW5zdGFuY2VvZiBYbWxPYmplY3QpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkNhbm5vdCB2YWxpZGF0ZSB0cmVlIHJvb3RlZCBhdCBzdWJyb290T2JqLiIpOwotCi0gICAgICAgIHJldHVybiB2YWxpZGF0ZUltcGwoKFhtbE9iamVjdClvLCBfaGFuZGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb290KE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlKG8pOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlSW1wbChYbWxPYmplY3QgbywgVmFsaWRhdGlvbkV2ZW50SGFuZGxlciBoYW5kbGVyKQotICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBhc3NlcnQgbyAhPSBudWxsICYmIGhhbmRsZXIgIT0gbnVsbDsKLQotICAgICAgICBmaW5hbCBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihsKTsKLQotICAgICAgICBmaW5hbCBib29sZWFuIHZhbGlkID0gby52YWxpZGF0ZShvcHRzKTsKLQotICAgICAgICAvLyBjb252ZXJ0IHRvIFZhbGlkYXRpb25FdmVudCBhbmQgZGlzcGF0Y2gKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbC5zaXplKCkgOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVycm9yIHhlID0gKFhtbEVycm9yKWwuZ2V0KGkpOwotCi0gICAgICAgICAgICBpbnQgc2V2ZXJpdHkgPSB4ZS5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SID8gCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkV2ZW50LkVSUk9SIDoKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uRXZlbnQuV0FSTklORzsKLQotICAgICAgICAgICAgVmFsaWRhdGlvbkV2ZW50IHZlID0gbmV3IFZhbGlkYXRpb25FdmVudEltcGwoc2V2ZXJpdHksIHhlLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkxvY2F0b3JFdmVudEltcGwuY3JlYXRlKHhlKSk7Ci0KLSAgICAgICAgICAgIHRyeSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoISBoYW5kbGVyLmhhbmRsZUV2ZW50KHZlKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24odmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsaWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9zY2hlbWEvamF4YmNvbmZpZy54c2QgYi92MS9zcmMvamF4Yi9zY2hlbWEvamF4YmNvbmZpZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYWQwMjYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvc2NoZW1hL2pheGJjb25maWcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6amM9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzA4L2pheGIvY29uZmlnIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wOC9qYXhiL2NvbmZpZyIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgCi0gIDx4czplbGVtZW50IG5hbWU9ImpheGItY29uZmlnIj4KLSAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2xvYmFsLWVsZW1lbnRzIj4KLSAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnbG9iYWwtZWxlbWVudCIgdHlwZT0iamM6Z2xvYmFsLWVsZW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPC94czplbGVtZW50PgotCi0gICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Imdsb2JhbC10eXBlcyIgPgotICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Imdsb2JhbC10eXBlIiB0eXBlPSJqYzpnbG9iYWwtdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnbG9iYWwtZWxlbWVudCI+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icW5hbWUiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1pbXBsIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ2xvYmFsLXR5cGUiLz4KLQotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL3NjaGVtYS9qYXhiY29uZmlnLnhzZGNvbmZpZyBiL3YxL3NyYy9qYXhiL3NjaGVtYS9qYXhiY29uZmlnLnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMDAzMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9zY2hlbWEvamF4YmNvbmZpZy54c2Rjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyI+Ci0gIDx4YjpuYW1lc3BhY2UgdXJpPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wOC9qYXhiL2NvbmZpZyI+Ci0gICAgPHhiOnBhY2thZ2U+b3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnPC94YjpwYWNrYWdlPgotICA8L3hiOm5hbWVzcGFjZT4KLTwveGI6Y29uZmlnPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvRWRpdEJ1aWxkU2NyaXB0LmphdmEgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlYjU5Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHJlcGFja2FnZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIEVkaXRCdWlsZFNjcmlwdAotewotICAgIC8vCi0gICAgLy8gdXNnYWU6IGVkaXQgYnVpbGRmaWxlIHRva2VuIG5ldy12YWx1ZQotICAgIC8vCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoIFN0cmluZ1tdIGFyZ3MgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIiApOwotCi0gICAgICAgIGFyZ3NbIDAgXSA9IGFyZ3NbIDAgXS5yZXBsYWNlKCAnLycsIEZpbGUuc2VwYXJhdG9yQ2hhciApOwotCi0gICAgICAgIEZpbGUgYnVpbGRGaWxlID0gbmV3IEZpbGUoIGFyZ3NbIDAgXSApOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBidWlsZEZpbGUgKTsKLQotICAgICAgICBTdHJpbmcgdG9rZW5TdHIgPSAiPHByb3BlcnR5IG5hbWU9XCIiICsgYXJnc1sgMSBdICsgIlwiIHZhbHVlPVwiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IGkgPSBzYi5pbmRleE9mKCB0b2tlblN0ciApOwotCi0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDYW4ndCBmaW5kIHRva2VuOiAiICsgdG9rZW5TdHIgKTsKLQotICAgICAgICBpbnQgaiA9IGkgKyB0b2tlblN0ci5sZW5ndGgoKTsKLQotICAgICAgICB3aGlsZSAoIHNiLmNoYXJBdCggaiApICE9ICciJyApCi0gICAgICAgICAgICBqKys7Ci0KLSAgICAgICAgc2IucmVwbGFjZSggaSArIHRva2VuU3RyLmxlbmd0aCgpLCBqLCBhcmdzWyAyIF0gKTsKLQotICAgICAgICB3cml0ZUZpbGUoIGJ1aWxkRmlsZSwgc2IgKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkRmlsZSAoIEZpbGUgZiApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmICk7Ci0gICAgICAgIFJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpbiApOwotICAgICAgICBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBjb3B5KCByLCB3ICk7Ci0KLSAgICAgICAgdy5jbG9zZSgpOwotICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgIGluLmNsb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHcuZ2V0QnVmZmVyKCk7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIHdyaXRlRmlsZSAoIEZpbGUgZiwgU3RyaW5nQnVmZmVyIGNoYXJzICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGYgKTsKLSAgICAgICAgV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBvdXQgKTsKLSAgICAgICAgUmVhZGVyIHIgPSBuZXcgU3RyaW5nUmVhZGVyKCBjaGFycy50b1N0cmluZygpICk7Ci0KLSAgICAgICAgY29weSggciwgdyApOwotCi0gICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgdy5jbG9zZSgpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgY29weSAoIFJlYWRlciByLCBXcml0ZXIgdyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyIFsgMTAyNCAqIDE2IF07Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSByLnJlYWQoIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCApOwotCi0gICAgICAgICAgICBpZiAobiA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHcud3JpdGUoIGJ1ZmZlciwgMCwgbiApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlLmphdmEgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwYzkzYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHJlcGFja2FnZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLQotcHVibGljIGNsYXNzIFJlcGFja2FnZQotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ldyBSZXBhY2thZ2UoKS5yZXBhY2thZ2UoIGFyZ3MgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyIHx8ICFhcmdzWzBdLmVxdWFscyggIi1yZXBhY2thZ2UiICkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVzYWdlOiByZXBhY2thZ2UgLXJlcGFja2FnZSBbc3BlY10iICk7Ci0gICAgICAgIAotICAgICAgICBfcmVwYWNrYWdlciA9IG5ldyBSZXBhY2thZ2VyKCBhcmdzWyAxIF0gKTsKLQotICAgICAgICBfZnJvbVBhY2thZ2VzID0gX3JlcGFja2FnZXIuZ2V0RnJvbVBhY2thZ2VzKCk7Ci0gICAgICAgIF90b1BhY2thZ2VzID0gX3JlcGFja2FnZXIuZ2V0VG9QYWNrYWdlcygpOwotICAgICAgICAKLSAgICAgICAgX3BhY2thZ2VQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSggIl5cXHMqcGFja2FnZVxccysoKD86XFx3fFxcLikqKVxccyo7IiwgUGF0dGVybi5NVUxUSUxJTkUgKTsKLSAgICAgICAgCi0gICAgICAgIF9tb3ZlQWxvbmdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgX21vdmVkRGlycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICBGaWxlIGN1cnJlbnREaXIgICA9IG5ldyBGaWxlKCAiLiIgKTsKLSAgICAgICAgRmlsZSBidWlsZERpciAgICAgPSBuZXcgRmlsZSggY3VycmVudERpciwgImJ1aWxkIiApOwotICAgICAgICBGaWxlIHJlcGFja2FnZURpciA9IG5ldyBGaWxlKCBidWlsZERpciwgInJlcGFja2FnZSIgKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZWxldGluZyByZXBhY2thZ2UgZGlyIC4uLiIgKTsKLSAgICAgICAgCi0gICAgICAgIHJlY3Vyc2l2ZURlbGV0ZSggcmVwYWNrYWdlRGlyICk7Ci0KLSAgICAgICAgcmVwYWNrYWdlRGlyLm1rZGlycygpOwotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZpbGxGaWxlcyggZmlsZXMsIGN1cnJlbnREaXIgKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlJlcGFja2FnaW5nICIgKyBmaWxlcy5zaXplKCkgKyAiIGZpbGVzIC4uLiIgKTsKLQotICAgICAgICBpbnQgcHJlZml4TGVuZ3RoID0gY3VycmVudERpci5nZXRDYW5vbmljYWxQYXRoKCkubGVuZ3RoKCk7Ci0KLSAgICAgICAgX3NvdXJjZUJhc2UgPSBjdXJyZW50RGlyOwotICAgICAgICBfdGFyZ2V0QmFzZSA9IHJlcGFja2FnZURpcjsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZmlsZXMuc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmcm9tID0gKEZpbGUpIGZpbGVzLmdldCggaSApOwotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZyb20uZ2V0Q2Fub25pY2FsUGF0aCgpLnN1YnN0cmluZyggcHJlZml4TGVuZ3RoICsgMSApOwotCi0gICAgICAgICAgICByZXBhY2thZ2VGaWxlKCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmlzaE1vdmluZ0ZpbGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlRmlsZSAoIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCggIi5qYXZhIiApKQotICAgICAgICAgICAgcmVwYWNrYWdlSmF2YUZpbGUoIG5hbWUgKTsKLSAgICAgICAgZWxzZSBpZiAobmFtZS5lbmRzV2l0aCggIi54c2Rjb25maWciICkpCi0gICAgICAgICAgICByZXBhY2thZ2VOb25KYXZhRmlsZSggbmFtZSApOwotICAgICAgICBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoICJiaW4iICsgRmlsZS5zZXBhcmF0b3JDaGFyICkpCi0gICAgICAgICAgICByZXBhY2thZ2VOb25KYXZhRmlsZSggbmFtZSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtb3ZlQWxvbmdXaXRoSmF2YUZpbGVzKCBuYW1lICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZUFsb25nV2l0aEphdmFGaWxlcyggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgX21vdmVBbG9uZ0ZpbGVzLmFkZChuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmluaXNoTW92aW5nRmlsZXMgKCApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9tb3ZlQWxvbmdGaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRvTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSBSZXBhY2thZ2VyLmRpckZvclBhdGgoIG5hbWUgKTsKLSAgICAgICAgICAgIFN0cmluZyB0b0RpciA9IChTdHJpbmcpIF9tb3ZlZERpcnMuZ2V0KCBzcmNEaXIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRvRGlyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdG9OYW1lID0gbmV3IEZpbGUoIHRvRGlyLCBuZXcgRmlsZSggbmFtZSApLmdldE5hbWUoKSApLnRvU3RyaW5nKCk7IAotCi0gICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCggIi5odG1sIiApKQotICAgICAgICAgICAgICAgIHJlcGFja2FnZU5vbkphdmFGaWxlKCBuYW1lLCB0b05hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb3B5RmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBuYW1lICksIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgdG9OYW1lICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZU5vbkphdmFGaWxlICggU3RyaW5nIG5hbWUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIG5hbWUgKSApOwotCi0gICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKLSAgICAgICAgCi0gICAgICAgIHdyaXRlRmlsZSggbmV3IEZpbGUoIF90YXJnZXRCYXNlLCBuYW1lICksIHNiICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZU5vbkphdmFGaWxlICggU3RyaW5nIHNvdXJjZU5hbWUsIFN0cmluZyB0YXJnZXROYW1lICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSByZWFkRmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBzb3VyY2VOYW1lICkgKTsKLQotICAgICAgICBfcmVwYWNrYWdlci5yZXBhY2thZ2UoIHNiICk7Ci0gICAgICAgIAotICAgICAgICB3cml0ZUZpbGUoIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgdGFyZ2V0TmFtZSApLCBzYiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2VKYXZhRmlsZSAoIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSByZWFkRmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBuYW1lICkgKTsKLQotICAgICAgICBNYXRjaGVyIHBhY2thZ2VNYXRjaGVyID0gX3BhY2thZ2VQYXR0ZXJuLm1hdGNoZXIoIHNiICk7Ci0KLSAgICAgICAgaWYgKHBhY2thZ2VNYXRjaGVyLmZpbmQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBrZyA9IHBhY2thZ2VNYXRjaGVyLmdyb3VwKCAxICk7Ci0gICAgICAgICAgICBpbnQgcGtnU3RhcnQgPSBwYWNrYWdlTWF0Y2hlci5zdGFydCggMSApOwotICAgICAgICAgICAgaW50IHBrZ0VuZCA9IHBhY2thZ2VNYXRjaGVyLmVuZCggMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoZXIuZmluZCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVHdvIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbnMgZm91bmQ6ICIgKyBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgZmlsZVBhdGggPSBSZXBhY2thZ2VyLnNwbGl0UGF0aCggbmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyICk7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjRGlyID0gUmVwYWNrYWdlci5kaXJGb3JQYXRoKCBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNvcnQgdGhlIHJlcGFja2FnZSBzcGVjIHNvIHRoYXQgbG9uZ2VyIGZyb20ncyBhcmUgZmlyc3QgdG8gbWF0Y2gKLSAgICAgICAgICAgIC8vIGxvbmdlc3QgcGFja2FnZSBmaXJzdAotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3dhcHBlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAxIDsgaSA8IGZpbGVQYXRoLnNpemUoKSA7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3BlYzEgPSAoU3RyaW5nKSBmaWxlUGF0aC5nZXQoIGkgLSAxICk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMiA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzcGVjMS5pbmRleE9mKCAnOicgKSA8IHNwZWMyLmluZGV4T2YoICc6JyApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5zZXQoIGkgLSAxLCBzcGVjMiApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGguc2V0KCBpLCBzcGVjMSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghc3dhcHBlZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3QgcGtnUGF0aCA9IFJlcGFja2FnZXIuc3BsaXRQYXRoKCBwa2csICcuJyApOwotCi0gICAgICAgICAgICBpbnQgZiA9IGZpbGVQYXRoLnNpemUoKSAtIDI7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gcGtnUGF0aC5zaXplKCkgLSAxIDsgaSA+PSAwIDsgaS0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguZ2V0KCBpICkuZXF1YWxzKCBmaWxlUGF0aC5nZXQoIGYtLSApICkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiUGFja2FnZSBzcGVjIGRpZmZlcnMgZnJvbSBmaWxlIHBhdGg6ICIgKyBuYW1lICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3QgY2hhbmdlVG8gPSBudWxsOwotICAgICAgICAgICAgTGlzdCBjaGFuZ2VGcm9tID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZnJvbToKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbVBhY2thZ2VzLnNpemUoKSA7IGkgKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3QgZnJvbSA9IChMaXN0KSBfZnJvbVBhY2thZ2VzLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGZyb20uc2l6ZSgpIDw9IHBrZ1BhdGguc2l6ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IGZyb20uc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnJvbS5nZXQoIGogKS5lcXVhbHMoIHBrZ1BhdGguZ2V0KCBqICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGZyb207Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlRnJvbSA9IGZyb207Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZVRvID0gKExpc3QpIF90b1BhY2thZ2VzLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoYW5nZVRvICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1BrZyA9ICIiOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgY2hhbmdlVG8uc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGtnICs9ICIuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgKz0gRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gY2hhbmdlVG8uZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05hbWUgKz0gY2hhbmdlVG8uZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gZmlsZVBhdGguc2l6ZSgpIC0gcGtnUGF0aC5zaXplKCkgLSAyIDsgaSA+PSAwIDsgaS0tICkKLSAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSApICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgbmV3TmFtZTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gY2hhbmdlRnJvbS5zaXplKCkgOyBpIDwgcGtnUGF0aC5zaXplKCkgOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBGaWxlLnNlcGFyYXRvckNoYXIgKyAoU3RyaW5nKSBwa2dQYXRoLmdldCggaSApOwotICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gJy4nICsgKFN0cmluZykgcGtnUGF0aC5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZXdOYW1lICs9IEZpbGUuc2VwYXJhdG9yQ2hhciArIChTdHJpbmcpIGZpbGVQYXRoLmdldCggZmlsZVBhdGguc2l6ZSgpIC0gMSApOwotCi0gICAgICAgICAgICAgICAgc2IucmVwbGFjZSggcGtnU3RhcnQsIHBrZ0VuZCwgbmV3UGtnICk7Ci0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmV3TmFtZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3RGlyID0gUmVwYWNrYWdlci5kaXJGb3JQYXRoKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFzcmNEaXIuZXF1YWxzKG5ld0RpcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbW92ZWREaXJzLnB1dChzcmNEaXIsIG5ld0Rpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgX3JlcGFja2FnZXIucmVwYWNrYWdlKCBzYiApOwotICAgICAgICAKLSAgICAgICAgd3JpdGVGaWxlKCBuZXcgRmlsZSggX3RhcmdldEJhc2UsIG5hbWUgKSwgc2IgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHdyaXRlRmlsZSAoIEZpbGUgZiwgU3RyaW5nQnVmZmVyIGNoYXJzICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwotICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG91dCApOwotICAgICAgICBSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoIGNoYXJzLnRvU3RyaW5nKCkgKTsKLQotICAgICAgICBjb3B5KCByLCB3ICk7Ci0KLSAgICAgICAgci5jbG9zZSgpOwotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdCdWZmZXIgcmVhZEZpbGUgKCBGaWxlIGYgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZiApOwotICAgICAgICBSZWFkZXIgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaW4gKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgY29weSggciwgdyApOwotCi0gICAgICAgIHcuY2xvc2UoKTsKLSAgICAgICAgci5jbG9zZSgpOwotICAgICAgICBpbi5jbG9zZSgpOwotCi0gICAgICAgIHJldHVybiB3LmdldEJ1ZmZlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZSAoIEZpbGUgZnJvbSwgRmlsZSB0byApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdG8uZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZnJvbSApOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCB0byApOwotCi0gICAgICAgIGNvcHkoIGluLCBvdXQgKTsKLSAgICAgICAgCi0gICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICBpbi5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5ICggSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZSBbIDEwMjQgKiAxNiBdOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gaW4ucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgb3V0LndyaXRlKCBidWZmZXIsIDAsIG4gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb3B5ICggUmVhZGVyIHIsIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXIgWyAxMDI0ICogMTYgXTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdy53cml0ZSggYnVmZmVyLCAwLCBuICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmlsbEZpbGVzICggQXJyYXlMaXN0IGZpbGVzLCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcy5hZGQoIGZpbGUgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeQotCi0gICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoICJidWlsZCIgKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4Y2x1ZGUgQ1ZTIGRpcmVjdG9yaWVzCi0gICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoICJDVlMiICkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IGZpbGUubGlzdCgpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBlbnRyaWVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICBmaWxsRmlsZXMoIGZpbGVzLCBuZXcgRmlsZSggZmlsZSwgZW50cmllc1sgaSBdICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWN1cnNpdmVEZWxldGUgKCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gZmlsZS5saXN0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBlbnRyaWVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKCBuZXcgRmlsZSggZmlsZSwgZW50cmllc1sgaSBdICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIF9zb3VyY2VCYXNlOwotICAgIHByaXZhdGUgRmlsZSBfdGFyZ2V0QmFzZTsKLQotICAgIHByaXZhdGUgTGlzdCBfZnJvbVBhY2thZ2VzOwotICAgIHByaXZhdGUgTGlzdCBfdG9QYWNrYWdlczsKLSAgICAKLSAgICBwcml2YXRlIFBhdHRlcm4gX3BhY2thZ2VQYXR0ZXJuOwotCi0gICAgcHJpdmF0ZSBSZXBhY2thZ2VyIF9yZXBhY2thZ2VyOwotICAgIAotICAgIHByaXZhdGUgTWFwIF9tb3ZlZERpcnM7Ci0gICAgcHJpdmF0ZSBMaXN0IF9tb3ZlQWxvbmdGaWxlczsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZXIuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2N2Y4Ni4uMDAwMDAwMAotLS0gYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSByZXBhY2thZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFJlcGFja2FnZXIKLXsKLSAgICBwdWJsaWMgUmVwYWNrYWdlciAoIFN0cmluZyByZXBhY2thZ2VTcGVjcyApCi0gICAgewotICAgICAgICBfZnJvbVBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBfdG9QYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmVwYWNrYWdlcyA9IHNwbGl0UGF0aCggcmVwYWNrYWdlU3BlY3MsICc7JyApOwotCi0gICAgICAgIC8vIFNvcnQgdGhlIHJlcGFja2FnZSBzcGVjIHNvIHRoYXQgbG9uZ2VyIGZyb20ncyBhcmUgZmlyc3QgdG8gbWF0Y2gKLSAgICAgICAgLy8gbG9uZ2VzdCBwYWNrYWdlIGZpcnN0Ci0gICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHN3YXBwZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAxIDsgaSA8IHJlcGFja2FnZXMuc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BlYzEgPSAoU3RyaW5nKSByZXBhY2thZ2VzLmdldCggaSAtIDEgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BlYzIgPSAoU3RyaW5nKSByZXBhY2thZ2VzLmdldCggaSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzcGVjMS5pbmRleE9mKCAnOicgKSA8IHNwZWMyLmluZGV4T2YoICc6JyApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwYWNrYWdlcy5zZXQoIGkgLSAxLCBzcGVjMiApOwotICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VzLnNldCggaSwgc3BlYzEgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN3YXBwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzd2FwcGVkKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHJlcGFja2FnZXMuc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNwZWMgPSAoU3RyaW5nKSByZXBhY2thZ2VzLmdldCggaSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgaiA9IHNwZWMuaW5kZXhPZiggJzonICk7Ci0KLSAgICAgICAgICAgIGlmIChqIDwgMCB8fCBzcGVjLmluZGV4T2YoICc6JywgaiArIDEgKSA+PSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiSWxsZWdhbCByZXBhY2thZ2Ugc3BlY2lmaWNhdGlvbjogIiArIHNwZWMgKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZyb20gPSBzcGVjLnN1YnN0cmluZyggMCwgaiApOwotICAgICAgICAgICAgU3RyaW5nIHRvID0gc3BlYy5zdWJzdHJpbmcoIGogKyAxICk7Ci0KLSAgICAgICAgICAgIF9mcm9tUGFja2FnZXMuYWRkKCBSZXBhY2thZ2VyLnNwbGl0UGF0aCggZnJvbSwgJy4nICkgKTsKLSAgICAgICAgICAgIF90b1BhY2thZ2VzLmFkZCggUmVwYWNrYWdlci5zcGxpdFBhdGgoIHRvLCAnLicgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgX2Zyb21NYXRjaGVycyA9IG5ldyBNYXRjaGVyIFsgX2Zyb21QYWNrYWdlcy5zaXplKCkgKiAyIF07Ci0gICAgICAgIF90b1BhY2thZ2VOYW1lcyA9IG5ldyBTdHJpbmcgWyBfZnJvbVBhY2thZ2VzLnNpemUoKSAqIDIgXTsKLQotICAgICAgICBhZGRQYXR0ZXJucyggJy4nLCAwICk7Ci0gICAgICAgIGFkZFBhdHRlcm5zKCAnLycsIF9mcm9tUGFja2FnZXMuc2l6ZSgpICk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRQYXR0ZXJucyAoIGNoYXIgc2VwLCBpbnQgb2ZmICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbVBhY2thZ2VzLnNpemUoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgZnJvbSA9IChMaXN0KSBfZnJvbVBhY2thZ2VzLmdldCggaSApOwotICAgICAgICAgICAgTGlzdCB0byA9IChMaXN0KSBfdG9QYWNrYWdlcy5nZXQoIGkgKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IGZyb20uc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaiA+IDApCi0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gKz0gIlxcIiArIHNlcDsKLQotICAgICAgICAgICAgICAgIHBhdHRlcm4gKz0gZnJvbS5nZXQoIGogKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHRvUGFja2FnZSA9ICIiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgdG8uc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaiA+IDApCi0gICAgICAgICAgICAgICAgICAgIHRvUGFja2FnZSArPSBzZXA7Ci0KLSAgICAgICAgICAgICAgICB0b1BhY2thZ2UgKz0gdG8uZ2V0KCBqICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9mcm9tTWF0Y2hlcnNbIG9mZiArIGkgXSA9IFBhdHRlcm4uY29tcGlsZSggcGF0dGVybiApLm1hdGNoZXIoIG51bGwgKTsKLSAgICAgICAgICAgIF90b1BhY2thZ2VOYW1lc1sgb2ZmICsgaSBdID0gdG9QYWNrYWdlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlICggU3RyaW5nQnVmZmVyIHNiICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbU1hdGNoZXJzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IChNYXRjaGVyKSBfZnJvbU1hdGNoZXJzWyBpIF07Ci0KLSAgICAgICAgICAgIG1hdGNoZXIucmVzZXQoIHNiICk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggbWF0Y2hlci5maW5kKCkgKQotICAgICAgICAgICAgICAgIHNiLnJlcGxhY2UoIG1hdGNoZXIuc3RhcnQoKSwgbWF0Y2hlci5lbmQoKSwgX3RvUGFja2FnZU5hbWVzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEZyb21QYWNrYWdlcyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZnJvbVBhY2thZ2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFRvUGFja2FnZXMgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3RvUGFja2FnZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IHNwbGl0UGF0aCAoIFN0cmluZyBwYXRoLCBjaGFyIHNlcGFyYXRvciApCi0gICAgewotICAgICAgICBBcnJheUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpID0gcGF0aC5pbmRleE9mKCBzZXBhcmF0b3IgKTsKLQotICAgICAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZCggcGF0aC5zdWJzdHJpbmcoIDAsIGkgKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoIGkgKyAxICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZCggcGF0aCApOwotCi0gICAgICAgIHJldHVybiBjb21wb25lbnRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJGb3JQYXRoICggU3RyaW5nIHBhdGggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBfZnJvbVBhY2thZ2VzOwotICAgIHByaXZhdGUgTGlzdCBfdG9QYWNrYWdlczsKLSAgICAKLSAgICBwcml2YXRlIE1hdGNoZXJbXSBfZnJvbU1hdGNoZXJzOwotICAgIHByaXZhdGUgU3RyaW5nW10gIF90b1BhY2thZ2VOYW1lczsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdG9vbHNjaGVtYS9sdGdmbXQueHNkIGIvdjEvc3JjL3Rvb2xzY2hlbWEvbHRnZm10LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0ZWZlYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdG9vbHNjaGVtYS9sdGdmbXQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wNS94bWxiZWFuL2x0Z2ZtdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5iZWEuY29tLzIwMDMvMDUveG1sYmVhbi9sdGdmbXQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGVzdHMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idGVzdCIgdHlwZT0idG5zOnRlc3QtY2FzZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0ZXN0LWNhc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlsZXMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlsZSIgdHlwZT0idG5zOmZpbGUtZGVzYyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9yaWdpbiIgdHlwZT0ieHM6dG9rZW4iLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vZGlmaWVkIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmlsZS1kZXNjIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRzRGlyIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9sZGVyIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmlsZU5hbWUiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb2xlIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2NoZW1hIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnN0YW5jZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzb3VyY2UiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkaXR5IiB0eXBlPSJ4czpib29sZWFuIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3Rvb2xzY2hlbWEvc3Vic3R3c2RsLnhzZCBiL3YxL3NyYy90b29sc2NoZW1hL3N1YnN0d3NkbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiY2NmM2MuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3Rvb2xzY2hlbWEvc3Vic3R3c2RsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgIFRoaXMgc2NoZW1hIHN0YW5kcyBpbiBmb3IgYSBzY2hlbWEgZm9yIFdTREwuCi0KLSAgIEl0IGhhcyBub25lIG9mIHRoZSByZWFsIHN0cnVjdHVyZSBvZiBhIFdTREwgZXhjZXB0ICJpbXBvcnRzIiBhbmQKLSAgIHRoZSAybmQtbGV2ZWwgdGFnIG5hbWVzLgotCi0gICBXaGVuIGNvbXBpbGluZyBzY2hlbWFzIHdpdGhpbiAud3NkbCBmaWxlcywgd2UgdXNlIHRoaXMgc2NoZW1hIHRvIGxvYWQKLSAgIHRoZSBXU0RMIGZpbGVzLiAgT2YgY291cnNlLCBXU0RMIGZpbGVzIGFyZSBhY3R1YWxseSBpbiB0aGUKLSAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIG5hbWVzcGFjZSwgYnV0IHdlIHVzZSB0aGUKLSAgIExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyBvcHRpb24gaW4gb3JkZXIgdG8gaW50ZXJuYWxseSBzdWJzdGl0dXRlCi0gICB0aGUgbmFtZXNwYWNlIGJlbG93LgotLS0+Ci0KLQotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW50ZXJuYWwveG1sYmVhbnMvd3NkbHN1YnN0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW50ZXJuYWwveG1sYmVhbnMvd3NkbHN1YnN0IgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRlZmluaXRpb25zIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiIHR5cGU9InRuczpUSW1wb3J0Ii8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InR5cGVzIi8+ICAgICAgICAgICAgICAgCQkJCi0gICAgICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2UiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmluZGluZyIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwb3J0VHlwZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlIi8+Ci0gICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czphbnlBdHRyaWJ1dGUvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVEltcG9ydCI+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIi8+CQkKLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMvdG9vbHNjaGVtYS94c2Rvd25sb2FkLnhzZCBiL3YxL3NyYy90b29sc2NoZW1hL3hzZG93bmxvYWQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTY5ZDM2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90b29sc2NoZW1hL3hzZG93bmxvYWQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6aT0iaHR0cDovL3d3dy5iZWEuY29tLzIwMDMvMDEveG1sYmVhbi94c2Rvd25sb2FkIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMS94bWxiZWFuL3hzZG93bmxvYWQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZG93bmxvYWRlZC1zY2hlbWFzIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJlbnRyeSIgdHlwZT0iaTpkb3dubG9hZGVkLXNjaGVtYS1lbnRyeSIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0RGlyZWN0b3J5IiB0eXBlPSJ4czp0b2tlbiIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZG93bmxvYWRlZC1zY2hlbWEtZW50cnkiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hhMSIgdHlwZT0ieHM6dG9rZW4iLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9CTVBhdHRlcm4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvQk1QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyN2M1NWQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9CTVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLQotLyoqCi0gKiBCb3llci1Nb29yZSBzZWFyY2hlci4KLSAqLwotcHVibGljIGNsYXNzIEJNUGF0dGVybiB7Ci0gICAgY2hhcltdIHBhdHRlcm47Ci0gICAgaW50W10gc2hpZnRUYWJsZTsKLSAgICBib29sZWFuIGlnbm9yZUNhc2U7Ci0KLSAgICBwdWJsaWMgQk1QYXR0ZXJuKFN0cmluZyBwYXQsIGJvb2xlYW4gaWdub3JlQ2FzZSkgewotICAgICAgICB0aGlzKHBhdCwgMjU2LCBpZ25vcmVDYXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQk1QYXR0ZXJuKFN0cmluZyBwYXQsIGludCB0YWJsZVNpemUsIGJvb2xlYW4gaWdub3JlQ2FzZSkgewotICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgdGhpcy5zaGlmdFRhYmxlID0gbmV3IGludFt0YWJsZVNpemVdOwotICAgICAgICB0aGlzLmlnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOwotCi0gICAgICAgIGludCBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsgIGkgKyspCi0gICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaV0gPSBsZW5ndGg7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbGVuZ3RoOyAgaSArKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHRoaXMucGF0dGVybltpXTsKLSAgICAgICAgICAgIGludCBkaWZmID0gbGVuZ3RoLWktMTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChkaWZmIDwgdGhpcy5zaGlmdFRhYmxlW2luZGV4XSkKLSAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdID0gZGlmZjsKLSAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpIHsKLSAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZmYgPCB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdKQotICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdID0gZGlmZjsKLSAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaCk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZmYgPCB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdKQotICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdID0gZGlmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiA8dmFyPml0ZXJhdG9yPC92YXI+IGRvZXMgbm90IGNvbnRhaW4gdGhpcyBwYXR0ZXJuLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgIHJldHVybiB0aGlzLm1hdGNoZXNJZ25vcmVDYXNlKGl0ZXJhdG9yLCBzdGFydCwgbGltaXQpOwotICAgICAgICBpbnQgcGxlbmd0aCA9IHRoaXMucGF0dGVybi5sZW5ndGg7Ci0gICAgICAgIGlmIChwbGVuZ3RoID09IDApICByZXR1cm4gc3RhcnQ7Ci0gICAgICAgIGludCBpbmRleCA9IHN0YXJ0K3BsZW5ndGg7Ci0gICAgICAgIHdoaWxlIChpbmRleCA8PSBsaW1pdCkgewotICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7Ci0gICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKLSAgICAgICAgICAgIGNoYXIgY2g7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaCA9IGl0ZXJhdG9yLnNldEluZGV4KC0taW5kZXgpKSAhPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gLTEgaWYgPHZhcj5zdHI8L3Zhcj4gZG9lcyBub3QgY29udGFpbiB0aGlzIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIGludCBtYXRjaGVzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpICByZXR1cm4gdGhpcy5tYXRjaGVzSWdub3JlQ2FzZShzdHIsIHN0YXJ0LCBsaW1pdCk7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRzIGF0ICIraW5kZXgpOwotICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7Ci0gICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKLSAgICAgICAgICAgIGNoYXIgY2g7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoLS1pbmRleCkpICE9IHRoaXMucGF0dGVyblstLXBpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChwaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfSB3aGlsZSAocGluZGV4ID4gMCk7Ci0gICAgICAgICAgICBpbmRleCArPSB0aGlzLnNoaWZ0VGFibGVbY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoXSsxOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgbmluZGV4KSAgaW5kZXggPSBuaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gLTEgaWYgPHZhcj5jaGFyczwvY2hhcj4gZG9lcyBub3QgY29udGFpbiB0aGlzIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIGludCBtYXRjaGVzKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgIHJldHVybiB0aGlzLm1hdGNoZXNJZ25vcmVDYXNlKGNoYXJzLCBzdGFydCwgbGltaXQpOwotICAgICAgICBpbnQgcGxlbmd0aCA9IHRoaXMucGF0dGVybi5sZW5ndGg7Ci0gICAgICAgIGlmIChwbGVuZ3RoID09IDApICByZXR1cm4gc3RhcnQ7Ci0gICAgICAgIGludCBpbmRleCA9IHN0YXJ0K3BsZW5ndGg7Ci0gICAgICAgIHdoaWxlIChpbmRleCA8PSBsaW1pdCkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIlN0YXJ0cyBhdCAiK2luZGV4KTsKLSAgICAgICAgICAgIGludCBwaW5kZXggPSBwbGVuZ3RoOwotICAgICAgICAgICAgaW50IG5pbmRleCA9IGluZGV4KzE7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGlmICgoY2ggPSBjaGFyc1stLWluZGV4XSkgIT0gdGhpcy5wYXR0ZXJuWy0tcGluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50IG1hdGNoZXNJZ25vcmVDYXNlKENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICBpbnQgcGxlbmd0aCA9IHRoaXMucGF0dGVybi5sZW5ndGg7Ci0gICAgICAgIGlmIChwbGVuZ3RoID09IDApICByZXR1cm4gc3RhcnQ7Ci0gICAgICAgIGludCBpbmRleCA9IHN0YXJ0K3BsZW5ndGg7Ci0gICAgICAgIHdoaWxlIChpbmRleCA8PSBsaW1pdCkgewotICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7Ci0gICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKLSAgICAgICAgICAgIGNoYXIgY2g7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaDEgPSBjaCA9IGl0ZXJhdG9yLnNldEluZGV4KC0taW5kZXgpOwotICAgICAgICAgICAgICAgIGNoYXIgY2gyID0gdGhpcy5wYXR0ZXJuWy0tcGluZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAoY2gxICE9IGNoMikgewotICAgICAgICAgICAgICAgICAgICBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKLSAgICAgICAgICAgICAgICAgICAgY2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyICYmIENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDEpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfSB3aGlsZSAocGluZGV4ID4gMCk7Ci0gICAgICAgICAgICBpbmRleCArPSB0aGlzLnNoaWZ0VGFibGVbY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoXSsxOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgbmluZGV4KSAgaW5kZXggPSBuaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBpbnQgbWF0Y2hlc0lnbm9yZUNhc2UoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGNoID0gdGV4dC5jaGFyQXQoLS1pbmRleCk7Ci0gICAgICAgICAgICAgICAgY2hhciBjaDIgPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgICAgICAgICBjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMikpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBtYXRjaGVzSWdub3JlQ2FzZShjaGFyW10gY2hhcnMsIGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGNoID0gY2hhcnNbLS1pbmRleF07Ci0gICAgICAgICAgICAgICAgY2hhciBjaDIgPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgICAgICAgICBjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMikpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnRbXSBzaGlmdFRhYmxlID0gbmV3IGludFsyNTZdOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUJveWVyTW9vcmUoYXJndlswXSwgc2hpZnRUYWJsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpbnQgbyA9IC0xOwotICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlID0gbmV3IGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihhcmd2WzFdKTsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7ICBpIDwgMTAwMDA7ICBpICsrKQotICAgICAgICAgICAgICAgIG8gPSBzZWFyY2hJZ25vcmVDYXNlc1dpdGhCb3llck1vb3JlKGl0ZSwgMCwgYXJndlswXSwgc2hpZnRUYWJsZSk7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0OwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQ6ICIrbysiLCBFbGFwc2VkOiAiK3N0YXJ0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0qLwotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L01hdGNoLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L01hdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2Y3YmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9NYXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYXMgcmFuZ2VzIGNhcHR1cmVkIGluIG1hdGNoaW5nLgotICoKLSAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhjaGFyW10sIGludCwgaW50LCBNYXRjaCkKLSAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhjaGFyW10sIE1hdGNoKQotICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvciwgTWF0Y2gpCi0gKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIE1hdGNoKQotICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcsIE1hdGNoKQotICogQGF1dGhvciBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OwotICovCi1wdWJsaWMgY2xhc3MgTWF0Y2ggaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIGludFtdIGJlZ2lucG9zID0gbnVsbDsKLSAgICBpbnRbXSBlbmRwb3MgPSBudWxsOwotICAgIGludCBub2Zncm91cHMgPSAwOwotCi0gICAgQ2hhcmFjdGVySXRlcmF0b3IgY2lTb3VyY2UgPSBudWxsOwotICAgIFN0cmluZyBzdHJTb3VyY2UgPSBudWxsOwotICAgIGNoYXJbXSBjaGFyU291cmNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIE1hdGNoKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIE1hdGNoIG1hID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgIGlmICh0aGlzLm5vZmdyb3VwcyA+IDApIHsKLSAgICAgICAgICAgIG1hLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mZ3JvdXBzKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNpU291cmNlICE9IG51bGwpICBtYS5zZXRTb3VyY2UodGhpcy5jaVNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5zdHJTb3VyY2UgIT0gbnVsbCkgIG1hLnNldFNvdXJjZSh0aGlzLnN0clNvdXJjZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLm5vZmdyb3VwczsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBtYS5zZXRCZWdpbm5pbmcoaSwgdGhpcy5nZXRCZWdpbm5pbmcoaSkpOwotICAgICAgICAgICAgICAgIG1hLnNldEVuZChpLCB0aGlzLmdldEVuZChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TnVtYmVyT2ZHcm91cHMoaW50IG4pIHsKLSAgICAgICAgaW50IG9sZG4gPSB0aGlzLm5vZmdyb3VwczsKLSAgICAgICAgdGhpcy5ub2Zncm91cHMgPSBuOwotICAgICAgICBpZiAob2xkbiA8PSAwCi0gICAgICAgICAgICB8fCBvbGRuIDwgbiB8fCBuKjIgPCBvbGRuKSB7Ci0gICAgICAgICAgICB0aGlzLmJlZ2lucG9zID0gbmV3IGludFtuXTsKLSAgICAgICAgICAgIHRoaXMuZW5kcG9zID0gbmV3IGludFtuXTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBuOyAgaSArKykgewotICAgICAgICAgICAgdGhpcy5iZWdpbnBvc1tpXSA9IC0xOwotICAgICAgICAgICAgdGhpcy5lbmRwb3NbaV0gPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlKENoYXJhY3Rlckl0ZXJhdG9yIGNpKSB7Ci0gICAgICAgIHRoaXMuY2lTb3VyY2UgPSBjaTsKLSAgICAgICAgdGhpcy5zdHJTb3VyY2UgPSBudWxsOwotICAgICAgICB0aGlzLmNoYXJTb3VyY2UgPSBudWxsOwotICAgIH0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHRoaXMuY2lTb3VyY2UgPSBudWxsOwotICAgICAgICB0aGlzLnN0clNvdXJjZSA9IHN0cjsKLSAgICAgICAgdGhpcy5jaGFyU291cmNlID0gbnVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2UoY2hhcltdIGNoYXJzKSB7Ci0gICAgICAgIHRoaXMuY2lTb3VyY2UgPSBudWxsOwotICAgICAgICB0aGlzLnN0clNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuY2hhclNvdXJjZSA9IGNoYXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVnaW5uaW5nKGludCBpbmRleCwgaW50IHYpIHsKLSAgICAgICAgdGhpcy5iZWdpbnBvc1tpbmRleF0gPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RW5kKGludCBpbmRleCwgaW50IHYpIHsKLSAgICAgICAgdGhpcy5lbmRwb3NbaW5kZXhdID0gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXBzLgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgMSB3aGVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIG5vIGNhcHR1cmluZy1wYXJlbnRoZXNpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mR3JvdXBzKCkgewotICAgICAgICBpZiAodGhpcy5ub2Zncm91cHMgPD0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZmdyb3VwczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IHRleHQgbWF0Y2hlZCB0byBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIGdyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IExlc3MgdGhhbiA8Y29kZT5nZXROdW1iZXJPZkdyb3VwcygpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJlZ2lubmluZyhpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHRoaXMuYmVnaW5wb3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOwotICAgICAgICByZXR1cm4gdGhpcy5iZWdpbnBvc1tpbmRleF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGVuZCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IHRleHQgbWF0Y2hlZCB0byBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIGdyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IExlc3MgdGhhbiA8Y29kZT5nZXROdW1iZXJPZkdyb3VwcygpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVuZChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHRoaXMuZW5kcG9zID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIHJlc3VsdCBpcyBub3Qgc2V0LiIpOwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IHRoaXMubm9mZ3JvdXBzIDw9IGluZGV4KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLm5vZmdyb3VwcysiOiAiK2luZGV4KTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZW5kcG9zW2luZGV4XTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gc3Vic3RyaW5nIG9mIHRoZSB0YXJnZXQgdGV4dCBtYXRjaGVkIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggTGVzcyB0aGFuIDxjb2RlPmdldE51bWJlck9mR3JvdXBzKCk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FwdHVyZWRUZXh0KGludCBpbmRleCkgewotICAgICAgICBpZiAodGhpcy5iZWdpbnBvcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWF0Y2goKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQuIik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOwotICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICBpbnQgYmVnaW4gPSB0aGlzLmJlZ2lucG9zW2luZGV4XSwgZW5kID0gdGhpcy5lbmRwb3NbaW5kZXhdOwotICAgICAgICBpZiAoYmVnaW4gPCAwIHx8IGVuZCA8IDApICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuY2lTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0ID0gUkVVdGlsLnN1YnN0cmluZyh0aGlzLmNpU291cmNlLCBiZWdpbiwgZW5kKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0clNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSB0aGlzLnN0clNvdXJjZS5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBuZXcgU3RyaW5nKHRoaXMuY2hhclNvdXJjZSwgYmVnaW4sIGVuZC1iZWdpbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODIwMzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9PcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKi8KLWNsYXNzIE9wIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IERPVCA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSID0gMTsgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUgY2hhcmFjdGVyCi0gICAgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDM7ICAgICAgICAgICAgICAgICAvLyBbYS16QS1aXQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTlJBTkdFID0gNDsgICAgICAgICAgICAgICAgLy8gW15hLXpBLVpdCi0gICAgc3RhdGljIGZpbmFsIGludCBBTkNIT1IgPSA1OyAgICAgICAgICAgICAgICAvLyBeICQgLi4uCi0gICAgc3RhdGljIGZpbmFsIGludCBTVFJJTkcgPSA2OyAgICAgICAgICAgICAgICAvLyBsaXRlcmFsIFN0cmluZyAKLSAgICBzdGF0aWMgZmluYWwgaW50IENMT1NVUkUgPSA3OyAgICAgICAgICAgICAgIC8vIFgqCi0gICAgc3RhdGljIGZpbmFsIGludCBOT05HUkVFRFlDTE9TVVJFID0gODsgICAgICAvLyBYKj8KLSAgICBzdGF0aWMgZmluYWwgaW50IFFVRVNUSU9OID0gOTsgICAgICAgICAgICAgIC8vIFg/Ci0gICAgc3RhdGljIGZpbmFsIGludCBOT05HUkVFRFlRVUVTVElPTiA9IDEwOyAgICAvLyBYPz8KLSAgICBzdGF0aWMgZmluYWwgaW50IFVOSU9OID0gMTE7ICAgICAgICAgICAgICAgIC8vIFh8WQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FQVFVSRSA9IDE1OyAgICAgICAgICAgICAgLy8gKCBhbmQgKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1JFRkVSRU5DRSA9IDE2OyAgICAgICAgLy8gXDEgXDIgLi4uCi0gICAgc3RhdGljIGZpbmFsIGludCBMT09LQUhFQUQgPSAyMDsgICAgICAgICAgICAvLyAoPz0uLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBORUdBVElWRUxPT0tBSEVBRCA9IDIxOyAgICAvLyAoPyEuLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBMT09LQkVISU5EID0gMjI7ICAgICAgICAgICAvLyAoPzw9Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQkVISU5EID0gMjM7ICAgLy8gKD88IS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IElOREVQRU5ERU5UID0gMjQ7ICAgICAgICAgIC8vICg/Pi4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PRElGSUVSID0gMjU7ICAgICAgICAgICAgIC8vICg/aW1zLWltczouLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT04gPSAyNjsgICAgICAgICAgICAvLyAoPyguLil5ZXN8bm8pCi0KLSAgICBzdGF0aWMgaW50IG5vZmluc3RhbmNlcyA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlQgPSBmYWxzZTsKLQotICAgIHN0YXRpYyBPcCBjcmVhdGVEb3QoKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBPcChPcC5ET1QpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hhck9wIGNyZWF0ZUNoYXIoaW50IGRhdGEpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IENoYXJPcChPcC5DSEFSLCBkYXRhKTsKLSAgICB9Ci0gICAgc3RhdGljIENoYXJPcCBjcmVhdGVBbmNob3IoaW50IGRhdGEpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IENoYXJPcChPcC5BTkNIT1IsIGRhdGEpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hhck9wIGNyZWF0ZUNhcHR1cmUoaW50IG51bWJlciwgT3AgbmV4dCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIENoYXJPcCBvcCA9IG5ldyBDaGFyT3AoT3AuQ0FQVFVSRSwgbnVtYmVyKTsKLSAgICAgICAgb3AubmV4dCA9IG5leHQ7Ci0gICAgICAgIHJldHVybiBvcDsKLSAgICB9Ci0gICAgc3RhdGljIFVuaW9uT3AgY3JlYXRlVW5pb24oaW50IHNpemUpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiQ3JlYXRlcyBVbmlvbk9wIik7Ci0gICAgICAgIHJldHVybiBuZXcgVW5pb25PcChPcC5VTklPTiwgc2l6ZSk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZUNsb3N1cmUoaW50IGlkKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBNb2RpZmllck9wKE9wLkNMT1NVUkUsIGlkLCAtMSk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZU5vbkdyZWVkeUNsb3N1cmUoKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGlsZE9wKE9wLk5PTkdSRUVEWUNMT1NVUkUpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVRdWVzdGlvbihib29sZWFuIG5vbmdyZWVkeSkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hpbGRPcChub25ncmVlZHkgPyBPcC5OT05HUkVFRFlRVUVTVElPTiA6IE9wLlFVRVNUSU9OKTsKLSAgICB9Ci0gICAgc3RhdGljIFJhbmdlT3AgY3JlYXRlUmFuZ2UoVG9rZW4gdG9rKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBSYW5nZU9wKE9wLlJBTkdFLCB0b2spOwotICAgIH0KLSAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVMb29rKGludCB0eXBlLCBPcCBuZXh0LCBPcCBicmFuY2gpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICBDaGlsZE9wIG9wID0gbmV3IENoaWxkT3AodHlwZSk7Ci0gICAgICAgIG9wLnNldENoaWxkKGJyYW5jaCk7Ci0gICAgICAgIG9wLm5leHQgPSBuZXh0OwotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfQotICAgIHN0YXRpYyBDaGFyT3AgY3JlYXRlQmFja1JlZmVyZW5jZShpbnQgcmVmbm8pIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IENoYXJPcChPcC5CQUNLUkVGRVJFTkNFLCByZWZubyk7Ci0gICAgfQotICAgIHN0YXRpYyBTdHJpbmdPcCBjcmVhdGVTdHJpbmcoU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ09wKE9wLlNUUklORywgbGl0ZXJhbCk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZUluZGVwZW5kZW50KE9wIG5leHQsIE9wIGJyYW5jaCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIENoaWxkT3Agb3AgPSBuZXcgQ2hpbGRPcChPcC5JTkRFUEVOREVOVCk7Ci0gICAgICAgIG9wLnNldENoaWxkKGJyYW5jaCk7Ci0gICAgICAgIG9wLm5leHQgPSBuZXh0OwotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfQotICAgIHN0YXRpYyBNb2RpZmllck9wIGNyZWF0ZU1vZGlmaWVyKE9wIG5leHQsIE9wIGJyYW5jaCwgaW50IGFkZCwgaW50IG1hc2spIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICBNb2RpZmllck9wIG9wID0gbmV3IE1vZGlmaWVyT3AoT3AuTU9ESUZJRVIsIGFkZCwgbWFzayk7Ci0gICAgICAgIG9wLnNldENoaWxkKGJyYW5jaCk7Ci0gICAgICAgIG9wLm5leHQgPSBuZXh0OwotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfQotICAgIHN0YXRpYyBDb25kaXRpb25PcCBjcmVhdGVDb25kaXRpb24oT3AgbmV4dCwgaW50IHJlZiwgT3AgY29uZGl0aW9uZmxvdywgT3AgeWVzZmxvdywgT3Agbm9mbG93KSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgQ29uZGl0aW9uT3Agb3AgPSBuZXcgQ29uZGl0aW9uT3AoT3AuQ09ORElUSU9OLCByZWYsIGNvbmRpdGlvbmZsb3csIHllc2Zsb3csIG5vZmxvdyk7Ci0gICAgICAgIG9wLm5leHQgPSBuZXh0OwotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfQotCi0gICAgaW50IHR5cGU7Ci0gICAgT3AgbmV4dCA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgT3AoaW50IHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBpbnQgc2l6ZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBVTklPTgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgT3AgZWxlbWVudEF0KGludCBpbmRleCkgeyAgICAgICAgICAgICAgICAgICAvLyBmb3IgVU5Jb04KLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKLSAgICB9Ci0gICAgT3AgZ2V0Q2hpbGQoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQ0xPU1VSRSwgUVVFU1RJT04KLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllck9wCi0gICAgaW50IGdldERhdGEoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFyT3AgIGZvciBDSEFSLCBCQUNLUkVGRVJFTkNFLCBDQVBUVVJFLCBBTkNIT1IsIAotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOwotICAgIH0KLSAgICBpbnQgZ2V0RGF0YTIoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmaWVyT3AKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKLSAgICB9Ci0gICAgUmFuZ2VUb2tlbiBnZXRUb2tlbigpIHsgICAgICAgICAgICAgICAgICAgICAvLyBSQU5HRSwgTlJBTkdFCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7Ci0gICAgfQotICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RSSU5HCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBDaGFyT3AgZXh0ZW5kcyBPcCB7Ci0gICAgICAgIGludCBjaGFyRGF0YTsKLSAgICAgICAgQ2hhck9wKGludCB0eXBlLCBpbnQgZGF0YSkgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLmNoYXJEYXRhID0gZGF0YTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZ2V0RGF0YSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJEYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBVbmlvbk9wIGV4dGVuZHMgT3AgewotICAgICAgICBWZWN0b3IgYnJhbmNoZXM7Ci0gICAgICAgIFVuaW9uT3AoaW50IHR5cGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuYnJhbmNoZXMgPSBuZXcgVmVjdG9yKHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgYWRkRWxlbWVudChPcCBvcCkgewotICAgICAgICAgICAgdGhpcy5icmFuY2hlcy5hZGRFbGVtZW50KG9wKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJyYW5jaGVzLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBPcCBlbGVtZW50QXQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gKE9wKXRoaXMuYnJhbmNoZXMuZWxlbWVudEF0KGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgQ2hpbGRPcCBleHRlbmRzIE9wIHsKLSAgICAgICAgT3AgY2hpbGQ7Ci0gICAgICAgIENoaWxkT3AoaW50IHR5cGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgc2V0Q2hpbGQoT3AgY2hpbGQpIHsKLSAgICAgICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKLSAgICAgICAgfQotICAgICAgICBPcCBnZXRDaGlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgTW9kaWZpZXJPcCBleHRlbmRzIENoaWxkT3AgewotICAgICAgICBpbnQgdjE7Ci0gICAgICAgIGludCB2MjsKLSAgICAgICAgTW9kaWZpZXJPcChpbnQgdHlwZSwgaW50IHYxLCBpbnQgdjIpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy52MSA9IHYxOwotICAgICAgICAgICAgdGhpcy52MiA9IHYyOwotICAgICAgICB9Ci0gICAgICAgIGludCBnZXREYXRhKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudjE7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdldERhdGEyKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudjI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBSYW5nZU9wIGV4dGVuZHMgT3AgewotICAgICAgICBUb2tlbiB0b2s7Ci0gICAgICAgIFJhbmdlT3AoaW50IHR5cGUsIFRva2VuIHRvaykgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLnRvayA9IHRvazsKLSAgICAgICAgfQotICAgICAgICBSYW5nZVRva2VuIGdldFRva2VuKCkgewotICAgICAgICAgICAgcmV0dXJuIChSYW5nZVRva2VuKXRoaXMudG9rOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgU3RyaW5nT3AgZXh0ZW5kcyBPcCB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmc7Ci0gICAgICAgIFN0cmluZ09wKGludCB0eXBlLCBTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLnN0cmluZyA9IGxpdGVyYWw7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGdldFN0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIENvbmRpdGlvbk9wIGV4dGVuZHMgT3AgewotICAgICAgICBpbnQgcmVmTnVtYmVyOwotICAgICAgICBPcCBjb25kaXRpb247Ci0gICAgICAgIE9wIHllczsKLSAgICAgICAgT3Agbm87Ci0gICAgICAgIENvbmRpdGlvbk9wKGludCB0eXBlLCBpbnQgcmVmbm8sIE9wIGNvbmRpdGlvbmZsb3csIE9wIHllc2Zsb3csIE9wIG5vZmxvdykgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLnJlZk51bWJlciA9IHJlZm5vOwotICAgICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb25mbG93OwotICAgICAgICAgICAgdGhpcy55ZXMgPSB5ZXNmbG93OwotICAgICAgICAgICAgdGhpcy5ubyA9IG5vZmxvdzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0MWFiMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotLyoqCi0gKgotICogQGF1dGhvciBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OwotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICBpbnQgbG9jYXRpb247Ci0KLSAgICAvKgotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzKSB7Ci0gICAgICAgIHRoaXMobWVzLCAtMSk7Ci0gICAgfQotICAgICovCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lcywgaW50IGxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG1lcyk7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gLTEgaWYgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlckZvclhNTFNjaGVtYS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZXJGb3JYTUxTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlOWI2NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlckZvclhNTFNjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIEEgcmVndWxhciBleHByZXNzaW9uIHBhcnNlciBmb3IgdGhlIFhNTCBTaGVtYS4KLSAqCi0gKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7Ci0gKi8KLWNsYXNzIFBhcnNlckZvclhNTFNjaGVtYSBleHRlbmRzIFJlZ2V4UGFyc2VyIHsKLQotICAgIHB1YmxpYyBQYXJzZXJGb3JYTUxTY2hlbWEoKSB7Ci0gICAgICAgIC8vdGhpcy5zZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgfQotICAgIHB1YmxpYyBQYXJzZXJGb3JYTUxTY2hlbWEoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICAvL3RoaXMuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgfQotCi0gICAgVG9rZW4gcHJvY2Vzc0NhcmV0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDaGFyKCdeJyk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NEb2xsYXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNoYXIoJyQnKTsKLSAgICAgfQotICAgIFRva2VuIHByb2Nlc3NMb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc05lZ2F0aXZlbG9va2FoZWFkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NMb29rYmVoaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0EoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2x0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19ndCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzU3RhcihUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUGx1cyhUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFgrIC0+IFhYKgotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNvbmNhdCh0b2ssIFRva2VuLmNyZWF0ZUNsb3N1cmUodG9rKSk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NRdWVzdGlvbihUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFg/IC0+IFh8Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiBwYXIgPSBUb2tlbi5jcmVhdGVVbmlvbigpOwotICAgICAgICBwYXIuYWRkQ2hpbGQodG9rKTsKLSAgICAgICAgcGFyLmFkZENoaWxkKFRva2VuLmNyZWF0ZUVtcHR5KCkpOwotICAgICAgICByZXR1cm4gcGFyOwotICAgIH0KLSAgICBib29sZWFuIGNoZWNrUXVlc3Rpb24oaW50IG9mZikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NQYXJlbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVQYXJlbih0aGlzLnBhcnNlUmVnZXgoKSwgMCk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBzdXBlci5UX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUGFyZW4yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NDb25kaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc01vZGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzSW5kZXBlbmRlbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ2MnKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ0MnKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ2knKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ0knKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2coKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19YKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldC0yKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tyZWZlcmVuY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0LTQpOwotICAgIH0KLQotICAgIGludCBwcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKFJhbmdlVG9rZW4gdG9rLCBpbnQgYykgewotICAgICAgICB0b2subWVyZ2VSYW5nZXModGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZChjKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIGNoYXJhY3Rlci1jbGFzcy1leHByZXNzaW9uLCBub3QgYSBjaGFyYWN0ZXItY2xhc3MtZXNjYXBlLgotICAgICAqCi0gICAgICogYy1jLWV4cHJlc3Npb24gICA6Oj0gJ1snIGMtZ3JvdXAgJ10nCi0gICAgICogYy1ncm91cCAgICAgICAgICA6Oj0gcG9zaXRpdmUtYy1ncm91cCB8IG5lZ2F0aXZlLWMtZ3JvdXAgfCBjLWMtc3VidHJhY3Rpb24KLSAgICAgKiBwb3NpdGl2ZS1jLWdyb3VwIDo6PSAoYy1yYW5nZSB8IGMtYy1lc2NhcGUpKwotICAgICAqIG5lZ2F0aXZlLWMtZ3JvdXAgOjo9ICdeJyBwb3NpdGl2ZS1jLWdyb3VwCi0gICAgICogYy1jLXN1YnRyYWN0aW9uICA6Oj0gKHBvc2l0aXZlLWMtZ3JvdXAgfCBuZWdhdGl2ZS1jLWdyb3VwKSBzdWJ0cmFjdGlvbgotICAgICAqIHN1YnRyYWN0aW9uICAgICAgOjo9ICctJyBjLWMtZXhwcmVzc2lvbgotICAgICAqIGMtcmFuZ2UgICAgICAgICAgOjo9IHNpbmdsZS1yYW5nZSB8IGZyb20tdG8tcmFuZ2UKLSAgICAgKiBzaW5nbGUtcmFuZ2UgICAgIDo6PSBtdWx0aS1jLWVzY2FwZSB8IGNhdGVnb3J5LWMtZXNjYXBlIHwgYmxvY2stYy1lc2NhcGUgfCA8YW55IFhNTCBjaGFyPgotICAgICAqIGNjLW5vcm1hbC1jICAgICAgOjo9IDxhbnkgY2hhcmFjdGVyIGV4Y2VwdCBbLCBdLCBcPgotICAgICAqIGZyb20tdG8tcmFuZ2UgICAgOjo9IGNjLW5vcm1hbC1jICctJyBjYy1ub3JtYWwtYwotICAgICAqCi0gICAgICogQHBhcmFtIHVzZU5yYWdlIElnbm9yZWQuCi0gICAgICogQHJldHVybiBUaGlzIHJldHVybnMgbm8gTnJhZ2VUb2tlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBwYXJzZUNoYXJhY3RlckNsYXNzKGJvb2xlYW4gdXNlTnJhbmdlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldENvbnRleHQoU19JTkJSQUNLRVRTKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdbJwotICAgICAgICBib29sZWFuIG5yYW5nZSA9IGZhbHNlOwotICAgICAgICBSYW5nZVRva2VuIGJhc2UgPSBudWxsOwotICAgICAgICBSYW5nZVRva2VuIHRvazsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICdeJykgewotICAgICAgICAgICAgbnJhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdeJwotICAgICAgICAgICAgYmFzZSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBiYXNlLmFkZFJhbmdlKDAsIFRva2VuLlVURjE2X01BWCk7Ci0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdGxvb3AgPSB0cnVlOwotICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9FT0YpIHsgLy8gRG9uJ3QgdXNlICdjb3RpbnVlJyBmb3IgdGhpcyBsb29wLgotICAgICAgICAgICAgLy8gc2luZ2xlLXJhbmdlIHwgZnJvbS10by1yYW5nZSB8IHN1YnRyYWN0aW9uCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScgJiYgIWZpcnN0bG9vcCkgewotICAgICAgICAgICAgICAgIGlmIChucmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOwotICAgICAgICAgICAgICAgICAgICB0b2sgPSBiYXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjID0gdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBUX0JBQ0tTT0xJRFVTKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgICBjYXNlICdkJzogIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgY2FzZSAndyc6ICBjYXNlICdXJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyh0aGlzLmdldFRva2VuRm9yU2hvcnRoYW5kKGMpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOiAgY2FzZSAnSSc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICdjJzogIGNhc2UgJ0MnOgotICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5wcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKHRvaywgYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMCkgIGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICAgICAgICAgICAgIGludCBwc3RhcnQgPSB0aGlzLm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2syID0gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfcFAoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2syID09IG51bGwpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuYXRvbS41IiwgcHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHRvazIpOwotICAgICAgICAgICAgICAgICAgICBlbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYyA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgICAgICAgICAgICAgIH0gLy8gXCArIGMKLSAgICAgICAgICAgIH0gLy8gYmFja3NvbGlkdXMKLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT04gJiYgIWZpcnN0bG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VicmFjdGlvbgotICAgICAgICAgICAgICAgIGlmIChucmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOwotICAgICAgICAgICAgICAgICAgICB0b2sgPSBiYXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlMiA9IHRoaXMucGFyc2VDaGFyYWN0ZXJDbGFzcyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdG9rLnN1YnRyYWN0UmFuZ2VzKHJhbmdlMik7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCB0aGlzLmNoYXJkYXRhICE9ICddJykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjUiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IHRoaXMgbG9vcAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWVuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgc2hvcnRoYW5kcy4uLgotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWycpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNiIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXScpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNyIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8IHRoaXMuY2hhcmRhdGEgIT0gJy0nKSB7IC8vIEhlcmUgaXMgbm8gJy0nLgotICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCAnLScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgJy0nIGlzIGEgZnJvbS10byB0b2tlbj8/Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBTa2lwcyAnLScKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdGhpcy5yZWFkKCkpID09IFRfRU9GKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjICctJyAnXScgLT4gJy0nIGlzIGEgc2luZ2xlLXJhbmdlLgotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnLScsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMgJy0nICctWycgLT4gJy0nIGlzIGEgc2luZ2xlLXJhbmdlLgotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFRfWE1MU0NIRU1BX0NDX1NVQlRSQUNUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoJy0nLCAnLScpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlZW5kID0gdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZWVuZCA9PSAnWycpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZWVuZCA9PSAnXScpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNyIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9CQUNLU09MSURVUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZWVuZCA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgcmFuZ2VlbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyc3Rsb29wID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfRU9GKQotICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIC8vdG9rLmR1bXBSYW5nZXMoKTsKLSAgICAgICAgdGhpcy5zZXRDb250ZXh0KFNfTk9STUFMKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnXScKLQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHBhcnNlU2V0T3BlcmF0aW9ucygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotIAotICAgIFRva2VuIGdldFRva2VuRm9yU2hvcnRoYW5kKGludCBjaCkgewotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNEaWdpdCIsIHRydWUpOwotICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzRGlnaXQiLCBmYWxzZSk7Ci0gICAgICAgICAgY2FzZSAndyc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNXb3JkIiwgdHJ1ZSk7Ci0gICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNXb3JkIiwgZmFsc2UpOwotICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzU3BhY2UiLCB0cnVlKTsKLSAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc1NwYWNlIiwgZmFsc2UpOwotICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzTmFtZUNoYXIiLCB0cnVlKTsKLSAgICAgICAgICBjYXNlICdDJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc05hbWVDaGFyIiwgZmFsc2UpOwotICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzSW5pdGlhbE5hbWVDaGFyIiwgdHJ1ZSk7Ci0gICAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCBmYWxzZSk7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogc2hvcnRoYW5kczogXFx1IitJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNikpOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBkZWNvZGVFc2NhcGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQkFDS1NPTElEVVMpICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICBpbnQgYyA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgIGNhc2UgJ24nOiAgYyA9ICdcbic7ICBicmVhazsgLy8gTElORSBGRUVEIFUrMDAwQQotICAgICAgICAgIGNhc2UgJ3InOiAgYyA9ICdccic7ICBicmVhazsgLy8gQ1JSSUFHRSBSRVRVUk4gVSswMDBECi0gICAgICAgICAgY2FzZSAndCc6ICBjID0gJ1x0JzsgIGJyZWFrOyAvLyBIT1JJWk9OVEFMIFRBQlVMQVRJT04gVSswMDA5Ci0KLSAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNSIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHJhbmdlcyA9IG51bGw7Ci0gICAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHJhbmdlczIgPSBudWxsOwotICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIFJhbmdlVG9rZW4gZ2V0UmFuZ2UoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgaWYgKHJhbmdlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByYW5nZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICByYW5nZXMyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIFNQQUNFUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNTcGFjZSIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzU3BhY2UiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIERJR0lUUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNEaWdpdCIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIERJR0lUUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNEaWdpdCIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIExFVFRFUlMpOwotICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKChUb2tlbilyYW5nZXMuZ2V0KCJ4bWw6aXNEaWdpdCIpKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc1dvcmQiLCB0b2spOwotICAgICAgICAgICAgcmFuZ2VzMi5wdXQoInhtbDppc1dvcmQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIE5BTUVDSEFSUyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNOYW1lQ2hhciIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzTmFtZUNoYXIiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOwotCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIExFVFRFUlMpOwotICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCdfJywgJ18nKTsKLSAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnOicsICc6Jyk7Ci0gICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCB0b2spOwotICAgICAgICAgICAgcmFuZ2VzMi5wdXQoInhtbDppc0luaXRpYWxOYW1lQ2hhciIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBwb3NpdGl2ZSA/IChSYW5nZVRva2VuKXJhbmdlcy5nZXQobmFtZSkKLSAgICAgICAgICAgIDogKFJhbmdlVG9rZW4pcmFuZ2VzMi5nZXQobmFtZSk7Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0dXBSYW5nZShUb2tlbiByYW5nZSwgU3RyaW5nIHNyYykgewotICAgICAgICBpbnQgbGVuID0gc3JjLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW47ICBpICs9IDIpCi0gICAgICAgICAgICByYW5nZS5hZGRSYW5nZShzcmMuY2hhckF0KGkpLCBzcmMuY2hhckF0KGkrMSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRVMgPSAiXHRcblxyXHIgICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVDSEFSUyA9Ci0gICAgICAgICJcdTAwMmRcdTAwMmVcdTAwMzBcdTAwM2FcdTAwNDFcdTAwNWFcdTAwNWZcdTAwNWZcdTAwNjFcdTAwN2FcdTAwYjdcdTAwYjdcdTAwYzBcdTAwZDYiCi0gICAgICAgICsiXHUwMGQ4XHUwMGY2XHUwMGY4XHUwMTMxXHUwMTM0XHUwMTNlXHUwMTQxXHUwMTQ4XHUwMTRhXHUwMTdlXHUwMTgwXHUwMWMzXHUwMWNkXHUwMWYwIgotICAgICAgICArIlx1MDFmNFx1MDFmNVx1MDFmYVx1MDIxN1x1MDI1MFx1MDJhOFx1MDJiYlx1MDJjMVx1MDJkMFx1MDJkMVx1MDMwMFx1MDM0NVx1MDM2MFx1MDM2MSIKLSAgICAgICAgKyJcdTAzODZcdTAzOGFcdTAzOGNcdTAzOGNcdTAzOGVcdTAzYTFcdTAzYTNcdTAzY2VcdTAzZDBcdTAzZDZcdTAzZGFcdTAzZGFcdTAzZGNcdTAzZGMiCi0gICAgICAgICsiXHUwM2RlXHUwM2RlXHUwM2UwXHUwM2UwXHUwM2UyXHUwM2YzXHUwNDAxXHUwNDBjXHUwNDBlXHUwNDRmXHUwNDUxXHUwNDVjXHUwNDVlXHUwNDgxIgotICAgICAgICArIlx1MDQ4M1x1MDQ4Nlx1MDQ5MFx1MDRjNFx1MDRjN1x1MDRjOFx1MDRjYlx1MDRjY1x1MDRkMFx1MDRlYlx1MDRlZVx1MDRmNVx1MDRmOFx1MDRmOSIKLSAgICAgICAgKyJcdTA1MzFcdTA1NTZcdTA1NTlcdTA1NTlcdTA1NjFcdTA1ODZcdTA1OTFcdTA1YTFcdTA1YTNcdTA1YjlcdTA1YmJcdTA1YmRcdTA1YmZcdTA1YmYiCi0gICAgICAgICsiXHUwNWMxXHUwNWMyXHUwNWM0XHUwNWM0XHUwNWQwXHUwNWVhXHUwNWYwXHUwNWYyXHUwNjIxXHUwNjNhXHUwNjQwXHUwNjUyXHUwNjYwXHUwNjY5IgotICAgICAgICArIlx1MDY3MFx1MDZiN1x1MDZiYVx1MDZiZVx1MDZjMFx1MDZjZVx1MDZkMFx1MDZkM1x1MDZkNVx1MDZlOFx1MDZlYVx1MDZlZFx1MDZmMFx1MDZmOSIKLSAgICAgICAgKyJcdTA5MDFcdTA5MDNcdTA5MDVcdTA5MzlcdTA5M2NcdTA5NGRcdTA5NTFcdTA5NTRcdTA5NThcdTA5NjNcdTA5NjZcdTA5NmZcdTA5ODFcdTA5ODMiCi0gICAgICAgICsiXHUwOTg1XHUwOThjXHUwOThmXHUwOTkwXHUwOTkzXHUwOWE4XHUwOWFhXHUwOWIwXHUwOWIyXHUwOWIyXHUwOWI2XHUwOWI5XHUwOWJjXHUwOWJjIgotICAgICAgICArIlx1MDliZVx1MDljNFx1MDljN1x1MDljOFx1MDljYlx1MDljZFx1MDlkN1x1MDlkN1x1MDlkY1x1MDlkZFx1MDlkZlx1MDllM1x1MDllNlx1MDlmMSIKLSAgICAgICAgKyJcdTBhMDJcdTBhMDJcdTBhMDVcdTBhMGFcdTBhMGZcdTBhMTBcdTBhMTNcdTBhMjhcdTBhMmFcdTBhMzBcdTBhMzJcdTBhMzNcdTBhMzVcdTBhMzYiCi0gICAgICAgICsiXHUwYTM4XHUwYTM5XHUwYTNjXHUwYTNjXHUwYTNlXHUwYTQyXHUwYTQ3XHUwYTQ4XHUwYTRiXHUwYTRkXHUwYTU5XHUwYTVjXHUwYTVlXHUwYTVlIgotICAgICAgICArIlx1MGE2Nlx1MGE3NFx1MGE4MVx1MGE4M1x1MGE4NVx1MGE4Ylx1MGE4ZFx1MGE4ZFx1MGE4Zlx1MGE5MVx1MGE5M1x1MGFhOFx1MGFhYVx1MGFiMCIKLSAgICAgICAgKyJcdTBhYjJcdTBhYjNcdTBhYjVcdTBhYjlcdTBhYmNcdTBhYzVcdTBhYzdcdTBhYzlcdTBhY2JcdTBhY2RcdTBhZTBcdTBhZTBcdTBhZTZcdTBhZWYiCi0gICAgICAgICsiXHUwYjAxXHUwYjAzXHUwYjA1XHUwYjBjXHUwYjBmXHUwYjEwXHUwYjEzXHUwYjI4XHUwYjJhXHUwYjMwXHUwYjMyXHUwYjMzXHUwYjM2XHUwYjM5IgotICAgICAgICArIlx1MGIzY1x1MGI0M1x1MGI0N1x1MGI0OFx1MGI0Ylx1MGI0ZFx1MGI1Nlx1MGI1N1x1MGI1Y1x1MGI1ZFx1MGI1Zlx1MGI2MVx1MGI2Nlx1MGI2ZiIKLSAgICAgICAgKyJcdTBiODJcdTBiODNcdTBiODVcdTBiOGFcdTBiOGVcdTBiOTBcdTBiOTJcdTBiOTVcdTBiOTlcdTBiOWFcdTBiOWNcdTBiOWNcdTBiOWVcdTBiOWYiCi0gICAgICAgICsiXHUwYmEzXHUwYmE0XHUwYmE4XHUwYmFhXHUwYmFlXHUwYmI1XHUwYmI3XHUwYmI5XHUwYmJlXHUwYmMyXHUwYmM2XHUwYmM4XHUwYmNhXHUwYmNkIgotICAgICAgICArIlx1MGJkN1x1MGJkN1x1MGJlN1x1MGJlZlx1MGMwMVx1MGMwM1x1MGMwNVx1MGMwY1x1MGMwZVx1MGMxMFx1MGMxMlx1MGMyOFx1MGMyYVx1MGMzMyIKLSAgICAgICAgKyJcdTBjMzVcdTBjMzlcdTBjM2VcdTBjNDRcdTBjNDZcdTBjNDhcdTBjNGFcdTBjNGRcdTBjNTVcdTBjNTZcdTBjNjBcdTBjNjFcdTBjNjZcdTBjNmYiCi0gICAgICAgICsiXHUwYzgyXHUwYzgzXHUwYzg1XHUwYzhjXHUwYzhlXHUwYzkwXHUwYzkyXHUwY2E4XHUwY2FhXHUwY2IzXHUwY2I1XHUwY2I5XHUwY2JlXHUwY2M0IgotICAgICAgICArIlx1MGNjNlx1MGNjOFx1MGNjYVx1MGNjZFx1MGNkNVx1MGNkNlx1MGNkZVx1MGNkZVx1MGNlMFx1MGNlMVx1MGNlNlx1MGNlZlx1MGQwMlx1MGQwMyIKLSAgICAgICAgKyJcdTBkMDVcdTBkMGNcdTBkMGVcdTBkMTBcdTBkMTJcdTBkMjhcdTBkMmFcdTBkMzlcdTBkM2VcdTBkNDNcdTBkNDZcdTBkNDhcdTBkNGFcdTBkNGQiCi0gICAgICAgICsiXHUwZDU3XHUwZDU3XHUwZDYwXHUwZDYxXHUwZDY2XHUwZDZmXHUwZTAxXHUwZTJlXHUwZTMwXHUwZTNhXHUwZTQwXHUwZTRlXHUwZTUwXHUwZTU5IgotICAgICAgICArIlx1MGU4MVx1MGU4Mlx1MGU4NFx1MGU4NFx1MGU4N1x1MGU4OFx1MGU4YVx1MGU4YVx1MGU4ZFx1MGU4ZFx1MGU5NFx1MGU5N1x1MGU5OVx1MGU5ZiIKLSAgICAgICAgKyJcdTBlYTFcdTBlYTNcdTBlYTVcdTBlYTVcdTBlYTdcdTBlYTdcdTBlYWFcdTBlYWJcdTBlYWRcdTBlYWVcdTBlYjBcdTBlYjlcdTBlYmJcdTBlYmQiCi0gICAgICAgICsiXHUwZWMwXHUwZWM0XHUwZWM2XHUwZWM2XHUwZWM4XHUwZWNkXHUwZWQwXHUwZWQ5XHUwZjE4XHUwZjE5XHUwZjIwXHUwZjI5XHUwZjM1XHUwZjM1IgotICAgICAgICArIlx1MGYzN1x1MGYzN1x1MGYzOVx1MGYzOVx1MGYzZVx1MGY0N1x1MGY0OVx1MGY2OVx1MGY3MVx1MGY4NFx1MGY4Nlx1MGY4Ylx1MGY5MFx1MGY5NSIKLSAgICAgICAgKyJcdTBmOTdcdTBmOTdcdTBmOTlcdTBmYWRcdTBmYjFcdTBmYjdcdTBmYjlcdTBmYjlcdTEwYTBcdTEwYzVcdTEwZDBcdTEwZjZcdTExMDBcdTExMDAiCi0gICAgICAgICsiXHUxMTAyXHUxMTAzXHUxMTA1XHUxMTA3XHUxMTA5XHUxMTA5XHUxMTBiXHUxMTBjXHUxMTBlXHUxMTEyXHUxMTNjXHUxMTNjXHUxMTNlXHUxMTNlIgotICAgICAgICArIlx1MTE0MFx1MTE0MFx1MTE0Y1x1MTE0Y1x1MTE0ZVx1MTE0ZVx1MTE1MFx1MTE1MFx1MTE1NFx1MTE1NVx1MTE1OVx1MTE1OVx1MTE1Zlx1MTE2MSIKLSAgICAgICAgKyJcdTExNjNcdTExNjNcdTExNjVcdTExNjVcdTExNjdcdTExNjdcdTExNjlcdTExNjlcdTExNmRcdTExNmVcdTExNzJcdTExNzNcdTExNzVcdTExNzUiCi0gICAgICAgICsiXHUxMTllXHUxMTllXHUxMWE4XHUxMWE4XHUxMWFiXHUxMWFiXHUxMWFlXHUxMWFmXHUxMWI3XHUxMWI4XHUxMWJhXHUxMWJhXHUxMWJjXHUxMWMyIgotICAgICAgICArIlx1MTFlYlx1MTFlYlx1MTFmMFx1MTFmMFx1MTFmOVx1MTFmOVx1MWUwMFx1MWU5Ylx1MWVhMFx1MWVmOVx1MWYwMFx1MWYxNVx1MWYxOFx1MWYxZCIKLSAgICAgICAgKyJcdTFmMjBcdTFmNDVcdTFmNDhcdTFmNGRcdTFmNTBcdTFmNTdcdTFmNTlcdTFmNTlcdTFmNWJcdTFmNWJcdTFmNWRcdTFmNWRcdTFmNWZcdTFmN2QiCi0gICAgICAgICsiXHUxZjgwXHUxZmI0XHUxZmI2XHUxZmJjXHUxZmJlXHUxZmJlXHUxZmMyXHUxZmM0XHUxZmM2XHUxZmNjXHUxZmQwXHUxZmQzXHUxZmQ2XHUxZmRiIgotICAgICAgICArIlx1MWZlMFx1MWZlY1x1MWZmMlx1MWZmNFx1MWZmNlx1MWZmY1x1MjBkMFx1MjBkY1x1MjBlMVx1MjBlMVx1MjEyNlx1MjEyNlx1MjEyYVx1MjEyYiIKLSAgICAgICAgKyJcdTIxMmVcdTIxMmVcdTIxODBcdTIxODJcdTMwMDVcdTMwMDVcdTMwMDdcdTMwMDdcdTMwMjFcdTMwMmZcdTMwMzFcdTMwMzVcdTMwNDFcdTMwOTQiCi0gICAgICAgICsiXHUzMDk5XHUzMDlhXHUzMDlkXHUzMDllXHUzMGExXHUzMGZhXHUzMGZjXHUzMGZlXHUzMTA1XHUzMTJjXHU0ZTAwXHU5ZmE1XHVhYzAwXHVkN2EzIgotICAgICAgICArIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFVFRFUlMgPQotICAgICAgICAiXHUwMDQxXHUwMDVhXHUwMDYxXHUwMDdhXHUwMGMwXHUwMGQ2XHUwMGQ4XHUwMGY2XHUwMGY4XHUwMTMxXHUwMTM0XHUwMTNlXHUwMTQxXHUwMTQ4IgotICAgICAgICArIlx1MDE0YVx1MDE3ZVx1MDE4MFx1MDFjM1x1MDFjZFx1MDFmMFx1MDFmNFx1MDFmNVx1MDFmYVx1MDIxN1x1MDI1MFx1MDJhOFx1MDJiYlx1MDJjMSIKLSAgICAgICAgKyJcdTAzODZcdTAzODZcdTAzODhcdTAzOGFcdTAzOGNcdTAzOGNcdTAzOGVcdTAzYTFcdTAzYTNcdTAzY2VcdTAzZDBcdTAzZDZcdTAzZGFcdTAzZGEiCi0gICAgICAgICsiXHUwM2RjXHUwM2RjXHUwM2RlXHUwM2RlXHUwM2UwXHUwM2UwXHUwM2UyXHUwM2YzXHUwNDAxXHUwNDBjXHUwNDBlXHUwNDRmXHUwNDUxXHUwNDVjIgotICAgICAgICArIlx1MDQ1ZVx1MDQ4MVx1MDQ5MFx1MDRjNFx1MDRjN1x1MDRjOFx1MDRjYlx1MDRjY1x1MDRkMFx1MDRlYlx1MDRlZVx1MDRmNVx1MDRmOFx1MDRmOSIKLSAgICAgICAgKyJcdTA1MzFcdTA1NTZcdTA1NTlcdTA1NTlcdTA1NjFcdTA1ODZcdTA1ZDBcdTA1ZWFcdTA1ZjBcdTA1ZjJcdTA2MjFcdTA2M2FcdTA2NDFcdTA2NGEiCi0gICAgICAgICsiXHUwNjcxXHUwNmI3XHUwNmJhXHUwNmJlXHUwNmMwXHUwNmNlXHUwNmQwXHUwNmQzXHUwNmQ1XHUwNmQ1XHUwNmU1XHUwNmU2XHUwOTA1XHUwOTM5IgotICAgICAgICArIlx1MDkzZFx1MDkzZFx1MDk1OFx1MDk2MVx1MDk4NVx1MDk4Y1x1MDk4Zlx1MDk5MFx1MDk5M1x1MDlhOFx1MDlhYVx1MDliMFx1MDliMlx1MDliMiIKLSAgICAgICAgKyJcdTA5YjZcdTA5YjlcdTA5ZGNcdTA5ZGRcdTA5ZGZcdTA5ZTFcdTA5ZjBcdTA5ZjFcdTBhMDVcdTBhMGFcdTBhMGZcdTBhMTBcdTBhMTNcdTBhMjgiCi0gICAgICAgICsiXHUwYTJhXHUwYTMwXHUwYTMyXHUwYTMzXHUwYTM1XHUwYTM2XHUwYTM4XHUwYTM5XHUwYTU5XHUwYTVjXHUwYTVlXHUwYTVlXHUwYTcyXHUwYTc0IgotICAgICAgICArIlx1MGE4NVx1MGE4Ylx1MGE4ZFx1MGE4ZFx1MGE4Zlx1MGE5MVx1MGE5M1x1MGFhOFx1MGFhYVx1MGFiMFx1MGFiMlx1MGFiM1x1MGFiNVx1MGFiOSIKLSAgICAgICAgKyJcdTBhYmRcdTBhYmRcdTBhZTBcdTBhZTBcdTBiMDVcdTBiMGNcdTBiMGZcdTBiMTBcdTBiMTNcdTBiMjhcdTBiMmFcdTBiMzBcdTBiMzJcdTBiMzMiCi0gICAgICAgICsiXHUwYjM2XHUwYjM5XHUwYjNkXHUwYjNkXHUwYjVjXHUwYjVkXHUwYjVmXHUwYjYxXHUwYjg1XHUwYjhhXHUwYjhlXHUwYjkwXHUwYjkyXHUwYjk1IgotICAgICAgICArIlx1MGI5OVx1MGI5YVx1MGI5Y1x1MGI5Y1x1MGI5ZVx1MGI5Zlx1MGJhM1x1MGJhNFx1MGJhOFx1MGJhYVx1MGJhZVx1MGJiNVx1MGJiN1x1MGJiOSIKLSAgICAgICAgKyJcdTBjMDVcdTBjMGNcdTBjMGVcdTBjMTBcdTBjMTJcdTBjMjhcdTBjMmFcdTBjMzNcdTBjMzVcdTBjMzlcdTBjNjBcdTBjNjFcdTBjODVcdTBjOGMiCi0gICAgICAgICsiXHUwYzhlXHUwYzkwXHUwYzkyXHUwY2E4XHUwY2FhXHUwY2IzXHUwY2I1XHUwY2I5XHUwY2RlXHUwY2RlXHUwY2UwXHUwY2UxXHUwZDA1XHUwZDBjIgotICAgICAgICArIlx1MGQwZVx1MGQxMFx1MGQxMlx1MGQyOFx1MGQyYVx1MGQzOVx1MGQ2MFx1MGQ2MVx1MGUwMVx1MGUyZVx1MGUzMFx1MGUzMFx1MGUzMlx1MGUzMyIKLSAgICAgICAgKyJcdTBlNDBcdTBlNDVcdTBlODFcdTBlODJcdTBlODRcdTBlODRcdTBlODdcdTBlODhcdTBlOGFcdTBlOGFcdTBlOGRcdTBlOGRcdTBlOTRcdTBlOTciCi0gICAgICAgICsiXHUwZTk5XHUwZTlmXHUwZWExXHUwZWEzXHUwZWE1XHUwZWE1XHUwZWE3XHUwZWE3XHUwZWFhXHUwZWFiXHUwZWFkXHUwZWFlXHUwZWIwXHUwZWIwIgotICAgICAgICArIlx1MGViMlx1MGViM1x1MGViZFx1MGViZFx1MGVjMFx1MGVjNFx1MGY0MFx1MGY0N1x1MGY0OVx1MGY2OVx1MTBhMFx1MTBjNVx1MTBkMFx1MTBmNiIKLSAgICAgICAgKyJcdTExMDBcdTExMDBcdTExMDJcdTExMDNcdTExMDVcdTExMDdcdTExMDlcdTExMDlcdTExMGJcdTExMGNcdTExMGVcdTExMTJcdTExM2NcdTExM2MiCi0gICAgICAgICsiXHUxMTNlXHUxMTNlXHUxMTQwXHUxMTQwXHUxMTRjXHUxMTRjXHUxMTRlXHUxMTRlXHUxMTUwXHUxMTUwXHUxMTU0XHUxMTU1XHUxMTU5XHUxMTU5IgotICAgICAgICArIlx1MTE1Zlx1MTE2MVx1MTE2M1x1MTE2M1x1MTE2NVx1MTE2NVx1MTE2N1x1MTE2N1x1MTE2OVx1MTE2OVx1MTE2ZFx1MTE2ZVx1MTE3Mlx1MTE3MyIKLSAgICAgICAgKyJcdTExNzVcdTExNzVcdTExOWVcdTExOWVcdTExYThcdTExYThcdTExYWJcdTExYWJcdTExYWVcdTExYWZcdTExYjdcdTExYjhcdTExYmFcdTExYmEiCi0gICAgICAgICsiXHUxMWJjXHUxMWMyXHUxMWViXHUxMWViXHUxMWYwXHUxMWYwXHUxMWY5XHUxMWY5XHUxZTAwXHUxZTliXHUxZWEwXHUxZWY5XHUxZjAwXHUxZjE1IgotICAgICAgICArIlx1MWYxOFx1MWYxZFx1MWYyMFx1MWY0NVx1MWY0OFx1MWY0ZFx1MWY1MFx1MWY1N1x1MWY1OVx1MWY1OVx1MWY1Ylx1MWY1Ylx1MWY1ZFx1MWY1ZCIKLSAgICAgICAgKyJcdTFmNWZcdTFmN2RcdTFmODBcdTFmYjRcdTFmYjZcdTFmYmNcdTFmYmVcdTFmYmVcdTFmYzJcdTFmYzRcdTFmYzZcdTFmY2NcdTFmZDBcdTFmZDMiCi0gICAgICAgICsiXHUxZmQ2XHUxZmRiXHUxZmUwXHUxZmVjXHUxZmYyXHUxZmY0XHUxZmY2XHUxZmZjXHUyMTI2XHUyMTI2XHUyMTJhXHUyMTJiXHUyMTJlXHUyMTJlIgotICAgICAgICArIlx1MjE4MFx1MjE4Mlx1MzAwN1x1MzAwN1x1MzAyMVx1MzAyOVx1MzA0MVx1MzA5NFx1MzBhMVx1MzBmYVx1MzEwNVx1MzEyY1x1NGUwMFx1OWZhNSIKLSAgICAgICAgKyJcdWFjMDBcdWQ3YTMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdJVFMgPQotICAgICAgICAiXHUwMDMwXHUwMDM5XHUwNjYwXHUwNjY5XHUwNkYwXHUwNkY5XHUwOTY2XHUwOTZGXHUwOUU2XHUwOUVGXHUwQTY2XHUwQTZGXHUwQUU2XHUwQUVGIgotICAgICAgICArIlx1MEI2Nlx1MEI2Rlx1MEJFN1x1MEJFRlx1MEM2Nlx1MEM2Rlx1MENFNlx1MENFRlx1MEQ2Nlx1MEQ2Rlx1MEU1MFx1MEU1OVx1MEVEMFx1MEVEOSIKLSAgICAgICAgKyJcdTBGMjBcdTBGMjkiOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0IGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2YxMTY3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVRoaXMgaXMgYW4gaXNvbGF0ZWQgZGlyZWN0b3J5IHRoYXQgd2FzIHRha2VuIGZyb20gdGhlCi1BcGFjaGUgWGVyY2VzLUogMi4wIHByb2plY3QuCi0KLUl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbW9kaWZpY2F0aW9uczoKLQotKDEpIGEgY2hhbmdlIGluIG5hbWVzcGFjZS4KLSgyKSB0aGUgYWRkaXRpb24gb2YgYSBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbiBjbGFzcyBmb3IgZmFzdAotICAgIGRldGVjdGlvbiBvZiBOQ05BTUUsIGV0Yy4KLQotTm8geGJlYW4gY29kZSBvdXRzaWRlIHRoaXMgZGlyZWN0b3J5IG9yIG90aGVyIGRpcmVjdG9yaWVzIHdpdGgKLXNpbWlsYXIgUkVBRE1FIG5vdGljZXMgd2FzIHRha2VuIGZyb20gQXBhY2hlLgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUkVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzcxNjguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFJFVXRpbCB7Ci0gICAgcHJpdmF0ZSBSRVV0aWwoKSB7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBjb21wb3NlRnJvbVN1cnJvZ2F0ZXMoaW50IGhpZ2gsIGludCBsb3cpIHsKLSAgICAgICAgcmV0dXJuIDB4MTAwMDAgKyAoKGhpZ2gtMHhkODAwKTw8MTApICsgbG93LTB4ZGMwMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xvd1N1cnJvZ2F0ZShpbnQgY2gpIHsKLSAgICAgICAgcmV0dXJuIChjaCAmIDB4ZmMwMCkgPT0gMHhkYzAwOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZShpbnQgY2gpIHsKLSAgICAgICAgcmV0dXJuIChjaCAmIDB4ZmMwMCkgPT0gMHhkODAwOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVjb21wb3NlVG9TdXJyb2dhdGVzKGludCBjaCkgewotICAgICAgICBjaGFyW10gY2hzID0gbmV3IGNoYXJbMl07Ci0gICAgICAgIGNoIC09IDB4MTAwMDA7Ci0gICAgICAgIGNoc1swXSA9IChjaGFyKSgoY2g+PjEwKSsweGQ4MDApOwotICAgICAgICBjaHNbMV0gPSAoY2hhcikoKGNoJjB4M2ZmKSsweGRjMDApOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaHMpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3Vic3RyaW5nKENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgYmVnaW4sIGludCBlbmQpIHsKLSAgICAgICAgY2hhcltdIHNyYyA9IG5ldyBjaGFyW2VuZC1iZWdpbl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHNyYy5sZW5ndGg7ICBpICsrKQotICAgICAgICAgICAgc3JjW2ldID0gaXRlcmF0b3Iuc2V0SW5kZXgoaStiZWdpbik7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHNyYyk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgc3RhdGljIGZpbmFsIGludCBnZXRPcHRpb25WYWx1ZShpbnQgY2gpIHsKLSAgICAgICAgaW50IHJldCA9IDA7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5NVUxUSVBMRV9MSU5FUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uU0lOR0xFX0xJTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLkVYVEVOREVEX0NPTU1FTlQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAndyc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5VTklDT0RFX1dPUkRfQk9VTkRBUlk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdGJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlBST0hJQklUX0ZJWEVEX1NUUklOR19PUFRJTUlaQVRJT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlBST0hJQklUX0hFQURfQ0hBUkFDVEVSX09QVElNSVpBVElPTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1gnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICcsJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlNQRUNJQUxfQ09NTUE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBwYXJzZU9wdGlvbnMoU3RyaW5nIG9wdHMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvcHRzID09IG51bGwpICByZXR1cm4gMDsKLSAgICAgICAgaW50IG9wdGlvbnMgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBvcHRzLmxlbmd0aCgpOyAgaSArKykgewotICAgICAgICAgICAgaW50IHYgPSBnZXRPcHRpb25WYWx1ZShvcHRzLmNoYXJBdChpKSk7Ci0gICAgICAgICAgICBpZiAodiA9PSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW5rbm93biBPcHRpb246ICIrb3B0cy5zdWJzdHJpbmcoaSksIC0xKTsKLSAgICAgICAgICAgIG9wdGlvbnMgfD0gdjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGNyZWF0ZU9wdGlvblN0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDkpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5QUk9ISUJJVF9GSVhFRF9TVFJJTkdfT1BUSU1JWkFUSU9OKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdGJyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlBST0hJQklUX0hFQURfQ0hBUkFDVEVSX09QVElNSVpBVElPTikgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknSCcpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERSkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknWCcpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5JR05PUkVfQ0FTRSkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknaScpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5NVUxUSVBMRV9MSU5FUykgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknbScpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5TSU5HTEVfTElORSkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikncycpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikndScpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5VTklDT0RFX1dPUkRfQk9VTkRBUlkpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ3cnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uRVhURU5ERURfQ09NTUVOVCkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikneCcpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKScsJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpLmludGVybigpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbmRlZENvbW1lbnQoU3RyaW5nIHJlZ2V4KSB7Ci0gICAgICAgIGludCBsZW4gPSByZWdleC5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW4pIHsKLSAgICAgICAgICAgIGludCBjaCA9IHJlZ2V4LmNoYXJBdChvZmZzZXQrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyBhIHdoaXRlIHNwYWNlLgotICAgICAgICAgICAgaWYgKGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXGYnIHx8IGNoID09ICdccicgfHwgY2ggPT0gJyAnKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyBjaHJhY3RlcnMgYmV0d2VlbiAnIycgYW5kIGEgbGluZSBlbmQuCi0gICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbikgewotICAgICAgICAgICAgICAgICAgICBjaCA9IHJlZ2V4LmNoYXJBdChvZmZzZXQrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwcyBhbiBlc2NhcGVkIHdoaXRlIHNwYWNlLgotICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgb2Zmc2V0IDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuZXh0ID0gcmVnZXguY2hhckF0KG9mZnNldCkpID09ICcjJwotICAgICAgICAgICAgICAgICAgICB8fCBuZXh0ID09ICdcdCcgfHwgbmV4dCA9PSAnXG4nIHx8IG5leHQgPT0gJ1xmJwotICAgICAgICAgICAgICAgICAgICB8fCBuZXh0ID09ICdccicgfHwgbmV4dCA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciluZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpbmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyBpcy4KLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWNoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogU2FtcGxlIGVudHJ5LgotICAgICAqIDxkaXY+VXNhZ2U6IDxLQkQ+b3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguUkVVdGlsICZsdDtyZWdleCZndDsgJmx0O3N0cmluZyZndDs8L0tCRD48L2Rpdj4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBvcHRpb25zID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmKCBhcmd2Lmxlbmd0aCA9PSAwICkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkVycm9yOlVzYWdlOiBqYXZhIFJFVXRpbCAtaXwtbXwtc3wtdXwtd3wtWCByZWd1bGFyRXhwcmVzc2lvbiBTdHJpbmciICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoIDAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGFyZ3YubGVuZ3RoOyAgaSArKykgewotICAgICAgICAgICAgICAgIGlmIChhcmd2W2ldLmxlbmd0aCgpID09IDAgfHwgYXJndltpXS5jaGFyQXQoMCkgIT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gYXJndltpXTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBhcmd2W2ldOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVubmVjZXNzYXJ5OiAiK2FyZ3ZbaV0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1pIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAiaSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLW0iKSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJtIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gInMiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi11IikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAidSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLXciKSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJ3IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItWCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gIlgiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5rbm93biBvcHRpb246ICIrYXJndltpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVndWxhckV4cHJlc3Npb24gcmVnID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHBhdHRlcm4sIG9wdGlvbnMpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWd1bGFyRXhwcmVzc2lvbjogIityZWcpOwotICAgICAgICAgICAgTWF0Y2ggbWF0Y2ggPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgICAgIHJlZy5tYXRjaGVzKHRhcmdldCwgbWF0Y2gpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbWF0Y2guZ2V0TnVtYmVyT2ZHcm91cHMoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwICkgIFN5c3RlbS5vdXQucHJpbnQoIk1hdGNoZWQgcmFuZ2UgZm9yIHRoZSB3aG9sZSBwYXR0ZXJuOiAiKTsKLSAgICAgICAgICAgICAgICBlbHNlIFN5c3RlbS5vdXQucHJpbnQoIlsiK2krIl06ICIpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaC5nZXRCZWdpbm5pbmcoaSkgPCAwKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0xIik7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQobWF0Y2guZ2V0QmVnaW5uaW5nKGkpKyIsICIrbWF0Y2guZ2V0RW5kKGkpKyIsICIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiIittYXRjaC5nZXRDYXB0dXJlZFRleHQoaSkrIlwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLnJlZ2V4LlBhcnNlRXhjZXB0aW9uOiAiK3BlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudCA9ICIgICAgICAgICI7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGluZGVudCtwYXR0ZXJuKTsKLSAgICAgICAgICAgICAgICBpbnQgbG9jID0gcGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludChpbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsb2M7ICBpICsrKSAgU3lzdGVtLmVyci5wcmludCgiLSIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIl4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBDQUNIRVNJWkUgPSAyMDsKLSAgICBzdGF0aWMgZmluYWwgUmVndWxhckV4cHJlc3Npb25bXSByZWdleENhY2hlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uW0NBQ0hFU0laRV07Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJlZ3VsYXJFeHByZXNzaW9uIGluc3RhbmNlLgotICAgICAqIFRoaXMgbWV0aG9kIGNhY2hlcyBjcmVhdGVkIGluc3RhbmNlcy4KLSAgICAgKgotICAgICAqIEBzZWVxIFJlZ3VsYXJFeHByZXNzaW9uI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZWd1bGFyRXhwcmVzc2lvbiBjcmVhdGVSZWdleChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG9wdGlvbnMpCi0gICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbnVsbDsKLSAgICAgICAgaW50IGludE9wdGlvbnMgPSBSRVV0aWwucGFyc2VPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKFJFVXRpbC5yZWdleENhY2hlKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgUkVVdGlsLkNBQ0hFU0laRTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiBjYWNoZWQgPSBSRVV0aWwucmVnZXhDYWNoZVtpXTsKLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlZC5lcXVhbHMocGF0dGVybiwgaW50T3B0aW9ucykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmUgPSBjYWNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFJFVXRpbC5yZWdleENhY2hlLCAwLCBSRVV0aWwucmVnZXhDYWNoZSwgMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIFJFVXRpbC5yZWdleENhY2hlWzBdID0gcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbihwYXR0ZXJuLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFJFVXRpbC5yZWdleENhY2hlLCAwLCBSRVV0aWwucmVnZXhDYWNoZSwgMSwgUkVVdGlsLkNBQ0hFU0laRS0xKTsKLSAgICAgICAgICAgICAgICBSRVV0aWwucmVnZXhDYWNoZVswXSA9IHJlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyByZWdleCwgU3RyaW5nIHRhcmdldCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFJFVXRpbC5jcmVhdGVSZWdleChyZWdleCwgbnVsbCkubWF0Y2hlcyh0YXJnZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHJlZ2V4LCBTdHJpbmcgb3B0aW9ucywgU3RyaW5nIHRhcmdldCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFJFVXRpbC5jcmVhdGVSZWdleChyZWdleCwgb3B0aW9ucykubWF0Y2hlcyh0YXJnZXQpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGVNZXRhKFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIGludCBsZW4gPSBsaXRlcmFsLmxlbmd0aCgpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbGVuOyAgaSArKykgewotICAgICAgICAgICAgaW50IGNoID0gbGl0ZXJhbC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIi4qKz97WygpfFxcXiQiLmluZGV4T2YoY2gpID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpKyhsZW4taSkqMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgIGJ1ZmZlci5hcHBlbmQobGl0ZXJhbC5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSdcXCcpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWNoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyICE9IG51bGwgPyBidWZmZXIudG9TdHJpbmcoKSA6IGxpdGVyYWw7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgc3RhdGljIHZvaWQgZHVtcFN0cmluZyhTdHJpbmcgdikgewotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB2Lmxlbmd0aCgpOyAgaSArKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHYuY2hhckF0KGkpKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SYW5nZVRva2VuLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JhbmdlVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyYmJhYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JhbmdlVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjaGFyYWN0ZXIgY2xhc3Mgc3VjaCBhcyBbYS16XSBvciBhIHBlcmlvZC4KLSAqLwotZmluYWwgY2xhc3MgUmFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0gICAgaW50W10gcmFuZ2VzOwotICAgIGJvb2xlYW4gc29ydGVkOwotICAgIGJvb2xlYW4gY29tcGFjdGVkOwotICAgIFJhbmdlVG9rZW4gaWNhc2VDYWNoZSA9IG51bGw7Ci0gICAgaW50W10gbWFwID0gbnVsbDsKLSAgICBpbnQgbm9uTWFwSW5kZXg7Ci0KLSAgICBSYW5nZVRva2VuKGludCB0eXBlKSB7Ci0gICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICB0aGlzLnNldFNvcnRlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgUkFOR0Ugb3IgTlJBTkdFCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIHRoaXMuaWNhc2VDYWNoZSA9IG51bGw7Ci0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNhZGRSYW5nZSgpOiAiK3N0YXJ0KyIgIitlbmQpOwotICAgICAgICBpbnQgcjEsIHIyOwotICAgICAgICBpZiAoc3RhcnQgPD0gZW5kKSB7Ci0gICAgICAgICAgICByMSA9IHN0YXJ0OwotICAgICAgICAgICAgcjIgPSBlbmQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByMSA9IGVuZDsKLSAgICAgICAgICAgIHIyID0gc3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgaWYgKHRoaXMucmFuZ2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gbmV3IGludFsyXTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzWzBdID0gcjE7Ci0gICAgICAgICAgICB0aGlzLnJhbmdlc1sxXSA9IHIyOwotICAgICAgICAgICAgdGhpcy5zZXRTb3J0ZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb3MgPSB0aGlzLnJhbmdlcy5sZW5ndGg7Ci0gICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbcG9zLTFdKzEgPT0gcjEpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1twb3MtMV0gPSByMjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRbXSB0ZW1wID0gbmV3IGludFtwb3MrMl07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMucmFuZ2VzLCAwLCB0ZW1wLCAwLCBwb3MpOwotICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSB0ZW1wOwotICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW3Bvcy0xXSA+PSByMSkKLSAgICAgICAgICAgICAgICB0aGlzLnNldFNvcnRlZChmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLnJhbmdlc1twb3MrK10gPSByMTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzW3Bvc10gPSByMjsKLSAgICAgICAgICAgIGlmICghdGhpcy5zb3J0ZWQpCi0gICAgICAgICAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZDsKLSAgICB9Ci0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldFNvcnRlZChib29sZWFuIHNvcnQpIHsKLSAgICAgICAgdGhpcy5zb3J0ZWQgPSBzb3J0OwotICAgICAgICBpZiAoIXNvcnQpICB0aGlzLmNvbXBhY3RlZCA9IGZhbHNlOwotICAgIH0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNDb21wYWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbXBhY3RlZDsKLSAgICB9Ci0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldENvbXBhY3RlZCgpIHsKLSAgICAgICAgdGhpcy5jb21wYWN0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNvcnRSYW5nZXMoKSB7Ci0gICAgICAgIGlmICh0aGlzLmlzU29ydGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiRG8gc29ydGluZzogIit0aGlzLnJhbmdlcy5sZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdWJibGUgc29ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2h5PyAtLSBJbiBtYW55IGNhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLnJhbmdlcyBoYXMgZmV3IGVsZW1lbnRzLgotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5yYW5nZXMubGVuZ3RoLTQ7ICBpID49IDA7ICBpIC09IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyAgaiA8PSBpOyAgaiArPSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW2pdID4gdGhpcy5yYW5nZXNbaisyXQotICAgICAgICAgICAgICAgICAgICB8fCB0aGlzLnJhbmdlc1tqXSA9PSB0aGlzLnJhbmdlc1tqKzJdICYmIHRoaXMucmFuZ2VzW2orMV0gPiB0aGlzLnJhbmdlc1tqKzNdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHRoaXMucmFuZ2VzW2orMl07Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2orMl0gPSB0aGlzLnJhbmdlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbal0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHRoaXMucmFuZ2VzW2orM107Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2orM10gPSB0aGlzLnJhbmdlc1tqKzFdOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tqKzFdID0gdG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldFNvcnRlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzLnJhbmdlcyBpcyBzb3J0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFjdFJhbmdlcygpIHsKLSAgICAgICAgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCB8fCB0aGlzLnJhbmdlcy5sZW5ndGggPD0gMikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHRoaXMuaXNDb21wYWN0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50IGJhc2UgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGV4IG9mIHdyaXRpbmcgcG9pbnQKLSAgICAgICAgaW50IHRhcmdldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGV4IG9mIHByb2Nlc3NpbmcgcG9pbnQKLQotICAgICAgICB3aGlsZSAodGFyZ2V0IDwgdGhpcy5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAoYmFzZSAhPSB0YXJnZXQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tiYXNlXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsrXTsKLSAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tiYXNlKzFdID0gdGhpcy5yYW5nZXNbdGFyZ2V0KytdOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgdGFyZ2V0ICs9IDI7Ci0gICAgICAgICAgICBpbnQgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07Ci0gICAgICAgICAgICB3aGlsZSAodGFyZ2V0IDwgdGhpcy5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VlbmQrMSA8IHRoaXMucmFuZ2VzW3RhcmdldF0pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChiYXNlZW5kKzEgPT0gdGhpcy5yYW5nZXNbdGFyZ2V0XSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRva2VuI2NvbXBhY3RSYW5nZXMoKTogQ29tcGFjdGlvbjogWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1tiYXNlKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdLCBbIit0aGlzLnJhbmdlc1t0YXJnZXRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIC0+IFsiK3RoaXMucmFuZ2VzW2Jhc2VdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIik7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2UrMV0gPSB0aGlzLnJhbmdlc1t0YXJnZXQrMV07Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VlbmQgPSB0aGlzLnJhbmdlc1tiYXNlKzFdOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VlbmQgPj0gdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1tiYXNlKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIik7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZWVuZCA8IHRoaXMucmFuZ2VzW3RhcmdldCsxXSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRva2VuI2NvbXBhY3RSYW5nZXMoKTogQ29tcGFjdGlvbjogWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1tiYXNlKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdLCBbIit0aGlzLnJhbmdlc1t0YXJnZXRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIC0+IFsiK3RoaXMucmFuZ2VzW2Jhc2VdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIik7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2UrMV0gPSB0aGlzLnJhbmdlc1t0YXJnZXQrMV07Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VlbmQgPSB0aGlzLnJhbmdlc1tiYXNlKzFdOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBJbnRlcm5lbCBFcnJvcjogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMucmFuZ2VzW2Jhc2VdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbYmFzZSsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gWyIrdGhpcy5yYW5nZXNbdGFyZ2V0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwiK3RoaXMucmFuZ2VzW3RhcmdldCsxXSsiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLy8gd2hpbGUKLSAgICAgICAgICAgIGJhc2UgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlICE9IHRoaXMucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtiYXNlXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5yYW5nZXMsIDAsIHJlc3VsdCwgMCwgYmFzZSk7Ci0gICAgICAgICAgICB0aGlzLnJhbmdlcyA9IHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldENvbXBhY3RlZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG1lcmdlUmFuZ2VzKFRva2VuIHRva2VuKSB7Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47Ci0gICAgICAgIHRoaXMuc29ydFJhbmdlcygpOwotICAgICAgICB0b2suc29ydFJhbmdlcygpOwotICAgICAgICBpZiAodG9rLnJhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBudWxsOwotICAgICAgICB0aGlzLnNldFNvcnRlZCh0cnVlKTsKLSAgICAgICAgaWYgKHRoaXMucmFuZ2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gbmV3IGludFt0b2sucmFuZ2VzLmxlbmd0aF07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRvay5yYW5nZXMsIDAsIHRoaXMucmFuZ2VzLCAwLCB0b2sucmFuZ2VzLmxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFt0aGlzLnJhbmdlcy5sZW5ndGgrdG9rLnJhbmdlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDAsIGsgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aCB8fCBqIDwgdG9rLnJhbmdlcy5sZW5ndGg7KSB7Ci0gICAgICAgICAgICBpZiAoaSA+PSB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRvay5yYW5nZXNbaisrXTsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRvay5yYW5nZXNbaisrXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA+PSB0b2sucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdGhpcy5yYW5nZXNbaSsrXTsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRoaXMucmFuZ2VzW2krK107Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5yYW5nZXNbal0gPCB0aGlzLnJhbmdlc1tpXQotICAgICAgICAgICAgICAgICAgICAgICB8fCB0b2sucmFuZ2VzW2pdID09IHRoaXMucmFuZ2VzW2ldICYmIHRvay5yYW5nZXNbaisxXSA8IHRoaXMucmFuZ2VzW2krMV0pIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRvay5yYW5nZXNbaisrXTsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRvay5yYW5nZXNbaisrXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdGhpcy5yYW5nZXNbaSsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLnJhbmdlcyA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdWJ0cmFjdFJhbmdlcyhUb2tlbiB0b2tlbikgewotICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBOUkFOR0UpIHsKLSAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0UmFuZ2VzKHRva2VuKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBSYW5nZVRva2VuIHRvayA9IChSYW5nZVRva2VuKXRva2VuOwotICAgICAgICBpZiAodG9rLnJhbmdlcyA9PSBudWxsIHx8IHRoaXMucmFuZ2VzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRoaXMuaWNhc2VDYWNoZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc29ydFJhbmdlcygpOwotICAgICAgICB0aGlzLmNvbXBhY3RSYW5nZXMoKTsKLSAgICAgICAgdG9rLnNvcnRSYW5nZXMoKTsKLSAgICAgICAgdG9rLmNvbXBhY3RSYW5nZXMoKTsKLQotICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jc3Vic3RyYWN0UmFuZ2VzKCk6IEVudHJ5OiAiK3RoaXMucmFuZ2VzLmxlbmd0aCsiLCAiK3Rvay5yYW5nZXMubGVuZ3RoKTsKLQotICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RoaXMucmFuZ2VzLmxlbmd0aCt0b2sucmFuZ2VzLmxlbmd0aF07Ci0gICAgICAgIGludCB3cCA9IDAsIHNyYyA9IDAsIHN1YiA9IDA7Ci0gICAgICAgIHdoaWxlIChzcmMgPCB0aGlzLnJhbmdlcy5sZW5ndGggJiYgc3ViIDwgdG9rLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIGludCBzcmNiZWdpbiA9IHRoaXMucmFuZ2VzW3NyY107Ci0gICAgICAgICAgICBpbnQgc3JjZW5kID0gdGhpcy5yYW5nZXNbc3JjKzFdOwotICAgICAgICAgICAgaW50IHN1YmJlZ2luID0gdG9rLnJhbmdlc1tzdWJdOwotICAgICAgICAgICAgaW50IHN1YmVuZCA9IHRvay5yYW5nZXNbc3ViKzFdOwotICAgICAgICAgICAgaWYgKHNyY2VuZCA8IHN1YmJlZ2luKSB7ICAgICAgICAgICAgLy8gTm90IG92ZXJsYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogby0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogby0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3ViCi0gICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjZW5kID49IHN1YmJlZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHNyY2JlZ2luIDw9IHN1YmVuZCkgeyAvLyBPdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YjogIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgICAgICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YjogIG8tLS0tLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgaWYgKHN1YmJlZ2luIDw9IHNyY2JlZ2luICYmIHNyY2VuZCA8PSBzdWJlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS0tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogZW1wdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHN1YgotICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YmJlZ2luIDw9IHNyY2JlZ2luKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YjogIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICAgICBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzcmMoPXJlcykKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbc3JjXSA9IHN1YmVuZCsxOwotICAgICAgICAgICAgICAgICAgICBzdWIgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY2VuZCA8PSBzdWJlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgICAgICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgby0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3ViCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyY2JlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzdWJiZWdpbi0xOwotICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgIG8tbyAgICBvLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYyg9cmlnaHQgcmVzKQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmNiZWdpbjsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3ViYmVnaW4tMTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbc3JjXSA9IHN1YmVuZCsxOwotICAgICAgICAgICAgICAgICAgICBzdWIgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN1YmVuZCA8IHNyY2JlZ2luKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgb3ZlcmxhcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICAgICAgICBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6IG8tLS0tbwotICAgICAgICAgICAgICAgIHN1YiArPSAyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jc3VidHJhY3RSYW5nZXMoKTogSW50ZXJuYWwgRXJyb3I6IFsiK3RoaXMucmFuZ2VzW3NyY10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwiK3RoaXMucmFuZ2VzW3NyYysxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAtIFsiK3Rvay5yYW5nZXNbc3ViXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdG9rLnJhbmdlc1tzdWIrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoc3JjIDwgdGhpcy5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXN1bHRbd3ArK10gPSB0aGlzLnJhbmdlc1tzcmMrK107Ci0gICAgICAgICAgICByZXN1bHRbd3ArK10gPSB0aGlzLnJhbmdlc1tzcmMrK107Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3dwXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHRoaXMucmFuZ2VzLCAwLCB3cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnJhbmdlcyBpcyBzb3J0ZWQgYW5kIGNvbXBhY3RlZC4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdG9rIElnbm9yZSB3aGV0aGVyIGl0IGlzIE5SQU5HRSBvciBub3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJzZWN0UmFuZ2VzKFRva2VuIHRva2VuKSB7Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47Ci0gICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwgfHwgdGhpcy5yYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKLSAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRoaXMuY29tcGFjdFJhbmdlcygpOwotICAgICAgICB0b2suc29ydFJhbmdlcygpOwotICAgICAgICB0b2suY29tcGFjdFJhbmdlcygpOwotCi0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbdGhpcy5yYW5nZXMubGVuZ3RoK3Rvay5yYW5nZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IHdwID0gMCwgc3JjMSA9IDAsIHNyYzIgPSAwOwotICAgICAgICB3aGlsZSAoc3JjMSA8IHRoaXMucmFuZ2VzLmxlbmd0aCAmJiBzcmMyIDwgdG9rLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIGludCBzcmMxYmVnaW4gPSB0aGlzLnJhbmdlc1tzcmMxXTsKLSAgICAgICAgICAgIGludCBzcmMxZW5kID0gdGhpcy5yYW5nZXNbc3JjMSsxXTsKLSAgICAgICAgICAgIGludCBzcmMyYmVnaW4gPSB0b2sucmFuZ2VzW3NyYzJdOwotICAgICAgICAgICAgaW50IHNyYzJlbmQgPSB0b2sucmFuZ2VzW3NyYzIrMV07Ci0gICAgICAgICAgICBpZiAoc3JjMWVuZCA8IHNyYzJiZWdpbikgeyAgICAgICAgICAvLyBOb3Qgb3ZlcmxhcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMTogby0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogICAgICAgICBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICBlbXB0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjMgotICAgICAgICAgICAgICAgIHNyYzEgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMWVuZCA+PSBzcmMyYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgJiYgc3JjMWJlZ2luIDw9IHNyYzJlbmQpIHsgLy8gT3ZlcmxhcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMTogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICAgICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogIG8tLS0tLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgaWYgKHNyYzJiZWdpbiA8PSBzcmMyYmVnaW4gJiYgc3JjMWVuZCA8PSBzcmMyZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS0tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYzIKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMWJlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxZW5kOwotICAgICAgICAgICAgICAgICAgICBzcmMxICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMyYmVnaW4gPD0gc3JjMWJlZ2luKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICBvLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSB0aGUgcmVzdCBvZiBzcmMxCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzFiZWdpbjsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMmVuZDsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbc3JjMV0gPSBzcmMyZW5kKzE7Ci0gICAgICAgICAgICAgICAgICAgIHNyYzIgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYzFlbmQgPD0gc3JjMmVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMTogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogICAgICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgICAgICBvLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzcmMyCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzJiZWdpbjsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMWVuZDsKLSAgICAgICAgICAgICAgICAgICAgc3JjMSArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHRoZSByZXN0IG9mIHNyYzEKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMmJlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyZW5kOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmMxXSA9IHNyYzJlbmQrMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNyYzJlbmQgPCBzcmMxYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICAgICAgICBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiBvLS0tLW8KLSAgICAgICAgICAgICAgICBzcmMyICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNpbnRlcnNlY3RSYW5nZXMoKTogSW50ZXJuYWwgRXJyb3I6IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMucmFuZ2VzW3NyYzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0aGlzLnJhbmdlc1tzcmMxKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdICYgWyIrdG9rLnJhbmdlc1tzcmMyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdG9rLnJhbmdlc1tzcmMyKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHNyYzEgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYzErK107Ci0gICAgICAgICAgICByZXN1bHRbd3ArK10gPSB0aGlzLnJhbmdlc1tzcmMxKytdOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucmFuZ2VzID0gbmV3IGludFt3cF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCB0aGlzLnJhbmdlcywgMCwgd3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5yYW5nZXMgaXMgc29ydGVkIGFuZCBjb21wYWN0ZWQuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogZm9yIFJBTkdFOiBDcmVhdGVzIGNvbXBsZW1lbnQuCi0gICAgICogZm9yIE5SQU5HRTogQ3JlYXRlcyB0aGUgc2FtZSBtZWFuaW5nIFJBTkdFLgotICAgICAqLwotICAgIHN0YXRpYyBUb2tlbiBjb21wbGVtZW50UmFuZ2VzKFRva2VuIHRva2VuKSB7Ci0gICAgICAgIGlmICh0b2tlbi50eXBlICE9IFJBTkdFICYmIHRva2VuLnR5cGUgIT0gTlJBTkdFKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVG9rZW4jY29tcGxlbWVudFJhbmdlcygpOiBtdXN0IGJlIFJBTkdFOiAiK3Rva2VuLnR5cGUpOwotICAgICAgICBSYW5nZVRva2VuIHRvayA9IChSYW5nZVRva2VuKXRva2VuOwotICAgICAgICB0b2suc29ydFJhbmdlcygpOwotICAgICAgICB0b2suY29tcGFjdFJhbmdlcygpOwotICAgICAgICBpbnQgbGVuID0gdG9rLnJhbmdlcy5sZW5ndGgrMjsKLSAgICAgICAgaWYgKHRvay5yYW5nZXNbMF0gPT0gMCkKLSAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICBpbnQgbGFzdCA9IHRvay5yYW5nZXNbdG9rLnJhbmdlcy5sZW5ndGgtMV07Ci0gICAgICAgIGlmIChsYXN0ID09IFVURjE2X01BWCkKLSAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICBSYW5nZVRva2VuIHJldCA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHJldC5yYW5nZXMgPSBuZXcgaW50W2xlbl07Ci0gICAgICAgIGludCB3cCA9IDA7Ci0gICAgICAgIGlmICh0b2sucmFuZ2VzWzBdID4gMCkgewotICAgICAgICAgICAgcmV0LnJhbmdlc1t3cCsrXSA9IDA7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwKytdID0gdG9rLnJhbmdlc1swXS0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyAgaSA8IHRvay5yYW5nZXMubGVuZ3RoLTI7ICBpICs9IDIpIHsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzW2ldKzE7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwKytdID0gdG9rLnJhbmdlc1tpKzFdLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhc3QgIT0gVVRGMTZfTUFYKSB7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwKytdID0gbGFzdCsxOwotICAgICAgICAgICAgcmV0LnJhbmdlc1t3cF0gPSBVVEYxNl9NQVg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0LnNldENvbXBhY3RlZCgpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBSYW5nZVRva2VuIGdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCkgewotICAgICAgICBpZiAodGhpcy5pY2FzZUNhY2hlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5pY2FzZUNhY2hlOwotICAgICAgICAgICAgCi0gICAgICAgIFJhbmdlVG9rZW4gdXBwZXJzID0gdGhpcy50eXBlID09IFRva2VuLlJBTkdFID8gVG9rZW4uY3JlYXRlUmFuZ2UoKSA6IFRva2VuLmNyZWF0ZU5SYW5nZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNoID0gdGhpcy5yYW5nZXNbaV07ICBjaCA8PSB0aGlzLnJhbmdlc1tpKzFdOyAgY2ggKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPiAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgIHVwcGVycy5hZGRSYW5nZShjaCwgY2gpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwcGVycy5hZGRSYW5nZSh1Y2gsIHVjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJhbmdlVG9rZW4gbG93ZXJzID0gdGhpcy50eXBlID09IFRva2VuLlJBTkdFID8gVG9rZW4uY3JlYXRlUmFuZ2UoKSA6IFRva2VuLmNyZWF0ZU5SYW5nZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB1cHBlcnMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgY2ggPSB1cHBlcnMucmFuZ2VzW2ldOyAgY2ggPD0gdXBwZXJzLnJhbmdlc1tpKzFdOyAgY2ggKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPiAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgIGxvd2Vycy5hZGRSYW5nZShjaCwgY2gpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvd2Vycy5hZGRSYW5nZSh1Y2gsIHVjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvd2Vycy5tZXJnZVJhbmdlcyh1cHBlcnMpOwotICAgICAgICBsb3dlcnMubWVyZ2VSYW5nZXModGhpcyk7Ci0gICAgICAgIGxvd2Vycy5jb21wYWN0UmFuZ2VzKCk7Ci0KLSAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbG93ZXJzOwotICAgICAgICByZXR1cm4gbG93ZXJzOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFJhbmdlcygpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludCgiUkFOR0U6ICIpOwotICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIE5VTEwiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJbIit0aGlzLnJhbmdlc1tpXSsiLCIrdGhpcy5yYW5nZXNbaSsxXSsiXSAiKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbWF0Y2goaW50IGNoKSB7Ci0gICAgICAgIGlmICh0aGlzLm1hcCA9PSBudWxsKSAgdGhpcy5jcmVhdGVNYXAoKTsKLSAgICAgICAgYm9vbGVhbiByZXQ7Ci0gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gUkFOR0UpIHsKLSAgICAgICAgICAgIGlmIChjaCA8IE1BUFNJWkUpCi0gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1hcFtjaC8zMl0gJiAoMTw8KGNoJjB4MWYpKSkgIT0gMDsKLSAgICAgICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMubm9uTWFwSW5kZXg7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW2ldIDw9IGNoICYmIGNoIDw9IHRoaXMucmFuZ2VzW2krMV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNoIDwgTUFQU0laRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMubWFwW2NoLzMyXSAmICgxPDwoY2gmMHgxZikpKSA9PSAwOwotICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB0aGlzLm5vbk1hcEluZGV4OyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1tpXSA8PSBjaCAmJiBjaCA8PSB0aGlzLnJhbmdlc1tpKzFdKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFQU0laRSA9IDI1NjsKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWFwKCkgewotICAgICAgICBpbnQgYXNpemUgPSBNQVBTSVpFLzMyOyAgICAgICAgICAgICAgICAgLy8gMzIgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGBpbnQnLgotICAgICAgICB0aGlzLm1hcCA9IG5ldyBpbnRbYXNpemVdOwotICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gdGhpcy5yYW5nZXMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBhc2l6ZTsgIGkgKyspICB0aGlzLm1hcFtpXSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgaW50IHMgPSB0aGlzLnJhbmdlc1tpXTsKLSAgICAgICAgICAgIGludCBlID0gdGhpcy5yYW5nZXNbaSsxXTsKLSAgICAgICAgICAgIGlmIChzIDwgTUFQU0laRSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzOyAgaiA8PSBlICYmIGogPCBNQVBTSVpFOyAgaiArKykKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBbai8zMl0gfD0gMTw8KGomMHgxZik7IC8vIHMmMHgxZiA6IDAtMzEKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ub25NYXBJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZSA+PSBNQVBTSVpFKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ub25NYXBJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9mb3IgKGludCBpID0gMDsgIGkgPCBhc2l6ZTsgIGkgKyspICBTeXN0ZW0uZXJyLnByaW50bG4oIk1hcDogIitJbnRlZ2VyLnRvU3RyaW5nKHRoaXMubWFwW2ldLCAxNikpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IG9wdGlvbnMpIHsKLSAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBSQU5HRSkgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fZG90KQotICAgICAgICAgICAgICAgIHJldCA9ICIuIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fMHRvOSkKLSAgICAgICAgICAgICAgICByZXQgPSAiXFxkIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fd29yZGNoYXJzKQotICAgICAgICAgICAgICAgIHJldCA9ICJcXHciOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl9zcGFjZXMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxccyI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJbIik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlNQRUNJQUxfQ09NTUEpICE9IDAgJiYgaSA+IDApICBzYi5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW2ldID09IHRoaXMucmFuZ2VzW2krMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlc2NhcGVDaGFySW5DaGFyQ2xhc3ModGhpcy5yYW5nZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlc2NhcGVDaGFySW5DaGFyQ2xhc3ModGhpcy5yYW5nZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhciknLScpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpKzFdKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJdIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF8wdG85KQotICAgICAgICAgICAgICAgIHJldCA9ICJcXEQiOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl9ub3Rfd29yZGNoYXJzKQotICAgICAgICAgICAgICAgIHJldCA9ICJcXFciOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl9ub3Rfc3BhY2VzKQotICAgICAgICAgICAgICAgIHJldCA9ICJcXFMiOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiW14iKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQSkgIT0gMCAmJiBpID4gMCkgIHNiLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPT0gdGhpcy5yYW5nZXNbaSsxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCctJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2krMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICByZXQgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZUNoYXJJbkNoYXJDbGFzcyhpbnQgY2gpIHsKLSAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgIGNhc2UgJ1snOiAgY2FzZSAnXSc6ICBjYXNlICctJzogIGNhc2UgJ14nOgotICAgICAgICAgIGNhc2UgJywnOiAgY2FzZSAnXFwnOgotICAgICAgICAgICAgcmV0ID0gIlxcIisoY2hhciljaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1xmJzogIHJldCA9ICJcXGYiOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXG4nOiAgcmV0ID0gIlxcbiI7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdccic6ICByZXQgPSAiXFxyIjsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1x0JzogIHJldCA9ICJcXHQiOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAweDFiOiAgcmV0ID0gIlxcZSI7ICBicmVhazsKLSAgICAgICAgICAvL2Nhc2UgMHgwYjogIHJldCA9ICJcXHYiOyAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChjaCA8IDB4MjApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlID0gIjAiK0ludGVnZXIudG9IZXhTdHJpbmcoY2gpOwotICAgICAgICAgICAgICAgIHJldCA9ICJcXHgiK3ByZS5zdWJzdHJpbmcocHJlLmxlbmd0aCgpLTIsIHByZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4MTAwMDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlID0gIjAiK0ludGVnZXIudG9IZXhTdHJpbmcoY2gpOwotICAgICAgICAgICAgICAgIHJldCA9ICJcXHYiK3ByZS5zdWJzdHJpbmcocHJlLmxlbmd0aCgpLTYsIHByZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXQgPSAiIisoY2hhciljaDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWdleFBhcnNlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWdleFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjA5ZDk1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVnZXhQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogQSBSZWd1bGFyIEV4cHJlc3Npb24gUGFyc2VyLgotICovCi1jbGFzcyBSZWdleFBhcnNlciB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUX0NIQVIgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9FT0YgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9PUiA9IDI7ICAgICAgICAgICAgICAgICAgLy8gJ3wnCi0gICAgc3RhdGljIGZpbmFsIGludCBUX1NUQVIgPSAzOyAgICAgICAgICAgICAgICAvLyAnKicKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfUExVUyA9IDQ7ICAgICAgICAgICAgICAgIC8vICcrJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9RVUVTVElPTiA9IDU7ICAgICAgICAgICAgLy8gJz8nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0xQQVJFTiA9IDY7ICAgICAgICAgICAgICAvLyAnKCcKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfUlBBUkVOID0gNzsgICAgICAgICAgICAgIC8vICcpJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9ET1QgPSA4OyAgICAgICAgICAgICAgICAgLy8gJy4nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0xCUkFDS0VUID0gOTsgICAgICAgICAgICAvLyAnWycKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfQkFDS1NPTElEVVMgPSAxMDsgICAgICAgIC8vICdcJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9DQVJFVCA9IDExOyAgICAgICAgICAgICAgLy8gJ14nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0RPTExBUiA9IDEyOyAgICAgICAgICAgICAvLyAnJCcKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTFBBUkVOMiA9IDEzOyAgICAgICAgICAgIC8vICcoPzonCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0xPT0tBSEVBRCA9IDE0OyAgICAgICAgICAvLyAnKD89JwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9ORUdBVElWRUxPT0tBSEVBRCA9IDE1OyAgLy8gJyg/IScKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTE9PS0JFSElORCA9IDE2OyAgICAgICAgIC8vICcoPzw9JwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9ORUdBVElWRUxPT0tCRUhJTkQgPSAxNzsgLy8gJyg/PCEnCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0lOREVQRU5ERU5UID0gMTg7ICAgICAgICAvLyAnKD8+JwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9TRVRfT1BFUkFUSU9OUyA9IDE5OyAgICAgLy8gJyg/WycKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfUE9TSVhfQ0hBUkNMQVNTX1NUQVJUID0gMjA7IC8vICdbOicgaW4gYSBjaGFyYWN0ZXIgY2xhc3MKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfQ09NTUVOVCA9IDIxOyAgICAgICAgICAgIC8vICcoPyMnCi0gICAgc3RhdGljIGZpbmFsIGludCBUX01PRElGSUVSUyA9IDIyOyAgICAgICAgICAvLyAnKD8nIFtcLSxhLXosQS1aXQotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9DT05ESVRJT04gPSAyMzsgICAgICAgICAgLy8gJyg/KCcKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfWE1MU0NIRU1BX0NDX1NVQlRSQUNUSU9OID0gMjQ7IC8vICctWycgaW4gYSBjaGFyYWN0ZXIgY2xhc3MKLQotICAgIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VQb3NpdGlvbiB7Ci0gICAgICAgIGludCByZWZOdW1iZXI7Ci0gICAgICAgIGludCBwb3NpdGlvbjsKLSAgICAgICAgUmVmZXJlbmNlUG9zaXRpb24oaW50IG4sIGludCBwb3MpIHsKLSAgICAgICAgICAgIHRoaXMucmVmTnVtYmVyID0gbjsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgb2Zmc2V0OwotICAgIFN0cmluZyByZWdleDsKLSAgICBpbnQgcmVnZXhsZW47Ci0gICAgaW50IG9wdGlvbnM7Ci0gICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VzOwotICAgIGludCBjaGFyZGF0YTsKLSAgICBpbnQgbmV4dHRva2VuOwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgaW50IFNfTk9STUFMID0gMDsKLSAgICBzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGludCBTX0lOQlJBQ0tFVFMgPSAxOwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgaW50IFNfSU5YQlJBQ0tFVFMgPSAyOwotICAgIGludCBjb250ZXh0ID0gU19OT1JNQUw7Ci0gICAgaW50IHBhcmVubnVtYmVyID0gMTsKLSAgICBib29sZWFuIGhhc0JhY2tSZWZlcmVuY2VzOwotICAgIFZlY3RvciByZWZlcmVuY2VzID0gbnVsbDsKLQotICAgIHB1YmxpYyBSZWdleFBhcnNlcigpIHsKLSAgICAgICAgdGhpcy5zZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgfQotICAgIHB1YmxpYyBSZWdleFBhcnNlcihMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIHRoaXMuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXgubWVzc2FnZSIsIGxvY2FsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnN0YWxsYXRpb24gUHJvYmxlbT8/PyAgQ291bGRuJ3QgbG9hZCBtZXNzYWdlczogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK21yZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgUGFyc2VFeGNlcHRpb24gZXgoU3RyaW5nIGtleSwgaW50IGxvYykgewotICAgICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKHRoaXMucmVzb3VyY2VzLmdldFN0cmluZyhrZXkpLCBsb2MpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1NldChpbnQgZmxhZykgewotICAgICAgICByZXR1cm4gKHRoaXMub3B0aW9ucyAmIGZsYWcpID09IGZsYWc7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIFRva2VuIHBhcnNlKFN0cmluZyByZWdleCwgaW50IG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKLSAgICAgICAgdGhpcy5zZXRDb250ZXh0KFNfTk9STUFMKTsKLSAgICAgICAgdGhpcy5wYXJlbm51bWJlciA9IDE7Ci0gICAgICAgIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5yZWdleCA9IHJlZ2V4OwotICAgICAgICBpZiAodGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5FWFRFTkRFRF9DT01NRU5UKSkKLSAgICAgICAgICAgIHRoaXMucmVnZXggPSBSRVV0aWwuc3RyaXBFeHRlbmRlZENvbW1lbnQodGhpcy5yZWdleCk7Ci0gICAgICAgIHRoaXMucmVnZXhsZW4gPSB0aGlzLnJlZ2V4Lmxlbmd0aCgpOwotCi0KLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHJldCA9IHRoaXMucGFyc2VSZWdleCgpOwotICAgICAgICBpZiAodGhpcy5vZmZzZXQgIT0gdGhpcy5yZWdleGxlbikKLSAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIucGFyc2UuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJlZmVyZW5jZXMuc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgIFJlZmVyZW5jZVBvc2l0aW9uIHBvc2l0aW9uID0gKFJlZmVyZW5jZVBvc2l0aW9uKXRoaXMucmVmZXJlbmNlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW5udW1iZXIgPD0gcG9zaXRpb24ucmVmTnVtYmVyKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLnBhcnNlLjIiLCBwb3NpdGlvbi5wb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIFJlZ3VsYXJFeHByZXNzaW9uIGNyZWF0ZVJlZ2V4KFN0cmluZyByZWdleCwgaW50IG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFRva2VuIHRvayA9IHRoaXMucGFyc2UocmVnZXgsIG9wdGlvbnMpOwotICAgICAgICByZXR1cm4gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHJlZ2V4LCB0b2ssIHRoaXMucGFyZW5udW1iZXIsIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMsIG9wdGlvbnMpOwotICAgIH0KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0Q29udGV4dChpbnQgY29uKSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbjsKLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgcmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmV4dHRva2VuOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pIHsKLSAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSAtMTsKLSAgICAgICAgICAgIHRoaXMubmV4dHRva2VuID0gVF9FT0Y7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmV0OwotICAgICAgICBpbnQgY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCsrKTsKLSAgICAgICAgdGhpcy5jaGFyZGF0YSA9IGNoOwotCi0gICAgICAgIGlmICh0aGlzLmNvbnRleHQgPT0gU19JTkJSQUNLRVRTKSB7Ci0gICAgICAgICAgICAvLyBJbiBhIGNoYXJhY3RlciBjbGFzcywgdGhpcy5jaGFyZGF0YSBoYXMgb25lIGNoYXJhY3RlciwgdGhhdCBpcyB0byBzYXksCi0gICAgICAgICAgICAvLyBhIHBhaXIgb2Ygc3Vycm9nYXRlcyBpcyBjb21wb3NlZCBhbmQgc3RvcmVkIHRvIHRoaXMuY2hhcmRhdGEuCi0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICByZXQgPSBUX0JBQ0tTT0xJRFVTOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCsrKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vZmZzZXQgPCB0aGlzLnJlZ2V4bGVuICYmIHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KSA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQrKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT047Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IFRfQ0hBUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdbJzoKLSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpCi0gICAgICAgICAgICAgICAgICAgICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5yZWdleGxlbiAmJiB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCkgPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IFRfUE9TSVhfQ0hBUkNMQVNTX1NUQVJUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IC8vIFRocm91Z2ggZG93bgotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiB0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvdyA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShsb3cpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJkYXRhID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgbG93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCA9IFRfQ0hBUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubmV4dHRva2VuID0gcmV0OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgIGNhc2UgJ3wnOiByZXQgPSBUX09SOyAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICcqJzogcmV0ID0gVF9TVEFSOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnKyc6IHJldCA9IFRfUExVUzsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJz8nOiByZXQgPSBUX1FVRVNUSU9OOyAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICcpJzogcmV0ID0gVF9SUEFSRU47ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnLic6IHJldCA9IFRfRE9UOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1snOiByZXQgPSBUX0xCUkFDS0VUOyAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdeJzogcmV0ID0gVF9DQVJFVDsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnJCc6IHJldCA9IFRfRE9MTEFSOyAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJygnOgotICAgICAgICAgICAgcmV0ID0gVF9MUEFSRU47Ci0gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCkgIT0gJz8nKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKCsrdGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCsrKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgICAgY2FzZSAnOic6ICByZXQgPSBUX0xQQVJFTjI7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJz0nOiAgcmV0ID0gVF9MT09LQUhFQUQ7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICchJzogIHJldCA9IFRfTkVHQVRJVkVMT09LQUhFQUQ7ICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnWyc6ICByZXQgPSBUX1NFVF9PUEVSQVRJT05TOyAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJz4nOiAgcmV0ID0gVF9JTkRFUEVOREVOVDsgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5uZXh0LjIiLCB0aGlzLm9mZnNldC0zKTsKLSAgICAgICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9MT09LQkVISU5EOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyEnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IFRfTkVHQVRJVkVMT09LQkVISU5EOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMyIsIHRoaXMub2Zmc2V0LTMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICcjJzoKLSAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5vZmZzZXQgPCB0aGlzLnJlZ2V4bGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnKScpICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICcpJykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5uZXh0LjQiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgICAgICByZXQgPSBUX0NPTU1FTlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICctJyB8fCAnYScgPD0gY2ggJiYgY2ggPD0gJ3onIHx8ICdBJyA8PSBjaCAmJiBjaCA8PSAnWicpIHsvLyBPcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0IC0tOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBUX01PRElGSUVSUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKCcpIHsgICAgICAgICAvLyBjb25kaXRpb25hbAotICAgICAgICAgICAgICAgICAgICByZXQgPSBUX0NPTkRJVElPTjsgICAgICAgICAgLy8gdGhpcy5vZmZzZXRzIHBvaW50cyB0aGUgbmV4dCBvZiAnKCcuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMiIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXQgPSBUX0JBQ0tTT0xJRFVTOwotICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5uZXh0LjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCsrKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldCA9IFRfQ0hBUjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm5leHR0b2tlbiA9IHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZWdleCA6Oj0gdGVybSAoYHxgIHRlcm0pKgotICAgICAqIHRlcm0gOjo9IGZhY3RvcisKLSAgICAgKiBmYWN0b3IgOjo9ICgnXicgfCAnJCcgfCAnXEEnIHwgJ1xaJyB8ICdceicgfCAnXGInIHwgJ1xCJyB8ICdcPCcgfCAnXD4nCi0gICAgICogICAgICAgICAgICB8IGF0b20gKCgnKicgfCAnKycgfCAnPycgfCBtaW5tYXggKSAnPyc/ICk/KQotICAgICAqICAgICAgICAgICAgfCAnKD89JyByZWdleCAnKScgIHwgJyg/IScgcmVnZXggJyknICB8ICcoPyZsdDs9JyByZWdleCAnKScgIHwgJyg/Jmx0OyEnIHJlZ2V4ICcpJwotICAgICAqIGF0b20gOjo9IGNoYXIgfCAnLicgfCByYW5nZSB8ICcoJyByZWdleCAnKScgfCAnKD86JyByZWdleCAnKScgfCAnXCcgWzAtOV0KLSAgICAgKiAgICAgICAgICB8ICdcdycgfCAnXFcnIHwgJ1xkJyB8ICdcRCcgfCAnXHMnIHwgJ1xTJyB8IGNhdGVnb3J5LWJsb2NrIAotICAgICAqLwotICAgIFRva2VuIHBhcnNlUmVnZXgoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBUb2tlbiB0b2sgPSB0aGlzLnBhcnNlVGVybSgpOwotICAgICAgICBUb2tlbiBwYXJlbnQgPSBudWxsOwotICAgICAgICB3aGlsZSAodGhpcy5yZWFkKCkgPT0gVF9PUikgewotICAgICAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyAnfCcKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudCA9IFRva2VuLmNyZWF0ZVVuaW9uKCk7Ci0gICAgICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKHRvayk7Ci0gICAgICAgICAgICAgICAgdG9rID0gcGFyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG9rLmFkZENoaWxkKHRoaXMucGFyc2VUZXJtKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGVybSA6Oj0gZmFjdG9yKwotICAgICAqLwotICAgIFRva2VuIHBhcnNlVGVybSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjaCA9IHRoaXMucmVhZCgpOwotICAgICAgICBpZiAoY2ggPT0gVF9PUiB8fCBjaCA9PSBUX1JQQVJFTiB8fCBjaCA9PSBUX0VPRikgewotICAgICAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUVtcHR5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUb2tlbiB0b2sgPSB0aGlzLnBhcnNlRmFjdG9yKCk7Ci0gICAgICAgICAgICBUb2tlbiBjb25jYXQgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKChjaCA9IHRoaXMucmVhZCgpKSAhPSBUX09SICYmIGNoICE9IFRfUlBBUkVOICYmIGNoICE9IFRfRU9GKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmNhdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmNhdCA9IFRva2VuLmNyZWF0ZUNvbmNhdCgpOwotICAgICAgICAgICAgICAgICAgICBjb25jYXQuYWRkQ2hpbGQodG9rKTsKLSAgICAgICAgICAgICAgICAgICAgdG9rID0gY29uY2F0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25jYXQuYWRkQ2hpbGQodGhpcy5wYXJzZUZhY3RvcigpKTsKLSAgICAgICAgICAgICAgICAvL3RvayA9IFRva2VuLmNyZWF0ZUNvbmNhdCh0b2ssIHRoaXMucGFyc2VGYWN0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdG9rOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVG9rZW4gcHJvY2Vzc0NhcmV0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi50b2tlbl9saW5lYmVnaW5uaW5nOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzRG9sbGFyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi50b2tlbl9saW5lZW5kOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzTG9va2FoZWFkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZUxvb2soVG9rZW4uTE9PS0FIRUFELCB0aGlzLnBhcnNlUmVnZXgoKSk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzTmVnYXRpdmVsb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5ORUdBVElWRUxPT0tBSEVBRCwgdGhpcy5wYXJzZVJlZ2V4KCkpOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9SUEFSRU4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnKScKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0xvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5MT09LQkVISU5ELCB0aGlzLnBhcnNlUmVnZXgoKSk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzTmVnYXRpdmVsb29rYmVoaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZUxvb2soVG9rZW4uTkVHQVRJVkVMT09LQkVISU5ELCB0aGlzLnBhcnNlUmVnZXgoKSk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyAnKScKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0EoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3N0cmluZ2JlZ2lubmluZzsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3N0cmluZ2VuZDI7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c196KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi50b2tlbl9zdHJpbmdlbmQ7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19iKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi50b2tlbl93b3JkZWRnZTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX25vdF93b3JkZWRnZTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2x0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi50b2tlbl93b3JkYmVnaW5uaW5nOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfZ3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3dvcmRlbmQ7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NTdGFyKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSA9PSBUX1FVRVNUSU9OKSB7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVOR0Nsb3N1cmUodG9rKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUGx1cyhUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFgrIC0+IFhYKgotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfUVVFU1RJT04pIHsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNvbmNhdCh0b2ssIFRva2VuLmNyZWF0ZU5HQ2xvc3VyZSh0b2spKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ29uY2F0KHRvaywgVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc1F1ZXN0aW9uKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gWD8gLT4gWHwKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHBhciA9IFRva2VuLmNyZWF0ZVVuaW9uKCk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSA9PSBUX1FVRVNUSU9OKSB7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIHBhci5hZGRDaGlsZChUb2tlbi5jcmVhdGVFbXB0eSgpKTsKLSAgICAgICAgICAgIHBhci5hZGRDaGlsZCh0b2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyLmFkZENoaWxkKHRvayk7Ci0gICAgICAgICAgICBwYXIuYWRkQ2hpbGQoVG9rZW4uY3JlYXRlRW1wdHkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcjsKLSAgICB9Ci0gICAgYm9vbGVhbiBjaGVja1F1ZXN0aW9uKGludCBvZmYpIHsKLSAgICAgICAgcmV0dXJuIG9mZiA8IHRoaXMucmVnZXhsZW4gJiYgdGhpcy5yZWdleC5jaGFyQXQob2ZmKSA9PSAnPyc7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NQYXJlbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBpbnQgcCA9IHRoaXMucGFyZW5udW1iZXIrKzsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlUGFyZW4odGhpcy5wYXJzZVJlZ2V4KCksIHApOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9SUEFSRU4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnKScKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc1BhcmVuMigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVQYXJlbih0aGlzLnBhcnNlUmVnZXgoKSwgMCk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQ29uZGl0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMub2Zmc2V0IHBvaW50cyB0aGUgbmV4dCBvZiAnKCcKLSAgICAgICAgaWYgKHRoaXMub2Zmc2V0KzEgPj0gdGhpcy5yZWdleGxlbikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjQiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZXMgYSBjb25kaXRpb24uCi0gICAgICAgIGludCByZWZubyA9IC0xOwotICAgICAgICBUb2tlbiBjb25kaXRpb24gPSBudWxsOwotICAgICAgICBpbnQgY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0gICAgICAgIGlmICgnMScgPD0gY2ggJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICByZWZubyA9IGNoLScwJzsKLSAgICAgICAgICAgIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlcyA9PSBudWxsKSAgdGhpcy5yZWZlcmVuY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzLmFkZEVsZW1lbnQobmV3IFJlZmVyZW5jZVBvc2l0aW9uKHJlZm5vLCB0aGlzLm9mZnNldCkpOwotICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpICE9ICcpJykgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnPycpICB0aGlzLm9mZnNldCAtLTsgLy8gUG9pbnRzICcoJy4KLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgY29uZGl0aW9uID0gdGhpcy5wYXJzZUZhY3RvcigpOwotICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24udHlwZSkgewotICAgICAgICAgICAgICBjYXNlIFRva2VuLkxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgY2FzZSBUb2tlbi5ORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgY2FzZSBUb2tlbi5MT09LQkVISU5EOgotICAgICAgICAgICAgICBjYXNlIFRva2VuLk5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBUb2tlbi5BTkNIT1I6Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjUiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlcyB5ZXMvbm8tcGF0dGVybnMuCi0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB5ZXNQYXR0ZXJuID0gdGhpcy5wYXJzZVJlZ2V4KCk7Ci0gICAgICAgIFRva2VuIG5vUGF0dGVybiA9IG51bGw7Ci0gICAgICAgIGlmICh5ZXNQYXR0ZXJuLnR5cGUgPT0gVG9rZW4uVU5JT04pIHsKLSAgICAgICAgICAgIGlmICh5ZXNQYXR0ZXJuLnNpemUoKSAhPSAyKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuNiIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgIG5vUGF0dGVybiA9IHllc1BhdHRlcm4uZ2V0Q2hpbGQoMSk7Ci0gICAgICAgICAgICB5ZXNQYXR0ZXJuID0geWVzUGF0dGVybi5nZXRDaGlsZCgwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9SUEFSRU4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ29uZGl0aW9uKHJlZm5vLCBjb25kaXRpb24sIHllc1BhdHRlcm4sIG5vUGF0dGVybik7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NNb2RpZmllcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5vZmZzZXQgcG9pbnRzIHRoZSBuZXh0IG9mICc/Jy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmaWVycyA6Oj0gW2ltc3ddKiAoJy0nIFtpbXN3XSopPyAnOicKLSAgICAgICAgaW50IGFkZCA9IDAsIG1hc2sgPSAwLCBjaCA9IC0xOwotICAgICAgICB3aGlsZSAodGhpcy5vZmZzZXQgPCB0aGlzLnJlZ2V4bGVuKSB7Ci0gICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgIGludCB2ID0gUkVVdGlsLmdldE9wdGlvblZhbHVlKGNoKTsKLSAgICAgICAgICAgIGlmICh2ID09IDApICBicmVhazsgICAgICAgICAgICAgICAgIC8vICctJyBvciAnOic/Ci0gICAgICAgICAgICBhZGQgfD0gdjsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICBpZiAoY2ggPT0gJy0nKSB7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKLSAgICAgICAgICAgIHdoaWxlICh0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4pIHsKLSAgICAgICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpbnQgdiA9IFJFVXRpbC5nZXRPcHRpb25WYWx1ZShjaCk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gMCkgIGJyZWFrOyAgICAgICAgICAgICAvLyAnOic/Ci0gICAgICAgICAgICAgICAgbWFzayB8PSB2OwotICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4yIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgVG9rZW4gdG9rOwotICAgICAgICBpZiAoY2ggPT0gJzonKSB7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTW9kaWZpZXJHcm91cCh0aGlzLnBhcnNlUmVnZXgoKSwgYWRkLCBtYXNrKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcpJykgeyAgICAgICAgICAgICAgICAgLy8gc3VjaCBhcyAoPy1pKQotICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZU1vZGlmaWVyR3JvdXAodGhpcy5wYXJzZVJlZ2V4KCksIGFkZCwgbWFzayk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMyIsIHRoaXMub2Zmc2V0KTsKLQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzSW5kZXBlbmRlbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5JTkRFUEVOREVOVCwgdGhpcy5wYXJzZVJlZ2V4KCkpOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9SUEFSRU4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnKScKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpbnQgY2gyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBpbiAweDAwNDAtMHgwMDVmCi0gICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuCi0gICAgICAgICAgICB8fCAoKGNoMiA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspKSAmIDB4ZmZlMCkgIT0gMHgwMDQwKQotICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5hdG9tLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDaGFyKGNoMi0weDQwKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVDaGFyKCdpJyk7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfSSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4uZ2V0R3JhcGhlbWVQYXR0ZXJuKCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19YKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5nZXRDb21iaW5pbmdDaGFyYWN0ZXJTZXF1ZW5jZSgpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3JlZmVyZW5jZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZWZudW0gPSB0aGlzLmNoYXJkYXRhLScwJzsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlQmFja1JlZmVyZW5jZShyZWZudW0pOwotICAgICAgICB0aGlzLmhhc0JhY2tSZWZlcmVuY2VzID0gdHJ1ZTsKLSAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlcyA9PSBudWxsKSAgdGhpcy5yZWZlcmVuY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgICB0aGlzLnJlZmVyZW5jZXMuYWRkRWxlbWVudChuZXcgUmVmZXJlbmNlUG9zaXRpb24ocmVmbnVtLCB0aGlzLm9mZnNldC0yKSk7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIGZhY3RvciA6Oj0gKCdeJyB8ICckJyB8ICdcQScgfCAnXFonIHwgJ1x6JyB8ICdcYicgfCAnXEInIHwgJ1w8JyB8ICdcPicKLSAgICAgKiAgICAgICAgICAgIHwgYXRvbSAoKCcqJyB8ICcrJyB8ICc/JyB8IG1pbm1heCApICc/Jz8gKT8pCi0gICAgICogICAgICAgICAgICB8ICcoPz0nIHJlZ2V4ICcpJyAgfCAnKD8hJyByZWdleCAnKScgIHwgJyg/Jmx0Oz0nIHJlZ2V4ICcpJyAgfCAnKD8mbHQ7IScgcmVnZXggJyknCi0gICAgICogICAgICAgICAgICB8ICcoPyMnIFteKV0qICcpJwotICAgICAqIG1pbm1heCA6Oj0gJ3snIG1pbiAoJywnIG1heD8pPyAnfScKLSAgICAgKiBtaW4gOjo9IFswLTldKwotICAgICAqIG1heCA6Oj0gWzAtOV0rCi0gICAgICovCi0gICAgVG9rZW4gcGFyc2VGYWN0b3IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geyAgICAgICAgCi0gICAgICAgIGludCBjaCA9IHRoaXMucmVhZCgpOwotICAgICAgICBUb2tlbiB0b2s7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlIFRfQ0FSRVQ6ICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NhcmV0KCk7Ci0gICAgICAgICAgY2FzZSBUX0RPTExBUjogICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEb2xsYXIoKTsKLSAgICAgICAgICBjYXNlIFRfTE9PS0FIRUFEOiAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvb2thaGVhZCgpOwotICAgICAgICAgIGNhc2UgVF9ORUdBVElWRUxPT0tBSEVBRDogcmV0dXJuIHRoaXMucHJvY2Vzc05lZ2F0aXZlbG9va2FoZWFkKCk7Ci0gICAgICAgICAgY2FzZSBUX0xPT0tCRUhJTkQ6ICAgIHJldHVybiB0aGlzLnByb2Nlc3NMb29rYmVoaW5kKCk7Ci0gICAgICAgICAgY2FzZSBUX05FR0FUSVZFTE9PS0JFSElORDogcmV0dXJuIHRoaXMucHJvY2Vzc05lZ2F0aXZlbG9va2JlaGluZCgpOwotCi0gICAgICAgICAgY2FzZSBUX0NPTU1FTlQ6Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVFbXB0eSgpOwotCi0gICAgICAgICAgY2FzZSBUX0JBQ0tTT0xJRFVTOgotICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNoYXJkYXRhKSB7Ci0gICAgICAgICAgICAgIGNhc2UgJ0EnOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfQSgpOwotICAgICAgICAgICAgICBjYXNlICdaJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX1ooKTsKLSAgICAgICAgICAgICAgY2FzZSAneic6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c196KCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ2InOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfYigpOwotICAgICAgICAgICAgICBjYXNlICdCJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX0IoKTsKLSAgICAgICAgICAgICAgY2FzZSAnPCc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19sdCgpOwotICAgICAgICAgICAgICBjYXNlICc+JzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX2d0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIGRvd24KLSAgICAgICAgfQotICAgICAgICB0b2sgPSB0aGlzLnBhcnNlQXRvbSgpOwotICAgICAgICBjaCA9IHRoaXMucmVhZCgpOwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSBUX1NUQVI6ICByZXR1cm4gdGhpcy5wcm9jZXNzU3Rhcih0b2spOwotICAgICAgICAgIGNhc2UgVF9QTFVTOiAgcmV0dXJuIHRoaXMucHJvY2Vzc1BsdXModG9rKTsKLSAgICAgICAgICBjYXNlIFRfUVVFU1RJT046IHJldHVybiB0aGlzLnByb2Nlc3NRdWVzdGlvbih0b2spOwotICAgICAgICAgIGNhc2UgVF9DSEFSOgotICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmRhdGEgPT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm9mZnNldCAtPiBuZXh0IG9mICd7JwotICAgICAgICAgICAgICAgIGludCBvZmYgPSB0aGlzLm9mZnNldDsKLSAgICAgICAgICAgICAgICBpbnQgbWluID0gMCwgbWF4ID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZiA+PSB0aGlzLnJlZ2V4bGVuKSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdChvZmYrKyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICcsJyAmJiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpKSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICcsJykgeyAgICAgICAgICAgICAgICAvLyAwLTkKLSAgICAgICAgICAgICAgICAgICAgbWluID0gY2gtJzAnOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2ZmIDwgdGhpcy5yZWdleGxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNoID0gdGhpcy5yZWdleC5jaGFyQXQob2ZmKyspKSA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4qMTAgK2NoLScwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL2lmIChvZmYgPj0gdGhpcy5yZWdleGxlbikgIGJyZWFrOwotICAgICAgICAgICAgICAgIG1heCA9IG1pbjsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPj0gdGhpcy5yZWdleGxlbgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChjaCA9IHRoaXMucmVnZXguY2hhckF0KG9mZisrKSkgPCAnMCcgfHwgY2ggPiAnOScpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBjaCAhPSAnfScpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICd9JykgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gLTE7ICAgICAgICAgICAvLyB7bWluLH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLScwJzsgICAgICAgLy8ge21pbixtYXh9Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2ZmIDwgdGhpcy5yZWdleGxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjaCA9IHRoaXMucmVnZXguY2hhckF0KG9mZisrKSkgPj0gJzAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KjEwICtjaC0nMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDApICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1pbiA+IG1heCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigicGFyc2VGYWN0b3IoKTogbWluID4gbWF4OiAiK21pbisiLCAiK21heCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICd9JykgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ZmIC0+IG5leHQgb2YgJ30nCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tRdWVzdGlvbihvZmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZU5HQ2xvc3VyZSh0b2spOwotICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZisxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZUNsb3N1cmUodG9rKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRvay5zZXRNaW4obWluKTsKLSAgICAgICAgICAgICAgICB0b2suc2V0TWF4KG1heCk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkNMT1NVUkU6ICIrbWluKyIsICIrbWF4KTsKLSAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGF0b20gOjo9IGNoYXIgfCAnLicgfCBjaGFyLWNsYXNzIHwgJygnIHJlZ2V4ICcpJyB8ICcoPzonIHJlZ2V4ICcpJyB8ICdcJyBbMC05XQotICAgICAqICAgICAgICAgIHwgJ1x3JyB8ICdcVycgfCAnXGQnIHwgJ1xEJyB8ICdccycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sKLSAgICAgKiAgICAgICAgICB8ICcoPz4nIHJlZ2V4ICcpJwotICAgICAqIGNoYXIgOjo9ICdcXCcgfCAnXCcgW2VmbnJ0XSB8IGJtcC1jb2RlIHwgY2hhcmFjdGVyLTEKLSAgICAgKi8KLSAgICBUb2tlbiBwYXJzZUF0b20oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpbnQgY2ggPSB0aGlzLnJlYWQoKTsKLSAgICAgICAgVG9rZW4gdG9rID0gbnVsbDsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgIGNhc2UgVF9MUEFSRU46ICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUGFyZW4oKTsKLSAgICAgICAgICBjYXNlIFRfTFBBUkVOMjogICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1BhcmVuMigpOyAvLyAnKD86JwotICAgICAgICAgIGNhc2UgVF9DT05ESVRJT046ICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ29uZGl0aW9uKCk7IC8vICcoPygnCi0gICAgICAgICAgY2FzZSBUX01PRElGSUVSUzogICAgIHJldHVybiB0aGlzLnByb2Nlc3NNb2RpZmllcnMoKTsgLy8gKD9tb2RpZmllcnMgLi4uICkKLSAgICAgICAgICBjYXNlIFRfSU5ERVBFTkRFTlQ6ICAgcmV0dXJuIHRoaXMucHJvY2Vzc0luZGVwZW5kZW50KCk7Ci0gICAgICAgICAgY2FzZSBUX0RPVDoKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgJy4nCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi50b2tlbl9kb3Q7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBjaGFyLWNsYXNzIDo6PSAnWycgKCAnXic/IHJhbmdlICcsJz8pKyAnXScKLSAgICAgICAgICAgICAqIHJhbmdlIDo6PSAnXGQnIHwgJ1x3JyB8ICdccycgfCBjYXRlZ29yeS1ibG9jayB8IHJhbmdlLWNoYXIKLSAgICAgICAgICAgICAqICAgICAgICAgICB8IHJhbmdlLWNoYXIgJy0nIHJhbmdlLWNoYXIKLSAgICAgICAgICAgICAqIHJhbmdlLWNoYXIgOjo9ICdcWycgfCAnXF0nIHwgJ1xcJyB8ICdcJyBbLC1lZm5ydHZdIHwgYm1wLWNvZGUgfCBjaGFyYWN0ZXItMgotICAgICAgICAgICAgICogYm1wLWNoYXIgOjo9ICdcJyAndScgWzAtOWEtZkEtRl0gWzAtOWEtZkEtRl0gWzAtOWEtZkEtRl0gWzAtOWEtZkEtRl0KLSAgICAgICAgICAgICAqLwotICAgICAgICAgIGNhc2UgVF9MQlJBQ0tFVDogICAgICByZXR1cm4gdGhpcy5wYXJzZUNoYXJhY3RlckNsYXNzKHRydWUpOwotICAgICAgICAgIGNhc2UgVF9TRVRfT1BFUkFUSU9OUzogcmV0dXJuIHRoaXMucGFyc2VTZXRPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgICBjYXNlIFRfQkFDS1NPTElEVVM6Ci0gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhcmRhdGEpIHsKLSAgICAgICAgICAgICAgY2FzZSAnZCc6ICBjYXNlICdEJzoKLSAgICAgICAgICAgICAgY2FzZSAndyc6ICBjYXNlICdXJzoKLSAgICAgICAgICAgICAgY2FzZSAncyc6ICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICB0b2sgPSB0aGlzLmdldFRva2VuRm9yU2hvcnRoYW5kKHRoaXMuY2hhcmRhdGEpOwotICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0b2s7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnZSc6ICBjYXNlICdmJzogIGNhc2UgJ24nOiAgY2FzZSAncic6Ci0gICAgICAgICAgICAgIGNhc2UgJ3QnOiAgY2FzZSAndSc6ICBjYXNlICd2JzogIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoMiA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2gyIDwgMHgxMDAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlQ2hhcihjaDIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlU3RyaW5nKFJFVXRpbC5kZWNvbXBvc2VUb1N1cnJvZ2F0ZXMoY2gyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnYyc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19jKCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ0MnOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfQygpOwotICAgICAgICAgICAgICBjYXNlICdpJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX2koKTsKLSAgICAgICAgICAgICAgY2FzZSAnSSc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19JKCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ2cnOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfZygpOwotICAgICAgICAgICAgICBjYXNlICdYJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX1goKTsKLSAgICAgICAgICAgICAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOiAgY2FzZSAnNCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzogIGNhc2UgJzgnOiAgY2FzZSAnOSc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tyZWZlcmVuY2UoKTsKLQotICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgaW50IHBzdGFydCA9IHRoaXMub2Zmc2V0OwotICAgICAgICAgICAgICAgIHRvayA9IHByb2Nlc3NCYWNrc29saWR1c19wUCh0aGlzLmNoYXJkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rID09IG51bGwpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuYXRvbS41IiwgcHN0YXJ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZUNoYXIodGhpcy5jaGFyZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBUX0NIQVI6Ci0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVDaGFyKHRoaXMuY2hhcmRhdGEpOwotICAgICAgICAgICAgaW50IGhpZ2ggPSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShoaWdoKQotICAgICAgICAgICAgICAgICYmIHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiBSRVV0aWwuaXNMb3dTdXJyb2dhdGUodGhpcy5jaGFyZGF0YSkpIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gc3VyID0gbmV3IGNoYXJbMl07Ci0gICAgICAgICAgICAgICAgc3VyWzBdID0gKGNoYXIpaGlnaDsKLSAgICAgICAgICAgICAgICBzdXJbMV0gPSAoY2hhcil0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVBhcmVuKFRva2VuLmNyZWF0ZVN0cmluZyhuZXcgU3RyaW5nKHN1cikpLCAwKTsKLSAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjQiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHByb2Nlc3NCYWNrc29saWR1c19wUChpbnQgYykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBwb3NpdGl2ZSA9IGMgPT0gJ3AnOwotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUikgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjIiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2s7Ci0gICAgICAgIHN3aXRjaCAodGhpcy5jaGFyZGF0YSkgewotICAgICAgICAgIGNhc2UgJ0wnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0dGVyCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiTCIsIHBvc2l0aXZlKTsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ00nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyawotICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIk0iLCBwb3NpdGl2ZSk7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdOJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlcgotICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIk4iLCBwb3NpdGl2ZSk7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdaJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcGFyYXRvcgotICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIloiLCBwb3NpdGl2ZSk7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdDJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiQyIsIHBvc2l0aXZlKTsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1AnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVuY3R1YXRpb24KLSAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKCJQIiwgcG9zaXRpdmUpOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnUyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2wKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKCJTIiwgcG9zaXRpdmUpOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICAvLyB0aGlzLm9mZnNldCBwb2ludHMgdGhlIG5leHQgb2YgJ3snLgotICAgICAgICAgICAgLy9wc3RhcnQgPSB0aGlzLm9mZnNldDsKLSAgICAgICAgICAgIGludCBuYW1lc3RhcnQgPSB0aGlzLm9mZnNldDsKLSAgICAgICAgICAgIGludCBuYW1lZW5kID0gdGhpcy5yZWdleC5pbmRleE9mKCd9JywgbmFtZXN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChuYW1lZW5kIDwgMCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjMiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICBTdHJpbmcgcG5hbWUgPSB0aGlzLnJlZ2V4LnN1YnN0cmluZyhuYW1lc3RhcnQsIG5hbWVlbmQpOwotICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBuYW1lZW5kKzE7Ci0gICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZShwbmFtZSwgcG9zaXRpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICBpZiAodGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5JR05PUkVfQ0FTRSkpCi0gICAgICAgICAgICAgIHRvayA9IFJhbmdlVG9rZW4uY3JlYXRlQ2FzZUluc2Vuc2l0aXZlVG9rZW4odG9rKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuYXRvbS4yIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0KLSAgICBpbnQgcHJvY2Vzc0NJaW5DaGFyYWN0ZXJDbGFzcyhSYW5nZVRva2VuIHRvaywgaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoYXItY2xhc3MgOjo9ICdbJyAoICdeJz8gcmFuZ2UgJywnPykrICddJwotICAgICAqIHJhbmdlIDo6PSAnXGQnIHwgJ1x3JyB8ICdccycgfCBjYXRlZ29yeS1ibG9jayB8IHJhbmdlLWNoYXIKLSAgICAgKiAgICAgICAgICAgfCByYW5nZS1jaGFyICctJyByYW5nZS1jaGFyCi0gICAgICogcmFuZ2UtY2hhciA6Oj0gJ1xbJyB8ICdcXScgfCAnXFwnIHwgJ1wnIFssLWVmbnJ0dl0gfCBibXAtY29kZSB8IGNoYXJhY3Rlci0yCi0gICAgICogYm1wLWNvZGUgOjo9ICdcJyAndScgWzAtOWEtZkEtRl0gWzAtOWEtZkEtRl0gWzAtOWEtZkEtRl0gWzAtOWEtZkEtRl0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBwYXJzZUNoYXJhY3RlckNsYXNzKGJvb2xlYW4gdXNlTnJhbmdlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldENvbnRleHQoU19JTkJSQUNLRVRTKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdbJwotICAgICAgICBib29sZWFuIG5yYW5nZSA9IGZhbHNlOwotICAgICAgICBSYW5nZVRva2VuIGJhc2UgPSBudWxsOwotICAgICAgICBSYW5nZVRva2VuIHRvazsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICdeJykgewotICAgICAgICAgICAgbnJhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdeJwotICAgICAgICAgICAgaWYgKHVzZU5yYW5nZSkgewotICAgICAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZU5SYW5nZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYXNlID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBiYXNlLmFkZFJhbmdlKDAsIFRva2VuLlVURjE2X01BWCk7Ci0gICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHR5cGU7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3Rsb29wID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKCh0eXBlID0gdGhpcy5yZWFkKCkpICE9IFRfRU9GKSB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScgJiYgIWZpcnN0bG9vcCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGZpcnN0bG9vcCA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGMgPSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgYm9vbGVhbiBlbmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IFRfQkFDS1NPTElEVVMpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICd3JzogIGNhc2UgJ1cnOgotICAgICAgICAgICAgICAgICAgY2FzZSAncyc6ICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoYykpOwotICAgICAgICAgICAgICAgICAgICBlbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6ICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOiAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLnByb2Nlc3NDSWluQ2hhcmFjdGVyQ2xhc3ModG9rLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAwKSAgZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgICAgICAgaW50IHBzdGFydCA9IHRoaXMub2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvazIgPSB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19wUChjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvazIgPT0gbnVsbCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjUiLCBwc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB0b2subWVyZ2VSYW5nZXModG9rMik7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7Ci0gICAgICAgICAgICAgICAgfSAvLyBcICsgYwotICAgICAgICAgICAgfSAvLyBiYWNrc29saWR1cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUE9TSVggQ2hhcmFjdGVyIGNsYXNzIHN1Y2ggYXMgWzphbG51bTpdCi0gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFRfUE9TSVhfQ0hBUkNMQVNTX1NUQVJUKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5hbWVlbmQgPSB0aGlzLnJlZ2V4LmluZGV4T2YoJzonLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVlbmQgPCAwKSB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHBvc2l0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpID09ICdeJykgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0aGlzLnJlZ2V4LnN1YnN0cmluZyh0aGlzLm9mZnNldCwgbmFtZWVuZCk7Ci0gICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiByYW5nZSA9IFRva2VuLmdldFJhbmdlKG5hbWUsIHBvc2l0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJhbmdlID09IG51bGwpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMyIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB0b2subWVyZ2VSYW5nZXMocmFuZ2UpOwotICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVlbmQrMSA+PSB0aGlzLnJlZ2V4bGVuIHx8IHRoaXMucmVnZXguY2hhckF0KG5hbWVlbmQrMSkgIT0gJ10nKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMSIsIG5hbWVlbmQpOwotICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gbmFtZWVuZCsyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWVuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgc2hvcnRoYW5kcy4uLgotICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgdGhpcy5jaGFyZGF0YSAhPSAnLScpIHsgLy8gSGVyZSBpcyBubyAnLScuCi0gICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gU2tpcHMgJy0nCi0gICAgICAgICAgICAgICAgICAgIGlmICgodHlwZSA9IHRoaXMucmVhZCgpKSA9PSBUX0VPRikgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4yIiwgdGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnLScsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2VlbmQgPSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9CQUNLU09MSURVUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZWVuZCA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgcmFuZ2VlbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQSkKLSAgICAgICAgICAgICAgICAmJiB0aGlzLnJlYWQoKSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnLCcpCi0gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfRU9GKQotICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgIGlmICghdXNlTnJhbmdlICYmIG5yYW5nZSkgewotICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOwotICAgICAgICAgICAgdG9rID0gYmFzZTsKLSAgICAgICAgfQotICAgICAgICB0b2suc29ydFJhbmdlcygpOwotICAgICAgICB0b2suY29tcGFjdFJhbmdlcygpOwotICAgICAgICAvL3Rvay5kdW1wUmFuZ2VzKCk7Ci0gICAgICAgIC8qCi0gICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkKLSAgICAgICAgICAgIHRvayA9IFJhbmdlVG9rZW4uY3JlYXRlQ2FzZUluc2Vuc2l0aXZlVG9rZW4odG9rKTsKLSAgICAgICAgKi8KLSAgICAgICAgdGhpcy5zZXRDb250ZXh0KFNfTk9STUFMKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnXScKLQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICcoP1snIC4uLiAnXScgKCgnLScgfCAnKycgfCAnJicpICdbJyAuLi4gJ10nKT8gJyknCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJhbmdlVG9rZW4gcGFyc2VTZXRPcGVyYXRpb25zKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSB0aGlzLnBhcnNlQ2hhcmFjdGVyQ2xhc3MoZmFsc2UpOwotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgd2hpbGUgKCh0eXBlID0gdGhpcy5yZWFkKCkpICE9IFRfUlBBUkVOKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9DSEFSICYmIChjaCA9PSAnLScgfHwgY2ggPT0gJyYnKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gVF9QTFVTKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfTEJSQUNLRVQpIHRocm93IGV4KCJwYXJzZXIub3BlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHQyID0gdGhpcy5wYXJzZUNoYXJhY3RlckNsYXNzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX1BMVVMpCi0gICAgICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyh0Mik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJy0nKQotICAgICAgICAgICAgICAgICAgICB0b2suc3VidHJhY3RSYW5nZXModDIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICcmJykKLSAgICAgICAgICAgICAgICAgICAgdG9rLmludGVyc2VjdFJhbmdlcyh0Mik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQVNTRVJUIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIub3BlLjIiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0KLSAgICBUb2tlbiBnZXRUb2tlbkZvclNob3J0aGFuZChpbnQgY2gpIHsKLSAgICAgICAgVG9rZW4gdG9rOwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICB0b2sgPSB0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZKQotICAgICAgICAgICAgICAgID8gVG9rZW4uZ2V0UmFuZ2UoIk5kIiwgdHJ1ZSkgOiBUb2tlbi50b2tlbl8wdG85OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICB0b2sgPSB0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZKQotICAgICAgICAgICAgICAgID8gVG9rZW4uZ2V0UmFuZ2UoIk5kIiwgZmFsc2UpIDogVG9rZW4udG9rZW5fbm90XzB0bzk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICd3JzoKLSAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCi0gICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiSXNXb3JkIiwgdHJ1ZSkgOiBUb2tlbi50b2tlbl93b3JkY2hhcnM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdXJzoKLSAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCi0gICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiSXNXb3JkIiwgZmFsc2UpIDogVG9rZW4udG9rZW5fbm90X3dvcmRjaGFyczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKLSAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1NwYWNlIiwgdHJ1ZSkgOiBUb2tlbi50b2tlbl9zcGFjZXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCi0gICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiSXNTcGFjZSIsIGZhbHNlKSA6IFRva2VuLnRva2VuX25vdF9zcGFjZXM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHNob3J0aGFuZHM6IFxcdSIrSW50ZWdlci50b1N0cmluZyhjaCwgMTYpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqLwotICAgIGludCBkZWNvZGVFc2NhcGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQkFDS1NPTElEVVMpICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICBpbnQgYyA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgIGNhc2UgJ2UnOiAgYyA9IDB4MWI7ICBicmVhazsgLy8gRVNDQVBFIFUrMDAxQgotICAgICAgICAgIGNhc2UgJ2YnOiAgYyA9ICdcZic7ICBicmVhazsgLy8gRk9STSBGRUVEIFUrMDAwQwotICAgICAgICAgIGNhc2UgJ24nOiAgYyA9ICdcbic7ICBicmVhazsgLy8gTElORSBGRUVEIFUrMDAwQQotICAgICAgICAgIGNhc2UgJ3InOiAgYyA9ICdccic7ICBicmVhazsgLy8gQ1JSSUFHRSBSRVRVUk4gVSswMDBECi0gICAgICAgICAgY2FzZSAndCc6ICBjID0gJ1x0JzsgIGJyZWFrOyAvLyBIT1JJWk9OVEFMIFRBQlVMQVRJT04gVSswMDA5Ci0gICAgICAgICAgLy9jYXNlICd2JzogIGMgPSAweDBiOyAgYnJlYWs7IC8vIFZFUlRJQ0FMIFRBQlVMQVRJT04gVSswMDBCCi0gICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIpICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmRhdGEgPT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgaW50IHYxID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgdXYgPSAwOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIpICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1diA+IHV2KjE2KSB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYXJkYXRhICE9ICd9JykgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4zIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHV2ID4gVG9rZW4uVVRGMTZfTUFYKSAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjQiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgICAgICBjID0gdXY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCB2MSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgaW50IHV2ID0gdjE7Ci0gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKLSAgICAgICAgICAgICAgICBjID0gdXY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgaW50IHYxID0gMDsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIGludCB1diA9IHYxOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgYyA9IHV2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHV2ID0gdjE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKLSAgICAgICAgICAgIGlmICh1diA+IFRva2VuLlVURjE2X01BWCkgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwcGUuNCIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgYyA9IHV2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNSIsIHRoaXMub2Zmc2V0LTIpOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IGhleENoYXIoaW50IGNoKSB7Ci0gICAgICAgIGlmIChjaCA8ICcwJykgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGNoID4gJ2YnKSAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoY2ggPD0gJzknKSAgcmV0dXJuIGNoLScwJzsKLSAgICAgICAgaWYgKGNoIDwgJ0EnKSAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoY2ggPD0gJ0YnKSAgcmV0dXJuIGNoLSdBJysxMDsKLSAgICAgICAgaWYgKGNoIDwgJ2EnKSAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gY2gtJ2EnKzEwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVndWxhckV4cHJlc3Npb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVndWxhckV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0MzgyZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ3VsYXJFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTg4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotCi0vKioKLSAqIEEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGVuZ2luZSB1c2luZyBOb24tZGV0ZXJtaW5pc3RpYyBGaW5pdGUgQXV0b21hdG9uIChORkEpLgotICogVGhpcyBlbmdpbmUgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgUE9TSVggcmVndWxhciBleHByZXNzaW9uLgotICoKLSAqIDxociB3aWR0aD0iNTAlIj4KLSAqIDxoMz5Ib3cgdG8gdXNlPC9oMz4KLSAqCi0gKiA8ZGw+Ci0gKiAgIDxkdD5BLiBTdGFuZGFyZCB3YXkKLSAqICAgPGRkPgotICogPHByZT4KLSAqIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKDx2YXI+cmVnZXg8L3Zhcj4pOwotICogaWYgKHJlLm1hdGNoZXModGV4dCkpIHsgLi4uIH0KLSAqIDwvcHJlPgotICoKLSAqICAgPGR0PkIuIENhcHR1cmluZyBncm91cHMKLSAqICAgPGRkPgotICogPHByZT4KLSAqIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKDx2YXI+cmVnZXg8L3Zhcj4pOwotICogTWF0Y2ggbWF0Y2ggPSBuZXcgTWF0Y2goKTsKLSAqIGlmIChyZS5tYXRjaGVzKHRleHQsIG1hdGNoKSkgewotICogICAgIC4uLiAvLyBZb3UgY2FuIHJlZmVyIGNhcHR1cmVkIHRleHRzIHdpdGggbWV0aG9kcyBvZiB0aGUgPGNvZGU+TWF0Y2g8L2NvZGU+IGNsYXNzLgotICogfQotICogPC9wcmU+Ci0gKgotICogPC9kbD4KLSAqCi0gKiA8aDQ+Q2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZzwvaDQ+Ci0gKiA8cHJlPgotICogUmVndWxhckV4cHJlc3Npb24gcmUgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oPHZhcj5yZWdleDwvdmFyPiwgImkiKTsKLSAqIGlmIChyZS5tYXRjaGVzKHRleHQpID49IDApIHsgLi4ufQotICogPC9wcmU+Ci0gKgotICogPGg0Pk9wdGlvbnM8L2g0PgotICogPHA+WW91IGNhbiBzcGVjaWZ5IG9wdGlvbnMgdG8gPGEgaHJlZj0iI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48Y29kZT5SZWd1bGFyRXhwcmVzc2lvbig8L2NvZGU+PHZhcj5yZWdleDwvdmFyPjxjb2RlPiwgPC9jb2RlPjx2YXI+b3B0aW9uczwvdmFyPjxjb2RlPik8L2NvZGU+PC9hPgotICogICAgb3IgPGEgaHJlZj0iI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjxjb2RlPnNldFBhdHRlcm4oPC9jb2RlPjx2YXI+cmVnZXg8L3Zhcj48Y29kZT4sIDwvY29kZT48dmFyPm9wdGlvbnM8L3Zhcj48Y29kZT4pPC9jb2RlPjwvYT4uCi0gKiAgICBUaGlzIDx2YXI+b3B0aW9uczwvdmFyPiBwYXJhbWV0ZXIgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzLgotICogPC9wPgotICogPGRsPgotICogICA8ZHQ+PGEgbmFtZT0iSV9PUFRJT04iPjxjb2RlPiJpIjwvY29kZT48L2E+Ci0gKiAgIDxkZD5UaGlzIG9wdGlvbiBpbmRpY2F0ZXMgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZy4KLSAqICAgPGR0PjxhIG5hbWU9Ik1fT1BUSU9OIj48Y29kZT4ibSI8L2NvZGU+PC9hPgotICogICA8ZGQgY2xhc3M9IlJFR0VYIj48a2JkPl48L2tiZD4gYW5kIDxrYmQ+JDwva2JkPiBjb25zaWRlciB0aGUgRU9MIGNoYXJhY3RlcnMgd2l0aGluIHRoZSB0ZXh0LgotICogICA8ZHQ+PGEgbmFtZT0iU19PUFRJT04iPjxjb2RlPiJzIjwvY29kZT48L2E+Ci0gKiAgIDxkZCBjbGFzcz0iUkVHRVgiPjxrYmQ+Ljwva2JkPiBtYXRjaGVzIGFueSBvbmUgY2hhcmFjdGVyLgotICogICA8ZHQ+PGEgbmFtZT0iVV9PUFRJT04iPjxjb2RlPiJ1IjwvY29kZT48L2E+Ci0gKiAgIDxkZCBjbGFzcz0iUkVHRVgiPlJlZGVmaW5lcyA8S2JkPlxkIFxEIFx3IFxXIFxzIFxTIFxiIFxCIFwmbHQ7IFw+PC9rYmQ+IGFzIGJlY29taW5nIHRvIFVuaWNvZGUuCi0gKiAgIDxkdD48YSBuYW1lPSJXX09QVElPTiI+PGNvZGU+InciPC9jb2RlPjwvYT4KLSAqICAgPGRkIGNsYXNzPSJSRUdFWCI+QnkgdGhpcyBvcHRpb24sIDxrYmQ+XGIgXEIgXCZsdDsgXD48L2tiZD4gYXJlIHByb2Nlc3NlZCB3aXRoIHRoZSBtZXRob2Qgb2YKLSAqICAgICAgJ1VuaWNvZGUgUmVndWxhciBFeHByZXNzaW9uIEd1aWRlbGluZXMnIFJldmlzaW9uIDQuCi0gKiAgICAgIFdoZW4gInciIGFuZCAidSIgYXJlIHNwZWNpZmllZCBhdCB0aGUgc2FtZSB0aW1lLAotICogICAgICA8a2JkPlxiIFxCIFwmbHQ7IFw+PC9rYmQ+IGFyZSBwcm9jZXNzZWQgZm9yIHRoZSAidyIgb3B0aW9uLgotICogICA8ZHQ+PGEgbmFtZT0iQ09NTUFfT1BUSU9OIj48Y29kZT4iLCI8L2NvZGU+PC9hPgotICogICA8ZGQ+VGhlIHBhcnNlciB0cmVhdHMgYSBjb21tYSBpbiBhIGNoYXJhY3RlciBjbGFzcyBhcyBhIHJhbmdlIHNlcGFyYXRvci4KLSAqICAgICAgPGtiZCBjbGFzcz0iUkVHRVgiPlthLGJdPC9rYmQ+IG1hdGNoZXMgPGtiZD5hPC9rYmQ+IG9yIDxrYmQ+LDwva2JkPiBvciA8a2JkPmI8L2tiZD4gd2l0aG91dCB0aGlzIG9wdGlvbi4KLSAqICAgICAgPGtiZCBjbGFzcz0iUkVHRVgiPlthLGJdPC9rYmQ+IG1hdGNoZXMgPGtiZD5hPC9rYmQ+IG9yIDxrYmQ+Yjwva2JkPiB3aXRoIHRoaXMgb3B0aW9uLgotICoKLSAqICAgPGR0PjxhIG5hbWU9IlhfT1BUSU9OIj48Y29kZT4iWCI8L2NvZGU+PC9hPgotICogICA8ZGQgY2xhc3M9IlJFR0VYIj4KLSAqICAgICAgIEJ5IHRoaXMgb3B0aW9uLCB0aGUgZW5naW5lIGNvbmZvbXMgdG8gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9XRC14bWxzY2hlbWEtMi0yMDAwMDQwNy8jcmVnZXhzIj5YTUwgU2NoZW1hOiBSZWd1bGFyIEV4cHJlc3Npb248L2E+LgotICogICAgICAgVGhlIDxjb2RlPm1hdGNoKCk8L2NvZGU+IG1ldGhvZCBkb2VzIG5vdCBkbyBzdWJzcmluZyBtYXRjaGluZwotICogICAgICAgYnV0IGVudGlyZSBzdHJpbmcgbWF0Y2hpbmcuCi0gKgotICogPC9kbD4KLSAqIAotICogPGhyIHdpZHRoPSI1MCUiPgotICogPGgzPlN5bnRheDwvaDM+Ci0gKiA8dGFibGUgYm9yZGVyPSIxIiBiZ2NvbG9yPSIjZGRlZWZmIj4KLSAqICAgPHRyPgotICogICAgPHRkPgotICogICAgIDxoND5EaWZmZXJlbmNlcyBmcm9tIHRoZSBQZXJsIDUgcmVndWxhciBleHByZXNzaW9uPC9oND4KLSAqICAgICA8dWw+Ci0gKiAgICAgIDxsaT5UaGVyZSBpcyA2LWRpZ2l0IGhleGFkZWNpbWFsIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiAgKDxrYmQ+XHUwMDVjdjwva2JkPjx2YXI+SEhISEhIPC92YXI+LikKLSAqICAgICAgPGxpPlN1cHBvcnRzIHN1YnRyYWN0aW9uLCB1bmlvbiwgYW5kIGludGVyc2VjdGlvbiBvcGVyYXRpb25zIGZvciBjaGFyYWN0ZXIgY2xhc3Nlcy4KLSAqICAgICAgPGxpPk5vdCBzdXBwb3J0ZWQ6IDxrYmQ+XDwva2JkPjx2YXI+b29vPC92YXI+IChPY3RhbCBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb25zKSwKLSAqICAgICAgICAgIDxLYmQ+XEc8L2tiZD4sIDxrYmQ+XEM8L2tiZD4sIDxrYmQ+XGw8L2tiZD48dmFyPmM8L3Zhcj4sCi0gKiAgICAgICAgICA8a2JkPlx1MDA1YyB1PC9rYmQ+PHZhcj5jPC92YXI+LCA8a2JkPlxMPC9rYmQ+LCA8a2JkPlxVPC9rYmQ+LAotICogICAgICAgICAgPGtiZD5cRTwva2JkPiwgPGtiZD5cUTwva2JkPiwgPGtiZD5cTns8L2tiZD48dmFyPm5hbWU8L3Zhcj48a2JkPn08L2tiZD4sCi0gKiAgICAgICAgICA8S2JkPig/ezxrYmQ+PHZhcj5jb2RlPC92YXI+PGtiZD59KTwva2JkPiwgPEtiZD4oPz97PGtiZD48dmFyPmNvZGU8L3Zhcj48a2JkPn0pPC9rYmQ+Ci0gKiAgICAgPC91bD4KLSAqICAgIDwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiA8L3RhYmxlPgotICoKLSAqIDxQPk1ldGEgY2hhcmFjdGVycyBhcmUgYDxLQkQ+LiAqICsgPyB7IFsgKCApIHwgXCBeICQ8L0tCRD4nLjwvUD4KLSAqIDx1bD4KLSAqICAgPGxpPkNoYXJhY3RlcgotICogICAgIDxkbD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+Ljwva2JkPiAoQSBwZXJpb2QpCi0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBhbnkgb25lIGNoYXJhY3RlciBleGNlcHQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzLgotICogICAgICAgPGRkPkxJTkUgRkVFRCAoVSswMDBBKSwgQ0FSUklBR0UgUkVUVVJOIChVKzAwMEQpLAotICogICAgICAgICAgIFBBUkFHUkFQSCBTRVBBUkFUT1IgKFUrMjAyOSksIExJTkUgU0VQQVJBVE9SIChVKzIwMjgpCi0gKiAgICAgICA8ZGQ+VGhpcyBleHByZXNzaW9uIG1hdGNoZXMgb25lIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4gSXQgY2FuIG1hdGNoIGEgcGFpciBvZiBzdXJyb2dhdGVzLgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1NfT1BUSU9OIj50aGUgInMiIG9wdGlvbjwvYT4gaXMgc3BlY2lmaWVkLAotICogICAgICAgICAgIGl0IG1hdGNoZXMgYW55IGNoYXJhY3RlciBpbmNsdWRpbmcgdGhlIGFib3ZlIGZvdXIgY2hhcmFjdGVycy4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48S2JkPlxlIFxmIFxuIFxyIFx0PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBFU0NBUEUgKFUrMDAxQiksIEZPUk0gRkVFRCAoVSswMDBDKSwgTElORSBGRUVEIChVKzAwMEEpLAotICogICAgICAgICAgIENBUlJJQUdFIFJFVFVSTiAoVSswMDBEKSwgSE9SSVpPTlRBTCBUQUJVTEFUSU9OIChVKzAwMDkpCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cYzwva2JkPjx2YXI+QzwvdmFyPgotICogICAgICAgPGRkPk1hdGNoZXMgYSBjb250cm9sIGNoYXJhY3Rlci4KLSAqICAgICAgICAgICBUaGUgPHZhcj5DPC92YXI+IG11c3QgYmUgb25lIG9mICc8a2JkPkA8L2tiZD4nLCAnPGtiZD5BPC9rYmQ+Jy0nPGtiZD5aPC9rYmQ+JywKLSAqICAgICAgICAgICAnPGtiZD5bPC9rYmQ+JywgJzxrYmQ+XHUwMDVjPC9rYmQ+JywgJzxrYmQ+XTwva2JkPicsICc8a2JkPl48L2tiZD4nLCAnPGtiZD5fPC9rYmQ+Jy4KLSAqICAgICAgICAgICBJdCBtYXRjaGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgb2Ygd2hpY2ggdGhlIGNoYXJhY3RlciBjb2RlIGlzIGxlc3MgdGhhbgotICogICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgY29kZSBvZiB0aGUgPHZhcj5DPC92YXI+IGJ5IDB4MDA0MC4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkZvciBleGFtcGxlLCBhIDxrYmQ+XGNKPC9rYmQ+IG1hdGNoZXMgYSBMSU5FIEZFRUQgKFUrMDAwQSksCi0gKiAgICAgICAgICAgYW5kIGEgPGtiZD5cY1s8L2tiZD4gbWF0Y2hlcyBhbiBFU0NBUEUgKFUrMDAxQikuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+YSBub24tbWV0YSBjaGFyYWN0ZXIKLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBjaGFyYWN0ZXIuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PEtCRD5cPC9LQkQ+ICsgYSBtZXRhIGNoYXJhY3RlcgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIG1ldGEgY2hhcmFjdGVyLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHUwMDVjeDwva2JkPjx2YXI+SEg8L3Zhcj4gPGtiZD5cdTAwNWN4ezwva2JkPjx2YXI+SEhISDwvdmFyPjxrYmQ+fTwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgYSBjaGFyYWN0ZXIgb2Ygd2hpY2ggY29kZSBwb2ludCBpcyA8dmFyPkhIPC92YXI+IChIZXhhZGVjaW1hbCkgaW4gVW5pY29kZS4KLSAqICAgICAgICAgICBZb3UgY2FuIHdyaXRlIGp1c3QgMiBkaWdpdHMgZm9yIDxrYmQ+XHUwMDVjeDwva2JkPjx2YXI+SEg8L3Zhcj4sIGFuZAotICogICAgICAgICAgIHZhcmlhYmxlIGxlbmd0aCBkaWdpdHMgZm9yIDxrYmQ+XHUwMDVjeHs8L2tiZD48dmFyPkhISEg8L3Zhcj48a2JkPn08L2tiZD4uCi0gKgotICogICAgICAgPCEtLQotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cdTAwNWMgdTwva2JkPjx2YXI+SEhISDwvdmFyPgotICogICAgICAgPGRkPk1hdGNoZXMgYSBjaGFyYWN0ZXIgb2Ygd2hpY2ggY29kZSBwb2ludCBpcyA8dmFyPkhISEg8L3Zhcj4gKEhleGFkZWNpbWFsKSBpbiBVbmljb2RlLgotICogICAgICAgLS0+Ci0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cdTAwNWN2PC9rYmQ+PHZhcj5ISEhISEg8L3Zhcj4KLSAqICAgICAgIDxkZD5NYXRjaGVzIGEgY2hhcmFjdGVyIG9mIHdoaWNoIGNvZGUgcG9pbnQgaXMgPHZhcj5ISEhISEg8L3Zhcj4gKEhleGFkZWNpbWFsKSBpbiBVbmljb2RlLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XGc8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIGEgZ3JhcGhlbWUuCi0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5JdCBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+KD9bXHB7QVNTSUdORUR9XS1bXHB7TX1ccHtDfV0pPyg/Olxwe019fFtceHswOTREfVx4ezA5Q0R9XHh7MEE0RH1ceHswQUNEfVx4ezBCM0R9XHh7MEJDRH1ceHswQzREfVx4ezBDQ0R9XHh7MEQ0RH1ceHswRTNBfVx4ezBGODR9XVxwe0x9fFtceHsxMTYwfS1ceHsxMUE3fV18W1x4ezExQTh9LVx4ezExRkZ9XXxbXHh7RkY5RX1ceHtGRjlGfV0pKjwva2JkPgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XFg8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPk1hdGNoZXMgYSBjb21iaW5pbmcgY2hhcmFjdGVyIHNlcXVlbmNlLgotICogICAgICAgSXQgaXMgZXF1aXZhbGVudCB0byA8a2JkPig/OlxQTVxwTSopPC9rYmQ+Ci0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqCi0gKiAgIDxsaT5DaGFyYWN0ZXIgY2xhc3MKLSAqICAgICA8ZGw+Ci0rICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5bPC9rYmQ+PHZhcj5SPHN1Yj4xPC9zdWI+PC92YXI+PHZhcj5SPHN1Yj4yPC9zdWI+PC92YXI+PHZhcj4uLi48L3Zhcj48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj48a2JkPl08L2tiZD4gKHdpdGhvdXQgPGEgaHJlZj0iI0NPTU1BX09QVElPTiI+IiwiIG9wdGlvbjwvYT4pCi0rICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5bPC9rYmQ+PHZhcj5SPHN1Yj4xPC9zdWI+PC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5SPHN1Yj4yPC9zdWI+PC92YXI+PGtiZD4sPC9rYmQ+PHZhcj4uLi48L3Zhcj48a2JkPiw8L2tiZD48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj48a2JkPl08L2tiZD4gKHdpdGggPGEgaHJlZj0iI0NPTU1BX09QVElPTiI+IiwiIG9wdGlvbjwvYT4pCi0gKiAgICAgICA8ZGQ+UG9zaXRpdmUgY2hhcmFjdGVyIGNsYXNzLiAgSXQgbWF0Y2hlcyBhIGNoYXJhY3RlciBpbiByYW5nZXMuCi0gKiAgICAgICA8ZGQ+PHZhcj5SPHN1Yj5uPC9zdWI+PC92YXI+OgotICogICAgICAgPHVsPgotICogICAgICAgICA8bGkgY2xhc3M9IlJFR0VYIj5BIGNoYXJhY3RlciAoaW5jbHVkaW5nIDxLYmQ+XGUgXGYgXG4gXHIgXHQ8L2tiZD4gPGtiZD5cdTAwNWN4PC9rYmQ+PHZhcj5ISDwvdmFyPiA8a2JkPlx1MDA1Y3h7PC9rYmQ+PHZhcj5ISEhIPC92YXI+PGtiZD59PC9rYmQ+IDwhLS1rYmQ+XHUwMDVjIHU8L2tiZD48dmFyPkhISEg8L3Zhci0tPiA8a2JkPlx1MDA1Y3Y8L2tiZD48dmFyPkhISEhISDwvdmFyPikKLSAqICAgICAgICAgICAgIDxwPlRoaXMgcmFuZ2UgbWF0Y2hlcyB0aGUgY2hhcmFjdGVyLgotICogICAgICAgICA8bGkgY2xhc3M9IlJFR0VYIj48dmFyPkM8c3ViPjE8L3N1Yj48L3Zhcj48a2JkPi08L2tiZD48dmFyPkM8c3ViPjI8L3N1Yj48L3Zhcj4KLSAqICAgICAgICAgICAgIDxwPlRoaXMgcmFuZ2UgbWF0Y2hlcyBhIGNoYXJhY3RlciB3aGljaCBoYXMgYSBjb2RlIHBvaW50IHRoYXQgaXMgPj0gPHZhcj5DPHN1Yj4xPC9zdWI+PC92YXI+J3MgY29kZSBwb2ludCBhbmQgJmx0Oz0gPHZhcj5DPHN1Yj4yPC9zdWI+PC92YXI+J3MgY29kZSBwb2ludC4KLSsgKiAgICAgICAgIDxsaSBjbGFzcz0iUkVHRVgiPkEgUE9TSVggY2hhcmFjdGVyIGNsYXNzOiA8S2JkPls6YWxwaGE6XSBbOmFsbnVtOl0gWzphc2NpaTpdIFs6Y250cmw6XSBbOmRpZ2l0Ol0gWzpncmFwaDpdIFs6bG93ZXI6XSBbOnByaW50Ol0gWzpwdW5jdDpdIFs6c3BhY2U6XSBbOnVwcGVyOl0gWzp4ZGlnaXQ6XTwva2JkPiwKLSsgKiAgICAgICAgICAgICBhbmQgbmVnYXRpdmUgUE9TSVggY2hhcmFjdGVyIGNsYXNzZXMgaW4gUGVybCBsaWtlIDxrYmQ+WzpeYWxwaGE6XTwva2JkPgotICogICAgICAgICAgICAgPHA+Li4uCi0gKiAgICAgICAgIDxsaSBjbGFzcz0iUkVHRVgiPjxrYmQ+XGQgXEQgXHMgXFMgXHcgXFcgXHB7PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59IFxQezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fTwva2JkPgotICogICAgICAgICAgICAgPHA+VGhlc2UgZXhwcmVzc2lvbnMgc3BlY2lmaWVzIHRoZSBzYW1lIHJhbmdlcyBhcyB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zLgotICogICAgICAgPC91bD4KLSAqICAgICAgIDxwIGNsYXNzPSJSRUdFWCI+RW51bWVyYXRlZCByYW5nZXMgYXJlIG1lcmdlZCAodW5pb24gb3BlcmF0aW9uKS4KLSAqICAgICAgICAgIDxrYmQ+W2EtZWMtel08L2tiZD4gaXMgZXF1aXZhbGVudCB0byA8a2JkPlthLXpdPC9rYmQ+Ci0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5bXjwva2JkPjx2YXI+UjxzdWI+MTwvc3ViPjwvdmFyPjx2YXI+UjxzdWI+Mjwvc3ViPjwvdmFyPjx2YXI+Li4uPC92YXI+PHZhcj5SPHN1Yj5uPC9zdWI+PC92YXI+PGtiZD5dPC9rYmQ+ICh3aXRob3V0IGEgPGEgaHJlZj0iI0NPTU1BX09QVElPTiI+IiwiIG9wdGlvbjwvYT4pCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPltePC9rYmQ+PHZhcj5SPHN1Yj4xPC9zdWI+PC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5SPHN1Yj4yPC9zdWI+PC92YXI+PGtiZD4sPC9rYmQ+PHZhcj4uLi48L3Zhcj48a2JkPiw8L2tiZD48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj48a2JkPl08L2tiZD4gKHdpdGggYSA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKLSAqICAgICAgIDxkZD5OZWdhdGl2ZSBjaGFyYWN0ZXIgY2xhc3MuICBJdCBtYXRjaGVzIGEgY2hhcmFjdGVyIG5vdCBpbiByYW5nZXMuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oP1s8L2tiZD48dmFyPnJhbmdlczwvdmFyPjxrYmQ+XTwva2JkPjx2YXI+b3A8L3Zhcj48a2JkPls8L2tiZD48dmFyPnJhbmdlczwvdmFyPjxrYmQ+XTwva2JkPjx2YXI+b3A8L3Zhcj48a2JkPls8L2tiZD48dmFyPnJhbmdlczwvdmFyPjxrYmQ+XTwva2JkPiAuLi4gPEtiZD4pPC9rYmQ+Ci0gKiAgICAgICAoPHZhcj5vcDwvdmFyPiBpcyA8a2JkPi08L2tiZD4gb3IgPGtiZD4rPC9rYmQ+IG9yIDxrYmQ+Jjwva2JkPi4pCi0gKiAgICAgICA8ZGQ+U3VidHJhY3Rpb24gb3IgdW5pb24gb3IgaW50ZXJzZWN0aW9uIGZvciBjaGFyYWN0ZXIgY2xhc3Nlcy4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkZvciBleG1hcGxlLCA8a2JkPig/W0EtWl0tW0NGXSk8L2tiZD4gaXMgZXF1aXZhbGVudCB0byA8a2JkPltBLUJELUVHLVpdPC9rYmQ+LCBhbmQgPGtiZD4oP1sweDAwLTB4N2ZdLVtLXSZbXHB7THV9XSk8L2tiZD4gaXMgZXF1aXZhbGVudCB0byA8a2JkPltBLUpMLVpdPC9rYmQ+LgotICogICAgICAgPGRkPlRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb25zIGlzIGEgPHU+cG9zaXRpdmUgY2hhcmFjdGVyIGNsYXNzPC91PgotICogICAgICAgICAgIGV2ZW4gaWYgYW4gZXhwcmVzc2lvbiBpbmNsdWRlcyBhbnkgbmVnYXRpdmUgY2hhcmFjdGVyIGNsYXNzZXMuCi0gKiAgICAgICAgICAgWW91IGhhdmUgdG8gdGFrZSBjYXJlIG9uIHRoaXMgaW4gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZy4KLSAqICAgICAgICAgICBGb3IgaW5zdGFuY2UsIDxrYmQ+KD9bXmJdKTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W1x4MDAtYWMtXHh7MTBmZmZmfV08L2tiZD4sCi0gKiAgICAgICAgICAgd2hpY2ggaXMgZXF1aXZhbGVudCB0byA8a2JkPlteYl08L2tiZD4gaW4gY2FzZS1zZW5zaXRpdmUgbWF0Y2hpbmcuCi0gKiAgICAgICAgICAgQnV0LCBpbiBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCA8a2JkPig/W15iXSk8L2tiZD4gbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGJlY2F1c2UKLSAqICAgICAgICAgICBpdCBpbmNsdWRlcyAnPGtiZD5CPC9rYmQ+JyBhbmQgJzxrYmQ+Qjwva2JkPicgbWF0Y2hlcyAnPGtiZD5iPC9rYmQ+JwotICogICAgICAgICAgIHRob3VnaCA8a2JkPlteYl08L2tiZD4gaXMgcHJvY2Vzc2VkIGFzIDxrYmQ+W15CYl08L2tiZD4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5bPC9rYmQ+PHZhcj5SPHN1Yj4xPC9zdWI+UjxzdWI+Mjwvc3ViPi4uLjwvdmFyPjxrYmQ+LVs8L2tiZD48dmFyPlI8c3ViPm48L3N1Yj5SPHN1Yj5uKzE8L3N1Yj4uLi48L3Zhcj48a2JkPl1dPC9rYmQ+ICh3aXRoIGFuIDxhIGhyZWY9IiNYX09QVElPTiI+IlgiIG9wdGlvbjwvYT4pPC9kdD4KLSAqICAgICAgIDxkZD5DaGFyYWN0ZXIgY2xhc3Mgc3VidHJhY3Rpb24gZm9yIHRoZSBYTUwgU2NoZW1hLgotICogICAgICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgc3ludGF4IHdoZW4geW91IHNwZWNpZnkgYW4gPGEgaHJlZj0iI1hfT1BUSU9OIj4iWCIgb3B0aW9uPC9hPi4KLSAqICAgICAgICAgICAKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XGQ8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bMC05XTwva2JkPi4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+XHB7TmR9PC9rYmQ+PC9zcGFuPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxEPC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+W14wLTldPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCi0gKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlxQe05kfTwva2JkPjwvc3Bhbj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cczwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlsgXGZcblxyXHRdPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCi0gKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlsgXGZcblxyXHRccHtafV08L2tiZD48L3NwYW4+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XFM8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bXiBcZlxuXHJcdF08L2tiZD4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+W14gXGZcblxyXHRccHtafV08L2tiZD48L3NwYW4+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHc8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bYS16QS1aMC05X108L2tiZD4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+W1xwe0x1fVxwe0xsfVxwe0xvfVxwe05kfV9dPC9rYmQ+PC9zcGFuPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxXPC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+W15hLXpBLVowLTlfXTwva2JkPgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5bXlxwe0x1fVxwe0xsfVxwe0xvfVxwe05kfV9dPC9rYmQ+PC9zcGFuPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxwezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fTwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgb25lIGNoYXJhY3RlciBpbiB0aGUgc3BlY2lmaWVkIEdlbmVyYWwgQ2F0ZWdvcnkgKHRoZSBzZWNvbmQgZmllbGQgaW4gPGEgaHJlZj0iZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dCI+PGtiZD5Vbmljb2RlRGF0YS50eHQ8L2tiZD48L2E+KSBvciB0aGUgc3BlY2lmaWVkIDxhIGhyZWY9ImZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvVU5JREFUQS9CbG9ja3MudHh0Ij5CbG9jazwvYT4uCi0gKiAgICAgICBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSBhdmFpbGFibGU6Ci0gKiAgICAgICA8ZGw+Ci0gKiAgICAgICAgIDxkdD5Vbmljb2RlIEdlbmVyYWwgQ2F0ZWdvcmllczoKLSAqICAgICAgICAgPGRkPjxrYmQ+Ci0gKiAgICAgICBMLCBNLCBOLCBaLCBDLCBQLCBTLCBMdSwgTGwsIEx0LCBMbSwgTG8sIE1uLCBNZSwgTWMsIE5kLCBObCwgTm8sIFpzLCBabCwgWnAsCi0gKiAgICAgICBDYywgQ2YsIENuLCBDbywgQ3MsIFBkLCBQcywgUGUsIFBjLCBQbywgU20sIFNjLCBTaywgU28sCi0gKiAgICAgICAgIDwva2JkPgotICogICAgICAgICA8ZGQ+KEN1cnJlbnRseSB0aGUgQ24gY2F0ZWdvcnkgaW5jbHVkZXMgVSsxMDAwMC1VKzEwRkZGRiBjaGFyYWN0ZXJzKQotICogICAgICAgICA8ZHQ+VW5pY29kZSBCbG9ja3M6Ci0gKiAgICAgICAgIDxkZD48a2JkPgotICogICAgICAgQmFzaWMgTGF0aW4sIExhdGluLTEgU3VwcGxlbWVudCwgTGF0aW4gRXh0ZW5kZWQtQSwgTGF0aW4gRXh0ZW5kZWQtQiwKLSAqICAgICAgIElQQSBFeHRlbnNpb25zLCBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcywgR3JlZWssCi0gKiAgICAgICBDeXJpbGxpYywgQXJtZW5pYW4sIEhlYnJldywgQXJhYmljLCBEZXZhbmFnYXJpLCBCZW5nYWxpLCBHdXJtdWtoaSwgR3VqYXJhdGksCi0gKiAgICAgICBPcml5YSwgVGFtaWwsIFRlbHVndSwgS2FubmFkYSwgTWFsYXlhbGFtLCBUaGFpLCBMYW8sIFRpYmV0YW4sIEdlb3JnaWFuLAotICogICAgICAgSGFuZ3VsIEphbW8sIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIEdyZWVrIEV4dGVuZGVkLCBHZW5lcmFsIFB1bmN0dWF0aW9uLAotICogICAgICAgU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzLCBDdXJyZW5jeSBTeW1ib2xzLCBDb21iaW5pbmcgTWFya3MgZm9yIFN5bWJvbHMsCi0gKiAgICAgICBMZXR0ZXJsaWtlIFN5bWJvbHMsIE51bWJlciBGb3JtcywgQXJyb3dzLCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzLAotICogICAgICAgTWlzY2VsbGFuZW91cyBUZWNobmljYWwsIENvbnRyb2wgUGljdHVyZXMsIE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uLAotICogICAgICAgRW5jbG9zZWQgQWxwaGFudW1lcmljcywgQm94IERyYXdpbmcsIEJsb2NrIEVsZW1lbnRzLCBHZW9tZXRyaWMgU2hhcGVzLAotICogICAgICAgTWlzY2VsbGFuZW91cyBTeW1ib2xzLCBEaW5nYmF0cywgQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uLCBIaXJhZ2FuYSwKLSAqICAgICAgIEthdGFrYW5hLCBCb3BvbW9mbywgSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbywgS2FuYnVuLAotICogICAgICAgRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocywgQ0pLIENvbXBhdGliaWxpdHksIENKSyBVbmlmaWVkIElkZW9ncmFwaHMsCi0gKiAgICAgICBIYW5ndWwgU3lsbGFibGVzLCBIaWdoIFN1cnJvZ2F0ZXMsIEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcywgTG93IFN1cnJvZ2F0ZXMsCi0gKiAgICAgICBQcml2YXRlIFVzZSwgQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocywgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMsCi0gKiAgICAgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEsIENvbWJpbmluZyBIYWxmIE1hcmtzLCBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcywKLSAqICAgICAgIFNtYWxsIEZvcm0gVmFyaWFudHMsIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiwgU3BlY2lhbHMsCi0gKiAgICAgICBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcwotICogICAgICAgICA8L2tiZD4KLSAqICAgICAgICAgPGR0Pk90aGVyczoKLSAqICAgICAgICAgPGRkPjxrYmQ+QUxMPC9rYmQ+IChFcXVpdmFsZW50IHRvIDxrYmQ+W1x1MDA1Y3UwMDAwLVx1MDA1Y3YxMEZGRkZdPC9rYmQ+KQotICogICAgICAgICA8ZGQ+PGtiZD5BU1NHSU5FRDwva2JkPiAoPGtiZD5ccHtBU1NJR05FRH08L2tiZD4gaXMgZXF1aXZhbGVudCB0byA8a2JkPlxQe0NufTwva2JkPikKLSAqICAgICAgICAgPGRkPjxrYmQ+VU5BU1NHSU5FRDwva2JkPgotICogICAgICAgICAgICAgKDxrYmQ+XHB7VU5BU1NJR05FRH08L2tiZD4gaXMgZXF1aXZhbGVudCB0byA8a2JkPlxwe0NufTwva2JkPikKLSAqICAgICAgIDwvZGw+Ci0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cUHs8L2tiZD48dmFyPm5hbWU8L3Zhcj48a2JkPn08L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIG9uZSBjaGFyYWN0ZXIgbm90IGluIHRoZSBzcGVjaWZpZWQgR2VuZXJhbCBDYXRlZ29yeSBvciB0aGUgc3BlY2lmaWVkIEJsb2NrLgotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKgotICogICA8bGk+U2VsZWN0aW9uIGFuZCBRdWFudGlmaWVyCi0gKiAgICAgPGRsPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD58PC9rYmQ+PFZBUj5ZPC9WQVI+Ci0gKiAgICAgICA8ZGQ+Li4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4qPC9LQkQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyAwIG9yIG1vcmUgPHZhcj5YPC92YXI+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+KzwvS0JEPgotICogICAgICAgPGRkPk1hdGNoZXMgMSBvciBtb3JlIDx2YXI+WDwvdmFyPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPj88L0tCRD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIDAgb3IgMSA8dmFyPlg8L3Zhcj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5udW1iZXI8L3Zhcj48a2JkPn08L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIDx2YXI+bnVtYmVyPC92YXI+IHRpbWVzLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bWluPC92YXI+PGtiZD4sfTwva2JkPgotICogICAgICAgPGRkPi4uLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bWluPC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5tYXg8L3Zhcj48a2JkPn08L2tiZD4KLSAqICAgICAgIDxkZD4uLi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPio/PC9rYmQ+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPis/PC9rYmQ+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPj8/PC9rYmQ+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48dmFyPlg8L3Zhcj48a2JkPns8L2tiZD48dmFyPm1pbjwvdmFyPjxrYmQ+LH0/PC9rYmQ+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48dmFyPlg8L3Zhcj48a2JkPns8L2tiZD48dmFyPm1pbjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+bWF4PC92YXI+PGtiZD59Pzwva2JkPgotICogICAgICAgPGRkPk5vbi1ncmVlZHkgbWF0Y2hpbmcuCi0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqCi0gKiAgIDxsaT5Hcm91cGluZywgQ2FwdHVyaW5nLCBhbmQgQmFjay1yZWZlcmVuY2UKLSAqICAgICA8ZGw+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48S0JEPig/Ojwva2JkPjxWQVI+WDwvVkFSPjxrYmQ+KTwvS0JEPgotICogICAgICAgPGRkPkdyb3VwaW5nLiAiPEtCRD5mb28rPC9LQkQ+IiBtYXRjaGVzICI8S0JEPmZvbzwvS0JEPiIgb3IgIjxLQkQ+Zm9vb288L0tCRD4iLgotICogICAgICAgSWYgeW91IHdhbnQgaXQgbWF0Y2hlcyAiPEtCRD5mb29mb288L0tCRD4iIG9yICI8S0JEPmZvb2Zvb2ZvbzwvS0JEPiIsCi0gKiAgICAgICB5b3UgaGF2ZSB0byB3cml0ZSAiPEtCRD4oPzpmb28pKzwvS0JEPiIuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PEtCRD4oPC9rYmQ+PFZBUj5YPC9WQVI+PGtiZD4pPC9LQkQ+Ci0gKiAgICAgICA8ZGQ+R3JvdXBpbmcgd2l0aCBjYXB0dXJpbmcuCi0gKiBJdCBtYWtlIGEgZ3JvdXAgYW5kIGFwcGxpY2F0aW9ucyBjYW4ga25vdwotICogd2hlcmUgaW4gdGFyZ2V0IHRleHQgYSBncm91cCBtYXRjaGVkIHdpdGggbWV0aG9kcyBvZiBhIDxjb2RlPk1hdGNoPC9jb2RlPiBpbnN0YW5jZQotICogYWZ0ZXIgPGNvZGU+PGEgaHJlZj0iI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguTWF0Y2gpIj5tYXRjaGVzKFN0cmluZyxNYXRjaCk8L2E+PC9jb2RlPi4KLSAqIFRoZSAwdGggZ3JvdXAgbWVhbnMgd2hvbGUgb2YgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCi0gKiBUaGUgPFZBUj5OPC9WQVI+dGggZ29ydXAgaXMgdGhlIGluc2lkZSBvZiB0aGUgPFZBUj5OPC9WQVI+dGggbGVmdCBwYXJlbnRoZXNpcy4KLSAqIAotICogICA8cD5Gb3IgaW5zdGFuY2UsIGEgcmVndWxhciBleHByZXNzaW9uIGlzCi0gKiAgICI8Rk9OVCBjb2xvcj1ibHVlPjxLQkQ+ICooW14mbHQ7Ol0qKSArJmx0OyhbXiZndDtdKikmZ3Q7ICo8L0tCRD48L0ZPTlQ+IgotICogICBhbmQgdGFyZ2V0IHRleHQgaXMKLSAqICAgIjxGT05UIGNvbG9yPXJlZD48S0JEPkZyb206IFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7PC9LQkQ+PC9GT05UPiI6Ci0gKiAgIDx1bD4KLSAqICAgICA8bGk+PGNvZGU+TWF0Y2guZ2V0Q2FwdHVyZWRUZXh0KDApPC9jb2RlPjoKLSAqICAgICAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+IFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7PC9LQkQ+PC9GT05UPiIKLSAqICAgICA8bGk+PGNvZGU+TWF0Y2guZ2V0Q2FwdHVyZWRUZXh0KDEpPC9jb2RlPjogIjxGT05UIGNvbG9yPXJlZD48S0JEPlRBTVVSQSBLZW50PC9LQkQ+PC9GT05UPiIKLSAqICAgICA8bGk+PGNvZGU+TWF0Y2guZ2V0Q2FwdHVyZWRUZXh0KDIpPC9jb2RlPjogIjxGT05UIGNvbG9yPXJlZD48S0JEPmtlbnRAdHJsLmlibS5jby5qcDwvS0JEPjwvRk9OVD4iCi0gKiAgIDwvdWw+Ci0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cMSBcMiBcMyBcNCBcNSBcNiBcNyBcOCBcOTwva2JkPgotICogICAgICAgPGRkPgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8+PC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+SW5kZXBlbmRlbnQgZXhwcmVzc2lvbiBncm91cC4gLi4uLi4uLi4uLi4uLi4uLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD88L2tiZD48dmFyPm9wdGlvbnM8L3Zhcj48a2JkPjo8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD88L2tiZD48dmFyPm9wdGlvbnM8L3Zhcj48a2JkPi08L2tiZD48dmFyPm9wdGlvbnMyPC92YXI+PGtiZD46PC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICogICAgICAgPGRkPlRoZSA8dmFyPm9wdGlvbnM8L3Zhcj4gb3IgdGhlIDx2YXI+b3B0aW9uczI8L3Zhcj4gY29uc2lzdHMgb2YgJ2knICdtJyAncycgJ3cnLgotICogICAgICAgICAgIE5vdGUgdGhhdCBpdCBjYW4gbm90IGNvbnRhaW4gJ3UnLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD88L2tiZD48dmFyPm9wdGlvbnM8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD88L2tiZD48dmFyPm9wdGlvbnM8L3Zhcj48a2JkPi08L2tiZD48dmFyPm9wdGlvbnMyPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Li4uLi4uCi0gKiAgICAgICA8ZGQ+VGhlc2UgZXhwcmVzc2lvbnMgbXVzdCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZ3JvdXAuCi0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqCi0gKiAgIDxsaT5BbmNob3IKLSAqICAgICA8ZGw+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxBPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgYmVnaW5uaWcgb2YgdGhlIHRleHQuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cWjwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgdGV4dCwgb3IgYmVmb3JlIGFuIEVPTCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCwKLSAqICAgICAgICAgICBvciBDQVJSSUFHRSBSRVRVUk4gKyBMSU5FIEZFRUQgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx6PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+Xjwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4gIEl0IGlzIGVxdWl2YWxlbnQgdG8gPHNwYW4gY2xhc3M9IlJFR0VYIj48S2JkPlxBPC9rYmQ+PC9zcGFuPi4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNNX09QVElPTiI+YSAibSIgb3B0aW9uPC9hPiBpcyBzZXQsCi0gKiAgICAgICAgICAgaXQgbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LCBvciBhZnRlciBvbmUgb2YgRU9MIGNoYXJhY3RlcnMgKAotICogICAgICAgICAgIExJTkUgRkVFRCAoVSswMDBBKSwgQ0FSUklBR0UgUkVUVVJOIChVKzAwMEQpLCBMSU5FIFNFUEFSQVRPUiAoVSsyMDI4KSwKLSAqICAgICAgICAgICBQQVJBR1JBUEggU0VQQVJBVE9SIChVKzIwMjkpLikKLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPiQ8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHRleHQsIG9yIGJlZm9yZSBhbiBFT0wgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQsCi0gKiAgICAgICAgICAgb3IgQ0FSUklBR0UgUkVUVVJOICsgTElORSBGRUVEIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjTV9PUFRJT04iPmEgIm0iIG9wdGlvbjwvYT4gaXMgc2V0LAotICogICAgICAgICAgIGl0IG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgdGV4dCwgb3IgYmVmb3JlIGFuIEVPTCBjaGFyYWN0ZXIuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cYjwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgd29yZCBib3VuZGFyeS4KLSAqICAgICAgICAgICAoU2VlIDxhIGhyZWY9IiNXX09QVElPTiI+YSAidyIgb3B0aW9uPC9hPikKLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxCPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBub24gd29yZCBib3VuZGFyeS4KLSAqICAgICAgICAgICAoU2VlIDxhIGhyZWY9IiNXX09QVElPTiI+YSAidyIgb3B0aW9uPC9hPikKLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlwmbHQ7PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIGEgd29yZC4KLSAqICAgICAgICAgICAoU2VlIDxhIGhyZWY9IiNXX09QVElPTiI+YSAidyIgb3B0aW9uPC9hPikKLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlwmZ3Q7PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgZW5kIG9mIGEgd29yZC4KLSAqICAgICAgICAgICAoU2VlIDxhIGhyZWY9IiNXX09QVElPTiI+YSAidyIgb3B0aW9uPC9hPikKLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICogICA8bGk+TG9va2FoZWFkIGFuZCBsb29rYmVoaW5kCi0gKiAgICAgPGRsPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPz08L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD5Mb29rYWhlYWQuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPyE8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD5OZWdhdGl2ZSBsb29rYWhlYWQuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPyZsdDs9PC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TG9va2JlaGluZC4KLSAqICAgICAgIDxkZD4oTm90ZSBmb3IgdGV4dCBjYXB0dXJpbmcuLi4uLi4pCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPyZsdDshPC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TmVnYXRpdmUgbG9va2JlaGluZC4KLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICoKLSAqICAgPGxpPk1pc2MuCi0gKiAgICAgPGRsPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPyg8L0tiZD48dmFyPmNvbmRpdGlvbjwvdmFyPjxLYmQ+KTwva2JkPjx2YXI+eWVzLXBhdHRlcm48L3Zhcj48a2JkPnw8L2tiZD48dmFyPm5vLXBhdHRlcm48L3Zhcj48a2JkPik8L2tiZD4sCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/KDwva2JkPjx2YXI+Y29uZGl0aW9uPC92YXI+PGtiZD4pPC9rYmQ+PHZhcj55ZXMtcGF0dGVybjwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPi4uLi4uLgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPyM8L2tiZD48dmFyPmNvbW1lbnQ8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD5Db21tZW50LiAgQSBjb21tZW50IHN0cmluZyBjb25zaXN0cyBvZiBjaGFyYWN0ZXJzIGV4Y2VwdCAnPGtiZD4pPC9rYmQ+Jy4KLSAqICAgICAgICAgICBZb3UgY2FuIG5vdCB3cml0ZSBjb21tZW50cyBpbiBjaGFyYWN0ZXIgY2xhc3NlcyBhbmQgYmVmb3JlIHF1YW50aWZpZXJzLgotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqCi0gKiA8aHIgd2lkdGg9IjUwJSI+Ci0gKiA8aDM+Qk5GIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uPC9oMz4KLSAqIDxwcmU+Ci0gKiByZWdleCA6Oj0gKCcoPycgb3B0aW9ucyAnKScpPyB0ZXJtICgnfCcgdGVybSkqCi0gKiB0ZXJtIDo6PSBmYWN0b3IrCi0gKiBmYWN0b3IgOjo9IGFuY2hvcnMgfCBhdG9tICgoJyonIHwgJysnIHwgJz8nIHwgbWlubWF4ICkgJz8nPyApPwotICogICAgICAgICAgICB8ICcoPyMnIFteKV0qICcpJwotICogbWlubWF4IDo6PSAneycgKFswLTldKyB8IFswLTldKyAnLCcgfCAnLCcgWzAtOV0rIHwgWzAtOV0rICcsJyBbMC05XSspICd9JwotICogYXRvbSA6Oj0gY2hhciB8ICcuJyB8IGNoYXItY2xhc3MgfCAnKCcgcmVnZXggJyknIHwgJyg/OicgcmVnZXggJyknIHwgJ1wnIFswLTldCi0gKiAgICAgICAgICB8ICdcdycgfCAnXFcnIHwgJ1xkJyB8ICdcRCcgfCAnXHMnIHwgJ1xTJyB8IGNhdGVnb3J5LWJsb2NrIHwgJ1xYJwotICogICAgICAgICAgfCAnKD8+JyByZWdleCAnKScgfCAnKD8nIG9wdGlvbnMgJzonIHJlZ2V4ICcpJwotICogICAgICAgICAgfCAnKD8nICgnKCcgWzAtOV0gJyknIHwgJygnIGFuY2hvcnMgJyknIHwgbG9va3MpIHRlcm0gKCd8JyB0ZXJtKT8gJyknCi0gKiBvcHRpb25zIDo6PSBbaW1zd10qICgnLScgW2ltc3ddKyk/Ci0gKiBhbmNob3JzIDo6PSAnXicgfCAnJCcgfCAnXEEnIHwgJ1xaJyB8ICdceicgfCAnXGInIHwgJ1xCJyB8ICdcJmx0OycgfCAnXD4nCi0gKiBsb29rcyA6Oj0gJyg/PScgcmVnZXggJyknICB8ICcoPyEnIHJlZ2V4ICcpJwotICogICAgICAgICAgIHwgJyg/Jmx0Oz0nIHJlZ2V4ICcpJyB8ICcoPyZsdDshJyByZWdleCAnKScKLSAqIGNoYXIgOjo9ICdcXCcgfCAnXCcgW2VmbnJ0dl0gfCAnXGMnIFtALV9dIHwgY29kZS1wb2ludCB8IGNoYXJhY3Rlci0xCi0gKiBjYXRlZ29yeS1ibG9jayA6Oj0gJ1wnIFtwUF0gY2F0ZWdvcnktc3ltYm9sLTEKLSAqICAgICAgICAgICAgICAgICAgICB8ICgnXHB7JyB8ICdcUHsnKSAoY2F0ZWdvcnktc3ltYm9sIHwgYmxvY2stbmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG90aGVyLXByb3BlcnRpZXMpICd9JwotICogY2F0ZWdvcnktc3ltYm9sLTEgOjo9ICdMJyB8ICdNJyB8ICdOJyB8ICdaJyB8ICdDJyB8ICdQJyB8ICdTJwotICogY2F0ZWdvcnktc3ltYm9sIDo6PSBjYXRlZ29yeS1zeW1ib2wtMSB8ICdMdScgfCAnTGwnIHwgJ0x0JyB8ICdMbScgfCBMbycKLSAqICAgICAgICAgICAgICAgICAgICAgfCAnTW4nIHwgJ01lJyB8ICdNYycgfCAnTmQnIHwgJ05sJyB8ICdObycKLSAqICAgICAgICAgICAgICAgICAgICAgfCAnWnMnIHwgJ1psJyB8ICdacCcgfCAnQ2MnIHwgJ0NmJyB8ICdDbicgfCAnQ28nIHwgJ0NzJwotICogICAgICAgICAgICAgICAgICAgICB8ICdQZCcgfCAnUHMnIHwgJ1BlJyB8ICdQYycgfCAnUG8nCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgJ1NtJyB8ICdTYycgfCAnU2snIHwgJ1NvJwotICogYmxvY2stbmFtZSA6Oj0gKFNlZSBhYm92ZSkKLSAqIG90aGVyLXByb3BlcnRpZXMgOjo9ICdBTEwnIHwgJ0FTU0lHTkVEJyB8ICdVTkFTU0lHTkVEJwotICogY2hhcmFjdGVyLTEgOjo9IChhbnkgY2hhcmFjdGVyIGV4Y2VwdCBtZXRhLWNoYXJhY3RlcnMpCi0gKgotICogY2hhci1jbGFzcyA6Oj0gJ1snIHJhbmdlcyAnXScKLSAqICAgICAgICAgICAgICAgIHwgJyg/WycgcmFuZ2VzICddJyAoWy0rJl0gJ1snIHJhbmdlcyAnXScpPyAnKScKLSAqIHJhbmdlcyA6Oj0gJ14nPyAocmFuZ2UgPGEgaHJlZj0iI0NPTU1BX09QVElPTiI+JywnPzwvYT4pKwotICogcmFuZ2UgOjo9ICdcZCcgfCAnXHcnIHwgJ1xzJyB8ICdcRCcgfCAnXFcnIHwgJ1xTJyB8IGNhdGVnb3J5LWJsb2NrCi0gKiAgICAgICAgICAgfCByYW5nZS1jaGFyIHwgcmFuZ2UtY2hhciAnLScgcmFuZ2UtY2hhcgotICogcmFuZ2UtY2hhciA6Oj0gJ1xbJyB8ICdcXScgfCAnXFwnIHwgJ1wnIFssLWVmbnJ0dl0gfCBjb2RlLXBvaW50IHwgY2hhcmFjdGVyLTIKLSAqIGNvZGUtcG9pbnQgOjo9ICdceCcgaGV4LWNoYXIgaGV4LWNoYXIKLSAqICAgICAgICAgICAgICAgIHwgJ1x4eycgaGV4LWNoYXIrICd9JwotICogPCEtLSAgICAgICAgICAgICAgIHwgJ1x1MDA1YyB1JyBoZXgtY2hhciBoZXgtY2hhciBoZXgtY2hhciBoZXgtY2hhcgotICogLS0+ICAgICAgICAgICAgICAgfCAnXHYnIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyCi0gKiBoZXgtY2hhciA6Oj0gWzAtOWEtZkEtRl0KLSAqIGNoYXJhY3Rlci0yIDo6PSAoYW55IGNoYXJhY3RlciBleGNlcHQgXFtdLSwpCi0gKiA8L3ByZT4KLSAqCi0gKiA8aHIgd2lkdGg9IjUwJSI+Ci0gKiA8aDM+VE9ETzwvaDM+Ci0gKiA8dWw+Ci0gKiAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjE4LyI+VW5pY29kZSBSZWd1bGFyIEV4cHJlc3Npb24gR3VpZGVsaW5lczwvYT4KLSAqICAgICA8dWw+Ci0gKiAgICAgICA8bGk+Mi40IENhbm9uaWNhbCBFcXVpdmFsZW50cwotICogICAgICAgPGxpPkxldmVsIDMKLSAqICAgICA8L3VsPgotICogICA8bGk+UGFyc2luZyBwZXJmb3JtYW5jZQotICogPC91bD4KLSAqCi0gKiA8aHIgd2lkdGg9IjUwJSI+Ci0gKgotICogQGF1dGhvciBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OwotICogQHZlcnNpb24gJElkOiBSZWd1bGFyRXhwcmVzc2lvbi5qYXZhLHYgMS4zIDIwMDMvMDkvMjQgMjM6MzE6MDYgZXJpY3ZhcyBFeHAgJAotICovCi1wdWJsaWMgY2xhc3MgUmVndWxhckV4cHJlc3Npb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGEgdG9rZW4gdHJlZSBpbnRvIGFuIG9wZXJhdGlvbiBmbG93LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY29tcGlsZShUb2tlbiB0b2spIHsKLSAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aGlzLm51bWJlck9mQ2xvc3VyZXMgPSAwOwotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSB0aGlzLmNvbXBpbGUodG9rLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSB0b2tlbiB0byBhbiBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBPcCBjb21waWxlKFRva2VuIHRvaywgT3AgbmV4dCwgYm9vbGVhbiByZXZlcnNlKSB7Ci0gICAgICAgIE9wIHJldDsKLSAgICAgICAgc3dpdGNoICh0b2sudHlwZSkgewotICAgICAgICBjYXNlIFRva2VuLkRPVDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZURvdCgpOwotICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5DSEFSOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlQ2hhcih0b2suZ2V0Q2hhcigpKTsKLSAgICAgICAgICAgIHJldC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uQU5DSE9SOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlQW5jaG9yKHRvay5nZXRDaGFyKCkpOwotICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5SQU5HRToKLSAgICAgICAgY2FzZSBUb2tlbi5OUkFOR0U6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVSYW5nZSh0b2spOwotICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5DT05DQVQ6Ci0gICAgICAgICAgICByZXQgPSBuZXh0OwotICAgICAgICAgICAgaWYgKCFyZXZlcnNlKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRvay5zaXplKCktMTsgIGkgPj0gMDsgIGkgLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZSh0b2suZ2V0Q2hpbGQoaSksIHJldCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdG9rLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZSh0b2suZ2V0Q2hpbGQoaSksIHJldCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5VTklPTjoKLSAgICAgICAgICAgIE9wLlVuaW9uT3AgdW5pID0gT3AuY3JlYXRlVW5pb24odG9rLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0b2suc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgIHVuaS5hZGRFbGVtZW50KGNvbXBpbGUodG9rLmdldENoaWxkKGkpLCBuZXh0LCByZXZlcnNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSB1bmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXQubmV4dCBpcyBudWxsLgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5DTE9TVVJFOgotICAgICAgICBjYXNlIFRva2VuLk5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICBUb2tlbiBjaGlsZCA9IHRvay5nZXRDaGlsZCgwKTsKLSAgICAgICAgICAgIGludCBtaW4gPSB0b2suZ2V0TWluKCk7Ci0gICAgICAgICAgICBpbnQgbWF4ID0gdG9rLmdldE1heCgpOwotICAgICAgICAgICAgaWYgKG1pbiA+PSAwICYmIG1pbiA9PSBtYXgpIHsgLy8ge259Ci0gICAgICAgICAgICAgICAgcmV0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZShjaGlsZCwgcmV0LCByZXZlcnNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWluID4gMCAmJiBtYXggPiAwKQotICAgICAgICAgICAgICAgIG1heCAtPSBtaW47Ci0gICAgICAgICAgICBpZiAobWF4ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFh7Miw2fSAtPiBYWChYKFgoWFg/KT8pPyk/Ci0gICAgICAgICAgICAgICAgcmV0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBtYXg7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9wLkNoaWxkT3AgcSA9IE9wLmNyZWF0ZVF1ZXN0aW9uKHRvay50eXBlID09IFRva2VuLk5PTkdSRUVEWUNMT1NVUkUpOwotICAgICAgICAgICAgICAgICAgICBxLm5leHQgPSBuZXh0OwotICAgICAgICAgICAgICAgICAgICBxLnNldENoaWxkKGNvbXBpbGUoY2hpbGQsIHJldCwgcmV2ZXJzZSkpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT3AuQ2hpbGRPcCBvcDsKLSAgICAgICAgICAgICAgICBpZiAodG9rLnR5cGUgPT0gVG9rZW4uTk9OR1JFRURZQ0xPU1VSRSkgewotICAgICAgICAgICAgICAgICAgICBvcCA9IE9wLmNyZWF0ZU5vbkdyZWVkeUNsb3N1cmUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRva2VuLkNMT1NVUkUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldE1pbkxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IE9wLmNyZWF0ZUNsb3N1cmUodGhpcy5udW1iZXJPZkNsb3N1cmVzKyspOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IE9wLmNyZWF0ZUNsb3N1cmUoLTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcC5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICBvcC5zZXRDaGlsZChjb21waWxlKGNoaWxkLCBvcCwgcmV2ZXJzZSkpOwotICAgICAgICAgICAgICAgIHJldCA9IG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbiA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBtaW47ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbXBpbGUoY2hpbGQsIHJldCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5FTVBUWToKLSAgICAgICAgICAgIHJldCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLlNUUklORzoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZVN0cmluZyh0b2suZ2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5CQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlQmFja1JlZmVyZW5jZSh0b2suZ2V0UmVmZXJlbmNlTnVtYmVyKCkpOwotICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5QQVJFTjoKLSAgICAgICAgICAgIGlmICh0b2suZ2V0UGFyZW5OdW1iZXIoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG5leHQsIHJldmVyc2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXZlcnNlKSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IE9wLmNyZWF0ZUNhcHR1cmUodG9rLmdldFBhcmVuTnVtYmVyKCksIG5leHQpOwotICAgICAgICAgICAgICAgIG5leHQgPSBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbmV4dCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlQ2FwdHVyZSgtdG9rLmdldFBhcmVuTnVtYmVyKCksIG5leHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gT3AuY3JlYXRlQ2FwdHVyZSgtdG9rLmdldFBhcmVuTnVtYmVyKCksIG5leHQpOwotICAgICAgICAgICAgICAgIG5leHQgPSBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbmV4dCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlQ2FwdHVyZSh0b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkxPT0tBSEVBRDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUxvb2soT3AuTE9PS0FIRUFELCBuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgZmFsc2UpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRva2VuLk5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTG9vayhPcC5ORUdBVElWRUxPT0tBSEVBRCwgbmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIGZhbHNlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUb2tlbi5MT09LQkVISU5EOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTG9vayhPcC5MT09LQkVISU5ELCBuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgdHJ1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVG9rZW4uTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTG9vayhPcC5ORUdBVElWRUxPT0tCRUhJTkQsIG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCB0cnVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLklOREVQRU5ERU5UOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlSW5kZXBlbmRlbnQobmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIHJldmVyc2UpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uTU9ESUZJRVJHUk9VUDoKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZU1vZGlmaWVyKG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCByZXZlcnNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVG9rZW4uTW9kaWZpZXJUb2tlbil0b2spLmdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVG9rZW4uTW9kaWZpZXJUb2tlbil0b2spLmdldE9wdGlvbnNNYXNrKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5DT05ESVRJT046Ci0gICAgICAgICAgICBUb2tlbi5Db25kaXRpb25Ub2tlbiBjdG9rID0gKFRva2VuLkNvbmRpdGlvblRva2VuKXRvazsKLSAgICAgICAgICAgIGludCByZWYgPSBjdG9rLnJlZk51bWJlcjsKLSAgICAgICAgICAgIE9wIGNvbmRpdGlvbiA9IGN0b2suY29uZGl0aW9uID09IG51bGwgPyBudWxsIDogY29tcGlsZShjdG9rLmNvbmRpdGlvbiwgbnVsbCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICBPcCB5ZXMgPSBjb21waWxlKGN0b2sueWVzLCBuZXh0LCByZXZlcnNlKTsKLSAgICAgICAgICAgIE9wIG5vID0gY3Rvay5ubyA9PSBudWxsID8gbnVsbCA6IGNvbXBpbGUoY3Rvay5ubywgbmV4dCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDb25kaXRpb24obmV4dCwgcmVmLCBjb25kaXRpb24sIHllcywgbm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRva2VuIHR5cGU6ICIrdG9rLnR5cGUpOwotICAgICAgICB9IC8vIHN3aXRjaCAodG9rLnR5cGUpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0KLS8vUHVibGljCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBtYXRjaGVkIHRvIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoY2hhcltdICB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIDAsICB0YXJnZXQgLmxlbmd0aCAsIChNYXRjaCludWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybgotICAgICAqIGluIHNwZWNpZmllZCByYW5nZSBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcGFyYW0gZW5kICBFbmQgb2Zmc2V0ICsxIG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBtYXRjaGVkIHRvIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoY2hhcltdICB0YXJnZXQsIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgc3RhcnQsIGVuZCwgKE1hdGNoKW51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXRjaCBBIE1hdGNoIGluc3RhbmNlIGZvciBzdG9yaW5nIG1hdGNoaW5nIHJlc3VsdC4KLSAgICAgKiBAcmV0dXJuIE9mZnNldCBvZiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gPFZBUj50YXJnZXQ8L1ZBUj47IG9yIC0xIGlmIG5vdCBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGNoYXJbXSAgdGFyZ2V0LCBNYXRjaCBtYXRjaCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgMCwgIHRhcmdldCAubGVuZ3RoICwgbWF0Y2gpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4KLSAgICAgKiBpbiBzcGVjaWZpZWQgcmFuZ2Ugb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHBhcmFtIGVuZCAgRW5kIG9mZnNldCArMSBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgotICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoY2hhcltdICB0YXJnZXQsIGludCBzdGFydCwgaW50IGVuZCwgTWF0Y2ggbWF0Y2gpIHsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmUoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIENvbnRleHQgY29uID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmNvbnRleHQpIHsKLSAgICAgICAgICAgIGNvbiA9IHRoaXMuY29udGV4dC5pbnVzZSA/IG5ldyBDb250ZXh0KCkgOiB0aGlzLmNvbnRleHQ7Ci0gICAgICAgICAgICBjb24ucmVzZXQodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzLm51bWJlck9mQ2xvc3VyZXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKLSAgICAgICAgICAgIG1hdGNoLnNldFNvdXJjZSh0YXJnZXQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzQmFja1JlZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIG1hdGNoID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKLSAgICAgICAgICAgIC8vIE5lZWQgbm90IHRvIGNhbGwgc2V0U291cmNlKCkgYmVjYXVzZQotICAgICAgICAgICAgLy8gYSBjYWxsZXIgY2FuIG5vdCBhY2Nlc3MgdGhpcyBtYXRjaCBpbnN0YW5jZS4KLSAgICAgICAgfQotICAgICAgICBjb24ubWF0Y2ggPSBtYXRjaDsKLQotICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgewotICAgICAgICAgICAgaW50IG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IG1hdGNoRW5kPSIrbWF0Y2hFbmQpOwotICAgICAgICAgICAgaWYgKG1hdGNoRW5kID09IGNvbi5saW1pdCkgewotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIGNvbi5zdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBwYXR0ZXJuIGhhcyBvbmx5IGZpeGVkIHN0cmluZy4KLSAgICAgICAgICogVGhlIGVuZ2luZSB1c2VzIEJveWVyLU1vb3JlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmdPbmx5KSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IGZpeGVkLW9ubHk6ICIrdGhpcy5maXhlZFN0cmluZyk7Ci0gICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOwotICAgICAgICAgICAgaWYgKG8gPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG8pOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG8rdGhpcy5maXhlZFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcGF0dGVybiBjb250YWlucyBhIGZpeGVkIHN0cmluZy4KLSAgICAgICAgICogVGhlIGVuZ2luZSBjaGVja3Mgd2l0aCBCb3llci1Nb29yZSB3aGV0aGVyIHRoZSB0ZXh0IGNvbnRhaW5zIHRoZSBmaXhlZCBzdHJpbmcgb3Igbm90LgotICAgICAgICAgKiBJZiBub3QsIGl0IHJldHVybiB3aXRoIGZhbHNlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKLSAgICAgICAgICAgIGlmIChvIDwgMCkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJOb24tbWF0Y2ggaW4gZml4ZWQtc3RyaW5nIHNlYXJjaC4iKTsKLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGltaXQgPSBjb24ubGltaXQtdGhpcy5taW5sZW5ndGg7Ci0gICAgICAgIGludCBtYXRjaFN0YXJ0OwotICAgICAgICBpbnQgbWF0Y2hFbmQgPSAtMTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAiLioiLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyAhPSBudWxsCi0gICAgICAgICAgICAmJiB0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5DTE9TVVJFICYmIHRoaXMub3BlcmF0aW9ucy5nZXRDaGlsZCgpLnR5cGUgPT0gT3AuRE9UKSB7Ci0gICAgICAgICAgICBpZiAoaXNTZXQodGhpcy5vcHRpb25zLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OwotICAgICAgICAgICAgICAgIG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJldmlvdXNJc0VPTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBtYXRjaFN0YXJ0IF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0VPTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJc0VPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0VPTCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3B0aW1pemF0aW9uIGFnYWluc3QgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKHRoaXMuZmlyc3RDaGFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogd2l0aCBmaXJzdGNoYXItbWF0Y2hpbmc6ICIrdGhpcy5maXJzdENoYXIpOwotICAgICAgICAgICAgUmFuZ2VUb2tlbiByYW5nZSA9IHRoaXMuZmlyc3RDaGFyOwotICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZmlyc3RDaGFyLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBtYXRjaFN0YXJ0IF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgWyAgbWF0Y2hTdGFydCsxIF0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgbWF0Y2hTdGFydCBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCBbICBtYXRjaFN0YXJ0KzEgXSApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0cmFpZ2h0Zm9yd2FyZCBtYXRjaGluZy4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXRjaEVuZCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG1hdGNoU3RhcnQpOwotICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0vKioKLSAqIEByZXR1cm4gLTEgd2hlbiBub3QgbWF0Y2g7IG9mZnNldCBvZiB0aGUgZW5kIG9mIG1hdGNoZWQgc3RyaW5nIHdoZW4gbWF0Y2guCi0gKi8KLSAgICBwcml2YXRlIGludCBtYXRjaENoYXJBcnJheSAoQ29udGV4dCBjb24sIE9wIG9wLCBpbnQgb2Zmc2V0LCBpbnQgZHgsIGludCBvcHRzKSB7Ci0KLSAgICAgICAgY2hhcltdIHRhcmdldCA9IGNvbi5jaGFyVGFyZ2V0OwotCi0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBpc1NldChvcHRzLCBYTUxTQ0hFTUFfTU9ERSkgJiYgb2Zmc2V0ICE9IGNvbi5saW1pdCA/IC0xIDogb2Zmc2V0OwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IGNvbi5saW1pdCB8fCBvZmZzZXQgPCBjb24uc3RhcnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgc3dpdGNoIChvcC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE9wLkNIQVI6Ci0gICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgWyAgb2Zmc2V0IF0gKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgWyAgbzEgXSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCBjaCAhPSAgdGFyZ2V0IFsgIG9mZnNldCBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8IGNoICE9ICB0YXJnZXQgWyAgbzEgXSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkRPVDoKLSAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG9mZnNldCBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgWyAgKytvZmZzZXQgXSApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgbzEgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMSAtLTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCBbICAtLW8xIF0gLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRU9MQ2hhcihjaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIE9wLk5SQU5HRToKLSAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG9mZnNldCBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IFsgICsrb2Zmc2V0IF0gKTsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBvMSBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgWyAgLS1vMSBdICwgY2gpOwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkFOQ0hPUjoKLSAgICAgICAgICAgICAgICBib29sZWFuIGdvID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChvcC5nZXREYXRhKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdeJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IFsgIG9mZnNldC0xIF0gKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQCc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIHVzZSBvbmx5LgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQCBhbHdheXMgbWF0Y2hlcyBsaW5lIGJlZ2lubmluZ3MuCi0gICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IFsgIG9mZnNldC0xIF0gKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnJCc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA8IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQgXSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0IF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgWyAgb2Zmc2V0IF0gID09IENBUlJJQUdFX1JFVFVSTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCBbICBvZmZzZXQrMSBdICA9PSBMSU5FX0ZFRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0IF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCBbICBvZmZzZXQgXSAgPT0gQ0FSUklBR0VfUkVUVVJOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgWyAgb2Zmc2V0KzEgXSAgPT0gTElORV9GRUVEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24ubGltaXQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnYic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gV1RfSUdOT1JFKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZm9yZSA9IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSBhZnRlciA9PSBXVF9JR05PUkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWZ0ZXIgPT0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZ28pICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5saW1pdCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5zdGFydCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoIGFuY2hvciB0eXBlCi0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkJBQ0tSRUZFUkVOQ0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZubyA8PSAwIHx8IHJlZm5vID49IHRoaXMubm9mcGFyZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIityZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgLy8gKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgaW50IG8yID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gY29uLm1hdGNoLmdldEVuZChyZWZubyktbzI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuU1RSSU5HOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpdGVyYWwgPSBvcC5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBsaXRlcmFsLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5DTE9TVVJFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2F2ZXMgY3VycmVudCBwb3NpdGlvbiB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgKiB6ZXJvLXdpZHRoIHJlcGVhdHMuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBjb24ub2Zmc2V0c1tpZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNPZmZzZXQgPCAwIHx8IHByZXZpb3VzT2Zmc2V0ICE9IG9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMCkgIGNvbi5vZmZzZXRzW2lkXSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlFVRVNUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWVFVRVNUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLmdldENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlVOSU9OOgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG9wLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmVsZW1lbnRBdChpKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVTklPTjogIitpKyIsIHJldD0iK3JldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNBUFRVUkU6Ci0gICAgICAgICAgICAgICAgaW50IHJlZm5vID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIHNhdmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC1yZWZubzsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0RW5kKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIHNhdmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTE9PS0FIRUFEOgotICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5MT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAtMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAtMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLklOREVQRU5ERU5UOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5NT0RJRklFUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsb2NhbG9wdHMgPSBvcHRzOwotICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgfD0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgJj0gfm9wLmdldERhdGEyKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJNT0RJRklFUjogIitJbnRlZ2VyLnRvU3RyaW5nKG9wdHMsIDE2KSsiIC0+ICIrSW50ZWdlci50b1N0cmluZyhsb2NhbG9wdHMsIDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBsb2NhbG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5DT05ESVRJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBPcC5Db25kaXRpb25PcCBjb3AgPSAoT3AuQ29uZGl0aW9uT3Apb3A7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPj0gdGhpcy5ub2ZwYXJlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIitjb3AucmVmTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcoY29wLnJlZk51bWJlcikgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29uLm1hdGNoLmdldEVuZChjb3AucmVmTnVtYmVyKSA+PSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gMCA8PSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBjb3AuY29uZGl0aW9uLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaHApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLnllczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3Aubm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3Aubm87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIG9wZXJhdGlvbiB0eXBlOiAiK29wLnR5cGUpOwotICAgICAgICAgICAgfSAvLyBzd2l0Y2ggKG9wLnR5cGUpCi0gICAgICAgIH0gLy8gd2hpbGUKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UHJldmlvdXNXb3JkVHlwZShjaGFyW10gIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7Ci0gICAgICAgIGludCByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgd2hpbGUgKHJldCA9PSBXVF9JR05PUkUpCi0gICAgICAgICAgICByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0V29yZFR5cGUoY2hhcltdICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IGJlZ2luIHx8IG9mZnNldCA+PSBlbmQpICByZXR1cm4gV1RfT1RIRVI7Ci0gICAgICAgIHJldHVybiBnZXRXb3JkVHlwZTAoIHRhcmdldCBbICBvZmZzZXQgXSAsIG9wdHMpOwotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoY2hhcltdICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgWyAgb2Zmc2V0KysgXSAgIT0gcGFydC5jaGFyQXQoaSsrKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKGNoYXJbXSAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gb2Zmc2V0MjsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGlmICggdGFyZ2V0IFsgIG9mZnNldCsrIF0gICE9ICB0YXJnZXQgWyAgaSsrIF0gKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLS8qKgotICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nI3JlZ2lvbk1hdGNoZXMKLSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoY2hhcltdICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGNoYXIgY2gxID0gIHRhcmdldCBbICBvZmZzZXQrKyBdIDsKLSAgICAgICAgICAgIGNoYXIgY2gyID0gcGFydC5jaGFyQXQoaSsrKTsKLSAgICAgICAgICAgIGlmIChjaDEgPT0gY2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2hhciB1Y2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICBjaGFyIHVjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgIGlmICh1Y2gxID09IHVjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDEpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShjaGFyW10gIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSBvZmZzZXQyOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgY2hhciBjaDEgPSAgdGFyZ2V0IFsgIG9mZnNldCsrIF0gOwotICAgICAgICAgICAgY2hhciBjaDIgPSAgdGFyZ2V0IFsgIGkrKyBdIDsKLSAgICAgICAgICAgIGlmIChjaDEgPT0gY2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2hhciB1Y2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICBjaGFyIHVjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgIGlmICh1Y2gxID09IHVjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDEpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB0byB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyAgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAwLCAgdGFyZ2V0IC5sZW5ndGgoKSAsIChNYXRjaCludWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybgotICAgICAqIGluIHNwZWNpZmllZCByYW5nZSBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcGFyYW0gZW5kICBFbmQgb2Zmc2V0ICsxIG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBtYXRjaGVkIHRvIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nICB0YXJnZXQsIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgc3RhcnQsIGVuZCwgKE1hdGNoKW51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXRjaCBBIE1hdGNoIGluc3RhbmNlIGZvciBzdG9yaW5nIG1hdGNoaW5nIHJlc3VsdC4KLSAgICAgKiBAcmV0dXJuIE9mZnNldCBvZiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gPFZBUj50YXJnZXQ8L1ZBUj47IG9yIC0xIGlmIG5vdCBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyAgdGFyZ2V0LCBNYXRjaCBtYXRjaCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgMCwgIHRhcmdldCAubGVuZ3RoKCkgLCBtYXRjaCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4KLSAgICAgKiBpbiBzcGVjaWZpZWQgcmFuZ2Ugb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHBhcmFtIGVuZCAgRW5kIG9mZnNldCArMSBvZiB0aGUgcmFuZ2UuCi0gICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgotICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nICB0YXJnZXQsIGludCBzdGFydCwgaW50IGVuZCwgTWF0Y2ggbWF0Y2gpIHsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmUoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIENvbnRleHQgY29uID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmNvbnRleHQpIHsKLSAgICAgICAgICAgIGNvbiA9IHRoaXMuY29udGV4dC5pbnVzZSA/IG5ldyBDb250ZXh0KCkgOiB0aGlzLmNvbnRleHQ7Ci0gICAgICAgICAgICBjb24ucmVzZXQodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzLm51bWJlck9mQ2xvc3VyZXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKLSAgICAgICAgICAgIG1hdGNoLnNldFNvdXJjZSh0YXJnZXQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzQmFja1JlZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIG1hdGNoID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKLSAgICAgICAgICAgIC8vIE5lZWQgbm90IHRvIGNhbGwgc2V0U291cmNlKCkgYmVjYXVzZQotICAgICAgICAgICAgLy8gYSBjYWxsZXIgY2FuIG5vdCBhY2Nlc3MgdGhpcyBtYXRjaCBpbnN0YW5jZS4KLSAgICAgICAgfQotICAgICAgICBjb24ubWF0Y2ggPSBtYXRjaDsKLQotICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJ0YXJnZXQgc3RyaW5nPSIrdGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJtYXRjaEVuZD0iK21hdGNoRW5kKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNvbi5saW1pdD0iK2Nvbi5saW1pdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF0Y2hFbmQgPT0gY29uLmxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgY29uLnN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHBhdHRlcm4gaGFzIG9ubHkgZml4ZWQgc3RyaW5nLgotICAgICAgICAgKiBUaGUgZW5naW5lIHVzZXMgQm95ZXItTW9vcmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZ09ubHkpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogZml4ZWQtb25seTogIit0aGlzLmZpeGVkU3RyaW5nKTsKLSAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7Ci0gICAgICAgICAgICBpZiAobyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbyt0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIGEgZml4ZWQgc3RyaW5nLgotICAgICAgICAgKiBUaGUgZW5naW5lIGNoZWNrcyB3aXRoIEJveWVyLU1vb3JlIHdoZXRoZXIgdGhlIHRleHQgY29udGFpbnMgdGhlIGZpeGVkIHN0cmluZyBvciBub3QuCi0gICAgICAgICAqIElmIG5vdCwgaXQgcmV0dXJuIHdpdGggZmFsc2UuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOwotICAgICAgICAgICAgaWYgKG8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk5vbi1tYXRjaCBpbiBmaXhlZC1zdHJpbmcgc2VhcmNoLiIpOwotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBsaW1pdCA9IGNvbi5saW1pdC10aGlzLm1pbmxlbmd0aDsKLSAgICAgICAgaW50IG1hdGNoU3RhcnQ7Ci0gICAgICAgIGludCBtYXRjaEVuZCA9IC0xOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICIuKiIuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKLSAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsKLSAgICAgICAgICAgIGlmIChpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0VPTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJc0VPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0VPTCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3B0aW1pemF0aW9uIGFnYWluc3QgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKHRoaXMuZmlyc3RDaGFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogd2l0aCBmaXJzdGNoYXItbWF0Y2hpbmc6ICIrdGhpcy5maXJzdENoYXIpOwotICAgICAgICAgICAgUmFuZ2VUb2tlbiByYW5nZSA9IHRoaXMuZmlyc3RDaGFyOwotICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZmlyc3RDaGFyLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgbWF0Y2hTdGFydCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0KzEgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgbWF0Y2hTdGFydCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuY2hhckF0KCAgbWF0Y2hTdGFydCsxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTdHJhaWdodGZvcndhcmQgbWF0Y2hpbmcuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF0Y2hFbmQgPj0gMCkgewotICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBtYXRjaFN0YXJ0KTsKLSAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gLTEgd2hlbiBub3QgbWF0Y2g7IG9mZnNldCBvZiB0aGUgZW5kIG9mIG1hdGNoZWQgc3RyaW5nIHdoZW4gbWF0Y2guCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbWF0Y2hTdHJpbmcgKENvbnRleHQgY29uLCBPcCBvcCwgaW50IG9mZnNldCwgaW50IGR4LCBpbnQgb3B0cykgewotCi0KLQotCi0gICAgICAgIFN0cmluZyB0YXJnZXQgPSBjb24uc3RyVGFyZ2V0OwotCi0KLQotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTZXQob3B0cywgWE1MU0NIRU1BX01PREUpICYmIG9mZnNldCAhPSBjb24ubGltaXQgPyAtMSA6IG9mZnNldDsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiBjb24ubGltaXQgfHwgb2Zmc2V0IDwgY29uLnN0YXJ0KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHN3aXRjaCAob3AudHlwZSkgewotICAgICAgICAgICAgY2FzZSBPcC5DSEFSOgotICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCAuY2hhckF0KCAgbzEgKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCBjaCAhPSAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCBjaCAhPSAgdGFyZ2V0IC5jaGFyQXQoICBvMSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuRE9UOgotICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLmNoYXJBdCggICsrb2Zmc2V0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBvMSApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8xIC0tOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IC5jaGFyQXQoICAtLW8xICkgLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRU9MQ2hhcihjaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIE9wLk5SQU5HRToKLSAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuY2hhckF0KCAgKytvZmZzZXQgKSApOwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBvMSApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgLmNoYXJBdCggIC0tbzEgKSAsIGNoKTsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5BTkNIT1I6Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBnbyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN3aXRjaCAob3AuZ2V0RGF0YSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0LTEgKSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdAJzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBAIGFsd2F5cyBtYXRjaGVzIGxpbmUgYmVnaW5uaW5ncy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldC0xICkgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnJCc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA8IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzEgPT0gY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgID09IENBUlJJQUdFX1JFVFVSTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0KzEgKSAgPT0gTElORV9GRUVEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzEgPT0gY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSAgPT0gQ0FSUklBR0VfUkVUVVJOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCsxICkgID09IExJTkVfRkVFRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IFdUX0lHTk9SRSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWZvcmUgPSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gYmVmb3JlKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gYWZ0ZXIgPT0gV1RfSUdOT1JFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFmdGVyID09IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWdvKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwIHx8IG9mZnNldCA9PSBjb24ubGltaXQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX09USEVSKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwIHx8IG9mZnNldCA9PSBjb24uc3RhcnQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX09USEVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IC8vIHN3aXRjaCBhbmNob3IgdHlwZQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5CQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlZm5vID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmbm8gPD0gMCB8fCByZWZubyA+PSB0aGlzLm5vZnBhcmVuKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrcmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubykgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgIC8vICoqKioqKioqCi0gICAgICAgICAgICAgICAgICAgIGludCBvMiA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pLW8yOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLlNUUklORzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaXRlcmFsID0gb3AuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gbGl0ZXJhbC5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ0xPU1VSRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFNhdmVzIGN1cnJlbnQgcG9zaXRpb24gdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgICogemVyby13aWR0aCByZXBlYXRzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzT2Zmc2V0ID0gY29uLm9mZnNldHNbaWRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzT2Zmc2V0IDwgMCB8fCBwcmV2aW91c09mZnNldCAhPSBvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSAgY29uLm9mZnNldHNbaWRdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZQ0xPU1VSRToKLSAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AuZ2V0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuVU5JT046Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgb3Auc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZWxlbWVudEF0KGkpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVOSU9OOiAiK2krIiwgcmV0PSIrcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ0FQVFVSRToKLSAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgc2F2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLXJlZm5vOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRFbmQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgc2F2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5MT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLkxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLk1PRElGSUVSOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvY2Fsb3B0cyA9IG9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyB8PSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyAmPSB+b3AuZ2V0RGF0YTIoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk1PRElGSUVSOiAiK0ludGVnZXIudG9TdHJpbmcob3B0cywgMTYpKyIgLT4gIitJbnRlZ2VyLnRvU3RyaW5nKGxvY2Fsb3B0cywgMTYpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIGxvY2Fsb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNPTkRJVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9wLkNvbmRpdGlvbk9wIGNvcCA9IChPcC5Db25kaXRpb25PcClvcDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaHAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+PSB0aGlzLm5vZnBhcmVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK2NvcC5yZWZOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhjb3AucmVmTnVtYmVyKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb24ubWF0Y2guZ2V0RW5kKGNvcC5yZWZOdW1iZXIpID49IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSAwIDw9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIGNvcC5jb25kaXRpb24sIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNocCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AueWVzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcC5ubyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5ubzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIHR5cGU6ICIrb3AudHlwZSk7Ci0gICAgICAgICAgICB9IC8vIHN3aXRjaCAob3AudHlwZSkKLSAgICAgICAgfSAvLyB3aGlsZQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRQcmV2aW91c1dvcmRUeXBlKFN0cmluZyAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKLSAgICAgICAgaW50IHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOwotICAgICAgICB3aGlsZSAocmV0ID09IFdUX0lHTk9SRSkKLSAgICAgICAgICAgIHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRXb3JkVHlwZShTdHJpbmcgIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgewotICAgICAgICBpZiAob2Zmc2V0IDwgYmVnaW4gfHwgb2Zmc2V0ID49IGVuZCkgIHJldHVybiBXVF9PVEhFUjsKLSAgICAgICAgcmV0dXJuIGdldFdvcmRUeXBlMCggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSAsIG9wdHMpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRleHQucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIHBhcnQsIDAsIHBhcnRsZW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0ZXh0LnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCB0ZXh0LCBvZmZzZXQyLCBwYXJ0bGVuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgcmV0dXJuIHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBvZmZzZXQsIHBhcnQsIDAsIHBhcnRsZW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBvZmZzZXQsIHRleHQsIG9mZnNldDIsIHBhcnRsZW4pOwotICAgIH0KLQotCi0KLQotCi0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIChNYXRjaCludWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXRjaCBBIE1hdGNoIGluc3RhbmNlIGZvciBzdG9yaW5nIG1hdGNoaW5nIHJlc3VsdC4KLSAgICAgKiBAcmV0dXJuIE9mZnNldCBvZiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gPFZBUj50YXJnZXQ8L1ZBUj47IG9yIC0xIGlmIG5vdCBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIE1hdGNoIG1hdGNoKSB7Ci0gICAgICAgIGludCBzdGFydCA9IHRhcmdldC5nZXRCZWdpbkluZGV4KCk7Ci0gICAgICAgIGludCBlbmQgPSB0YXJnZXQuZ2V0RW5kSW5kZXgoKTsKLQotCi0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZXh0IGNvbiA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5jb250ZXh0KSB7Ci0gICAgICAgICAgICBjb24gPSB0aGlzLmNvbnRleHQuaW51c2UgPyBuZXcgQ29udGV4dCgpIDogdGhpcy5jb250ZXh0OwotICAgICAgICAgICAgY29uLnJlc2V0KHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpcy5udW1iZXJPZkNsb3N1cmVzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgbWF0Y2guc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2ZwYXJlbik7Ci0gICAgICAgICAgICBtYXRjaC5zZXRTb3VyY2UodGFyZ2V0KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc0JhY2tSZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICBtYXRjaCA9IG5ldyBNYXRjaCgpOwotICAgICAgICAgICAgbWF0Y2guc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2ZwYXJlbik7Ci0gICAgICAgICAgICAvLyBOZWVkIG5vdCB0byBjYWxsIHNldFNvdXJjZSgpIGJlY2F1c2UKLSAgICAgICAgICAgIC8vIGEgY2FsbGVyIGNhbiBub3QgYWNjZXNzIHRoaXMgbWF0Y2ggaW5zdGFuY2UuCi0gICAgICAgIH0KLSAgICAgICAgY29uLm1hdGNoID0gbWF0Y2g7Ci0KLSAgICAgICAgaWYgKHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBYTUxTQ0hFTUFfTU9ERSkpIHsKLSAgICAgICAgICAgIGludCBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IG1hdGNoRW5kPSIrbWF0Y2hFbmQpOwotICAgICAgICAgICAgaWYgKG1hdGNoRW5kID09IGNvbi5saW1pdCkgewotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIGNvbi5zdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBwYXR0ZXJuIGhhcyBvbmx5IGZpeGVkIHN0cmluZy4KLSAgICAgICAgICogVGhlIGVuZ2luZSB1c2VzIEJveWVyLU1vb3JlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmdPbmx5KSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IGZpeGVkLW9ubHk6ICIrdGhpcy5maXhlZFN0cmluZyk7Ci0gICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOwotICAgICAgICAgICAgaWYgKG8gPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG8pOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG8rdGhpcy5maXhlZFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcGF0dGVybiBjb250YWlucyBhIGZpeGVkIHN0cmluZy4KLSAgICAgICAgICogVGhlIGVuZ2luZSBjaGVja3Mgd2l0aCBCb3llci1Nb29yZSB3aGV0aGVyIHRoZSB0ZXh0IGNvbnRhaW5zIHRoZSBmaXhlZCBzdHJpbmcgb3Igbm90LgotICAgICAgICAgKiBJZiBub3QsIGl0IHJldHVybiB3aXRoIGZhbHNlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKLSAgICAgICAgICAgIGlmIChvIDwgMCkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJOb24tbWF0Y2ggaW4gZml4ZWQtc3RyaW5nIHNlYXJjaC4iKTsKLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGltaXQgPSBjb24ubGltaXQtdGhpcy5taW5sZW5ndGg7Ci0gICAgICAgIGludCBtYXRjaFN0YXJ0OwotICAgICAgICBpbnQgbWF0Y2hFbmQgPSAtMTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAiLioiLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyAhPSBudWxsCi0gICAgICAgICAgICAmJiB0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5DTE9TVVJFICYmIHRoaXMub3BlcmF0aW9ucy5nZXRDaGlsZCgpLnR5cGUgPT0gT3AuRE9UKSB7Ci0gICAgICAgICAgICBpZiAoaXNTZXQodGhpcy5vcHRpb25zLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OwotICAgICAgICAgICAgICAgIG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG1hdGNoU3RhcnQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0lzRU9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0VPTCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3B0aW1pemF0aW9uIGFnYWluc3QgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKHRoaXMuZmlyc3RDaGFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogd2l0aCBmaXJzdGNoYXItbWF0Y2hpbmc6ICIrdGhpcy5maXJzdENoYXIpOwotICAgICAgICAgICAgUmFuZ2VUb2tlbiByYW5nZSA9IHRoaXMuZmlyc3RDaGFyOwotICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZmlyc3RDaGFyLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCsxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG1hdGNoU3RhcnQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCsxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3RyYWlnaHRmb3J3YXJkIG1hdGNoaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF0Y2hFbmQgPj0gMCkgewotICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBtYXRjaFN0YXJ0KTsKLSAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gLTEgd2hlbiBub3QgbWF0Y2g7IG9mZnNldCBvZiB0aGUgZW5kIG9mIG1hdGNoZWQgc3RyaW5nIHdoZW4gbWF0Y2guCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoQ29udGV4dCBjb24sIE9wIG9wLCBpbnQgb2Zmc2V0LCBpbnQgZHgsIGludCBvcHRzKSB7Ci0KLQotICAgICAgICBDaGFyYWN0ZXJJdGVyYXRvciB0YXJnZXQgPSBjb24uY2lUYXJnZXQ7Ci0KLQotCi0KLQotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTZXQob3B0cywgWE1MU0NIRU1BX01PREUpICYmIG9mZnNldCAhPSBjb24ubGltaXQgPyAtMSA6IG9mZnNldDsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiBjb24ubGltaXQgfHwgb2Zmc2V0IDwgY29uLnN0YXJ0KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHN3aXRjaCAob3AudHlwZSkgewotICAgICAgICAgICAgY2FzZSBPcC5DSEFSOgotICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggIG8xICkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgY2ggIT0gIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCBjaCAhPSAgdGFyZ2V0IC5zZXRJbmRleCggIG8xICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5ET1Q6Ci0gICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggICsrb2Zmc2V0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG8xICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbzEgLS07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgLnNldEluZGV4KCAgLS1vMSApICwgY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VPTENoYXIoY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlJBTkdFOgotICAgICAgICAgICAgY2FzZSBPcC5OUkFOR0U6Ci0gICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuc2V0SW5kZXgoICArK29mZnNldCApICk7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IC5zZXRJbmRleCggIC0tbzEgKSAsIGNoKTsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5BTkNIT1I6Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBnbyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN3aXRjaCAob3AuZ2V0RGF0YSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQtMSApICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0AnOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCB1c2Ugb25seS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEAgYWx3YXlzIG1hdGNoZXMgbGluZSBiZWdpbm5pbmdzLgotICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQtMSApICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJyQnOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPCBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzEgPT0gY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICA9PSBDQVJSSUFHRV9SRVRVUk4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KzEgKSAgPT0gTElORV9GRUVEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzEgPT0gY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgID09IENBUlJJQUdFX1JFVFVSTgotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsxICkgID09IExJTkVfRkVFRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IFdUX0lHTk9SRSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWZvcmUgPSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gYmVmb3JlKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gYWZ0ZXIgPT0gV1RfSUdOT1JFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFmdGVyID09IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWdvKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwIHx8IG9mZnNldCA9PSBjb24ubGltaXQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX09USEVSKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwIHx8IG9mZnNldCA9PSBjb24uc3RhcnQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX09USEVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IC8vIHN3aXRjaCBhbmNob3IgdHlwZQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5CQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlZm5vID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmbm8gPD0gMCB8fCByZWZubyA+PSB0aGlzLm5vZnBhcmVuKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrcmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubykgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgIC8vICoqKioqKioqCi0gICAgICAgICAgICAgICAgICAgIGludCBvMiA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pLW8yOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLlNUUklORzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaXRlcmFsID0gb3AuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gbGl0ZXJhbC5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ0xPU1VSRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFNhdmVzIGN1cnJlbnQgcG9zaXRpb24gdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgICogemVyby13aWR0aCByZXBlYXRzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzT2Zmc2V0ID0gY29uLm9mZnNldHNbaWRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzT2Zmc2V0IDwgMCB8fCBwcmV2aW91c09mZnNldCAhPSBvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSAgY29uLm9mZnNldHNbaWRdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlDTE9TVVJFOgotICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlRVUVTVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLmdldENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLlVOSU9OOgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG9wLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZWxlbWVudEF0KGkpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVOSU9OOiAiK2krIiwgcmV0PSIrcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ0FQVFVSRToKLSAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBzYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtcmVmbm87Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEVuZChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIHNhdmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTE9PS0FIRUFEOgotICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAtMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTU9ESUZJRVI6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxvcHRzID0gb3B0czsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzIHw9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzICY9IH5vcC5nZXREYXRhMigpOwotICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTU9ESUZJRVI6ICIrSW50ZWdlci50b1N0cmluZyhvcHRzLCAxNikrIiAtPiAiK0ludGVnZXIudG9TdHJpbmcobG9jYWxvcHRzLCAxNikpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBsb2NhbG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5DT05ESVRJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBPcC5Db25kaXRpb25PcCBjb3AgPSAoT3AuQ29uZGl0aW9uT3Apb3A7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPj0gdGhpcy5ub2ZwYXJlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIitjb3AucmVmTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcoY29wLnJlZk51bWJlcikgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29uLm1hdGNoLmdldEVuZChjb3AucmVmTnVtYmVyKSA+PSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gMCA8PSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIGNvcC5jb25kaXRpb24sIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNocCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AueWVzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcC5ubyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5ubzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIHR5cGU6ICIrb3AudHlwZSk7Ci0gICAgICAgICAgICB9IC8vIHN3aXRjaCAob3AudHlwZSkKLSAgICAgICAgfSAvLyB3aGlsZQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRQcmV2aW91c1dvcmRUeXBlKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgewotICAgICAgICBpbnQgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7Ci0gICAgICAgIHdoaWxlIChyZXQgPT0gV1RfSUdOT1JFKQotICAgICAgICAgICAgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFdvcmRUeXBlKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IGJlZ2luIHx8IG9mZnNldCA+PSBlbmQpICByZXR1cm4gV1RfT1RIRVI7Ci0gICAgICAgIHJldHVybiBnZXRXb3JkVHlwZTAoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSAsIG9wdHMpOwotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrKyApICAhPSBwYXJ0LmNoYXJBdChpKyspKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IG9mZnNldDI7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrKyApICAhPSAgdGFyZ2V0IC5zZXRJbmRleCggIGkrKyApICkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nI3JlZ2lvbk1hdGNoZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGNoYXIgY2gxID0gIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrKyApIDsKLSAgICAgICAgICAgIGNoYXIgY2gyID0gcGFydC5jaGFyQXQoaSsrKTsKLSAgICAgICAgICAgIGlmIChjaDEgPT0gY2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2hhciB1Y2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICBjaGFyIHVjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgIGlmICh1Y2gxID09IHVjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDEpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IG9mZnNldDI7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBjaGFyIGNoMSA9ICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KysgKSA7Ci0gICAgICAgICAgICBjaGFyIGNoMiA9ICB0YXJnZXQgLnNldEluZGV4KCAgaSsrICkgOwotICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKLSAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotCi0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKiBAc2VyaWFsCi0gICAgICovCi0gICAgU3RyaW5nIHJlZ2V4OwotICAgIC8qKgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KLSAgICBpbnQgb3B0aW9uczsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgcGFyZW50aGVzaXMgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKiBAc2VyaWFsCi0gICAgICovCi0gICAgaW50IG5vZnBhcmVuOwotICAgIC8qKgotICAgICAqIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICogQHNlcmlhbAotICAgICAqLwotICAgIFRva2VuIHRva2VudHJlZTsKLQotICAgIGJvb2xlYW4gaGFzQmFja1JlZmVyZW5jZXMgPSBmYWxzZTsKLQotICAgIHRyYW5zaWVudCBpbnQgbWlubGVuZ3RoOwotICAgIHRyYW5zaWVudCBPcCBvcGVyYXRpb25zID0gbnVsbDsKLSAgICB0cmFuc2llbnQgaW50IG51bWJlck9mQ2xvc3VyZXM7Ci0gICAgdHJhbnNpZW50IENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgdHJhbnNpZW50IFJhbmdlVG9rZW4gZmlyc3RDaGFyID0gbnVsbDsKLQotICAgIHRyYW5zaWVudCBTdHJpbmcgZml4ZWRTdHJpbmcgPSBudWxsOwotICAgIHRyYW5zaWVudCBpbnQgZml4ZWRTdHJpbmdPcHRpb25zOwotICAgIHRyYW5zaWVudCBCTVBhdHRlcm4gZml4ZWRTdHJpbmdUYWJsZSA9IG51bGw7Ci0gICAgdHJhbnNpZW50IGJvb2xlYW4gZml4ZWRTdHJpbmdPbmx5ID0gZmFsc2U7Ci0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250ZXh0IHsKLSAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgY2lUYXJnZXQ7Ci0gICAgICAgIFN0cmluZyBzdHJUYXJnZXQ7Ci0gICAgICAgIGNoYXJbXSBjaGFyVGFyZ2V0OwotICAgICAgICBpbnQgc3RhcnQ7Ci0gICAgICAgIGludCBsaW1pdDsKLSAgICAgICAgaW50IGxlbmd0aDsKLSAgICAgICAgTWF0Y2ggbWF0Y2g7Ci0gICAgICAgIGJvb2xlYW4gaW51c2UgPSBmYWxzZTsKLSAgICAgICAgaW50W10gb2Zmc2V0czsKLQotICAgICAgICBDb250ZXh0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29tbW9uKGludCBub2ZjbG9zdXJlcykgewotICAgICAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmxpbWl0LXRoaXMuc3RhcnQ7Ci0gICAgICAgICAgICB0aGlzLmludXNlID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMubWF0Y2ggPSBudWxsOwotICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0cyA9PSBudWxsIHx8IHRoaXMub2Zmc2V0cy5sZW5ndGggIT0gbm9mY2xvc3VyZXMpCi0gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzID0gbmV3IGludFtub2ZjbG9zdXJlc107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBub2ZjbG9zdXJlczsgIGkgKyspICB0aGlzLm9mZnNldHNbaV0gPSAtMTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHJlc2V0KENoYXJhY3Rlckl0ZXJhdG9yIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBub2ZjbG9zdXJlcykgewotICAgICAgICAgICAgdGhpcy5jaVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKLSAgICAgICAgICAgIHRoaXMucmVzZXRDb21tb24obm9mY2xvc3VyZXMpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgcmVzZXQoU3RyaW5nIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBub2ZjbG9zdXJlcykgewotICAgICAgICAgICAgdGhpcy5zdHJUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7Ci0gICAgICAgICAgICB0aGlzLnJlc2V0Q29tbW9uKG5vZmNsb3N1cmVzKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHJlc2V0KGNoYXJbXSB0YXJnZXQsIGludCBzdGFydCwgaW50IGxpbWl0LCBpbnQgbm9mY2xvc3VyZXMpIHsKLSAgICAgICAgICAgIHRoaXMuY2hhclRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKLSAgICAgICAgICAgIHRoaXMucmVzZXRDb21tb24obm9mY2xvc3VyZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlcGFyZXMgZm9yIG1hdGNoaW5nLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHN0YXJ0aW5nIG1hdGNoaW5nLgotICAgICAqLwotICAgIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzID0gMDsKLSAgICAgICAgdGhpcy5jb21waWxlKHRoaXMudG9rZW50cmVlKTsKLSAgICAgICAgLyoKLSAgICAgICAgaWYgICh0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5DTE9TVVJFICYmIHRoaXMub3BlcmF0aW9ucy5nZXRDaGlsZCgpLnR5cGUgPT0gT3AuRE9UKSB7IC8vIC4qCi0gICAgICAgICAgICBPcCBhbmNob3IgPSBPcC5jcmVhdGVBbmNob3IoaXNTZXQodGhpcy5vcHRpb25zLCBTSU5HTEVfTElORSkgPyAnQScgOiAnQCcpOwotICAgICAgICAgICAgYW5jaG9yLm5leHQgPSB0aGlzLm9wZXJhdGlvbnM7Ci0gICAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBhbmNob3I7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zOiAiK09wLm5vZmluc3RhbmNlcyk7Ci0KLSAgICAgICAgdGhpcy5taW5sZW5ndGggPSB0aGlzLnRva2VudHJlZS5nZXRNaW5MZW5ndGgoKTsKLQotICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IG51bGw7Ci0gICAgICAgIGlmICghaXNTZXQodGhpcy5vcHRpb25zLCBQUk9ISUJJVF9IRUFEX0NIQVJBQ1RFUl9PUFRJTUlaQVRJT04pCi0gICAgICAgICAgICAmJiAhaXNTZXQodGhpcy5vcHRpb25zLCBYTUxTQ0hFTUFfTU9ERSkpIHsKLSAgICAgICAgICAgIFJhbmdlVG9rZW4gZmlyc3RDaGFyID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgIGludCBmcmVzdWx0ID0gdGhpcy50b2tlbnRyZWUuYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKGZpcnN0Q2hhciwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIGlmIChmcmVzdWx0ID09IFRva2VuLkZDX1RFUk1JTkFMKSB7Ci0gICAgICAgICAgICAgICAgZmlyc3RDaGFyLmNvbXBhY3RSYW5nZXMoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IGZpcnN0Q2hhcjsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IFVzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9wdGltaXphdGlvbjogIitmaXJzdENoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyAhPSBudWxsCi0gICAgICAgICAgICAmJiAodGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuU1RSSU5HIHx8IHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNIQVIpCi0gICAgICAgICAgICAmJiB0aGlzLm9wZXJhdGlvbnMubmV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludCgiICoqKiBPbmx5IGZpeGVkIHN0cmluZyEgKioqICIpOwotICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ09ubHkgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLlNUUklORykKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nID0gdGhpcy5vcGVyYXRpb25zLmdldFN0cmluZygpOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcGVyYXRpb25zLmdldERhdGEoKSA+PSAweDEwMDAwKSB7IC8vIE9wLkNIQVIKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nID0gUkVVdGlsLmRlY29tcG9zZVRvU3Vycm9nYXRlcyh0aGlzLm9wZXJhdGlvbnMuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGFjID0gbmV3IGNoYXJbMV07Ci0gICAgICAgICAgICAgICAgYWNbMF0gPSAoY2hhcil0aGlzLm9wZXJhdGlvbnMuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSBuZXcgU3RyaW5nKGFjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmdPcHRpb25zID0gdGhpcy5vcHRpb25zOwotICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ1RhYmxlID0gbmV3IEJNUGF0dGVybih0aGlzLmZpeGVkU3RyaW5nLCAyNTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2V0KHRoaXMuZml4ZWRTdHJpbmdPcHRpb25zLCBJR05PUkVfQ0FTRSkpOwotICAgICAgICB9IGVsc2UgaWYgKCFpc1NldCh0aGlzLm9wdGlvbnMsIFBST0hJQklUX0ZJWEVEX1NUUklOR19PUFRJTUlaQVRJT04pCi0gICAgICAgICAgICAgICAgICAgJiYgIWlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7Ci0gICAgICAgICAgICBUb2tlbi5GaXhlZFN0cmluZ0NvbnRhaW5lciBjb250YWluZXIgPSBuZXcgVG9rZW4uRml4ZWRTdHJpbmdDb250YWluZXIoKTsKLSAgICAgICAgICAgIHRoaXMudG9rZW50cmVlLmZpbmRGaXhlZFN0cmluZyhjb250YWluZXIsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nID0gY29udGFpbmVyLnRva2VuID09IG51bGwgPyBudWxsIDogY29udGFpbmVyLnRva2VuLmdldFN0cmluZygpOwotICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ09wdGlvbnMgPSBjb250YWluZXIub3B0aW9uczsKLSAgICAgICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nICE9IG51bGwgJiYgdGhpcy5maXhlZFN0cmluZy5sZW5ndGgoKSA8IDIpCi0gICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAvLyBUaGlzIHBhdHRlcm4gaGFzIGEgZml4ZWQgc3RyaW5nIG9mIHdoaWNoIGxlbmd0aCBpcyBtb3JlIHRoYW4gb25lLgotICAgICAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmdUYWJsZSA9IG5ldyBCTVBhdHRlcm4odGhpcy5maXhlZFN0cmluZywgMjU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXQodGhpcy5maXhlZFN0cmluZ09wdGlvbnMsIElHTk9SRV9DQVNFKSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6IFRoZSBsb25nZXN0IGZpeGVkIHN0cmluZzogIit0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIi8iIC8vK3RoaXMuZml4ZWRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLyIrUkVVdGlsLmNyZWF0ZU9wdGlvblN0cmluZyh0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucykpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJTdHJpbmc6ICIpOwotICAgICAgICAgICAgICAgICAgICBSRVV0aWwuZHVtcFN0cmluZyh0aGlzLmZpeGVkU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBvcHRpb24uCi0gICAgICogSWYgeW91IHNwZWNpZnkgdGhpcyBvcHRpb24sIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD4oPC9rYmQ+PHZhcj5YPC92YXI+PGtiZD4pPC9rYmQ+PC9zcGFuPgotICAgICAqIGNhcHR1cmVzIG1hdGNoZWQgdGV4dCwgYW5kIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD4oOj88L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD48L3NwYW4+Ci0gICAgICogZG9lcyBub3QgY2FwdHVyZS4KLSAgICAgKgotICAgICAqIEBzZWUgI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsaW50KQotICAgICAqIEBzZWUgI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgc3RhdGljIGZpbmFsIGludCBNQVJLX1BBUkVOUyA9IDE8PDA7Ci0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiAiaSIKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9DQVNFID0gMTw8MTsKLQotICAgIC8qKgotICAgICAqICJzIgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX0xJTkUgPSAxPDwyOwotCi0gICAgLyoqCi0gICAgICogIm0iCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBNVUxUSVBMRV9MSU5FUyA9IDE8PDM7Ci0KLSAgICAvKioKLSAgICAgKiAieCIKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEVYVEVOREVEX0NPTU1FTlQgPSAxPDw0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gcmVkZWZpbmVzIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5cZCBcRCBcdyBcVyBccyBcUzwva2JkPjwvc3Bhbj4uCi0gICAgICoKLSAgICAgKiBAc2VlICNSZWd1bGFyRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLGludCkKLSAgICAgKiBAc2VlICNzZXRQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcsaW50KQotICAgICAqIEBzZWUgI1VOSUNPREVfV09SRF9CT1VOREFSWQotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNFX1VOSUNPREVfQ0FURUdPUlkgPSAxPDw1OyAvLyAidSIKLQotICAgIC8qKgotICAgICAqIEFuIG9wdGlvbi4KLSAgICAgKiBUaGlzIGVuYWJsZXMgdG8gcHJvY2VzcyBsb2NhbGUtaW5kZXBlbmRlbnQgd29yZCBib3VuZGFyeSBmb3IgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlxiIFxCIFwmbHQ7IFw+PC9rYmQ+PC9zcGFuPi4KLSAgICAgKiA8cD5CeSBkZWZhdWx0LCB0aGUgZW5naW5lIGNvbnNpZGVycyBhIHBvc2l0aW9uIGJldHdlZW4gYSB3b3JkIGNoYXJhY3RlcgotICAgICAqICg8c3BhbiBjbGFzcz0iUkVHRVgiPjxLYmQ+XHc8L2tiZD48L3NwYW4+KSBhbmQgYSBub24gd29yZCBjaGFyYWN0ZXIKLSAgICAgKiBpcyBhIHdvcmQgYm91bmRhcnkuCi0gICAgICogPHA+QnkgdGhpcyBvcHRpb24sIHRoZSBlbmdpbmUgY2hlY2tzIHdvcmQgYm91bmRhcmllcyB3aXRoIHRoZSBtZXRob2Qgb2YKLSAgICAgKiAnVW5pY29kZSBSZWd1bGFyIEV4cHJlc3Npb24gR3VpZGVsaW5lcycgUmV2aXNpb24gNC4KLSAgICAgKgotICAgICAqIEBzZWUgI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsaW50KQotICAgICAqIEBzZWUgI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBVTklDT0RFX1dPUkRfQk9VTkRBUlkgPSAxPDw2OyAvLyAidyIKLQotICAgIC8qKgotICAgICAqICJIIgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRfSEVBRF9DSEFSQUNURVJfT1BUSU1JWkFUSU9OID0gMTw8NzsKLSAgICAvKioKLSAgICAgKiAiRiIKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0hJQklUX0ZJWEVEX1NUUklOR19PUFRJTUlaQVRJT04gPSAxPDw4OwotICAgIC8qKgotICAgICAqICJYIi4gWE1MIFNjaGVtYSBtb2RlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgWE1MU0NIRU1BX01PREUgPSAxPDw5OwotICAgIC8qKgotICAgICAqICIsIi4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNQRUNJQUxfQ09NTUEgPSAxPDwxMDsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1NldChpbnQgb3B0aW9ucywgaW50IGZsYWcpIHsKLSAgICAgICAgcmV0dXJuIChvcHRpb25zICYgZmxhZykgPT0gZmxhZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFJlZ3VsYXJFeHByZXNzaW9uIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlZ2V4IEEgcmVndWxhciBleHByZXNzaW9uCi0gICAgICogQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5QYXJzZUV4Y2VwdGlvbiA8VkFSPnJlZ2V4PC9WQVI+IGlzIG5vdCBjb25mb3JtaW5nIHRvIHRoZSBzeW50YXguCi0gICAgICovCi0gICAgcHVibGljIFJlZ3VsYXJFeHByZXNzaW9uKFN0cmluZyByZWdleCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXRQYXR0ZXJuKHJlZ2V4LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFJlZ3VsYXJFeHByZXNzaW9uIGluc3RhbmNlIHdpdGggb3B0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWdleCBBIHJlZ3VsYXIgZXhwcmVzc2lvbgotICAgICAqIEBwYXJhbSBvcHRpb25zIEEgU3RyaW5nIGNvbnNpc3RlZCBvZiAiaSIgIm0iICJzIiAidSIgInciICIsIiAiWCIKLSAgICAgKiBAZXhjZXB0aW9uIG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLnJlZ2V4LlBhcnNlRXhjZXB0aW9uIDxWQVI+cmVnZXg8L1ZBUj4gaXMgbm90IGNvbmZvcm1pbmcgdG8gdGhlIHN5bnRheC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVndWxhckV4cHJlc3Npb24oU3RyaW5nIHJlZ2V4LCBTdHJpbmcgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXRQYXR0ZXJuKHJlZ2V4LCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcmVnZXgsIFRva2VuIHRvaywgaW50IHBhcmVucywgYm9vbGVhbiBoYXNCYWNrUmVmZXJlbmNlcywgaW50IG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5yZWdleCA9IHJlZ2V4OwotICAgICAgICB0aGlzLnRva2VudHJlZSA9IHRvazsKLSAgICAgICAgdGhpcy5ub2ZwYXJlbiA9IHBhcmVuczsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IGhhc0JhY2tSZWZlcmVuY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgbmV3UGF0dGVybikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXRQYXR0ZXJuKG5ld1BhdHRlcm4sIHRoaXMub3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIG5ld1BhdHRlcm4sIGludCBvcHRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnJlZ2V4ID0gbmV3UGF0dGVybjsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgUmVnZXhQYXJzZXIgcnAgPSB0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgUGFyc2VyRm9yWE1MU2NoZW1hKCkgOiBuZXcgUmVnZXhQYXJzZXIoKTsKLSAgICAgICAgdGhpcy50b2tlbnRyZWUgPSBycC5wYXJzZSh0aGlzLnJlZ2V4LCB0aGlzLm9wdGlvbnMpOwotICAgICAgICB0aGlzLm5vZnBhcmVuID0gcnAucGFyZW5udW1iZXI7Ci0gICAgICAgIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMgPSBycC5oYXNCYWNrUmVmZXJlbmNlczsKLQotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBudWxsOwotICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsOwotICAgIH0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIG5ld1BhdHRlcm4sIFN0cmluZyBvcHRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldFBhdHRlcm4obmV3UGF0dGVybiwgUkVVdGlsLnBhcnNlT3B0aW9ucyhvcHRpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlZ2V4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgdGhpcyBpbnN0ZW5jZSBpbiBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudG9rZW50cmVlLnRvU3RyaW5nKHRoaXMub3B0aW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG9wdGlvbiBzdHJpbmcuCi0gICAgICogVGhlIG9yZGVyIG9mIGxldHRlcnMgaW4gaXQgbWF5IGJlIGRpZmZlcmVudCBmcm9tIGEgc3RyaW5nIHNwZWNpZmllZAotICAgICAqIGluIGEgY29uc3RydWN0b3Igb3IgPGNvZGU+c2V0UGF0dGVybigpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBzZWUgI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZykKLSAgICAgKiBAc2VlICNzZXRQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBSRVV0aWwuY3JlYXRlT3B0aW9uU3RyaW5nKHRoaXMub3B0aW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybiB0cnVlIGlmIHBhdHRlcm5zIGFyZSB0aGUgc2FtZSBhbmQgdGhlIG9wdGlvbnMgYXJlIGVxdWl2YWxlbnQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBSZWd1bGFyRXhwcmVzc2lvbikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHIgPSAoUmVndWxhckV4cHJlc3Npb24pb2JqOwotICAgICAgICByZXR1cm4gdGhpcy5yZWdleC5lcXVhbHMoci5yZWdleCkgJiYgdGhpcy5vcHRpb25zID09IHIub3B0aW9uczsKLSAgICB9Ci0KLSAgICBib29sZWFuIGVxdWFscyhTdHJpbmcgcGF0dGVybiwgaW50IG9wdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVnZXguZXF1YWxzKHBhdHRlcm4pICYmIHRoaXMub3B0aW9ucyA9PSBvcHRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLnJlZ2V4KyIvIit0aGlzLmdldE9wdGlvbnMoKSkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXBzLgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgMSB3aGVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIG5vIGNhcHR1cmluZy1wYXJlbnRoZXNpcy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZnBhcmVuOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXVF9JR05PUkUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXVF9MRVRURVIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXVF9PVEhFUiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFdvcmRUeXBlMChjaGFyIGNoLCBpbnQgb3B0cykgewotICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIFVOSUNPREVfV09SRF9CT1VOREFSWSkpIHsKLSAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBVU0VfVU5JQ09ERV9DQVRFR09SWSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRva2VuLmdldFJhbmdlKCJJc1dvcmQiLCB0cnVlKS5tYXRjaChjaCkpID8gV1RfTEVUVEVSIDogV1RfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNXb3JkQ2hhcihjaCkgPyBXVF9MRVRURVIgOiBXVF9PVEhFUjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoQ2hhcmFjdGVyLmdldFR5cGUoY2gpKSB7Ci0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLlVQUEVSQ0FTRV9MRVRURVI6ICAgICAgLy8gTAotICAgICAgICBjYXNlIENoYXJhY3Rlci5MT1dFUkNBU0VfTEVUVEVSOiAgICAgIC8vIEwKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuVElUTEVDQVNFX0xFVFRFUjogICAgICAvLyBMCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLk1PRElGSUVSX0xFVFRFUjogICAgICAgLy8gTAotICAgICAgICBjYXNlIENoYXJhY3Rlci5PVEhFUl9MRVRURVI6ICAgICAgICAgIC8vIEwKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTEVUVEVSX05VTUJFUjogICAgICAgICAvLyBOCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRFQ0lNQUxfRElHSVRfTlVNQkVSOiAgLy8gTgotICAgICAgICBjYXNlIENoYXJhY3Rlci5PVEhFUl9OVU1CRVI6ICAgICAgICAgIC8vIE4KLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuQ09NQklOSU5HX1NQQUNJTkdfTUFSSzogLy8gTWMKLSAgICAgICAgICAgIHJldHVybiBXVF9MRVRURVI7Ci0KLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRk9STUFUOiAgICAgICAgICAgICAgICAvLyBDZgotICAgICAgICBjYXNlIENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLOiAgICAgIC8vIE1uCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkVOQ0xPU0lOR19NQVJLOiAgICAgICAgLy8gTWMKLSAgICAgICAgICAgIHJldHVybiBXVF9JR05PUkU7Ci0KLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuQ09OVFJPTDogICAgICAgICAgICAgICAvLyBDYwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1RfT1RIRVI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBXVF9JR05PUkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBXVF9PVEhFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTElORV9GRUVEID0gMHgwMDBBOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FSUklBR0VfUkVUVVJOID0gMHgwMDBEOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTElORV9TRVBBUkFUT1IgPSAweDIwMjg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBQQVJBR1JBUEhfU0VQQVJBVE9SID0gMHgyMDI5OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0VPTENoYXIoaW50IGNoKSB7Ci0gICAgICAgIHJldHVybiBjaCA9PSBMSU5FX0ZFRUQgfHwgY2ggPT0gQ0FSUklBR0VfUkVUVVJOIHx8IGNoID09IExJTkVfU0VQQVJBVE9SCi0gICAgICAgIHx8IGNoID09IFBBUkFHUkFQSF9TRVBBUkFUT1I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1dvcmRDaGFyKGludCBjaCkgeyAvLyBMZWdhY3kgd29yZCBjaGFyYWN0ZXJzCi0gICAgICAgIGlmIChjaCA9PSAnXycpICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNoIDwgJzAnKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY2ggPiAneicpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChjaCA8PSAnOScpICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNoIDwgJ0EnKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY2ggPD0gJ1onKSAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjaCA8ICdhJykgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBtYXRjaElnbm9yZUNhc2UoaW50IGNoYXJkYXRhLCBpbnQgY2gpIHsKLSAgICAgICAgaWYgKGNoYXJkYXRhID09IGNoKSAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjaGFyZGF0YSA+IDB4ZmZmZiB8fCBjaCA+IDB4ZmZmZikgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2hhciB1Y2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoYXJkYXRhKTsKLSAgICAgICAgY2hhciB1Y2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1NjaGVtYVJlZ3VsYXJFeHByZXNzaW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1NjaGVtYVJlZ3VsYXJFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMmFkZTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9TY2hlbWFSZWd1bGFyRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUmVndWxhckV4cHJlc3Npb24gZXh0ZW5kcyBSZWd1bGFyRXhwcmVzc2lvbgotewotICAgIHByaXZhdGUgU2NoZW1hUmVndWxhckV4cHJlc3Npb24oU3RyaW5nIHBhdHRlcm4pCi0gICAgewotICAgICAgICBzdXBlcihwYXR0ZXJuLCAiWCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVndWxhckV4cHJlc3Npb24gZm9yUGF0dGVybihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uIHRyZSA9IChTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbilrbm93blBhdHRlcm5zLmdldChzKTsKLSAgICAgICAgaWYgKHRyZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRyZTsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWd1bGFyRXhwcmVzc2lvbihzLCAiWCIpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBNYXAga25vd25QYXR0ZXJucyA9IGJ1aWxkS25vd25QYXR0ZXJuTWFwKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRLbm93blBhdHRlcm5NYXAoKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoIlxcYysiLCBuZXcgU2NoZW1hUmVndWxhckV4cHJlc3Npb24oIlxcYysiKQotICAgICAgICAgICAgeyBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzKSB7IHJldHVybiBYTUxDaGFyLmlzVmFsaWRObXRva2VuKHMpOyB9IH0gKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiXFxpXFxjKiIsIG5ldyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbigiXFxpXFxjKiIpCi0gICAgICAgICAgICB7IHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHMpIHsgcmV0dXJuIFhNTENoYXIuaXNWYWxpZE5hbWUocyk7IH0gfSApOwotICAgICAgICByZXN1bHQucHV0KCJbXFxpLVs6XV1bXFxjLVs6XV0qIiwgbmV3IFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKCJbXFxpLVs6XV1bXFxjLVs6XV0qIikKLSAgICAgICAgICAgIHsgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcykgeyByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKHMpOyB9IH0gKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1Rva2VuLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MzEyZWUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCi0gKi8KLWNsYXNzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UVE9LRU5TID0gdHJ1ZTsKLSAgICBzdGF0aWMgaW50IHRva2VucyA9IDA7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVIgPSAwOyAgICAgICAgICAgICAgICAgIC8vIExpdGVyYWwgY2hhcgotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9UID0gMTE7ICAgICAgICAgICAgICAgICAgLy8gLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0FUID0gMTsgICAgICAgICAgICAgICAgLy8gWFkKLSAgICBzdGF0aWMgZmluYWwgaW50IFVOSU9OID0gMjsgICAgICAgICAgICAgICAgIC8vIFh8WXxaCi0gICAgc3RhdGljIGZpbmFsIGludCBDTE9TVVJFID0gMzsgICAgICAgICAgICAgICAvLyBYKgotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkFOR0UgPSA0OyAgICAgICAgICAgICAgICAgLy8gW2EtekEtWl0gZXRjLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgTlJBTkdFID0gNTsgICAgICAgICAgICAgICAgLy8gW15hLXpBLVpdIGV0Yy4KLSAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOID0gNjsgICAgICAgICAgICAgICAgIC8vIChYKSBvciAoPzpYKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSA3OyAgICAgICAgICAgICAgICAgLy8KLSAgICBzdGF0aWMgZmluYWwgaW50IEFOQ0hPUiA9IDg7ICAgICAgICAgICAgICAgIC8vIF4gJCBcYiBcQiBcPCBcPiBcQSBcWiBcegotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9OR1JFRURZQ0xPU1VSRSA9IDk7ICAgICAgLy8gKj8gKz8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklORyA9IDEwOyAgICAgICAgICAgICAgIC8vIHN0cmluZ3MKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tSRUZFUkVOQ0UgPSAxMjsgICAgICAgIC8vIGJhY2sgcmVmZXJlbmNlcwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS0FIRUFEID0gMjA7ICAgICAgICAgICAgLy8gKD89Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQUhFQUQgPSAyMTsgICAgLy8gKD8hLi4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS0JFSElORCA9IDIyOyAgICAgICAgICAgLy8gKD88PS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFTE9PS0JFSElORCA9IDIzOyAgIC8vICg/PCEuLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBJTkRFUEVOREVOVCA9IDI0OyAgICAgICAgICAvLyAoPz4uLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBNT0RJRklFUkdST1VQID0gMjU7ICAgICAgICAvLyAoP2ltcy1pbXM6Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OID0gMjY7ICAgICAgICAgICAgLy8gKD8oLi4uKXllc3xubykKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVRGMTZfTUFYID0gMHgxMGZmZmY7Ci0KLSAgICBpbnQgdHlwZTsKLQotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9kb3Q7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuXzB0bzk7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX3dvcmRjaGFyczsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbm90XzB0bzk7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX25vdF93b3JkY2hhcnM7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX3NwYWNlczsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbm90X3NwYWNlczsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fZW1wdHk7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX2xpbmViZWdpbm5pbmc7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX2xpbmViZWdpbm5pbmcyOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9saW5lZW5kOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9zdHJpbmdiZWdpbm5pbmc7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX3N0cmluZ2VuZDsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fc3RyaW5nZW5kMjsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fd29yZGVkZ2U7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX25vdF93b3JkZWRnZTsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fd29yZGJlZ2lubmluZzsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fd29yZGVuZDsKLSAgICBzdGF0aWMgewotICAgICAgICBUb2tlbi50b2tlbl9lbXB0eSA9IG5ldyBUb2tlbihUb2tlbi5FTVBUWSk7Ci0KLSAgICAgICAgVG9rZW4udG9rZW5fbGluZWJlZ2lubmluZyA9IFRva2VuLmNyZWF0ZUFuY2hvcignXicpOwotICAgICAgICBUb2tlbi50b2tlbl9saW5lYmVnaW5uaW5nMiA9IFRva2VuLmNyZWF0ZUFuY2hvcignQCcpOwotICAgICAgICBUb2tlbi50b2tlbl9saW5lZW5kID0gVG9rZW4uY3JlYXRlQW5jaG9yKCckJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3N0cmluZ2JlZ2lubmluZyA9IFRva2VuLmNyZWF0ZUFuY2hvcignQScpOwotICAgICAgICBUb2tlbi50b2tlbl9zdHJpbmdlbmQgPSBUb2tlbi5jcmVhdGVBbmNob3IoJ3onKTsKLSAgICAgICAgVG9rZW4udG9rZW5fc3RyaW5nZW5kMiA9IFRva2VuLmNyZWF0ZUFuY2hvcignWicpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkZWRnZSA9IFRva2VuLmNyZWF0ZUFuY2hvcignYicpOwotICAgICAgICBUb2tlbi50b2tlbl9ub3Rfd29yZGVkZ2UgPSBUb2tlbi5jcmVhdGVBbmNob3IoJ0InKTsKLSAgICAgICAgVG9rZW4udG9rZW5fd29yZGJlZ2lubmluZyA9IFRva2VuLmNyZWF0ZUFuY2hvcignPCcpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkZW5kID0gVG9rZW4uY3JlYXRlQW5jaG9yKCc+Jyk7Ci0KLSAgICAgICAgVG9rZW4udG9rZW5fZG90ID0gbmV3IFRva2VuKFRva2VuLkRPVCk7Ci0KLSAgICAgICAgVG9rZW4udG9rZW5fMHRvOSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIFRva2VuLnRva2VuXzB0bzkuYWRkUmFuZ2UoJzAnLCAnOScpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkY2hhcnMgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkY2hhcnMuYWRkUmFuZ2UoJzAnLCAnOScpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkY2hhcnMuYWRkUmFuZ2UoJ0EnLCAnWicpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkY2hhcnMuYWRkUmFuZ2UoJ18nLCAnXycpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkY2hhcnMuYWRkUmFuZ2UoJ2EnLCAneicpOwotICAgICAgICBUb2tlbi50b2tlbl9zcGFjZXMgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICBUb2tlbi50b2tlbl9zcGFjZXMuYWRkUmFuZ2UoJ1x0JywgJ1x0Jyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3NwYWNlcy5hZGRSYW5nZSgnXG4nLCAnXG4nKTsKLSAgICAgICAgVG9rZW4udG9rZW5fc3BhY2VzLmFkZFJhbmdlKCdcZicsICdcZicpOwotICAgICAgICBUb2tlbi50b2tlbl9zcGFjZXMuYWRkUmFuZ2UoJ1xyJywgJ1xyJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3NwYWNlcy5hZGRSYW5nZSgnICcsICcgJyk7Ci0KLSAgICAgICAgVG9rZW4udG9rZW5fbm90XzB0bzkgPSBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKFRva2VuLnRva2VuXzB0bzkpOwotICAgICAgICBUb2tlbi50b2tlbl9ub3Rfd29yZGNoYXJzID0gVG9rZW4uY29tcGxlbWVudFJhbmdlcyhUb2tlbi50b2tlbl93b3JkY2hhcnMpOwotICAgICAgICBUb2tlbi50b2tlbl9ub3Rfc3BhY2VzID0gVG9rZW4uY29tcGxlbWVudFJhbmdlcyhUb2tlbi50b2tlbl9zcGFjZXMpOwotICAgIH0KLQotICAgIHN0YXRpYyBUb2tlbi5QYXJlblRva2VuIGNyZWF0ZUxvb2soaW50IHR5cGUsIFRva2VuIGNoaWxkKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5QYXJlblRva2VuKHR5cGUsIGNoaWxkLCAwKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLlBhcmVuVG9rZW4gY3JlYXRlUGFyZW4oVG9rZW4gY2hpbGQsIGludCBwbnVtYmVyKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5QYXJlblRva2VuKFRva2VuLlBBUkVOLCBjaGlsZCwgcG51bWJlcik7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5DbG9zdXJlVG9rZW4gY3JlYXRlQ2xvc3VyZShUb2tlbiB0b2spIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNsb3N1cmVUb2tlbihUb2tlbi5DTE9TVVJFLCB0b2spOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4uQ2xvc3VyZVRva2VuIGNyZWF0ZU5HQ2xvc3VyZShUb2tlbiB0b2spIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNsb3N1cmVUb2tlbihUb2tlbi5OT05HUkVFRFlDTE9TVVJFLCB0b2spOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4uQ29uY2F0VG9rZW4gY3JlYXRlQ29uY2F0KFRva2VuIHRvazEsIFRva2VuIHRvazIpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNvbmNhdFRva2VuKHRvazEsIHRvazIpOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4uVW5pb25Ub2tlbiBjcmVhdGVDb25jYXQoKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5VbmlvblRva2VuKFRva2VuLkNPTkNBVCk7IC8vICoqKiBJdCBpcyBub3QgYSBidWcuCi0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5VbmlvblRva2VuIGNyZWF0ZVVuaW9uKCkgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uVW5pb25Ub2tlbihUb2tlbi5VTklPTik7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbiBjcmVhdGVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2VtcHR5OwotICAgIH0KLSAgICBzdGF0aWMgUmFuZ2VUb2tlbiBjcmVhdGVSYW5nZSgpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFJhbmdlVG9rZW4oVG9rZW4uUkFOR0UpOwotICAgIH0KLSAgICBzdGF0aWMgUmFuZ2VUb2tlbiBjcmVhdGVOUmFuZ2UoKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVRva2VuKFRva2VuLk5SQU5HRSk7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5DaGFyVG9rZW4gY3JlYXRlQ2hhcihpbnQgY2gpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNoYXJUb2tlbihUb2tlbi5DSEFSLCBjaCk7Ci0gICAgfQotICAgIHN0YXRpYyBwcml2YXRlIFRva2VuLkNoYXJUb2tlbiBjcmVhdGVBbmNob3IoaW50IGNoKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5DaGFyVG9rZW4oVG9rZW4uQU5DSE9SLCBjaCk7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5TdHJpbmdUb2tlbiBjcmVhdGVCYWNrUmVmZXJlbmNlKGludCByZWZubykgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uU3RyaW5nVG9rZW4oVG9rZW4uQkFDS1JFRkVSRU5DRSwgbnVsbCwgcmVmbm8pOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4uU3RyaW5nVG9rZW4gY3JlYXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLlN0cmluZ1Rva2VuKFRva2VuLlNUUklORywgc3RyLCAwKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLk1vZGlmaWVyVG9rZW4gY3JlYXRlTW9kaWZpZXJHcm91cChUb2tlbiBjaGlsZCwgaW50IGFkZCwgaW50IG1hc2spIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLk1vZGlmaWVyVG9rZW4oY2hpbGQsIGFkZCwgbWFzayk7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5Db25kaXRpb25Ub2tlbiBjcmVhdGVDb25kaXRpb24oaW50IHJlZm5vLCBUb2tlbiBjb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiB5ZXNwYXQsIFRva2VuIG5vcGF0KSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5Db25kaXRpb25Ub2tlbihyZWZubywgY29uZGl0aW9uLCB5ZXNwYXQsIG5vcGF0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVG9rZW4oaW50IHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFRva2VuIGdldENoaWxkKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgdm9pZCBhZGRDaGlsZChUb2tlbiB0b2spIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgUkFOR0Ugb3IgTlJBTkdFCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzb3J0UmFuZ2VzKCkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFjdFJhbmdlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIG1lcmdlUmFuZ2VzKFRva2VuIHRvaykgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc3VidHJhY3RSYW5nZXMoVG9rZW4gdG9rKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcnNlY3RSYW5nZXMoVG9rZW4gdG9rKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4gY29tcGxlbWVudFJhbmdlcyhUb2tlbiB0b2spIHsKLSAgICAgICAgcmV0dXJuIFJhbmdlVG9rZW4uY29tcGxlbWVudFJhbmdlcyh0b2spOwotICAgIH0KLQotCi0gICAgdm9pZCBzZXRNaW4oaW50IG1pbikgeyAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQ0xPU1VSRQotICAgIH0KLSAgICB2b2lkIHNldE1heChpbnQgbWF4KSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBDTE9TVVJFCi0gICAgfQotICAgIGludCBnZXRNaW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIENMT1NVUkUKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgZ2V0TWF4KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBDTE9TVVJFCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGdldFJlZmVyZW5jZU51bWJlcigpIHsgICAgICAgICAgICAgICAgICAvLyBmb3IgU1RSSU5HCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBTdHJpbmcgZ2V0U3RyaW5nKCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBTVFJJTkcKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaW50IGdldFBhcmVuTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGdldENoYXIoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygwKTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRva2VuLkRPVCA/ICIuIiA6ICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIG5lZWRlZD8KLSAgICAgKi8KLSAgICBmaW5hbCBpbnQgZ2V0TWluTGVuZ3RoKCkgewotICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewotICAgICAgICAgIGNhc2UgQ09OQ0FUOgotICAgICAgICAgICAgaW50IHN1bSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNpemUoKTsgIGkgKyspCi0gICAgICAgICAgICAgICAgc3VtICs9IHRoaXMuZ2V0Q2hpbGQoaSkuZ2V0TWluTGVuZ3RoKCk7Ci0gICAgICAgICAgICByZXR1cm4gc3VtOwotCi0gICAgICAgICAgY2FzZSBDT05ESVRJT046Ci0gICAgICAgICAgY2FzZSBVTklPTjoKLSAgICAgICAgICAgIGlmICh0aGlzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuZ2V0Q2hpbGQoMCkuZ2V0TWluTGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgIGkgPCB0aGlzLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgbWluID0gdGhpcy5nZXRDaGlsZChpKS5nZXRNaW5MZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBpZiAobWluIDwgcmV0KSAgcmV0ID0gbWluOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICAgIGNhc2UgQ0xPU1VSRToKLSAgICAgICAgICBjYXNlIE5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICBpZiAodGhpcy5nZXRNaW4oKSA+PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE1pbigpICogdGhpcy5nZXRDaGlsZCgwKS5nZXRNaW5MZW5ndGgoKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgICBjYXNlIEFOQ0hPUjoKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgY2FzZSBDSEFSOgotICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgY2FzZSBOUkFOR0U6Ci0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICAgIGNhc2UgSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgY2FzZSBQQVJFTjoKLSAgICAgICAgICBjYXNlIE1PRElGSUVSR1JPVVA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZCgwKS5nZXRNaW5MZW5ndGgoKTsKLQotICAgICAgICAgIGNhc2UgQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqKioqKioKLQotICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7Ci0KLSAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKLSAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgIGNhc2UgTE9PS0JFSElORDoKLSAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqKioqIFJlYWxseT8KLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jZ2V0TWluTGVuZ3RoKCk6IEludmFsaWQgVHlwZTogIit0aGlzLnR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgaW50IGdldE1heExlbmd0aCgpIHsKLSAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKLSAgICAgICAgICBjYXNlIENPTkNBVDoKLSAgICAgICAgICAgIGludCBzdW0gPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGQgPSB0aGlzLmdldENoaWxkKGkpLmdldE1heExlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmIChkIDwgMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBzdW0gKz0gZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdW07Ci0KLSAgICAgICAgICBjYXNlIENPTkRJVElPTjoKLSAgICAgICAgICBjYXNlIFVOSU9OOgotICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy5nZXRDaGlsZCgwKS5nZXRNYXhMZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyAgcmV0ID49IDAgJiYgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgIGludCBtYXggPSB0aGlzLmdldENoaWxkKGkpLmdldE1heExlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmIChtYXggPCAwKSB7ICAgICAgICAgICAgICAgICAgLy8gaW5maW5pdHkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWF4ID4gcmV0KSAgcmV0ID0gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICAgIGNhc2UgQ0xPU1VSRToKLSAgICAgICAgICBjYXNlIE5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICBpZiAodGhpcy5nZXRNYXgoKSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGlzLmNoaWxkLmdldE1heExlbmd0aCgpIDwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJucyBtaW51cyB2YWx1ZQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE1heCgpICogdGhpcy5nZXRDaGlsZCgwKS5nZXRNYXhMZW5ndGgoKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgICAgY2FzZSBBTkNIT1I6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgIGNhc2UgQ0hBUjoKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgY2FzZSBOUkFOR0U6Ci0gICAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICAgIGNhc2UgSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgY2FzZSBQQVJFTjoKLSAgICAgICAgICBjYXNlIE1PRElGSUVSR1JPVVA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZCgwKS5nZXRNYXhMZW5ndGgoKTsKLQotICAgICAgICAgIGNhc2UgQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqKioqKgotCi0gICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKLQotICAgICAgICAgIGNhc2UgTE9PS0FIRUFEOgotICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgY2FzZSBMT09LQkVISU5EOgotICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKiogUmVhbGx5PwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNnZXRNYXhMZW5ndGgoKTogSW52YWxpZCBUeXBlOiAiK3RoaXMudHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEZDX0NPTlRJTlVFID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZDX1RFUk1JTkFMID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZDX0FOWSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1NldChpbnQgb3B0aW9ucywgaW50IGZsYWcpIHsKLSAgICAgICAgcmV0dXJuIChvcHRpb25zICYgZmxhZykgPT0gZmxhZzsKLSAgICB9Ci0gICAgZmluYWwgaW50IGFuYWx5emVGaXJzdENoYXJhY3RlcihSYW5nZVRva2VuIHJlc3VsdCwgaW50IG9wdGlvbnMpIHsKLSAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKLSAgICAgICAgICBjYXNlIENPTkNBVDoKLSAgICAgICAgICAgIGludCByZXQgPSBGQ19DT05USU5VRTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHRoaXMuZ2V0Q2hpbGQoaSkuYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKHJlc3VsdCwgb3B0aW9ucykpICE9IEZDX0NPTlRJTlVFKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgICBjYXNlIFVOSU9OOgotICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZDX0NPTlRJTlVFOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBhfGJ8YyAtPiBGQ19URVJNSU5BTAotICAgICAgICAgICAgICogIGF8LnxjIC0+IEZDX0FOWQotICAgICAgICAgICAgICogIGF8YnwgIC0+IEZDX0NPTlRJTlVFCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCByZXQyID0gRkNfQ09OVElOVUU7Ci0gICAgICAgICAgICBib29sZWFuIGhhc0VtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICByZXQyID0gdGhpcy5nZXRDaGlsZChpKS5hbmFseXplRmlyc3RDaGFyYWN0ZXIocmVzdWx0LCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0MiA9PSBGQ19BTlkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJldDIgPT0gRkNfQ09OVElOVUUpCi0gICAgICAgICAgICAgICAgICAgIGhhc0VtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYXNFbXB0eSA/IEZDX0NPTlRJTlVFIDogcmV0MjsKLQotICAgICAgICAgIGNhc2UgQ09ORElUSU9OOgotICAgICAgICAgICAgaW50IHJldDMgPSB0aGlzLmdldENoaWxkKDApLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOwotICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID09IDEpICByZXR1cm4gRkNfQ09OVElOVUU7Ci0gICAgICAgICAgICBpZiAocmV0MyA9PSBGQ19BTlkpICByZXR1cm4gcmV0MzsKLSAgICAgICAgICAgIGludCByZXQ0ID0gdGhpcy5nZXRDaGlsZCgxKS5hbmFseXplRmlyc3RDaGFyYWN0ZXIocmVzdWx0LCBvcHRpb25zKTsKLSAgICAgICAgICAgIGlmIChyZXQ0ID09IEZDX0FOWSkgIHJldHVybiByZXQ0OwotICAgICAgICAgICAgcmV0dXJuIHJldDMgPT0gRkNfQ09OVElOVUUgfHwgcmV0NCA9PSBGQ19DT05USU5VRSA/IEZDX0NPTlRJTlVFIDogRkNfVEVSTUlOQUw7Ci0KLSAgICAgICAgICBjYXNlIENMT1NVUkU6Ci0gICAgICAgICAgY2FzZSBOT05HUkVFRFlDTE9TVVJFOgotICAgICAgICAgICAgdGhpcy5nZXRDaGlsZCgwKS5hbmFseXplRmlyc3RDaGFyYWN0ZXIocmVzdWx0LCBvcHRpb25zKTsKLSAgICAgICAgICAgIHJldHVybiBGQ19DT05USU5VRTsKLQotICAgICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgICAgY2FzZSBBTkNIT1I6Ci0gICAgICAgICAgICByZXR1cm4gRkNfQ09OVElOVUU7Ci0KLSAgICAgICAgICBjYXNlIENIQVI6Ci0gICAgICAgICAgICBpbnQgY2ggPSB0aGlzLmdldENoYXIoKTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShjaCwgY2gpOwotICAgICAgICAgICAgaWYgKGNoIDwgMHgxMDAwMCAmJiBpc1NldChvcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5JR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpY2gpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShjaCwgY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZDX1RFUk1JTkFMOwotCi0gICAgICAgICAgY2FzZSBET1Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKioqCi0gICAgICAgICAgICBpZiAoaXNTZXQob3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZDX0NPTlRJTlVFOyAgICAgICAgICAgICAvLyAqKioqIFdlIGNhbiBub3Qgb3B0aW1pemUuCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBGQ19DT05USU5VRTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZSgwLCBSZWd1bGFyRXhwcmVzc2lvbi5MSU5FX0ZFRUQtMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKFJlZ3VsYXJFeHByZXNzaW9uLkxJTkVfRkVFRCsxLCBSZWd1bGFyRXhwcmVzc2lvbi5DQVJSSUFHRV9SRVRVUk4tMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKFJlZ3VsYXJFeHByZXNzaW9uLkNBUlJJQUdFX1JFVFVSTisxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbi5MSU5FX1NFUEFSQVRPUi0xKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoUmVndWxhckV4cHJlc3Npb24uUEFSQUdSQVBIX1NFUEFSQVRPUisxLCBVVEYxNl9NQVgpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAgICAgaWYgKGlzU2V0KG9wdGlvbnMsIFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5tZXJnZVJhbmdlcygoKFJhbmdlVG9rZW4pdGhpcykuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5tZXJnZVJhbmdlcyh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBGQ19URVJNSU5BTDsKLQotICAgICAgICAgIGNhc2UgTlJBTkdFOiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKgotICAgICAgICAgICAgaWYgKGlzU2V0KG9wdGlvbnMsIFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5tZXJnZVJhbmdlcyhUb2tlbi5jb21wbGVtZW50UmFuZ2VzKCgoUmFuZ2VUb2tlbil0aGlzKS5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5tZXJnZVJhbmdlcyhUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRoaXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBGQ19URVJNSU5BTDsKLQotICAgICAgICAgIGNhc2UgSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgY2FzZSBQQVJFTjoKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOwotCi0gICAgICAgICAgY2FzZSBNT0RJRklFUkdST1VQOgotICAgICAgICAgICAgb3B0aW9ucyB8PSAoKE1vZGlmaWVyVG9rZW4pdGhpcykuZ2V0T3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucyAmPSB+KChNb2RpZmllclRva2VuKXRoaXMpLmdldE9wdGlvbnNNYXNrKCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZCgwKS5hbmFseXplRmlyc3RDaGFyYWN0ZXIocmVzdWx0LCBvcHRpb25zKTsKLQotICAgICAgICAgIGNhc2UgQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZSgwLCBVVEYxNl9NQVgpOyAgLy8gKioqKiBXZSBjYW4gbm90IG9wdGltaXplLgotICAgICAgICAgICAgcmV0dXJuIEZDX0FOWTsKLQotICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgaW50IGNoYSA9IHRoaXMuZ2V0U3RyaW5nKCkuY2hhckF0KDApOwotICAgICAgICAgICAgaW50IGNoMjsKLSAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoYSkKLSAgICAgICAgICAgICAgICAmJiB0aGlzLmdldFN0cmluZygpLmxlbmd0aCgpID49IDIKLSAgICAgICAgICAgICAgICAmJiBSRVV0aWwuaXNMb3dTdXJyb2dhdGUoKGNoMiA9IHRoaXMuZ2V0U3RyaW5nKCkuY2hhckF0KDEpKSkpCi0gICAgICAgICAgICAgICAgY2hhID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaGEsIGNoMik7Ci0gICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoY2hhLCBjaGEpOwotICAgICAgICAgICAgaWYgKGNoYSA8IDB4MTAwMDAgJiYgaXNTZXQob3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgY2hhID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoYSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKGNoYSwgY2hhKTsKLSAgICAgICAgICAgICAgICBjaGEgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpY2hhKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoY2hhLCBjaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZDX1RFUk1JTkFMOwotCi0gICAgICAgICAgY2FzZSBMT09LQUhFQUQ6Ci0gICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICBjYXNlIExPT0tCRUhJTkQ6Ci0gICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICByZXR1cm4gRkNfQ09OVElOVUU7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2FuYWx5emVIZWFkQ2hhcmFjdGVyKCk6IEludmFsaWQgVHlwZTogIit0aGlzLnR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2hvcnRlclRoYW4oVG9rZW4gdG9rKSB7Ci0gICAgICAgIGlmICh0b2sgPT0gbnVsbCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLyoKLSAgICAgICAgaW50IG15bGVuZ3RoOwotICAgICAgICBpZiAodGhpcy50eXBlID09IFNUUklORykgIG15bGVuZ3RoID0gdGhpcy5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKLSAgICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09IENIQVIpICBteWxlbmd0aCA9IHRoaXMuZ2V0Q2hhcigpID49IDB4MTAwMDAgPyAyIDogMTsKLSAgICAgICAgZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IElsbGVnYWwgdHlwZTogIit0aGlzLnR5cGUpOwotICAgICAgICBpbnQgb3RoZXJsZW5ndGg7Ci0gICAgICAgIGlmICh0b2sudHlwZSA9PSBTVFJJTkcpICBvdGhlcmxlbmd0aCA9IHRvay5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKLSAgICAgICAgZWxzZSBpZiAodG9rLnR5cGUgPT0gQ0hBUikgIG90aGVybGVuZ3RoID0gdG9rLmdldENoYXIoKSA+PSAweDEwMDAwID8gMiA6IDE7Ci0gICAgICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBJbGxlZ2FsIHR5cGU6ICIrdG9rLnR5cGUpOwotICAgICAgICAqLwotICAgICAgICBpbnQgbXlsZW5ndGg7Ci0gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gU1RSSU5HKSAgbXlsZW5ndGggPSB0aGlzLmdldFN0cmluZygpLmxlbmd0aCgpOwotICAgICAgICBlbHNlIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogSWxsZWdhbCB0eXBlOiAiK3RoaXMudHlwZSk7Ci0gICAgICAgIGludCBvdGhlcmxlbmd0aDsKLSAgICAgICAgaWYgKHRvay50eXBlID09IFNUUklORykgIG90aGVybGVuZ3RoID0gdG9rLmdldFN0cmluZygpLmxlbmd0aCgpOwotICAgICAgICBlbHNlIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogSWxsZWdhbCB0eXBlOiAiK3Rvay50eXBlKTsKLSAgICAgICAgcmV0dXJuIG15bGVuZ3RoIDwgb3RoZXJsZW5ndGg7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEZpeGVkU3RyaW5nQ29udGFpbmVyIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBudWxsOwotICAgICAgICBpbnQgb3B0aW9ucyA9IDA7Ci0gICAgICAgIEZpeGVkU3RyaW5nQ29udGFpbmVyKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBmaW5kRml4ZWRTdHJpbmcoRml4ZWRTdHJpbmdDb250YWluZXIgY29udGFpbmVyLCBpbnQgb3B0aW9ucykgewotICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewotICAgICAgICAgIGNhc2UgQ09OQ0FUOgotICAgICAgICAgICAgVG9rZW4gcHJldlRva2VuID0gbnVsbDsKLSAgICAgICAgICAgIGludCBwcmV2T3B0aW9ucyA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLmdldENoaWxkKGkpLmZpbmRGaXhlZFN0cmluZyhjb250YWluZXIsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIGlmIChwcmV2VG9rZW4gPT0gbnVsbCB8fCBwcmV2VG9rZW4uaXNTaG9ydGVyVGhhbihjb250YWluZXIudG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZUb2tlbiA9IGNvbnRhaW5lci50b2tlbjsKLSAgICAgICAgICAgICAgICAgICAgcHJldk9wdGlvbnMgPSBjb250YWluZXIub3B0aW9uczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250YWluZXIudG9rZW4gPSBwcmV2VG9rZW47Ci0gICAgICAgICAgICBjb250YWluZXIub3B0aW9ucyA9IHByZXZPcHRpb25zOwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgY2FzZSBVTklPTjoKLSAgICAgICAgICBjYXNlIENMT1NVUkU6Ci0gICAgICAgICAgY2FzZSBOT05HUkVFRFlDTE9TVVJFOgotICAgICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgICAgY2FzZSBBTkNIT1I6Ci0gICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICBjYXNlIERPVDoKLSAgICAgICAgICBjYXNlIE5SQU5HRToKLSAgICAgICAgICBjYXNlIEJBQ0tSRUZFUkVOQ0U6Ci0gICAgICAgICAgY2FzZSBMT09LQUhFQUQ6Ci0gICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICBjYXNlIExPT0tCRUhJTkQ6Ci0gICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgY2FzZSBDT05ESVRJT046Ci0gICAgICAgICAgICBjb250YWluZXIudG9rZW4gPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgY2FzZSBDSEFSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgQ0hBUiB0b2tlbnMuCi0gICAgICAgICAgICBjb250YWluZXIudG9rZW4gPSBudWxsOyAgICAgICAgICAgICAvLyAqKgotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioKLQotICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgY29udGFpbmVyLnRva2VuID0gdGhpczsKLSAgICAgICAgICAgIGNvbnRhaW5lci5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIGNhc2UgSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgY2FzZSBQQVJFTjoKLSAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGQoMCkuZmluZEZpeGVkU3RyaW5nKGNvbnRhaW5lciwgb3B0aW9ucyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICBjYXNlIE1PRElGSUVSR1JPVVA6Ci0gICAgICAgICAgICBvcHRpb25zIHw9ICgoTW9kaWZpZXJUb2tlbil0aGlzKS5nZXRPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zICY9IH4oKE1vZGlmaWVyVG9rZW4pdGhpcykuZ2V0T3B0aW9uc01hc2soKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGQoMCkuZmluZEZpeGVkU3RyaW5nKGNvbnRhaW5lciwgb3B0aW9ucyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2ZpbmRGaXhlZFN0cmluZygpOiBJbnZhbGlkIFR5cGU6ICIrdGhpcy50eXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gbWF0Y2goaW50IGNoKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJORkFBcnJvdyNtYXRjaCgpOiBJbnRlcm5hbCBlcnJvcjogIit0aGlzLnR5cGUpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2h0YWJsZSBjYXRlZ29yaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2h0YWJsZSBjYXRlZ29yaWVzMiA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjYXRlZ29yeU5hbWVzID0gewotICAgICAgICAiQ24iLCAiTHUiLCAiTGwiLCAiTHQiLCAiTG0iLCAiTG8iLCAiTW4iLCAiTWUiLCAiTWMiLCAiTmQiLAotICAgICAgICAiTmwiLCAiTm8iLCAiWnMiLCAiWmwiLCAiWnAiLCAiQ2MiLCAiQ2YiLCBudWxsLCAiQ28iLCAiQ3MiLAotICAgICAgICAiUGQiLCAiUHMiLCAiUGUiLCAiUGMiLCAiUG8iLCAiU20iLCAiU2MiLCAiU2siLCAiU28iLCAvLyAyOAotICAgICAgICAiUGkiLCAiUGYiLCAgLy8gMjksIDMwCi0gICAgICAgICJMIiwgIk0iLCAiTiIsICJaIiwgIkMiLCAiUCIsICJTIiwgICAgICAvLyAzMS0zNwotICAgIH07Ci0KLSAgICAvLyBTY2hlbWEgUmVjLiB7RGF0YXR5cGVzfSAtIFB1bmN0dWF0aW9uIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9JTklUX1FVT1RFICA9IDI5OyAgICAgLy8gUGkgLSBpbml0aWFsIHF1b3RlCi0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX0ZJTkFMX1FVT1RFID0gMzA7ICAgICAvLyBQZiAtIGZpbmFsIHF1b3RlCi0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX0xFVFRFUiA9IDMxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9NQVJLID0gMzI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX05VTUJFUiA9IDMzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9TRVBBUkFUT1IgPSAzNDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfT1RIRVIgPSAzNTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfUFVOQ1RVQVRJT04gPSAzNjsKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfU1lNQk9MID0gMzc7Ci0gICAgCi0gICAgLy9ibG9ja05hbWVzIGluIFVOSUNPREUgMy4xIHRoYXQgc3VwcG9ydGVkIGJ5IFhNTCBTY2hlbWEgUkVDICAgICAgICAgICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGJsb2NrTmFtZXMgPSB7Ci0gICAgICAgIC8qMDAwMC4uMDA3RjsqLyAiQmFzaWMgTGF0aW4iLAotICAgICAgICAvKjAwODAuLjAwRkY7Ki8gIkxhdGluLTEgU3VwcGxlbWVudCIsCi0gICAgICAgIC8qMDEwMC4uMDE3RjsqLyAiTGF0aW4gRXh0ZW5kZWQtQSIsCi0gICAgICAgIC8qMDE4MC4uMDI0RjsqLyAiTGF0aW4gRXh0ZW5kZWQtQiIsCi0gICAgICAgIC8qMDI1MC4uMDJBRjsqLyAiSVBBIEV4dGVuc2lvbnMiLAotICAgICAgICAvKjAyQjAuLjAyRkY7Ki8gIlNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyIsCi0gICAgICAgIC8qMDMwMC4uMDM2RjsqLyAiQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIiwKLSAgICAgICAgLyowMzcwLi4wM0ZGOyovICJHcmVlayIsCi0gICAgICAgIC8qMDQwMC4uMDRGRjsqLyAiQ3lyaWxsaWMiLAotICAgICAgICAvKjA1MzAuLjA1OEY7Ki8gIkFybWVuaWFuIiwKLSAgICAgICAgLyowNTkwLi4wNUZGOyovICJIZWJyZXciLAotICAgICAgICAvKjA2MDAuLjA2RkY7Ki8gIkFyYWJpYyIsCi0gICAgICAgIC8qMDcwMC4uMDc0RjsqLyAiU3lyaWFjIiwgIAotICAgICAgICAvKjA3ODAuLjA3QkY7Ki8gIlRoYWFuYSIsCi0gICAgICAgIC8qMDkwMC4uMDk3RjsqLyAiRGV2YW5hZ2FyaSIsCi0gICAgICAgIC8qMDk4MC4uMDlGRjsqLyAiQmVuZ2FsaSIsCi0gICAgICAgIC8qMEEwMC4uMEE3RjsqLyAiR3VybXVraGkiLAotICAgICAgICAvKjBBODAuLjBBRkY7Ki8gIkd1amFyYXRpIiwKLSAgICAgICAgLyowQjAwLi4wQjdGOyovICJPcml5YSIsCi0gICAgICAgIC8qMEI4MC4uMEJGRjsqLyAiVGFtaWwiLAotICAgICAgICAvKjBDMDAuLjBDN0Y7Ki8gIlRlbHVndSIsCi0gICAgICAgIC8qMEM4MC4uMENGRjsqLyAiS2FubmFkYSIsCi0gICAgICAgIC8qMEQwMC4uMEQ3RjsqLyAiTWFsYXlhbGFtIiwKLSAgICAgICAgLyowRDgwLi4wREZGOyovICJTaW5oYWxhIiwKLSAgICAgICAgLyowRTAwLi4wRTdGOyovICJUaGFpIiwKLSAgICAgICAgLyowRTgwLi4wRUZGOyovICJMYW8iLAotICAgICAgICAvKjBGMDAuLjBGRkY7Ki8gIlRpYmV0YW4iLAotICAgICAgICAvKjEwMDAuLjEwOUY7Ki8gIk15YW5tYXIiLCAKLSAgICAgICAgLyoxMEEwLi4xMEZGOyovICJHZW9yZ2lhbiIsCi0gICAgICAgIC8qMTEwMC4uMTFGRjsqLyAiSGFuZ3VsIEphbW8iLAotICAgICAgICAvKjEyMDAuLjEzN0Y7Ki8gIkV0aGlvcGljIiwKLSAgICAgICAgLyoxM0EwLi4xM0ZGOyovICJDaGVyb2tlZSIsCi0gICAgICAgIC8qMTQwMC4uMTY3RjsqLyAiVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyIsCi0gICAgICAgIC8qMTY4MC4uMTY5RjsqLyAiT2doYW0iLAotICAgICAgICAvKjE2QTAuLjE2RkY7Ki8gIlJ1bmljIiwKLSAgICAgICAgLyoxNzgwLi4xN0ZGOyovICJLaG1lciIsCi0gICAgICAgIC8qMTgwMC4uMThBRjsqLyAiTW9uZ29saWFuIiwKLSAgICAgICAgLyoxRTAwLi4xRUZGOyovICJMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsIiwKLSAgICAgICAgLyoxRjAwLi4xRkZGOyovICJHcmVlayBFeHRlbmRlZCIsCi0gICAgICAgIC8qMjAwMC4uMjA2RjsqLyAiR2VuZXJhbCBQdW5jdHVhdGlvbiIsCi0gICAgICAgIC8qMjA3MC4uMjA5RjsqLyAiU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzIiwKLSAgICAgICAgLyoyMEEwLi4yMENGOyovICJDdXJyZW5jeSBTeW1ib2xzIiwKLSAgICAgICAgLyoyMEQwLi4yMEZGOyovICJDb21iaW5pbmcgTWFya3MgZm9yIFN5bWJvbHMiLAotICAgICAgICAvKjIxMDAuLjIxNEY7Ki8gIkxldHRlcmxpa2UgU3ltYm9scyIsCi0gICAgICAgIC8qMjE1MC4uMjE4RjsqLyAiTnVtYmVyIEZvcm1zIiwKLSAgICAgICAgLyoyMTkwLi4yMUZGOyovICJBcnJvd3MiLAotICAgICAgICAvKjIyMDAuLjIyRkY7Ki8gIk1hdGhlbWF0aWNhbCBPcGVyYXRvcnMiLAotICAgICAgICAvKjIzMDAuLjIzRkY7Ki8gIk1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIiwKLSAgICAgICAgLyoyNDAwLi4yNDNGOyovICJDb250cm9sIFBpY3R1cmVzIiwKLSAgICAgICAgLyoyNDQwLi4yNDVGOyovICJPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiIsCi0gICAgICAgIC8qMjQ2MC4uMjRGRjsqLyAiRW5jbG9zZWQgQWxwaGFudW1lcmljcyIsCi0gICAgICAgIC8qMjUwMC4uMjU3RjsqLyAiQm94IERyYXdpbmciLAotICAgICAgICAvKjI1ODAuLjI1OUY7Ki8gIkJsb2NrIEVsZW1lbnRzIiwKLSAgICAgICAgLyoyNUEwLi4yNUZGOyovICJHZW9tZXRyaWMgU2hhcGVzIiwKLSAgICAgICAgLyoyNjAwLi4yNkZGOyovICJNaXNjZWxsYW5lb3VzIFN5bWJvbHMiLAotICAgICAgICAvKjI3MDAuLjI3QkY7Ki8gIkRpbmdiYXRzIiwKLSAgICAgICAgLyoyODAwLi4yOEZGOyovICJCcmFpbGxlIFBhdHRlcm5zIiwKLSAgICAgICAgLyoyRTgwLi4yRUZGOyovICJDSksgUmFkaWNhbHMgU3VwcGxlbWVudCIsCi0gICAgICAgIC8qMkYwMC4uMkZERjsqLyAiS2FuZ3hpIFJhZGljYWxzIiwKLSAgICAgICAgLyoyRkYwLi4yRkZGOyovICJJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzIiwKLSAgICAgICAgLyozMDAwLi4zMDNGOyovICJDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24iLAotICAgICAgICAvKjMwNDAuLjMwOUY7Ki8gIkhpcmFnYW5hIiwKLSAgICAgICAgLyozMEEwLi4zMEZGOyovICJLYXRha2FuYSIsCi0gICAgICAgIC8qMzEwMC4uMzEyRjsqLyAiQm9wb21vZm8iLAotICAgICAgICAvKjMxMzAuLjMxOEY7Ki8gIkhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8iLAotICAgICAgICAvKjMxOTAuLjMxOUY7Ki8gIkthbmJ1biIsCi0gICAgICAgIC8qMzFBMC4uMzFCRjsqLyAiQm9wb21vZm8gRXh0ZW5kZWQiLAotICAgICAgICAvKjMyMDAuLjMyRkY7Ki8gIkVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMiLAotICAgICAgICAvKjMzMDAuLjMzRkY7Ki8gIkNKSyBDb21wYXRpYmlsaXR5IiwKLSAgICAgICAgLyozNDAwLi40REI1OyovICJDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBIiwKLSAgICAgICAgLyo0RTAwLi45RkZGOyovICJDSksgVW5pZmllZCBJZGVvZ3JhcGhzIiwKLSAgICAgICAgLypBMDAwLi5BNDhGOyovICJZaSBTeWxsYWJsZXMiLAotICAgICAgICAvKkE0OTAuLkE0Q0Y7Ki8gIllpIFJhZGljYWxzIiwKLSAgICAgICAgLypBQzAwLi5EN0EzOyovICJIYW5ndWwgU3lsbGFibGVzIiwKLSAgICAgICAgLypEODAwLi5EQjdGOyovICJIaWdoIFN1cnJvZ2F0ZXMiLAotICAgICAgICAvKkRCODAuLkRCRkY7Ki8gIkhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcyIsCi0gICAgICAgIC8qREMwMC4uREZGRjsqLyAiTG93IFN1cnJvZ2F0ZXMiLAotICAgICAgICAvKkUwMDAuLkY4RkY7Ki8gIlByaXZhdGUgVXNlIiwKLSAgICAgICAgLypGOTAwLi5GQUZGOyovICJDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIiwKLSAgICAgICAgLypGQjAwLi5GQjRGOyovICJBbHBoYWJldGljIFByZXNlbnRhdGlvbiBGb3JtcyIsCi0gICAgICAgIC8qRkI1MC4uRkRGRjsqLyAiQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BIiwKLSAgICAgICAgLypGRTIwLi5GRTJGOyovICJDb21iaW5pbmcgSGFsZiBNYXJrcyIsCi0gICAgICAgIC8qRkUzMC4uRkU0RjsqLyAiQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMiLAotICAgICAgICAvKkZFNTAuLkZFNkY7Ki8gIlNtYWxsIEZvcm0gVmFyaWFudHMiLAotICAgICAgICAvKkZFNzAuLkZFRkU7Ki8gIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiIsCi0gICAgICAgIC8qRkVGRi4uRkVGRjsqLyAiU3BlY2lhbHMiLAotICAgICAgICAvKkZGMDAuLkZGRUY7Ki8gIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zIiwKLSAgICAgICAgIC8vbWlzc2luZyBTcGVjaWFscyBhZGQgbWFudWFsbHkKLSAgICAgICAgLyoxMDMwMC4uMTAzMkY7Ki8gIk9sZCBJdGFsaWMiLAkJLy8gODcKLSAgICAgICAgLyoxMDMzMC4uMTAzNEY7Ki8gIkdvdGhpYyIsCi0gICAgICAgIC8qMTA0MDAuLjEwNDRGOyovICJEZXNlcmV0IiwKLSAgICAgICAgLyoxRDAwMC4uMUQwRkY7Ki8gIkJ5emFudGluZSBNdXNpY2FsIFN5bWJvbHMiLAotICAgICAgICAvKjFEMTAwLi4xRDFGRjsqLyAiTXVzaWNhbCBTeW1ib2xzIiwKLSAgICAgICAgLyoxRDQwMC4uMUQ3RkY7Ki8gIk1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scyIsCi0gICAgICAgIC8qMjAwMDAuLjJBNkQ2OyovICJDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBCIiwKLSAgICAgICAgLyoyRjgwMC4uMkZBMUY7Ki8gIkNKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCIsCi0gICAgICAgIC8qRTAwMDAuLkUwMDdGOyovICJUYWdzIiwKLSAgICAgICAgLy9taXNzaW5nIDIgcHJpdmF0ZSB1c2UgYWRkIG1hbnVhbGx5Ci0KLSAgICB9OwotICAgIC8vQUREIFRIT1NFIE1BTlVBTExZCi0gICAgLy9GMDAwMC4uRkZGRkQ7ICJQcml2YXRlIFVzZSIsCi0gICAgLy8xMDAwMDAuLjEwRkZGRDsgIlByaXZhdGUgVXNlIgotICAgIC8vRkZGMC4uRkZGRDsgIlNwZWNpYWxzIiwgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBibG9ja1JhbmdlcyA9IAotICAgICAgICJcdTAwMDBcdTAwN0ZcdTAwODBcdTAwRkZcdTAxMDBcdTAxN0ZcdTAxODBcdTAyNEZcdTAyNTBcdTAyQUZcdTAyQjBcdTAyRkZcdTAzMDBcdTAzNkYiCi0gICAgICAgICsiXHUwMzcwXHUwM0ZGXHUwNDAwXHUwNEZGXHUwNTMwXHUwNThGXHUwNTkwXHUwNUZGXHUwNjAwXHUwNkZGXHUwNzAwXHUwNzRGXHUwNzgwXHUwN0JGIgotICAgICAgICArIlx1MDkwMFx1MDk3Rlx1MDk4MFx1MDlGRlx1MEEwMFx1MEE3Rlx1MEE4MFx1MEFGRlx1MEIwMFx1MEI3Rlx1MEI4MFx1MEJGRlx1MEMwMFx1MEM3Rlx1MEM4MFx1MENGRiIKLSAgICAgICAgKyJcdTBEMDBcdTBEN0ZcdTBEODBcdTBERkZcdTBFMDBcdTBFN0ZcdTBFODBcdTBFRkZcdTBGMDBcdTBGRkZcdTEwMDBcdTEwOUZcdTEwQTBcdTEwRkZcdTExMDBcdTExRkYiCi0gICAgICAgICsiXHUxMjAwXHUxMzdGXHUxM0EwXHUxM0ZGXHUxNDAwXHUxNjdGXHUxNjgwXHUxNjlGXHUxNkEwXHUxNkZGXHUxNzgwXHUxN0ZGXHUxODAwXHUxOEFGXHUxRTAwXHUxRUZGIgotICAgICAgICArIlx1MUYwMFx1MUZGRlx1MjAwMFx1MjA2Rlx1MjA3MFx1MjA5Rlx1MjBBMFx1MjBDRlx1MjBEMFx1MjBGRlx1MjEwMFx1MjE0Rlx1MjE1MFx1MjE4Rlx1MjE5MFx1MjFGRlx1MjIwMFx1MjJGRiIKLSAgICAgICAgKyJcdTIzMDBcdTIzRkZcdTI0MDBcdTI0M0ZcdTI0NDBcdTI0NUZcdTI0NjBcdTI0RkZcdTI1MDBcdTI1N0ZcdTI1ODBcdTI1OUZcdTI1QTBcdTI1RkZcdTI2MDBcdTI2RkZcdTI3MDBcdTI3QkYiCi0gICAgICAgICsiXHUyODAwXHUyOEZGXHUyRTgwXHUyRUZGXHUyRjAwXHUyRkRGXHUyRkYwXHUyRkZGXHUzMDAwXHUzMDNGXHUzMDQwXHUzMDlGXHUzMEEwXHUzMEZGXHUzMTAwXHUzMTJGXHUzMTMwXHUzMThGIgotICAgICAgICArIlx1MzE5MFx1MzE5Rlx1MzFBMFx1MzFCRlx1MzIwMFx1MzJGRlx1MzMwMFx1MzNGRlx1MzQwMFx1NERCNVx1NEUwMFx1OUZGRlx1QTAwMFx1QTQ4Rlx1QTQ5MFx1QTRDRiIKLSAgICAgICAgKyJcdUFDMDBcdUQ3QTNcdUQ4MDBcdURCN0ZcdURCODBcdURCRkZcdURDMDBcdURGRkZcdUUwMDBcdUY4RkZcdUY5MDBcdUZBRkZcdUZCMDBcdUZCNEZcdUZCNTBcdUZERkYiCi0gICAgICAgICsiXHVGRTIwXHVGRTJGXHVGRTMwXHVGRTRGXHVGRTUwXHVGRTZGXHVGRTcwXHVGRUZFXHVGRUZGXHVGRUZGXHVGRjAwXHVGRkVGIjsKLSAgICBzdGF0aWMgZmluYWwgaW50W10gbm9uQk1QQmxvY2tSYW5nZXMgPSB7Ci0gICAgICAgIDB4MTAzMDAsIDB4MTAzMkYsICAgICAgIC8vIDg3Ci0gICAgICAgIDB4MTAzMzAsIDB4MTAzNEYsCi0gICAgICAgIDB4MTA0MDAsIDB4MTA0NEYsCi0gICAgICAgIDB4MUQwMDAsIDB4MUQwRkYsCi0gICAgICAgIDB4MUQxMDAsIDB4MUQxRkYsCi0gICAgICAgIDB4MUQ0MDAsIDB4MUQ3RkYsCi0gICAgICAgIDB4MjAwMDAsIDB4MkE2RDYsCi0gICAgICAgIDB4MkY4MDAsIDB4MkZBMUYsCi0gICAgICAgIDB4RTAwMDAsIDB4RTAwN0YKLSAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT05CTVBfQkxPQ0tfU1RBUlQgPSA4NzsKLQotICAgIHN0YXRpYyBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBnZXRSYW5nZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBwb3NpdGl2ZSkgewotICAgICAgICBpZiAoVG9rZW4uY2F0ZWdvcmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChUb2tlbi5jYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICAgICAgVG9rZW5bXSByYW5nZXMgPSBuZXcgVG9rZW5bVG9rZW4uY2F0ZWdvcnlOYW1lcy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHJhbmdlcy5sZW5ndGg7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCB0eXBlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IDB4MTAwMDA7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDaGFyYWN0ZXIuZ2V0VHlwZSgoY2hhcilpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ2hhcmFjdGVyLlNUQVJUX1BVTkNUVUFUSU9OIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDaGFyYWN0ZXIuRU5EX1BVTkNUVUFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2J1aWxkIHRhYmxlIG9mIFBpIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMHgwMEFCIHx8IGkgPT0gMHgyMDE4IHx8IGkgPT0gMHgyMDFCIHx8IGkgPT0gMHgyMDFDIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9PSAweDIwMUYgfHwgaSA9PSAweDIwMzkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9JTklUX1FVT1RFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy9idWlsZCB0YWJsZSBvZiBQZiB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDB4MDBCQiB8fCBpID09IDB4MjAxOSB8fCBpID09IDB4MjAxRCB8fCBpID09IDB4MjAzQSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9GSU5BTF9RVU9URTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByYW5nZXNbdHlwZV0uYWRkUmFuZ2UoaSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlVQUEVSQ0FTRV9MRVRURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTE9XRVJDQVNFX0xFVFRFUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5USVRMRUNBU0VfTEVUVEVSOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk1PRElGSUVSX0xFVFRFUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5PVEhFUl9MRVRURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9MRVRURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNPTUJJTklOR19TUEFDSU5HX01BUks6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRU5DTE9TSU5HX01BUks6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9NQVJLOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuREVDSU1BTF9ESUdJVF9OVU1CRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTEVUVEVSX05VTUJFUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5PVEhFUl9OVU1CRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5TUEFDRV9TRVBBUkFUT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTElORV9TRVBBUkFUT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuUEFSQUdSQVBIX1NFUEFSQVRPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX1NFUEFSQVRPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNPTlRST0w6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRk9STUFUOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlNVUlJPR0FURToKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5QUklWQVRFX1VTRToKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5VTkFTU0lHTkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENIQVJfT1RIRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5DT05ORUNUT1JfUFVOQ1RVQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuREFTSF9QVU5DVFVBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5TVEFSVF9QVU5DVFVBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5FTkRfUFVOQ1RVQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEFSX0lOSVRfUVVPVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEFSX0ZJTkFMX1FVT1RFOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX1BVTkNUVUFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENIQVJfUFVOQ1RVQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5NQVRIX1NZTUJPTDoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5DVVJSRU5DWV9TWU1CT0w6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTU9ESUZJRVJfU1lNQk9MOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX1NZTUJPTDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX1NZTUJPTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigib3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguVG9rZW4jZ2V0UmFuZ2UoKTogVW5rbm93biBVbmljb2RlIGNhdGVnb3J5OiAiK3R5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlc1t0eXBlXS5hZGRSYW5nZShpLCBpKTsKLSAgICAgICAgICAgICAgICB9IC8vIGZvciBhbGwgY2hhcmFjdGVycwotICAgICAgICAgICAgICAgIHJhbmdlc1tDaGFyYWN0ZXIuVU5BU1NJR05FRF0uYWRkUmFuZ2UoMHgxMDAwMCwgVG9rZW4uVVRGMTZfTUFYKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHJhbmdlcy5sZW5ndGg7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUb2tlbi5jYXRlZ29yeU5hbWVzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IENoYXJhY3Rlci5VTkFTU0lHTkVEKSB7IC8vIFVuYXNzaWduZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXNbaV0uYWRkUmFuZ2UoMHgxMDAwMCwgVG9rZW4uVVRGMTZfTUFYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KFRva2VuLmNhdGVnb3J5TmFtZXNbaV0sIHJhbmdlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoVG9rZW4uY2F0ZWdvcnlOYW1lc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vUkVWSVNJVDogZG8gd2UgcmVhbGx5IG5lZWQgdG8gc3VwcG9ydCBibG9jayBuYW1lcyBhcyBpbiBVbmljb2RlIDMuMQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgb3Igd2UgY2FuIGp1c3QgY3JlYXRlIGFsbCB0aGUgbmFtZXMgaW4gSXNCTE9DS05BTUUgZm9ybWF0IChYTUwgU2NoZW1hIFJFQyk/Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig1MCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgVG9rZW4uYmxvY2tOYW1lcy5sZW5ndGg7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRva2VuIHIxID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IE5PTkJNUF9CTE9DS19TVEFSVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBpKjI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnN0YXJ0ID0gVG9rZW4uYmxvY2tSYW5nZXMuY2hhckF0KGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW5kID0gVG9rZW4uYmxvY2tSYW5nZXMuY2hhckF0KGxvY2F0aW9uKzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVR0lORwotICAgICAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4obisiICIgK0ludGVnZXIudG9IZXhTdHJpbmcocnN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICArIi0iKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHJlbmQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxLmFkZFJhbmdlKHJzdGFydCwgcmVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IChpIC0gTk9OQk1QX0JMT0NLX1NUQVJUKSAqIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMS5hZGRSYW5nZShUb2tlbi5ub25CTVBCbG9ja1Jhbmdlc1tsb2NhdGlvbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5ub25CTVBCbG9ja1Jhbmdlc1tsb2NhdGlvbiArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbiA9IFRva2VuLmJsb2NrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuLmVxdWFscygiU3BlY2lhbHMiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxLmFkZFJhbmdlKDB4ZmZmMCwgMHhmZmZkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4uZXF1YWxzKCJQcml2YXRlIFVzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMS5hZGRSYW5nZSgweEYwMDAwLDB4RkZGRkQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjEuYWRkUmFuZ2UoMHgxMDAwMDAsMHgxMEZGRkQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KG4sIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KG4sIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMocjEpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiSXMiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4uaW5kZXhPZignICcpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNpID0gMDsgIGNpIDwgbi5sZW5ndGgoKTsgIGNpICsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmNoYXJBdChjaSkgIT0gJyAnKSAgYnVmZmVyLmFwcGVuZCgoY2hhciluLmNoYXJBdChjaSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcyhidWZmZXIudG9TdHJpbmcoKSwgbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVFIjMTggMS4yCi0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIkFTU0lHTkVEIiwgIkNuIiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJVTkFTU0lHTkVEIiwgIkNuIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4gYWxsID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBhbGwuYWRkUmFuZ2UoMCwgVG9rZW4uVVRGMTZfTUFYKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dCgiQUxMIiwgYWxsKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIkFMTCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoYWxsKSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiQVNTSUdORUQiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJVTkFTU0lHTkVEIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiQUxMIik7Ci0KLSAgICAgICAgICAgICAgICBUb2tlbiBpc2FscGhhID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBpc2FscGhhLm1lcmdlUmFuZ2VzKHJhbmdlc1tDaGFyYWN0ZXIuVVBQRVJDQVNFX0xFVFRFUl0pOyAvLyBMdQotICAgICAgICAgICAgICAgIGlzYWxwaGEubWVyZ2VSYW5nZXMocmFuZ2VzW0NoYXJhY3Rlci5MT1dFUkNBU0VfTEVUVEVSXSk7IC8vIExsCi0gICAgICAgICAgICAgICAgaXNhbHBoYS5tZXJnZVJhbmdlcyhyYW5nZXNbQ2hhcmFjdGVyLk9USEVSX0xFVFRFUl0pOyAvLyBMbwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc0FscGhhIiwgaXNhbHBoYSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc0FscGhhIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNBbHBoYSIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4gaXNhbG51bSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgaXNhbG51bS5tZXJnZVJhbmdlcyhpc2FscGhhKTsgICAvLyBMdSBMbCBMbwotICAgICAgICAgICAgICAgIGlzYWxudW0ubWVyZ2VSYW5nZXMocmFuZ2VzW0NoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUl0pOyAvLyBOZAotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc0FsbnVtIiwgaXNhbG51bSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc0FsbnVtIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc2FsbnVtKSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNBbG51bSIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4gaXNzcGFjZSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgaXNzcGFjZS5tZXJnZVJhbmdlcyhUb2tlbi50b2tlbl9zcGFjZXMpOwotICAgICAgICAgICAgICAgIGlzc3BhY2UubWVyZ2VSYW5nZXMocmFuZ2VzW0NIQVJfU0VQQVJBVE9SXSk7IC8vIFoKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dCgiSXNTcGFjZSIsIGlzc3BhY2UpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dCgiSXNTcGFjZSIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoaXNzcGFjZSkpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzU3BhY2UiKTsKLQotICAgICAgICAgICAgICAgIFRva2VuIGlzd29yZCA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgaXN3b3JkLm1lcmdlUmFuZ2VzKGlzYWxudW0pOyAgICAgLy8gTHUgTGwgTG8gTmQKLSAgICAgICAgICAgICAgICBpc3dvcmQuYWRkUmFuZ2UoJ18nLCAnXycpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc1dvcmQiLCBpc3dvcmQpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dCgiSXNXb3JkIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc3dvcmQpKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc1dvcmQiKTsKLQotICAgICAgICAgICAgICAgIFRva2VuIGlzYXNjaWkgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgIGlzYXNjaWkuYWRkUmFuZ2UoMCwgMTI3KTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dCgiSXNBU0NJSSIsIGlzYXNjaWkpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dCgiSXNBU0NJSSIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoaXNhc2NpaSkpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzQVNDSUkiKTsKLQotICAgICAgICAgICAgICAgIFRva2VuIGlzbm90Z3JhcGggPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgIGlzbm90Z3JhcGgubWVyZ2VSYW5nZXMocmFuZ2VzW0NIQVJfT1RIRVJdKTsKLSAgICAgICAgICAgICAgICBpc25vdGdyYXBoLmFkZFJhbmdlKCcgJywgJyAnKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dCgiSXNHcmFwaCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoaXNub3RncmFwaCkpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dCgiSXNHcmFwaCIsIGlzbm90Z3JhcGgpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzR3JhcGgiKTsKLQotICAgICAgICAgICAgICAgIFRva2VuIGlzeGRpZ2l0ID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBpc3hkaWdpdC5hZGRSYW5nZSgnMCcsICc5Jyk7Ci0gICAgICAgICAgICAgICAgaXN4ZGlnaXQuYWRkUmFuZ2UoJ0EnLCAnRicpOwotICAgICAgICAgICAgICAgIGlzeGRpZ2l0LmFkZFJhbmdlKCdhJywgJ2YnKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dCgiSXNYRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzeGRpZ2l0KSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc1hEaWdpdCIsIGlzeGRpZ2l0KTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc1hEaWdpdCIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzRGlnaXQiLCAiTmQiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNVcHBlciIsICJMdSIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJJc0xvd2VyIiwgIkxsIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzQ250cmwiLCAiQyIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJJc1ByaW50IiwgIkMiLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzUHVuY3QiLCAiUCIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzRGlnaXQiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc1VwcGVyIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNMb3dlciIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzQ250cmwiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc1ByaW50Iik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNQdW5jdCIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImFscGhhIiwgIklzQWxwaGEiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiYWxudW0iLCAiSXNBbG51bSIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJhc2NpaSIsICJJc0FTQ0lJIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImNudHJsIiwgIklzQ250cmwiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiZGlnaXQiLCAiSXNEaWdpdCIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJncmFwaCIsICJJc0dyYXBoIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImxvd2VyIiwgIklzTG93ZXIiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygicHJpbnQiLCAiSXNQcmludCIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJwdW5jdCIsICJJc1B1bmN0IiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoInNwYWNlIiwgIklzU3BhY2UiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygidXBwZXIiLCAiSXNVcHBlciIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJ3b3JkIiwgIklzV29yZCIsIHRydWUpOyAvLyBQZXJsIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJ4ZGlnaXQiLCAiSXNYRGlnaXQiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJhbHBoYSIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImFsbnVtIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiYXNjaWkiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJjbnRybCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImRpZ2l0Iik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiZ3JhcGgiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJsb3dlciIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoInByaW50Iik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygicHVuY3QiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJzcGFjZSIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoInVwcGVyIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygid29yZCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoInhkaWdpdCIpOwotICAgICAgICAgICAgfSAvLyBzeW5jaHJvbml6ZWQKLSAgICAgICAgfSAvLyBpZiBudWxsCi0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gcG9zaXRpdmUgPyAoUmFuZ2VUb2tlbilUb2tlbi5jYXRlZ29yaWVzLmdldChuYW1lKQotICAgICAgICAgICAgOiAoUmFuZ2VUb2tlbilUb2tlbi5jYXRlZ29yaWVzMi5nZXQobmFtZSk7Ci0gICAgICAgIC8vaWYgKHRvayA9PSBudWxsKSBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSk7Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIHN0YXRpYyBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBnZXRSYW5nZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBwb3NpdGl2ZSwgYm9vbGVhbiB4cykgewotICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gVG9rZW4uZ2V0UmFuZ2UobmFtZSwgcG9zaXRpdmUpOwotICAgICAgICBpZiAoeHMgJiYgcmFuZ2UgIT0gbnVsbCAmJiBUb2tlbi5pc1JlZ2lzdGVyTm9uWFMobmFtZSkpCi0gICAgICAgICAgICByYW5nZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiByYW5nZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgSGFzaHRhYmxlIG5vbnhzID0gbnVsbDsKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgb25seSBnZXRSYW5nZSgpLgotICAgICAqIFNvIHRoaXMgbWV0aG9kIG5lZWQgbm90IE1ULXNhZmUuCi0gICAgICovCi0gICAgc3RhdGljIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTm9uWFMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKFRva2VuLm5vbnhzID09IG51bGwpCi0gICAgICAgICAgICBUb2tlbi5ub254cyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgVG9rZW4ubm9ueHMucHV0KG5hbWUsIG5hbWUpOwotICAgIH0KLSAgICBzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWdpc3Rlck5vblhTKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChUb2tlbi5ub254cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvL0RFQlVHCi0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJpc1JlZ2lzdGVyTm9uWFM6ICIrbmFtZSk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5ub254cy5jb250YWluc0tleShuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEFsaWFzKFN0cmluZyBuZXdOYW1lLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwb3NpdGl2ZSkgewotICAgICAgICBUb2tlbiB0MSA9IChUb2tlbilUb2tlbi5jYXRlZ29yaWVzLmdldChuYW1lKTsKLSAgICAgICAgVG9rZW4gdDIgPSAoVG9rZW4pVG9rZW4uY2F0ZWdvcmllczIuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocG9zaXRpdmUpIHsKLSAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KG5ld05hbWUsIHQxKTsKLSAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dChuZXdOYW1lLCB0Mik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQobmV3TmFtZSwgdDEpOwotICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQobmV3TmFtZSwgdDIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHZpcmFtYVN0cmluZyA9Ci0gICAgIlx1MDk0RCIvLyA7REVWQU5BR0FSSSBTSUdOIFZJUkFNQTtNbjs5O09OOzs7OztOOzs7OzsKLSAgICArIlx1MDlDRCIvLztCRU5HQUxJIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwQTREIi8vO0dVUk1VS0hJIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwQUNEIi8vO0dVSkFSQVRJIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwQjREIi8vO09SSVlBIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwQkNEIi8vO1RBTUlMIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwQzREIi8vO1RFTFVHVSBTSUdOIFZJUkFNQTtNbjs5O09OOzs7OztOOzs7OzsKLSAgICArIlx1MENDRCIvLztLQU5OQURBIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwRDREIi8vO01BTEFZQUxBTSBTSUdOIFZJUkFNQTtNbjs5O09OOzs7OztOOzs7OzsKLSAgICArIlx1MEUzQSIvLztUSEFJIENIQVJBQ1RFUiBQSElOVEhVO01uOzk7T047Ozs7O047VEhBSSBWT1dFTCBTSUdOIFBISU5USFU7Ozs7Ci0gICAgKyJcdTBGODQiOy8vO1RJQkVUQU4gTUFSSyBIQUxBTlRBO01uOzk7T047Ozs7O047VElCRVRBTiBWSVJBTUE7Ozs7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBUb2tlbiB0b2tlbl9ncmFwaGVtZSA9IG51bGw7Ci0gICAgc3RhdGljIHN5bmNocm9uaXplZCBUb2tlbiBnZXRHcmFwaGVtZVBhdHRlcm4oKSB7Ci0gICAgICAgIGlmIChUb2tlbi50b2tlbl9ncmFwaGVtZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2dyYXBoZW1lOwotCi0gICAgICAgIFRva2VuIGJhc2VfY2hhciA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7ICAvLyBbe0FTU0lHTkVEfV0tW3tNfSx7Q31dCi0gICAgICAgIGJhc2VfY2hhci5tZXJnZVJhbmdlcyhUb2tlbi5nZXRSYW5nZSgiQVNTSUdORUQiLCB0cnVlKSk7Ci0gICAgICAgIGJhc2VfY2hhci5zdWJ0cmFjdFJhbmdlcyhUb2tlbi5nZXRSYW5nZSgiTSIsIHRydWUpKTsKLSAgICAgICAgYmFzZV9jaGFyLnN1YnRyYWN0UmFuZ2VzKFRva2VuLmdldFJhbmdlKCJDIiwgdHJ1ZSkpOwotCi0gICAgICAgIFRva2VuIHZpcmFtYSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IFRva2VuLnZpcmFtYVN0cmluZy5sZW5ndGgoKTsgIGkgKyspIHsKLSAgICAgICAgICAgIGludCBjaCA9IHZpcmFtYVN0cmluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICB2aXJhbWEuYWRkUmFuZ2UoaSwgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUb2tlbiBjb21iaW5lcl93b192aXJhbWEgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICBjb21iaW5lcl93b192aXJhbWEubWVyZ2VSYW5nZXMoVG9rZW4uZ2V0UmFuZ2UoIk0iLCB0cnVlKSk7Ci0gICAgICAgIGNvbWJpbmVyX3dvX3ZpcmFtYS5hZGRSYW5nZSgweDExNjAsIDB4MTFmZik7IC8vIGhhbmd1bF9tZWRpYWwgYW5kIGhhbmd1bF9maW5hbAotICAgICAgICBjb21iaW5lcl93b192aXJhbWEuYWRkUmFuZ2UoMHhmZjllLCAweGZmOWYpOyAvLyBleHRyYXMKLQotICAgICAgICBUb2tlbiBsZWZ0ID0gVG9rZW4uY3JlYXRlVW5pb24oKTsgICAgICAgLy8gYmFzZV9jaGFyPwotICAgICAgICBsZWZ0LmFkZENoaWxkKGJhc2VfY2hhcik7Ci0gICAgICAgIGxlZnQuYWRkQ2hpbGQoVG9rZW4udG9rZW5fZW1wdHkpOwotCi0gICAgICAgIFRva2VuIGZvbyA9IFRva2VuLmNyZWF0ZVVuaW9uKCk7Ci0gICAgICAgIGZvby5hZGRDaGlsZChUb2tlbi5jcmVhdGVDb25jYXQodmlyYW1hLCBUb2tlbi5nZXRSYW5nZSgiTCIsIHRydWUpKSk7Ci0gICAgICAgIGZvby5hZGRDaGlsZChjb21iaW5lcl93b192aXJhbWEpOwotCi0gICAgICAgIGZvbyA9IFRva2VuLmNyZWF0ZUNsb3N1cmUoZm9vKTsKLQotICAgICAgICBmb28gPSBUb2tlbi5jcmVhdGVDb25jYXQobGVmdCwgZm9vKTsKLQotICAgICAgICBUb2tlbi50b2tlbl9ncmFwaGVtZSA9IGZvbzsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2dyYXBoZW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbWJpbmcgQ2hhcmFjdGVyIFNlcXVlbmNlIGluIFBlcmwgNS42LgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIFRva2VuIHRva2VuX2NjcyA9IG51bGw7Ci0gICAgc3RhdGljIHN5bmNocm9uaXplZCBUb2tlbiBnZXRDb21iaW5pbmdDaGFyYWN0ZXJTZXF1ZW5jZSgpIHsKLSAgICAgICAgaWYgKFRva2VuLnRva2VuX2NjcyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2NjczsKLQotICAgICAgICBUb2tlbiBmb28gPSBUb2tlbi5jcmVhdGVDbG9zdXJlKFRva2VuLmdldFJhbmdlKCJNIiwgdHJ1ZSkpOyAvLyBccE0qCi0gICAgICAgIGZvbyA9IFRva2VuLmNyZWF0ZUNvbmNhdChUb2tlbi5nZXRSYW5nZSgiTSIsIGZhbHNlKSwgZm9vKTsgLy8gXFBNICsgXHBNKgotICAgICAgICBUb2tlbi50b2tlbl9jY3MgPSBmb287Ci0gICAgICAgIHJldHVybiBUb2tlbi50b2tlbl9jY3M7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFN0cmluZ1Rva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmc7Ci0gICAgICAgIGludCByZWZOdW1iZXI7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW4oaW50IHR5cGUsIFN0cmluZyBzdHIsIGludCBuKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyOwotICAgICAgICAgICAgdGhpcy5yZWZOdW1iZXIgPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFJlZmVyZW5jZU51bWJlcigpIHsgICAgICAgICAgICAgIC8vIGZvciBTVFJJTkcKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZk51bWJlcjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZ2V0U3RyaW5nKCkgeyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIFNUUklORwotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy50eXBlID09IEJBQ0tSRUZFUkVOQ0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJcXCIrdGhpcy5yZWZOdW1iZXI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJFVXRpbC5xdW90ZU1ldGEodGhpcy5zdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBwYXJzZSB0cmVlLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBDb25jYXRUb2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBUb2tlbiBjaGlsZDsKLSAgICAgICAgVG9rZW4gY2hpbGQyOwotICAgICAgICAKLSAgICAgICAgQ29uY2F0VG9rZW4oVG9rZW4gdDEsIFRva2VuIHQyKSB7Ci0gICAgICAgICAgICBzdXBlcihUb2tlbi5DT05DQVQpOwotICAgICAgICAgICAgdGhpcy5jaGlsZCA9IHQxOwotICAgICAgICAgICAgdGhpcy5jaGlsZDIgPSB0MjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXggPT0gMCA/IHRoaXMuY2hpbGQgOiB0aGlzLmNoaWxkMjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IG9wdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXQ7Ci0gICAgICAgICAgICBpZiAodGhpcy5jaGlsZDIudHlwZSA9PSBDTE9TVVJFICYmIHRoaXMuY2hpbGQyLmdldENoaWxkKDApID09IHRoaXMuY2hpbGQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIrIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGlsZDIudHlwZSA9PSBOT05HUkVFRFlDTE9TVVJFICYmIHRoaXMuY2hpbGQyLmdldENoaWxkKDApID09IHRoaXMuY2hpbGQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIrPyI7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpK3RoaXMuY2hpbGQyLnRvU3RyaW5nKG9wdGlvbnMpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgQ2hhclRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIGludCBjaGFyZGF0YTsKLQotICAgICAgICBDaGFyVG9rZW4oaW50IHR5cGUsIGludCBjaCkgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLmNoYXJkYXRhID0gY2g7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJkYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7Ci0gICAgICAgICAgICAgIGNhc2UgQ0hBUjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhcmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3wnOiAgY2FzZSAnKic6ICBjYXNlICcrJzogIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6ICBjYXNlICcpJzogIGNhc2UgJy4nOiAgY2FzZSAnWyc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICd7JzogIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gIlxcIisoY2hhcil0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ1xmJzogIHJldCA9ICJcXGYiOyAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlICdcbic6ICByZXQgPSAiXFxuIjsgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOiAgcmV0ID0gIlxcciI7ICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzogIHJldCA9ICJcXHQiOyAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDB4MWI6ICByZXQgPSAiXFxlIjsgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvL2Nhc2UgMHgwYjogIHJldCA9ICJcXHYiOyAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGFyZGF0YSA+PSAweDEwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlID0gIjAiK0ludGVnZXIudG9IZXhTdHJpbmcodGhpcy5jaGFyZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAiXFx2IitwcmUuc3Vic3RyaW5nKHByZS5sZW5ndGgoKS02LCBwcmUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICIiKyhjaGFyKXRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgQU5DSE9SOgotICAgICAgICAgICAgICAgIGlmICh0aGlzID09IFRva2VuLnRva2VuX2xpbmViZWdpbm5pbmcgfHwgdGhpcyA9PSBUb2tlbi50b2tlbl9saW5lZW5kKQotICAgICAgICAgICAgICAgICAgICByZXQgPSAiIisoY2hhcil0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIHJldCA9ICJcXCIrKGNoYXIpdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBtYXRjaChpbnQgY2gpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ0hBUikgewotICAgICAgICAgICAgICAgIHJldHVybiBjaCA9PSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5GQUFycm93I21hdGNoKCk6IEludGVybmFsIGVycm9yOiAiK3RoaXMudHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIENsb3N1cmVUb2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBpbnQgbWluOwotICAgICAgICBpbnQgbWF4OwotICAgICAgICBUb2tlbiBjaGlsZDsKLQotICAgICAgICBDbG9zdXJlVG9rZW4oaW50IHR5cGUsIFRva2VuIHRvaykgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkID0gdG9rOwotICAgICAgICAgICAgdGhpcy5zZXRNaW4oLTEpOwotICAgICAgICAgICAgdGhpcy5zZXRNYXgoLTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgdm9pZCBzZXRNaW4oaW50IG1pbikgewotICAgICAgICAgICAgdGhpcy5taW4gPSBtaW47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgdm9pZCBzZXRNYXgoaW50IG1heCkgewotICAgICAgICAgICAgdGhpcy5tYXggPSBtYXg7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGdldE1pbigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgZ2V0TWF4KCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ0xPU1VSRSkgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE1pbigpIDwgMCAmJiB0aGlzLmdldE1heCgpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIqIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPT0gdGhpcy5nZXRNYXgoKSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyJ9IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPj0gMCAmJiB0aGlzLmdldE1heCgpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsieyIrdGhpcy5nZXRNaW4oKSsiLCIrdGhpcy5nZXRNYXgoKSsifSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1pbigpID49IDAgJiYgdGhpcy5nZXRNYXgoKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsieyIrdGhpcy5nZXRNaW4oKSsiLH0iOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jdG9TdHJpbmcoKTogQ0xPU1VSRSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLmdldE1pbigpKyIsICIrdGhpcy5nZXRNYXgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE1pbigpIDwgMCAmJiB0aGlzLmdldE1heCgpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIqPyI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1pbigpID09IHRoaXMuZ2V0TWF4KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsieyIrdGhpcy5nZXRNaW4oKSsifT8iOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNaW4oKSA+PSAwICYmIHRoaXMuZ2V0TWF4KCkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsIit0aGlzLmdldE1heCgpKyJ9PyI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1pbigpID49IDAgJiYgdGhpcy5nZXRNYXgoKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsieyIrdGhpcy5nZXRNaW4oKSsiLH0/IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI3RvU3RyaW5nKCk6IE5PTkdSRUVEWUNMT1NVUkUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5nZXRNaW4oKSsiLCAiK3RoaXMuZ2V0TWF4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgUGFyZW5Ub2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBUb2tlbiBjaGlsZDsKLSAgICAgICAgaW50IHBhcmVubnVtYmVyOwotCi0gICAgICAgIFBhcmVuVG9rZW4oaW50IHR5cGUsIFRva2VuIHRvaywgaW50IHBhcmVuKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuY2hpbGQgPSB0b2s7Ci0gICAgICAgICAgICB0aGlzLnBhcmVubnVtYmVyID0gcGFyZW47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIFRva2VuIGdldENoaWxkKGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0UGFyZW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbm51bWJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IG9wdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXQgPSBudWxsOwotICAgICAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKLSAgICAgICAgICAgICAgY2FzZSBQQVJFTjoKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbm51bWJlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9ICIoPzoiK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9ICIoIit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBMT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIig/PSIrdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsiKSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIig/ISIrdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsiKSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICByZXQgPSAiKD88PSIrdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsiKSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgICAgIHJldCA9ICIoPzwhIit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKLSAgICAgICAgICAgICAgICByZXQgPSAiKD8+Iit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAoPyhjb25kaXRpb24peWVzLXBhdHRlcm58bm8tcGF0dGVybikKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgQ29uZGl0aW9uVG9rZW4gZXh0ZW5kcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgaW50IHJlZk51bWJlcjsKLSAgICAgICAgVG9rZW4gY29uZGl0aW9uOwotICAgICAgICBUb2tlbiB5ZXM7Ci0gICAgICAgIFRva2VuIG5vOwotICAgICAgICBDb25kaXRpb25Ub2tlbihpbnQgcmVmbm8sIFRva2VuIGNvbmQsIFRva2VuIHllc3BhdCwgVG9rZW4gbm9wYXQpIHsKLSAgICAgICAgICAgIHN1cGVyKFRva2VuLkNPTkRJVElPTik7Ci0gICAgICAgICAgICB0aGlzLnJlZk51bWJlciA9IHJlZm5vOwotICAgICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kOwotICAgICAgICAgICAgdGhpcy55ZXMgPSB5ZXNwYXQ7Ci0gICAgICAgICAgICB0aGlzLm5vID0gbm9wYXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5ubyA9PSBudWxsID8gMSA6IDI7Ci0gICAgICAgIH0KLSAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgIHJldHVybiB0aGlzLnllczsKLSAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKSAgcmV0dXJuIHRoaXMubm87Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6ICIraW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgICAgIGlmIChyZWZOdW1iZXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gIig/KCIrcmVmTnVtYmVyKyIpIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb24udHlwZSA9PSBUb2tlbi5BTkNIT1IpIHsKLSAgICAgICAgICAgICAgICByZXQgPSAiKD8oIit0aGlzLmNvbmRpdGlvbisiKSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9ICIoPyIrdGhpcy5jb25kaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLm5vID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXQgKz0gdGhpcy55ZXMrIikiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXQgKz0gdGhpcy55ZXMrInwiK3RoaXMubm8rIikiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIChpbXMtaW1zOiAuLi4uICkKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTW9kaWZpZXJUb2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBUb2tlbiBjaGlsZDsKLSAgICAgICAgaW50IGFkZDsKLSAgICAgICAgaW50IG1hc2s7Ci0KLSAgICAgICAgTW9kaWZpZXJUb2tlbihUb2tlbiB0b2ssIGludCBhZGQsIGludCBtYXNrKSB7Ci0gICAgICAgICAgICBzdXBlcihUb2tlbi5NT0RJRklFUkdST1VQKTsKLSAgICAgICAgICAgIHRoaXMuY2hpbGQgPSB0b2s7Ci0gICAgICAgICAgICB0aGlzLmFkZCA9IGFkZDsKLSAgICAgICAgICAgIHRoaXMubWFzayA9IG1hc2s7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIFRva2VuIGdldENoaWxkKGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0T3B0aW9ucygpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZDsKLSAgICAgICAgfQotICAgICAgICBpbnQgZ2V0T3B0aW9uc01hc2soKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXNrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgcmV0dXJuICIoPyIKLSAgICAgICAgICAgICAgICArKHRoaXMuYWRkID09IDAgPyAiIiA6IFJFVXRpbC5jcmVhdGVPcHRpb25TdHJpbmcodGhpcy5hZGQpKQotICAgICAgICAgICAgICAgICsodGhpcy5tYXNrID09IDAgPyAiIiA6IFJFVXRpbC5jcmVhdGVPcHRpb25TdHJpbmcodGhpcy5tYXNrKSkKLSAgICAgICAgICAgICAgICArIjoiCi0gICAgICAgICAgICAgICAgK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykKLSAgICAgICAgICAgICAgICArIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBwYXJzZSB0cmVlLgotICAgICAqIGZvciBVTklPTiBvciBDT05DQVQuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFVuaW9uVG9rZW4gZXh0ZW5kcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgVmVjdG9yIGNoaWxkcmVuOwotCi0gICAgICAgIFVuaW9uVG9rZW4oaW50IHR5cGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRDaGlsZChUb2tlbiB0b2spIHsKLSAgICAgICAgICAgIGlmICh0b2sgPT0gbnVsbCkgIHJldHVybjsKLSAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpICB0aGlzLmNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBVTklPTikgewotICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkRWxlbWVudCh0b2spOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgQ09OQ0FULCBhbmQgbmV3IGNoaWxkIGlzIENPTkNBVC4KLSAgICAgICAgICAgIGlmICh0b2sudHlwZSA9PSBDT05DQVQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0b2suc2l6ZSgpOyAgaSArKykKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZCh0b2suZ2V0Q2hpbGQoaSkpOyAvLyBSZWN1cnNpb24KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkRWxlbWVudCh0b2spOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRva2VuIHByZXZpb3VzID0gKFRva2VuKXRoaXMuY2hpbGRyZW4uZWxlbWVudEF0KHNpemUtMSk7Ci0gICAgICAgICAgICBpZiAoISgocHJldmlvdXMudHlwZSA9PSBDSEFSIHx8IHByZXZpb3VzLnR5cGUgPT0gU1RSSU5HKQotICAgICAgICAgICAgICAgICAgJiYgKHRvay50eXBlID09IENIQVIgfHwgdG9rLnR5cGUgPT0gU1RSSU5HKSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmFkZEVsZW1lbnQodG9rKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJNZXJnZSAnIitwcmV2aW91cysiJyBhbmQgJyIrdG9rKyInLiIpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwotICAgICAgICAgICAgaW50IG5leHRNYXhMZW5ndGggPSAodG9rLnR5cGUgPT0gQ0hBUiA/IDIgOiB0b2suZ2V0U3RyaW5nKCkubGVuZ3RoKCkpOwotICAgICAgICAgICAgaWYgKHByZXZpb3VzLnR5cGUgPT0gQ0hBUikgeyAgICAgICAgLy8gUmVwbGFjZSBwcmV2aW91cyB0b2tlbiBieSBTVFJJTkcKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIgKyBuZXh0TWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbnQgY2ggPSBwcmV2aW91cy5nZXRDaGFyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoUkVVdGlsLmRlY29tcG9zZVRvU3Vycm9nYXRlcyhjaCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXMgPSBUb2tlbi5jcmVhdGVTdHJpbmcobnVsbCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zZXRFbGVtZW50QXQocHJldmlvdXMsIHNpemUtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVFJJTkcKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHByZXZpb3VzLmdldFN0cmluZygpLmxlbmd0aCgpICsgbmV4dE1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwcmV2aW91cy5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0b2sudHlwZSA9PSBDSEFSKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNoID0gdG9rLmdldENoYXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChSRVV0aWwuZGVjb21wb3NlVG9TdXJyb2dhdGVzKGNoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWNoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0b2suZ2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAoKFN0cmluZ1Rva2VuKXByZXZpb3VzKS5zdHJpbmcgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuID09IG51bGwgPyAwIDogdGhpcy5jaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRva2VuKXRoaXMuY2hpbGRyZW4uZWxlbWVudEF0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IG9wdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXQ7Ci0gICAgICAgICAgICBpZiAodGhpcy50eXBlID09IENPTkNBVCkgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLnNpemUoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRva2VuIGNoID0gdGhpcy5nZXRDaGlsZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4gY2gyID0gdGhpcy5nZXRDaGlsZCgxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoMi50eXBlID09IENMT1NVUkUgJiYgY2gyLmdldENoaWxkKDApID09IGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjaC50b1N0cmluZyhvcHRpb25zKSsiKyI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2gyLnR5cGUgPT0gTk9OR1JFRURZQ0xPU1VSRSAmJiBjaDIuZ2V0Q2hpbGQoMCkgPT0gY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNoLnRvU3RyaW5nKG9wdGlvbnMpKyIrPyI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2gudG9TdHJpbmcob3B0aW9ucykrY2gyLnRvU3RyaW5nKG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5jaGlsZHJlbi5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKChUb2tlbil0aGlzLmNoaWxkcmVuLmVsZW1lbnRBdChpKSkudG9TdHJpbmcob3B0aW9ucykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBTdHJpbmcoc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSgpID09IDIgJiYgdGhpcy5nZXRDaGlsZCgxKS50eXBlID09IEVNUFRZKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5nZXRDaGlsZCgwKS50b1N0cmluZyhvcHRpb25zKSsiPyI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSgpID09IDIKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5nZXRDaGlsZCgwKS50eXBlID09IEVNUFRZKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5nZXRDaGlsZCgxKS50b1N0cmluZyhvcHRpb25zKSsiPz8iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCgoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoMCkpLnRvU3RyaW5nKG9wdGlvbnMpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgIGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSd8Jyk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoKFRva2VuKXRoaXMuY2hpbGRyZW4uZWxlbWVudEF0KGkpKS50b1N0cmluZyhvcHRpb25zKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCA9IG5ldyBTdHJpbmcoc2IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvbWVzc2FnZS5wcm9wZXJ0aWVzIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTQ4ODAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1wYXJzZXIucGFyc2UuMT1Xcm9uZyBjaGFyYWN0ZXIuCi1wYXJzZXIucGFyc2UuMj1JbnZhbGlkIHJlZmVyZW5jZSBudW1iZXIuCi1wYXJzZXIubmV4dC4xPUEgY2hhcmFjdGVyIGlzIHJlcXVpcmVkIGFmdGVyIFxcLgotcGFyc2VyLm5leHQuMj0nPycgaXMgbm90IGV4cGVjdGVkLiAgJyg/Oicgb3IgJyg/PScgb3IgJyg/IScgb3IgJyg/PCcgb3IgJyg/Iycgb3IgJyg/Pic/Ci1wYXJzZXIubmV4dC4zPScoPzw9JyBvciAnKD88IScgaXMgZXhwZWN0ZWQuCi1wYXJzZXIubmV4dC40PUEgY29tbWVudCBpcyBub3QgdGVybWluYXRlZC4KLXBhcnNlci5mYWN0b3IuMT0nKScgaXMgZXhwZWN0ZWQuCi1wYXJzZXIuZmFjdG9yLjI9VW5leHBlY3RlZCBlbmQgb2YgdGhlIHBhdHRlcm4gaW4gYSBtb2RpZmllciBncm91cC4KLXBhcnNlci5mYWN0b3IuMz0nOicgaXMgZXhwZWN0ZWQuCi1wYXJzZXIuZmFjdG9yLjQ9VW5leHBlY3RlZCBlbmQgb2YgdGhlIHBhdHRlcm4gaW4gYSBjb25kaXRpb25hbCBncm91cC4KLXBhcnNlci5mYWN0b3IuNT1BIGJhY2sgcmVmZXJlbmNlIG9yIGFuIGFuY2hvciBvciBhIGxvb2thaGVhZCBvciBhIGxvb2tiZWhpbmQgaXMgZXhwZWN0ZWQgaW4gYSBjb25kaXRpb25hbCBwYXR0ZXJuLgotcGFyc2VyLmZhY3Rvci42PVRoZXJlIGFyZSBtb3JlIHRoYW4gdGhyZWUgY2hvaXNlcyBpbiBhIGNvbmRpdGlvbmFsIGdyb3VwLgotcGFyc2VyLmF0b20uMT1BIGNoYXJhY3RlciBpbiBVKzAwNDAtVSswMDVmIG11c3QgZm9sbG93IFxcYy4KLXBhcnNlci5hdG9tLjI9QSBDYXRlZ29yeSBjaGFyYWN0ZXIgb3IgJ3snIGlzIHJlcXVpcmVkLgotcGFyc2VyLmF0b20uMz1BIHByb3BlcnR5IG5hbWUgaXMgbm90IGNsb3NlZCBieSAnfScuCi1wYXJzZXIuYXRvbS40PVVuZXhwZWN0ZWQgbWV0YSBjaGFyYWN0ZXIuCi1wYXJzZXIuYXRvbS41PVVua25vd24gcHJvcGVydHkuCi1wYXJzZXIuY2MuMT1BIFBPU0lYIGNoYXJhY3RlciBjbGFzcyBtdXN0IGJlIGNsb3NlZCBieSAnOl0nLgotcGFyc2VyLmNjLjI9VW5leHBlY3RlZCBlbmQgb2YgdGhlIHBhdHRlcm4gaW4gYSBjaGFyYWN0ZXIgY2xhc3MuCi1wYXJzZXIuY2MuMz1Vbmtub3duIG5hbWUgZm9yIGEgUE9TSVggY2hhcmFjdGVyIGNsYXNzLgotcGFyc2VyLmNjLjQ9Jy0nIGlzIGludmFsaWQgaGVyZS4KLXBhcnNlci5jYy41PSddJyBpcyBleHBlY3RlZC4KLXBhcnNlci5jYy42PSdbJyBpcyBpbnZhbGlkIGluIGEgY2hhcmFjZXIgY2xhc3MuICBXcml0ZSAnXFxbJy4KLXBhcnNlci5jYy43PSddJyBpcyBpbnZhbGlkIGluIGEgY2hhcmFjZXIgY2xhc3MuICBXcml0ZSAnXFxdJy4KLXBhcnNlci5vcGUuMT0nWycgaXMgZXhwZWN0ZWQuCi1wYXJzZXIub3BlLjI9JyknIG9yICctWycgb3IgJytbJyBvciAnJlsnIGlzIGV4cGVjdGVkLgotcGFyc2VyLmRlc2NhcGUuMT1JbnZhbGlkIFVuaWNvZGUgaGV4IG5vdGF0aW9uLgotcGFyc2VyLmRlc2NhcGUuMj1PdmVyZmxvdyBpbiBhIGhleCBub3RhdGlvbi4KLXBhcnNlci5kZXNjYXBlLjM9J1xceHsnIG11c3QgYmUgY2xvc2VkIGJ5ICd9Jy4KLXBhcnNlci5kZXNjYXBlLjQ9SW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuCi1wYXJzZXIuZGVzY2FwZS41PUFuIGFuY2hvciBtdXN0IG5vdCBiZSBoZXJlLgotcGFyc2VyLnByb2Nlc3MuMT1UaGlzIGV4cHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBvcHRpb24gc2V0dGluZy4KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvbWVzc2FnZV9mci5wcm9wZXJ0aWVzIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2U5ODEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0gcGFyc2VyLnBhcnNlLjE9Q2FyYWN0XHUwMGU4cmUgaW52YWxpZGUuCi1wYXJzZXIucGFyc2UuMj1OdW1cdTAwZTlybyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGludmFsaWRlLgotcGFyc2VyLm5leHQuMT1VbiBcXCBkb2l0IFx1MDBlYXRyZSBzdWl2aSBkJ3VuIGNhcmFjdFx1MDBlOHJlLgotcGFyc2VyLm5leHQuMj0nPycgbidlc3QgcGFzIHBvc3NpYmxlIGljaS4gICcoPzonIG91ICcoPz0nIG91ICcoPyEnIG91ICcoPzwnIG91ICcoPyMnIG91ICcoPz4nPwotcGFyc2VyLm5leHQuMz0nKD88PScgb3UgJyg/PCEnIHNvbnQgYXR0ZW5kdXMuCi1wYXJzZXIubmV4dC40PVVuIGNvbW1lbnRhaXJlIG4nZXN0IHBhcyBmZXJtXHUwMGU5LgotcGFyc2VyLmZhY3Rvci4xPScpJyBtYW5xdWFudC4KLXBhcnNlci5mYWN0b3IuMj1GaW4gcHJcdTAwZTltYXR1clx1MDBlOWUgZGUgbW90aWYgZGFucyB1biBncm91cGUgbW9kaWZpYW50LgotcGFyc2VyLmZhY3Rvci4zPSc6JyBtYW5xdWFudC4KLXBhcnNlci5mYWN0b3IuND1GaW4gcHJcdTAwZTltYXR1clx1MDBlOWUgZGUgbW90aWYgZGFucyB1biBncm91cGUgY29uZGl0aW9uZWwuCi1wYXJzZXIuZmFjdG9yLjU9VW5lIHJcdTAwZTlmXHUwMGU5cmVuY2UgYXJyaVx1MDBlOHJlIG91IHVuZSBhbmNyZSBvdSB1biBsb29rYWhlYWQgb3UgdW4gbG9va2JlaGluZCBlc3QgYXR0ZW5kdSBkYW5zIHVuIGdyb3VwZSBjb25kaXRpb25lbC4KLXBhcnNlci5mYWN0b3IuNj1JbCB5IGEgcGx1cyBkZSB0cm9pcyBjaG9peCBkYW5zIHVuIGdyb3VwZSBjb25kaXRpb25lbC4KLXBhcnNlci5hdG9tLjE9XFxjIGRvaXQgXHUwMGVhdHJlIHN1aXZpIGQndW4gY2FyYWN0XHUwMGU4cmUgZGFucyBsJ2ludGVydmFsbGUgVSswMDQwLVUrMDA1ZiAuCi1wYXJzZXIuYXRvbS4yPVVuIGNhcmFjdFx1MDBlOHJlIGRlIGNhdFx1MDBlOWdvcmllIG91ICd7JyBlc3QgcmVxdWlzLgotcGFyc2VyLmF0b20uMz1VbiBub20gZGUgcHJvcHJpXHUwMGU5dFx1MDBlOSBuZSBzZSB0ZXJtaW5lIHBhcyBwYXIgJ30nLgotcGFyc2VyLmF0b20uND1NXHUwMGU5dGFjYXJhY3RcdTAwZThyZSBpbnRlcmRpdC4KLXBhcnNlci5hdG9tLjU9UHJvcHJpXHUwMGU5dFx1MDBlOSBpbmNvbm51ZS4KLXBhcnNlci5jYy4xPVVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUgUE9TSVggZG9pdCBcdTAwZWF0cmUgdGVybWluXHUwMGU5ZSBwYXIgJzpdJy4KLXBhcnNlci5jYy4yPUZpbiBwclx1MDBlOW1hdHVyXHUwMGU5ZSBkZSBtb3RpZiBkYW5zIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUuCi1wYXJzZXIuY2MuMz1Ob20gaW5jb25udSBwb3VyIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUgUE9TSVguCi1wYXJzZXIuY2MuND0nLScgZXN0IGludmFsaWRlLCBkYW5zIGNlIGNhcy4KLXBhcnNlci5jYy41PSddJyBtYW5xdWFudC4KLXBhcnNlci5jYy42PSdbJyBlc3QgaW52YWxpZGUgZGFucyB1bmUgY2xhc3NlIGRlIGNhcmFjdFx1MDBlOHJlLiBFY3JpdmV6ICdcXFsnLgotcGFyc2VyLmNjLjc9J10nIGVzdCBpbnZhbGlkZSBkYW5zIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUuIEVjcml2ZXogJ1xcXScuCi1wYXJzZXIub3BlLjE9J1snIGVzdCBhdHRlbmR1LgotcGFyc2VyLm9wZS4yPScpJyBvdSAnLVsnIG91ICcrWycgb3UgJyZbJyBzb250IGF0dGVuZHVzLgotcGFyc2VyLmRlc2NhcGUuMT1Ob3RhdGlvbiBoZXhhZFx1MDBlOWNpbWFsZSBVbmljb2RlIGludmFsaWRlLgotcGFyc2VyLmRlc2NhcGUuMj1EXHUwMGU5cGFzc2VtZW50IGRlIGNhcGFjaXRcdTAwZTkgZGFucyB1bmUgZXhwcmVzc2lvbiBoZXhhZFx1MDBlOWNpbWFsZS4KLXBhcnNlci5kZXNjYXBlLjM9J1xceHsnIGRvaXQgc2UgdGVybWluZXIgcGFyIHVuICd9Jy4KLXBhcnNlci5kZXNjYXBlLjQ9UG9pbnQgZGUgY29kZSBVbmljb2RlIGludmFsaWRlLgotcGFyc2VyLmRlc2NhcGUuNT1BbmNyZSBpbnRlcmRpdGUgaWNpLgotcGFyc2VyLnByb2Nlc3MuMT1DZXR0ZSBleHByZXNzaW9uIG4nZXN0IHBhcyBhdXRvcmlzXHUwMGU5ZSBjb21wdGUgdGVudSBkZXMgb3B0aW9ucyBlbiBjb3Vycy4KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvbWVzc2FnZV9qYS5wcm9wZXJ0aWVzIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZTgzOTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1wYXJzZXIucGFyc2UuMT1cdTMwNzhcdTMwOTNcdTMwNmFcdTY1ODdcdTViNTcuCi1wYXJzZXIucGFyc2UuMj1cdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTc1NmFcdTUzZjdcdTMwNjdcdTMwNTkuCi1wYXJzZXIubmV4dC4xPVxcIFx1MzA2ZVx1NWY4Y1x1MzA2YjFcdTY1ODdcdTViNTdcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCi1wYXJzZXIubmV4dC4yPSc/JyBcdTMwOTJcdTMwNTNcdTMwNTNcdTMwNmJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuIFx1MzA4Mlx1MzA1N1x1MzA0Ylx1MzA1N1x1MzA2NiAnKD86JyBcdTMwNGIgJyg/PScgXHUzMDRiICcoPyEnIFx1MzA0YiAnKD88JyBcdTMwNGIgJyg/IycgXHUzMDRiICcoPz4nIFx1MzA2N1x1MzA1OVx1MzA0Yj8KLXBhcnNlci5uZXh0LjM9Jyg/PD0nIFx1MzA0YiAnKD88IScgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLm5leHQuND1cdThhM2JcdTkxYzhcdTMwNGNcdTk1ODlcdTMwNThcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuZmFjdG9yLjE9JyknIFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5mYWN0b3IuMj1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTRlZDhcdTMwNGRcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmVcdTRlMmRcdTMwNjdcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuZmFjdG9yLjM9JzonIFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5mYWN0b3IuND1cdTY3NjFcdTRlZjZcdTRlZDhcdTMwNGRcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmVcdTRlMmRcdTMwNjdcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuZmFjdG9yLjU9XHU2NzYxXHU0ZWY2XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZiXHUzMDZmXHUzMDAxXHU1ZjhjXHU2NWI5XHU1M2MyXHU3MTY3XHUzMGZiXHUzMGEyXHUzMGYzXHUzMGFiXHUzMGZjXHUzMGZiXHU1MTQ4XHU4YWFkXHUzMDdmXHUzMGZiXHU1ZjhjXHU4YWFkXHUzMDdmXHUzMDZlXHUzMDdmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5LgotcGFyc2VyLmZhY3Rvci42PVx1Njc2MVx1NGVmNlx1NGVkOFx1MzA0ZFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGUyZFx1MzA2YjNcdTUwMGJcdTRlZTVcdTRlMGFcdTMwNmVcdTkwNzhcdTYyOWVcdTMwOTJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuYXRvbS4xPVxcYyBcdTMwNmVcdTVmOGNcdTMwNmJcdTMwNmZcdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNGMgVSswMDQwXHVmZjVlVSswMDVmIFx1MzA2ZVx1N2JjNFx1NTZmMlx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5hdG9tLjI9MVx1NjU4N1x1NWI1N1x1MzA2ZVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1NjU4N1x1NWI1N1x1MzA0YiAneycgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmF0b20uMz1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTU0MGRcdTMwNGMgJ30nIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5hdG9tLjQ9XHUzMGUxXHUzMGJmXHU2NTg3XHU1YjU3XHUzMDRjXHU1OTA5XHUzMDZhXHUzMDY4XHUzMDUzXHUzMDhkXHUzMDZiXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5LgotcGFyc2VyLmF0b20uNT1cdTY3MmFcdTc3ZTVcdTMwNmVcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTU0MGRcdTMwNjdcdTMwNTkuCi1wYXJzZXIuY2MuMT1QT1NJWCBcdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTMwNmYgJzpdJyBcdTMwNjdcdTk1ODlcdTMwNThcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkuCi1wYXJzZXIuY2MuMj1cdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTUxODVcdTMwNjdcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuY2MuMz1cdTY3MmFcdTc3ZTVcdTMwNmUgUE9TSVggXHU2NTg3XHU1YjU3XHUzMGFmXHUzMGU5XHUzMGI5XHU1NDBkXHUzMDY3XHUzMDU5LgotcGFyc2VyLmNjLjQ9XHUzMDUzXHUzMDUzXHUzMDZiICctJyBcdTMwOTJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuY2MuNT0nXScgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmNjLjY9XHU2NTg3XHU1YjU3XHUzMGFmXHUzMGU5XHUzMGI5XHU1MTg1XHUzMDY3XHUzMDZmICdbJyBcdTMwOTJcdTc2ZjRcdTYzYTVcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuICdcXFsnIFx1MzA2OFx1NjZmOFx1MzA0NFx1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NC4KLXBhcnNlci5jYy43PVx1NjU4N1x1NWI1N1x1MzBhZlx1MzBlOVx1MzBiOVx1NTE4NVx1MzA2N1x1MzA2ZiAnXScgXHUzMDkyXHU3NmY0XHU2M2E1XHU2NmY4XHUzMDRmXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzLiAnXFxdJyBcdTMwNjhcdTY2ZjhcdTMwNDRcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDQuCi1wYXJzZXIub3BlLjE9J1snIFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5vcGUuMj0nKScgXHUzMDRiICctWycgXHUzMDRiICcrWycgXHUzMDRiICcmWycgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuMT1cdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNmUxNlx1OTAzMlx1NjU3MFx1ODg2OFx1OGExOFx1NGUyZFx1MzA2Ylx1OTU5M1x1OTA1NVx1MzA2M1x1MzA1Zlx1NjU4N1x1NWI1N1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OS4KLXBhcnNlci5kZXNjYXBlLjI9XHUzMGIzXHUzMGZjXHUzMGM5XHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU2NTcwXHU1MDI0XHUzMDRjXHU1OTI3XHUzMDRkXHUzMDU5XHUzMDRlXHUzMDdlXHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuMz0nXFx4eycgXHUzMDZmICd9JyBcdTMwNjdcdTk1ODlcdTMwNThcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIuZGVzY2FwZS40PVVuaWNvZGUgXHUzMDZlXHUzMGIzXHUzMGZjXHUzMGM5XHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDY4XHUzMDU3XHUzMDY2XHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuNT1cdTMwYTJcdTMwZjNcdTMwYWJcdTMwZmNcdTMwOTJcdTMwNTNcdTMwNTNcdTMwNmJcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuCi1wYXJzZXIucHJvY2Vzcy4xPVx1MzA1M1x1MzA2ZVx1ODg2OFx1NzNmZVx1MzA2Zlx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1OGEyZFx1NWI5YVx1MzA2N1x1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9CdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWYxMmUxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxJbnRlZ2VySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFN0cmluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5TY2hlbWFSZWd1bGFyRXhwcmVzc2lvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIGV4dGVuZHMgU2NoZW1hVHlwZUxvYWRlckJhc2UgaW1wbGVtZW50cyBTY2hlbWFUeXBlU3lzdGVtCi17Ci0gICAgLy8gVGhlIGdsb2JhbCBidWlsdGluIHR5cGUgc3lzdGVtCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGdldCgpCi0gICAgICAgIHsgcmV0dXJuIF9nbG9iYWw7IH0KLQotICAgIC8vIHNvbWUgY29uc3RhbnRzIHRoYXQgbmVlZCB0byBiZSBpbml0aWFsaXplZCBlYXJseQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVbXSBFTVBUWV9TQ0hFTUFUWVBFX0FSUkFZID0gbmV3IFNjaGVtYVR5cGVbMF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZS5SZWZbXSBFTVBUWV9TQ0hFTUFUWVBFUkVGX0FSUkFZID0gbmV3IFNjaGVtYVR5cGUuUmVmWzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBFTVBUWV9TQ0hFTUFFTEVNRU5UX0FSUkFZID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRbMF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gRU1QVFlfU0NIRU1BQVRUUklCVVRFX0FSUkFZID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVswXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFNb2RlbEdyb3VwW10gRU1QVFlfU0NIRU1BTU9ERUxHUk9VUF9BUlJBWSA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwWzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gRU1QVFlfU0NIRU1BQVRUUklCVVRFR1JPVVBfQVJSQVkgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbMF07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbSBfZ2xvYmFsID0gbmV3IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtKCk7Ci0KLSAgICAvLyBVUiB0eXBlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQU5ZX1RZUEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0FOWV9TSU1QTEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEUpOwotCi0gICAgLy8gcHJpbWl0aXZlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQk9PTEVBTiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQk9PTEVBTik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9CQVNFXzY0X0JJTkFSWSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSEVYX0JJTkFSWSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9BTllfVVJJID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19BTllfVVJJKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1FOQU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19RTkFNRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT1RBVElPTiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9UQVRJT04pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfRkxPQVQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0ZMT0FUKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RPVUJMRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRE9VQkxFKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RFQ0lNQUwgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfU1RSSU5HID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19TVFJJTkcpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9EVVJBVElPTiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRFVSQVRJT04pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfREFURV9USU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfVElNRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVElNRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9EQVRFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19EQVRFKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0dfWUVBUl9NT05USCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0dfWUVBUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfR19ZRUFSKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0dfTU9OVEhfREFZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9HX0RBWSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfR19EQVkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19NT05USCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfR19NT05USCk7Ci0KLSAgICAvLyBkZXJpdmVkIG51bWVyaWNzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JTlRFR0VSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19JTlRFR0VSKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0xPTkcgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0xPTkcpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSU5UID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19JTlQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfU0hPUlQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1NIT1JUKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0JZVEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0JZVEUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9OX1BPU0lUSVZFX0lOVEVHRVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05FR0FUSVZFX0lOVEVHRVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05FR0FUSVZFX0lOVEVHRVIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9OX05FR0FUSVZFX0lOVEVHRVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1BPU0lUSVZFX0lOVEVHRVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1BPU0lUSVZFX0lOVEVHRVIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfVU5TSUdORURfTE9ORyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9VTlNJR05FRF9JTlQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9VTlNJR05FRF9TSE9SVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfVU5TSUdORURfQllURSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURSk7Ci0KLSAgICAvLyBkZXJpdmVkIHN0cmluZ3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05PUk1BTElaRURfU1RSSU5HID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OT1JNQUxJWkVEX1NUUklORyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9UT0tFTiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVE9LRU4pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTkFNRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTkFNRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OQ05BTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05DTkFNRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9MQU5HVUFHRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTEFOR1VBR0UpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSUQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lEKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lEUkVGID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19JRFJFRik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JRFJFRlMgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lEUkVGUyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9FTlRJVFkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0VOVElUWSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9FTlRJVElFUyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRU5USVRJRVMpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk1UT0tFTiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk1UT0tFTik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OTVRPS0VOUyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk1UT0tFTlMpOwotCi0gICAgLy8gdGhlIG5vLXR5cGUKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05PX1RZUEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9QUkVTRVJWRSA9IGJ1aWxkU3RyaW5nKCJwcmVzZXJ2ZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9SRVBMQUNFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX0NPTExBUFNFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19OT05FID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIG51bGwsIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTk9ORSA9IG5ldyBib29sZWFuW10KLSAgICAgICAgeyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1dTX0NPTExBUFNFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19XU19SRVBMQUNFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfUkVQTEFDRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1dTX1BSRVNFUlZFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfUFJFU0VSVkUpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19JTlRFR0VSID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19MT05HID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKSksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfSU5UID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUlOX1ZBTFVFKSksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfU0hPUlQgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoU2hvcnQuTUlOX1ZBTFVFKSksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoU2hvcnQuTUFYX1ZBTFVFKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0JZVEUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoQnl0ZS5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihCeXRlLk1BWF9WQUxVRSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19OT05ORUdBVElWRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1BPU0lUSVZFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5PTkUpLCBudWxsLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19OT05QT1NJVElWRSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05FR0FUSVZFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5PTkUubmVnYXRlKCkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTlNJR05FRF9MT05HID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgYnVpbGRJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5TSUdORURfSU5UID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZig0Mjk0OTY3Mjk1TCkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTlNJR05FRF9TSE9SVCA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoNjU1MzUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5TSUdORURfQllURSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMjU1KSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0JVSUxUSU5fTElTVCA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5PTkUpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX1dTID0gbmV3IGJvb2xlYW5bXQotICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX0lOVEVHRVIgPSBuZXcgYm9vbGVhbltdCi0gICAgICAgIHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLAotICAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSB9OwotCi0gICAgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOSU9OID0gRkFDRVRTX05PTkU7Ci0gICAgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfVU5JT04gPSBGSVhFRF9GQUNFVFNfTk9ORTsKLQotICAgIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19MSVNUID0gRkFDRVRTX1dTX0NPTExBUFNFOwotICAgIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX0xJU1QgPSBGSVhFRF9GQUNFVFNfV1M7Ci0KLQotICAgIC8qCi0gICAgICogTEFTVCBTdGF0aWMgaW5pdGlhbGl6ZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgewotICAgICAgICBmb3IgKGludCBpID0gU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU47IGkgPD0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9nbG9iYWwuZmlsbEluVHlwZShpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIF90eXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVJbXBsW10gX3R5cGVBcnJheSA9IG5ldyBTY2hlbWFUeXBlSW1wbFtTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyAxXTsKLSAgICBwcml2YXRlIE1hcCBfaGFuZGxlc1RvT2JqZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX29iamVjdHNUb0hhbmRsZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF90eXBlc0J5Q2xhc3NuYW1lID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZUltcGwgZ2V0QnVpbHRpblR5cGUoaW50IGJ0YykKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZUFycmF5W2J0Y107Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbSgpCi0gICAgewotICAgICAgICAvLyBVUiB0eXBlcwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUsICJhbnlUeXBlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFLCAiYW55U2ltcGxlVHlwZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGUiKTsKLQotICAgICAgICAvLyBwcmltaXRpdmVzCi0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19CT09MRUFOLCAiYm9vbGVhbiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJvb2xlYW4iKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZLCAiYmFzZTY0QmluYXJ5IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmFzZTY0QmluYXJ5Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZLCAiaGV4QmluYXJ5IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19BTllfVVJJLCAiYW55VVJJIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55VVJJIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19RTkFNRSwgIlFOYW1lIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OLCAiTk9UQVRJT04iLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOT1RBVElPTiIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfRkxPQVQsICJmbG9hdCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEZsb2F0Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19ET1VCTEUsICJkb3VibGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb3VibGUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwsICJkZWNpbWFsIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfU1RSSU5HLCAic3RyaW5nIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU3RyaW5nIik7Ci0KLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OLCAiZHVyYXRpb24iLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxEdXJhdGlvbiIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfREFURV9USU1FLCAiZGF0ZVRpbWUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlVGltZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVElNRSwgInRpbWUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxUaW1lIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19EQVRFLCAiZGF0ZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USCwgImdZZWFyTW9udGgiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxHWWVhck1vbnRoIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX1lFQVIsICJnWWVhciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdZZWFyIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWSwgImdNb250aERheSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdNb250aERheSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfR19EQVksICJnRGF5IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR0RheSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfR19NT05USCwgImdNb250aCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdNb250aCIpOwotCi0gICAgICAgIC8vIGRlcml2ZWQgbnVtZXJpY3MKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lOVEVHRVIsICJpbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlciIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTE9ORywgImxvbmciLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxMb25nIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19JTlQsICJpbnQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1NIT1JULCAic2hvcnQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaG9ydCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQllURSwgImJ5dGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxCeXRlIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUiwgIm5vblBvc2l0aXZlSW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vblBvc2l0aXZlSW50ZWdlciIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUiwgIm5lZ2F0aXZlSW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5lZ2F0aXZlSW50ZWdlciIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVIsICJub25OZWdhdGl2ZUludGVnZXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1BPU0lUSVZFX0lOVEVHRVIsICJwb3NpdGl2ZUludGVnZXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxQb3NpdGl2ZUludGVnZXIiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0xPTkcsICJ1bnNpZ25lZExvbmciLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZExvbmciKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVCwgInVuc2lnbmVkSW50IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRJbnQiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JULCAidW5zaWduZWRTaG9ydCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkU2hvcnQiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0JZVEUsICJ1bnNpZ25lZEJ5dGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEJ5dGUiKTsKLQotICAgICAgICAvLyBkZXJpdmVkIHN0cmluZ3MKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HLCAibm9ybWFsaXplZFN0cmluZyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vcm1hbGl6ZWRTdHJpbmciKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1RPS0VOLCAidG9rZW4iLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxUb2tlbiIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTkFNRSwgIk5hbWUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOYW1lIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OQ05BTUUsICJOQ05hbWUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOQ05hbWUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFLCAibGFuZ3VhZ2UiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxMYW5ndWFnZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSUQsICJJRCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19JRFJFRiwgIklEUkVGIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSURSRUYiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lEUkVGUywgIklEUkVGUyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEUkVGUyIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfRU5USVRZLCAiRU5USVRZIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRU5USVRZIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19FTlRJVElFUywgIkVOVElUSUVTIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRU5USVRJRVMiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05NVE9LRU4sICJOTVRPS0VOIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk1UT0tFTiIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk1UT0tFTlMsICJOTVRPS0VOUyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5NVE9LRU5TIik7Ci0KLSAgICAgICAgLy8gdGhlIG5vLXR5cGUKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAic2NoZW1hLnR5cGVzeXN0ZW0uYnVpbHRpbiI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VEZWZpbmVkKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kVHlwZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlKV90eXBlTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmREb2N1bWVudFR5cGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudCBmaW5kRWxlbWVudChRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBmaW5kQXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZFR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IGZpbmRUeXBlKG5hbWUpOwotICAgICAgICByZXR1cm4gKHR5cGUgPT0gbnVsbCA/IG51bGwgOiB0eXBlLmdldFJlZigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZERvY3VtZW50VHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRBdHRyaWJ1dGVUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZmluZEVsZW1lbnRSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIGZpbmRBdHRyaWJ1dGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwLlJlZiBmaW5kTW9kZWxHcm91cFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBmaW5kQXR0cmlidXRlR3JvdXBSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWUgbmFtZSkgCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9yQ2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpX3R5cGVzQnlDbGFzc25hbWUuZ2V0KGNsYXNzbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFNvdXJjZUFzU3RyZWFtKFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7IC8vIGJ1aWx0aW4gc2NoZW1hIHR5cGUgc3lzdGVtIGhhcyBubyBzb3VyY2UuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcygpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX3R5cGVBcnJheS5sZW5ndGggLSAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfdHlwZUFycmF5LCAxLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBkb2N1bWVudFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFUWVBFX0FSUkFZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQVRZUEVfQVJSQVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cygpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BRUxFTUVOVF9BUlJBWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFBVFRSSUJVVEVfQVJSQVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9kZWwgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXBbXSBtb2RlbEdyb3VwcygpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BTU9ERUxHUk9VUF9BUlJBWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gYXR0cmlidXRlR3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFBVFRSSUJVVEVHUk9VUF9BUlJBWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYW5kbGUgZm9yIHRoZSBnaXZlbiB0eXBlIHdpdGhpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGhhbmRsZUZvclR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpX29iamVjdHNUb0hhbmRsZXMuZ2V0KHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzbG9hZGVyIHVzZWQgYnkgdGhpcyBsb2FkZXIgZm9yIHJlc29sdmluZyB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhpcyB0eXBlIHRvIGEgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVUb0RpcmVjdG9yeShGaWxlIGNsYXNzRGlyKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgYnVpbHRpbiBzY2hlbWEgdHlwZSBzeXN0ZW0gY2Fubm90IGJlIHNhdmVkLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkX3dzc3RyaW5nKGludCB3c3IpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHdzcikKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOgotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfUFJFU0VSVkU7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUkVQTEFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX1JFUExBQ0U7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9DT0xMQVBTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyIGJpZ0ludCkKLSAgICB7Ci0gICAgICAgIGlmIChiaWdJbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAoYmlnSW50LnNpZ251bSgpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sSW50ZWdlckltcGwgaSA9IG5ldyBYbWxJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgaS5zZXQoYmlnSW50KTsKLSAgICAgICAgICAgIGkuc2V0SW1tdXRhYmxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKGkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZEludGVnZXIoQmlnSW50ZWdlciBiaWdJbnQpCi0gICAgewotICAgICAgICBpZiAoYmlnSW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEludGVnZXJJbXBsIGkgPSBuZXcgWG1sSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGkuc2V0KGJpZ0ludCk7Ci0gICAgICAgICAgICBpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZihpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRTdHJpbmcoU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIGlmIChzdHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxTdHJpbmdJbXBsIGkgPSBuZXcgWG1sU3RyaW5nSW1wbCgpOwotICAgICAgICAgICAgaS5zZXQoc3RyKTsKLSAgICAgICAgICAgIGkuc2V0SW1tdXRhYmxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKGkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBCdWlsdGluKGludCBidGMsIFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZUltcGwodGhpcywgdHJ1ZSk7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBsb2NhbG5hbWUgPT0gbnVsbCA/IG51bGwgOiBRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9ICJfQklfIiArIChsb2NhbG5hbWUgPT0gbnVsbCA/ICJOT19UWVBFIiA6IGxvY2FsbmFtZSk7Ci0gICAgICAgIHJlc3VsdC5zZXROYW1lKG5hbWUpOwotICAgICAgICByZXN1bHQuc2V0QnVpbHRpblR5cGVDb2RlKGJ0Yyk7Ci0gICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRGdWxsSmF2YU5hbWUoY2xhc3NuYW1lKTsKLQotICAgICAgICBfdHlwZUFycmF5W2J0Y10gPSByZXN1bHQ7Ci0gICAgICAgIF90eXBlTWFwLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICBfaGFuZGxlc1RvT2JqZWN0cy5wdXQoaGFuZGxlLCByZXN1bHQpOwotICAgICAgICBfb2JqZWN0c1RvSGFuZGxlcy5wdXQocmVzdWx0LCBoYW5kbGUpOwotICAgICAgICBpZiAoY2xhc3NuYW1lICE9IG51bGwpCi0gICAgICAgICAgICBfdHlwZXNCeUNsYXNzbmFtZS5wdXQoY2xhc3NuYW1lLCByZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoKQotICAgIHsKLSAgICAgICAgLy8gd2UncmUgYm9ybiByZXNvbHZlZCBhbmQgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9ySGFuZGxlKFN0cmluZyBoYW5kbGUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpX2hhbmRsZXNUb09iamVjdHMuZ2V0KGhhbmRsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudCByZXNvbHZlSGFuZGxlKFN0cmluZyBoYW5kbGUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUNvbXBvbmVudClfaGFuZGxlc1RvT2JqZWN0cy5nZXQoaGFuZGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaW5rcyBhIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbEluVHlwZShpbnQgYnRjKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZUltcGwgcmVzdWx0ID0gZ2V0QnVpbHRpblR5cGUoYnRjKTsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlOwotICAgICAgICBTY2hlbWFUeXBlIGl0ZW0gPSBudWxsOwotICAgICAgICBpbnQgdmFyaWV0eSA9IFNjaGVtYVR5cGUuQVRPTUlDOwotICAgICAgICBpbnQgZGVyaXZhdGlvblR5cGUgPSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OOwotCi0gICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOOgotICAgICAgICAgICAgICAgIHZhcmlldHkgPSBTY2hlbWFUeXBlLk5PVF9TSU1QTEU7Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0FOWV9UWVBFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgICAgIHZhcmlldHkgPSBTY2hlbWFUeXBlLk5PVF9TSU1QTEU7Ci0gICAgICAgICAgICAgICAgYmFzZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZGVyaXZhdGlvblR5cGUgPSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfQU5ZX1RZUEU7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfQU5ZX1NJTVBMRTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIGRlcml2ZWQgbnVtZXJpY3MKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfREVDSU1BTDsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTE9ORzoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfSU5URUdFUjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5UOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9MT05HOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TSE9SVDoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfSU5UOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CWVRFOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9TSE9SVDsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0lOVEVHRVI7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX05PTl9QT1NJVElWRV9JTlRFR0VSOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfSU5URUdFUjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTk9OX05FR0FUSVZFX0lOVEVHRVI7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0xPTkc6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX05PTl9ORUdBVElWRV9JTlRFR0VSOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1VOU0lHTkVEX0xPTkc7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9VTlNJR05FRF9JTlQ7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1VOU0lHTkVEX1NIT1JUOyBicmVhazsKLQotICAgICAgICAgICAgLy8gZGVyaXZlZCBzdHJpbmdzCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9TVFJJTkc7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RPS0VOOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OT1JNQUxJWkVEX1NUUklORzsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkFNRToKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfVE9LRU47IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05DTkFNRToKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTkFNRTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSUQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVFk6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX05DTkFNRTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTEFOR1VBR0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU46Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1RPS0VOOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRlM6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUzoKLSAgICAgICAgICAgICAgICB2YXJpZXR5ID0gU2NoZW1hVHlwZS5MSVNUOwotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfU0lNUExFOwotICAgICAgICAgICAgICAgIGlmIChidGMgPT0gU2NoZW1hVHlwZS5CVENfSURSRUZTKQotICAgICAgICAgICAgICAgICAgICBpdGVtID0gU1RfSURSRUY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnRjID09IFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTKQotICAgICAgICAgICAgICAgICAgICBpdGVtID0gU1RfRU5USVRZOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaXRlbSA9IFNUX05NVE9LRU47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0RGVyaXZhdGlvblR5cGUoZGVyaXZhdGlvblR5cGUpOwotICAgICAgICByZXN1bHQuc2V0U2ltcGxlVHlwZVZhcmlldHkodmFyaWV0eSk7Ci0gICAgICAgIGlmICh2YXJpZXR5ICE9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LnNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgKGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRSB8fCBidGMgPT0gU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU4pOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5zZXRCYXNlVHlwZVJlZihiYXNlID09IG51bGwgPyBudWxsIDogYmFzZS5nZXRSZWYoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRCYXNlRGVwdGgoYmFzZSA9PSBudWxsID8gMCA6ICgoU2NoZW1hVHlwZUltcGwpYmFzZSkuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgcmVzdWx0LnNldExpc3RJdGVtVHlwZVJlZihpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS5nZXRSZWYoKSk7Ci0gICAgICAgIGlmIChidGMgPj0gU2NoZW1hVHlwZS5CVENfRklSU1RfUFJJTUlUSVZFICYmIGJ0YyA8PSBTY2hlbWFUeXBlLkJUQ19MQVNUX1BSSU1JVElWRSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQcmltaXRpdmVUeXBlUmVmKHJlc3VsdC5nZXRSZWYoKSk7Ci0gICAgICAgIGVsc2UgaWYgKHZhcmlldHkgPT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiYXNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmFzZSB3YXMgbnVsbCBmb3IgIiArIGJ0Yyk7Ci0gICAgICAgICAgICBpZiAoYmFzZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCYXNlLmdwdCB3YXMgbnVsbCBmb3IgIiArIGJ0Yyk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0UHJpbWl0aXZlVHlwZVJlZihiYXNlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRSZWYoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxWYWx1ZVJlZltdIGZhY2V0czsKLSAgICAgICAgYm9vbGVhbltdIGZpeGVkZjsKLSAgICAgICAgaW50IHdzciA9IFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U7Ci0gICAgICAgIGludCBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuTk9UX0RFQ0lNQUw7Ci0KLSAgICAgICAgLy8gbm93IHNldCB1cCBmYWNldHMKLSAgICAgICAgc3dpdGNoIChidGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU46Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX05PTkU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1dTX1BSRVNFUlZFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfQ09MTEFQU0U7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX1dTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1dTX0NPTExBUFNFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19XUzsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xPTkc6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX0xPTkc7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfTE9ORzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlQ6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX0lOVDsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9JTlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1NIT1JUOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JZVEU6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX0JZVEU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQllURTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTk9OUE9TSVRJVkU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTkVHQVRJVkU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX05PTk5FR0FUSVZFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1BPU0lUSVZFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0xPTkc6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1VOU0lHTkVEX0xPTkc7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5UOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19VTlNJR05FRF9JTlQ7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfTE9ORzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVDoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfVU5TSUdORURfU0hPUlQ7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfSU5UOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1VOU0lHTkVEX0JZVEU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAgICAgLy8gZGVyaXZlZCBzdHJpbmdzCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19SRVBMQUNFOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfUkVQTEFDRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19UT0tFTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkNOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSUQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRlM6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfQ09MTEFQU0U7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTlM6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX0JVSUxUSU5fTElTVDsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKLSAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZnVuZGFtZW50YWwgZmFjZXRzCi0gICAgICAgIGludCBvcmRlcmVkID0gU2NoZW1hVHlwZS5VTk9SREVSRUQ7Ci0gICAgICAgIGJvb2xlYW4gaXNOdW1lcmljID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaXNGaW5pdGUgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpc0JvdW5kZWQgPSBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVE9LRU46Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05DTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTEFOR1VBR0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUZTOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVFk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU46Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIGlzRmluaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgaXNOdW1lcmljID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBvcmRlcmVkID0gU2NoZW1hVHlwZS5UT1RBTF9PUkRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBTY2hlbWFUeXBlLlBBUlRJQUxfT1JERVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTE9ORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5UOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TSE9SVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQllURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9MT05HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgIGlzTnVtZXJpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFNjaGVtYVR5cGUuVE9UQUxfT1JERVI7Ci0gICAgICAgICAgICAgICAgaXNGaW5pdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlzQm91bmRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0QmFzaWNGYWNldHMoZmFjZXRzLCBmaXhlZGYpOwotICAgICAgICByZXN1bHQuc2V0V2hpdGVTcGFjZVJ1bGUod3NyKTsKLSAgICAgICAgcmVzdWx0LnNldE9yZGVyZWQob3JkZXJlZCk7Ci0gICAgICAgIHJlc3VsdC5zZXRCb3VuZGVkKGlzQm91bmRlZCk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1lcmljKGlzTnVtZXJpYyk7Ci0gICAgICAgIHJlc3VsdC5zZXRGaW5pdGUoaXNGaW5pdGUpOwotICAgICAgICByZXN1bHQuc2V0RGVjaW1hbFNpemUoZGVjaW1hbFNpemUpOwotICAgICAgICByZXN1bHQuc2V0QW5vbnltb3VzVHlwZVJlZnMoRU1QVFlfU0NIRU1BVFlQRVJFRl9BUlJBWSk7Ci0KLSAgICAgICAgLy8gVE9ETzogc2V0IHVwIHBhdHRlcm5zIGZvciBOQ05BTUUsIGxhbmd1YWdlLCBldGMuCi0KLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBudWxsOwotICAgICAgICBib29sZWFuIGhhc1BhdHRlcm4gPSBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlthLXpBLVpdezEsOH0oLVthLXpBLVowLTldezEsOH0pKiI7IC8vIHdlIHVzZWQgdG8gaGF2ZSAoW2EtekEtWl17Mn18W2lJXS1bYS16QS1aXSt8W3hYXS1bYS16QS1aXXsxLDh9KSgtW2EtekEtWl17MSw4fSkqIiwgYnV0IHM0cyB1c2VzIHRoZSBtb3JlIGxlbmllbnQgcGF0dGVybiB0byB0aGUgbGVmdC4gCi0gICAgICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU46Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9ICJcXGMrIjsgCi0gICAgICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05BTUU6Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9ICJcXGlcXGMqIjsKLSAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkNOQU1FOgotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiW1xcaS1bOl1dW1xcYy1bOl1dKiI7Ci0gICAgICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFRoZXNlIHR5cGVzIGluaGVyaXQgdGhlaXIgcGF0dGVybnMKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSUQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19FTlRJVFk6Ci0gICAgICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24gcCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgeyBwID0gb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uLmZvclBhdHRlcm4ocGF0dGVybik7IH0KLSAgICAgICAgICAgIGNhdGNoIChvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUGFyc2VFeGNlcHRpb24gZSkgeyBhc3NlcnQgZmFsc2U7IH0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRQYXR0ZXJucyhuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10ge3B9KTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0UGF0dGVybkZhY2V0KGhhc1BhdHRlcm4pOwotCi0KLQotICAgICAgICAvLyBBTllfVFlQRSBoYXMgdG8gYmUgYWJsZSB0byBhY3QgbGlrZSBhIGNvbXBsZXggdHlwZQotICAgICAgICBpZiAoYnRjID09IFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgY29udGVudE1vZGVsID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0V2lsZGNhcmRTZXQoUU5hbWVTZXQuQUxMKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRXaWxkY2FyZFByb2Nlc3MoU2NoZW1hUGFydGljbGUuTEFYKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRNaW5PY2N1cnMoQmlnSW50ZWdlci5aRVJPKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRNYXhPY2N1cnMobnVsbCk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0VHJhbnNpdGlvblJ1bGVzKFFOYW1lU2V0LkFMTCwgdHJ1ZSk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0VHJhbnNpdGlvbk5vdGVzKFFOYW1lU2V0LkFMTCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7Ci0gICAgICAgICAgICBhdHRyTW9kZWwuc2V0V2lsZGNhcmRQcm9jZXNzKFNjaGVtYUF0dHJpYnV0ZU1vZGVsLkxBWCk7Ci0gICAgICAgICAgICBhdHRyTW9kZWwuc2V0V2lsZGNhcmRTZXQoUU5hbWVTZXQuQUxMKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldENvbXBsZXhUeXBlVmFyaWV0eShTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpOwotICAgICAgICAgICAgcmVzdWx0LnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGZhbHNlKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhFTVBUWV9TQ0hFTUFUWVBFUkVGX0FSUkFZKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQuQUxMLCB0cnVlLCBRTmFtZVNldC5BTEwsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc28gZG9lcyB0aGUgbm9fdHlwZSA6IGl0IHBlcm1pdHMgbm8gY29udGVudHMgKGFuZCBldmVuIGVtcHR5IGNvbnRlbnRzIGlzIGludmFsaWQsIGJ1dCB0aGF0J3Mgc3BlY2lhbC1jYXNlZCkKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBjb250ZW50TW9kZWwgPSBudWxsOyAvLyBlbXB0eQotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsgLy8gZW1wdHkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDb21wbGV4VHlwZVZhcmlldHkoU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0QW5vbnltb3VzVHlwZVJlZnMoRU1QVFlfU0NIRU1BVFlQRVJFRl9BUlJBWSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRTdW1tYXJ5KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSwgUU5hbWVTZXQuRU1QVFksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRPcmRlclNlbnNpdGl2ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlIGdldE5vVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU1RfTk9fVFlQRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9DbGFzc0xvYWRlclJlc291cmNlTG9hZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9DbGFzc0xvYWRlclJlc291cmNlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTUzMmQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50cyBSZXNvdXJjZUxvYWRlcgotewotICAgIENsYXNzTG9hZGVyIF9jbGFzc0xvYWRlcjsKLQotICAgIENsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gICAgewotICAgICAgICBfY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvRmlsZVJlc291cmNlTG9hZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9GaWxlUmVzb3VyY2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzY2Y1NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9GaWxlUmVzb3VyY2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotCi1wdWJsaWMgY2xhc3MgRmlsZVJlc291cmNlTG9hZGVyIGltcGxlbWVudHMgUmVzb3VyY2VMb2FkZXIKLXsKLSAgICBwcml2YXRlIEZpbGUgX2RpcmVjdG9yeTsKLSAgICBwcml2YXRlIFppcEZpbGUgX3ppcGZpbGU7Ci0KLSAgICBwdWJsaWMgRmlsZVJlc291cmNlTG9hZGVyKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgX2RpcmVjdG9yeSA9IGZpbGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgX3ppcGZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF96aXBmaWxlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBfemlwZmlsZS5nZXRFbnRyeShyZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ppcGZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKF9kaXJlY3RvcnksIHJlc291cmNlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfemlwZmlsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfemlwZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gb2ggd2VsbC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF96aXBmaWxlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvUGF0aFJlc291cmNlTG9hZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9QYXRoUmVzb3VyY2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NjdlOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9QYXRoUmVzb3VyY2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBQYXRoUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50cyBSZXNvdXJjZUxvYWRlcgotewotICAgIHByaXZhdGUgUmVzb3VyY2VMb2FkZXJbXSBfcGF0aDsKLQotICAgIHB1YmxpYyBQYXRoUmVzb3VyY2VMb2FkZXIoUmVzb3VyY2VMb2FkZXJbXSBsb2FkZXJwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9wYXRoID0gbmV3IFJlc291cmNlTG9hZGVyW2xvYWRlcnBhdGgubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShsb2FkZXJwYXRoLCAwLCBfcGF0aCwgMCwgX3BhdGgubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGF0aFJlc291cmNlTG9hZGVyKEZpbGVbXSBmaWxlcGF0aCkKLSAgICB7Ci0gICAgICAgIExpc3QgcGF0aGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlc291cmNlTG9hZGVyIHBhdGggPSBuZXcgRmlsZVJlc291cmNlTG9hZGVyKGZpbGVwYXRoW2ldKTsKLSAgICAgICAgICAgICAgICBwYXRobGlzdC5hZGQocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gY2FuJ3QgcmVhZCBhIGZpbGUgb24gY2xhc3NwYXRoPyBza2lwIGl0LgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9wYXRoID0gKFJlc291cmNlTG9hZGVyW10pcGF0aGxpc3QudG9BcnJheShuZXcgUmVzb3VyY2VMb2FkZXJbcGF0aGxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHJlc3VsdCA9IF9wYXRoW2ldLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wYXRoW2ldLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gb2ggd2VsbC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1Jlc291cmNlTG9hZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9SZXNvdXJjZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzNWU2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1Jlc291cmNlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTG9hZGVyCi17Ci0gICAgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjlmYTM3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgaW1wbGVtZW50cyBTY2hlbWFBdHRyaWJ1dGVHcm91cAotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIHByaXZhdGUgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9yZWRlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKLSAgICB7Ci0gICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXModHlwZVN5c3RlbSk7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbiwgWG1sT2JqZWN0IHgpCi0gICAgewotICAgICAgICBhc3NlcnQgX25hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscyggX25hbWUgKTsKLQotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgIF9wYXJzZVROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgX2NoYW1lbGVvbiA9IGNoYW1lbGVvbjsKLSAgICAgICAgX3JlZGVmaW5pdGlvbiA9IHJlZGVmaW5pdGlvbjsKLSAgICAgICAgX3BhcnNlT2JqZWN0ID0geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGdldFBhcnNlT2JqZWN0KCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlT2JqZWN0OyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZVROUzsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKHRoaXMpOwotICAgIAotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDk5MmEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgaW1wbGVtZW50cyBTY2hlbWFBdHRyaWJ1dGVNb2RlbAotewotICAgIHByaXZhdGUgTWFwIGF0dHJNYXA7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCB3Y1NldDsKLSAgICBwcml2YXRlIGludCB3Y1Byb2Nlc3M7Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCkKLSAgICB7Ci0gICAgICAgIGF0dHJNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICB3Y1NldCA9IG51bGw7Ci0gICAgICAgIHdjUHJvY2VzcyA9IE5PTkU7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChTY2hlbWFBdHRyaWJ1dGVNb2RlbCBzYW0pCi0gICAgewotICAgICAgICBhdHRyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNhbSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3Y1NldCA9IG51bGw7Ci0gICAgICAgICAgICB3Y1Byb2Nlc3MgPSBOT05FOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBhdHRycyA9IHNhbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF0dHJNYXAucHV0KGF0dHJzW2ldLmdldE5hbWUoKSwgYXR0cnNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2FtLmdldFdpbGRjYXJkUHJvY2VzcygpICE9IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2NTZXQgPSBzYW0uZ2V0V2lsZGNhcmRTZXQoKTsKLSAgICAgICAgICAgICAgICB3Y1Byb2Nlc3MgPSBzYW0uZ2V0V2lsZGNhcmRQcm9jZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBFTVBUWV9TTEFfQVJSQVkgPSBuZXcgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbMF07Ci0KLSAgICBwdWJsaWMgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSlhdHRyTWFwLnZhbHVlcygpLnRvQXJyYXkoRU1QVFlfU0xBX0FSUkFZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUxvY2FsQXR0cmlidXRlKWF0dHJNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTY2hlbWFMb2NhbEF0dHJpYnV0ZSBhdHRydXNlKQotICAgIHsKLSAgICAgICAgYXR0ck1hcC5wdXQoYXR0cnVzZS5nZXROYW1lKCksIGF0dHJ1c2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9oaWJpdGVkQXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBhdHRyTWFwLnJlbW92ZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWVTZXQgZ2V0V2lsZGNhcmRTZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdjU2V0ID09IG51bGwgPyBRTmFtZVNldC5FTVBUWSA6IHdjU2V0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdpbGRjYXJkU2V0KFFOYW1lU2V0IHNldCkKLSAgICB7Ci0gICAgICAgIHdjU2V0ID0gc2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lsZGNhcmRQcm9jZXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3Y1Byb2Nlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lsZGNhcmRQcm9jZXNzKGludCBwcm9jKQotICAgIHsKLSAgICAgICAgd2NQcm9jZXNzID0gcHJvYzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGJjMjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwKLSAgICAgICAgaW1wbGVtZW50cyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUKLXsKLSAgICBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOwotICAgIFN0cmluZyBfZmlsZW5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhcnNlVE5TOwotICAgIHByaXZhdGUgYm9vbGVhbiBfY2hhbWVsZW9uOwotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOwotICAgIH0KLQotCi0gICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIF9maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgcGFyc2VPYmplY3QsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uKQotICAgIHsKLSAgICAgICAgX3BhcnNlT2JqZWN0ID0gcGFyc2VPYmplY3Q7Ci0gICAgICAgIF9wYXJzZVROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgX2NoYW1lbGVvbiA9IGNoYW1lbGVvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGdldFBhcnNlT2JqZWN0KCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlT2JqZWN0OyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZVROUzsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIF9zZWxmcmVmID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYodGhpcyk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBnZXRSZWYoKQotICAgICAgICB7IHJldHVybiBfc2VsZnJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudC5SZWYgZ2V0Q29tcG9uZW50UmVmKCkKLSAgICAgICAgeyByZXR1cm4gZ2V0UmVmKCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEVsZW1lbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIyNmYzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2NoZW1hTG9jYWxFbGVtZW50SW1wbAotICAgICAgICBpbXBsZW1lbnRzIFNjaGVtYUdsb2JhbEVsZW1lbnQKLXsKLSAgICBwcml2YXRlIFNldCBfc2dNZW1iZXJzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZVtdIF9uYW1lYXJyYXkgPSBuZXcgUU5hbWVbMF07Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbEV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsUmVzdDsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW0gX3R5cGVTeXN0ZW07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2ZpbGVuYW1lOwotICAgIC8vIHByaXZhdGUgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsgbm93IGluaGVyaXRlZCBmcm9tIGJhc2UKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0gICAgcHJpdmF0ZSBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBfc2c7Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIF9maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLQotICAgIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBmaW5hbEV4dCwgYm9vbGVhbiBmaW5hbFJlc3QpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsgX2ZpbmFsRXh0ID0gZmluYWxFeHQ7IF9maW5hbFJlc3QgPSBmaW5hbFJlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudCBzdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NnID09IG51bGwgPyBudWxsIDogX3NnLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnN0aXR1dGlvbkdyb3VwKFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHNnKSAKLSAgICB7Ci0gICAgICAgIF9zZyA9IHNnOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZVtdIHN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gKFFOYW1lW10pX3NnTWVtYmVycy50b0FycmF5KF9uYW1lYXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsgX3NnTWVtYmVycy5hZGQobmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbEV4dGVuc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbmFsRXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsUmVzdHJpY3Rpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9maW5hbFJlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyc2VDb250ZXh0KFhtbE9iamVjdCBwYXJzZU9iamVjdCwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24pCi0gICAgewotICAgICAgICBfcGFyc2VPYmplY3QgPSBwYXJzZU9iamVjdDsKLSAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VPYmplY3Q7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlVE5TOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIF9zZWxmcmVmID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKHRoaXMpOwotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIGdldFJlZigpCi0gICAgICAgIHsgcmV0dXJuIF9zZWxmcmVmOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50LlJlZiBnZXRDb21wb25lbnRSZWYoKQotICAgICAgICB7IHJldHVybiBnZXRSZWYoKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmI2YjgzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpbXBsZW1lbnRzIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludAotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFN0cmluZyBfc2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfZmllbGRzOwotICAgIHByaXZhdGUgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBfa2V5OwotICAgIHByaXZhdGUgUU5hbWUgX25hbWU7Ci0gICAgcHJpdmF0ZSBpbnQgX3R5cGU7Ci0gICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlOwotICAgIHByaXZhdGUgTWFwIF9uc01hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0KLSAgICAvLyBMYXppbHkgY29tcHV0ZWQgcGF0aHMKLSAgICBwcml2YXRlIHZvbGF0aWxlIFhQYXRoIF9zZWxlY3RvclBhdGg7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBYUGF0aFtdIF9maWVsZFBhdGhzOwotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwoU2NoZW1hVHlwZVN5c3RlbSBzeXMpIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSBzeXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIF9zZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdG9yUGF0aCgpIHsKLSAgICAgICAgWFBhdGggcCA9IF9zZWxlY3RvclBhdGg7Ci0gICAgICAgIGlmIChwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRQYXRocygpOwotICAgICAgICAgICAgICAgIHAgPSBfc2VsZWN0b3JQYXRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiRmFpbGVkIHRvIGNvbXBpbGUgeHBhdGguIFNob3VsZCBiZSBjYXVnaHQgYnkgY29tcGlsZXIgIiArIGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TlNNYXAoTWFwIG5zTWFwKSB7Ci0gICAgICAgIF9uc01hcCA9IG5zTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0TlNNYXAoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoX25zTWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RvcihTdHJpbmcgc2VsZWN0b3IpIHsKLSAgICAgICAgYXNzZXJ0IHNlbGVjdG9yICE9IG51bGw7Ci0gICAgICAgIF9zZWxlY3RvciA9IHNlbGVjdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkcyhTdHJpbmdbXSBmaWVsZHMpIHsKLSAgICAgICAgYXNzZXJ0IGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5sZW5ndGggPiAwOwotICAgICAgICBfZmllbGRzID0gZmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGaWVsZHMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IG5ldyBTdHJpbmdbX2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9maWVsZHMsIDAsIGZpZWxkcywgMCwgZmllbGRzLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFBhdGgoaW50IGluZGV4KSB7Ci0gICAgICAgIFhQYXRoW10gcCA9IF9maWVsZFBhdGhzOwotICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkUGF0aHMoKTsKLSAgICAgICAgICAgICAgICBwID0gX2ZpZWxkUGF0aHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJGYWlsZWQgdG8gY29tcGlsZSB4cGF0aC4gU2hvdWxkIGJlIGNhdWdodCBieSBjb21waWxlciAiICsgZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFtpbmRleF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRQYXRocygpIHRocm93cyBYUGF0aC5YUGF0aENvbXBpbGVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBOZWVkIHRoZSBuYW1lc3BhY2UgbWFwIC0gcmVxdWlyZXMgc3RvcmUgc3VwcG9ydAotICAgICAgICBfc2VsZWN0b3JQYXRoID0gWFBhdGguY29tcGlsZVhQYXRoKF9zZWxlY3RvciwgX25zTWFwKTsKLQotICAgICAgICBfZmllbGRQYXRocyA9IG5ldyBYUGF0aFtfZmllbGRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9maWVsZFBhdGhzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIF9maWVsZFBhdGhzW2ldID0gWFBhdGguY29tcGlsZVhQYXRoKF9maWVsZHNbaV0sIF9uc01hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEtleShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGtleSkgewotICAgICAgICBfa2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZ2V0UmVmZXJlbmNlZEtleSgpIHsKLSAgICAgICAgcmV0dXJuIF9rZXkuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludENhdGVnb3J5KGludCB0eXBlKSB7Ci0gICAgICAgIGFzc2VydCB0eXBlID49IENDX0tFWSAmJiB0eXBlIDw9IENDX1VOSVFVRTsKLSAgICAgICAgX3R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIElERU5USVRZX0NPTlNUUkFJTlQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpIHsKLSAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgbywgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24pIHsKLSAgICAgICAgX3BhcnNlID0gbzsKLSAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyc2VUTlM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE9ubHkgYXBwbGljYWJsZSB0byBrZXlyZWZzLiBPdGhlciB0eXBlcyBhcmUgaW1wbGljaXRseSByZXNvbHZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgIT0gQ0NfS0VZUkVGIHx8IF9rZXkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZih0aGlzKTsKLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGdldFJlZigpCi0gICAgICAgIHsgcmV0dXJuIF9zZWxmcmVmOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50LlJlZiBnZXRDb21wb25lbnRSZWYoKQotICAgICAgICB7IHJldHVybiBnZXRSZWYoKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MWU1NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcC5TT0FQQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcC5TY2hlbWFXU0RMQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlQ29udGV4dDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgU2NoZW1hTG9jYWxBdHRyaWJ1dGUsIFNjaGVtYVdTRExBcnJheVR5cGUKLXsKLSAgICBwdWJsaWMgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChRTmFtZSBuYW1lLCBTY2hlbWFUeXBlLlJlZiB0eXBlcmVmLCBpbnQgdXNlLCBTdHJpbmcgZGVmdGV4dCwgWG1sT2JqZWN0IHBhcnNlT2JqZWN0LCBYbWxWYWx1ZVJlZiBkZWZ2YWx1ZSwgYm9vbGVhbiBpc0ZpeGVkLCBTT0FQQXJyYXlUeXBlIHdzZGxBcnJheSkKLSAgICB7Ci0gICAgICAgIGlmIChfeG1sTmFtZSAhPSBudWxsIHx8IF90eXBlcmVmICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIF91c2UgPSB1c2U7Ci0gICAgICAgIF90eXBlcmVmID0gdHlwZXJlZjsKLSAgICAgICAgX2RlZmF1bHRUZXh0ID0gZGVmdGV4dDsKLSAgICAgICAgX3BhcnNlT2JqZWN0ID0gcGFyc2VPYmplY3Q7Ci0gICAgICAgIF9kZWZhdWx0VmFsdWUgPSBkZWZ2YWx1ZTsKLSAgICAgICAgX2lzRGVmYXVsdCA9IChkZWZ0ZXh0ICE9IG51bGwpOwotICAgICAgICBfaXNGaXhlZCA9IGlzRml4ZWQ7Ci0gICAgICAgIF94bWxOYW1lID0gbmFtZTsKLSAgICAgICAgX3dzZGxBcnJheVR5cGUgPSB3c2RsQXJyYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHRUZXh0OwotICAgIC8qIHBhY2thZ2UgKi8gWG1sVmFsdWVSZWYgX2RlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzRml4ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0RlZmF1bHQ7Ci0gICAgcHJpdmF0ZSBRTmFtZSBfeG1sTmFtZTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF90eXBlcmVmOwotICAgIHByaXZhdGUgU09BUEFycmF5VHlwZSBfd3NkbEFycmF5VHlwZTsKLSAgICBwcml2YXRlIGludCBfdXNlOwotICAgIHByb3RlY3RlZCBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OyAvLyBmb3IgUU5hbWUgcmVzb2x1dGlvbgotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUmVzb2x2ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChfdHlwZXJlZiAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgIHsKLSAgICAgICAgaWYgKF90eXBlcmVmICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF90eXBlcmVmID0gdHlwZXJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFVzZSgpCi0gICAgICAgIHsgcmV0dXJuIF91c2U7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX3htbE5hbWU7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKQotICAgICAgICB7IHJldHVybiBfZGVmYXVsdFRleHQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0RlZmF1bHQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRml4ZWQoKQotICAgICAgICB7IHJldHVybiBfaXNGaXhlZDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKQotICAgICAgICB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3R5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBnZXRUeXBlUmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3R5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF91c2UgPT0gUkVRVUlSRUQgPyBCaWdJbnRlZ2VyLk9ORSA6IEJpZ0ludGVnZXIuWkVSTzsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4T2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX3VzZSA9PSBQUk9ISUJJVEVEID8gQmlnSW50ZWdlci5aRVJPIDogQmlnSW50ZWdlci5PTkU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgICAgICB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgcHVibGljIFNPQVBBcnJheVR5cGUgZ2V0V1NETEFycmF5VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF93c2RsQXJyYXlUeXBlOyB9Ci0gICAgCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZGVmYXVsdFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRWYWx1ZS5nZXQoKTsKLSAgICAgICAgaWYgKF9kZWZhdWx0VGV4dCAhPSBudWxsICYmIFhtbEFueVNpbXBsZVR5cGUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKGdldFR5cGUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcGFyc2VPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dChfcGFyc2VPYmplY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5uZXdWYWx1ZShfZGVmYXVsdFRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCkubmV3VmFsdWUoX2RlZmF1bHRUZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoWG1sVmFsdWVSZWYgZGVmYXVsdFJlZikKLSAgICAgICAgeyBfZGVmYXVsdFZhbHVlID0gZGVmYXVsdFJlZjsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTG9jYWxFbGVtZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTG9jYWxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjIyM2FkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcC5TT0FQQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcC5TY2hlbWFXU0RMQXJyYXlUeXBlOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCBleHRlbmRzIFNjaGVtYVBhcnRpY2xlSW1wbAotICAgICAgICBpbXBsZW1lbnRzIFNjaGVtYUxvY2FsRWxlbWVudCwgU2NoZW1hV1NETEFycmF5VHlwZQotewotICAgIHByaXZhdGUgYm9vbGVhbiBfYmxvY2tFeHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja1Jlc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja1N1YnN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIF9hYnM7Ci0gICAgcHJpdmF0ZSBTT0FQQXJyYXlUeXBlIF93c2RsQXJyYXlUeXBlOwotICAgIHByaXZhdGUgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIF9jb25zdHJhaW50cyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmWzBdOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCgpCi0gICAgewotICAgICAgICBzZXRQYXJ0aWNsZVR5cGUoU2NoZW1hUGFydGljbGUuRUxFTUVOVCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tFeHRlbnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ibG9ja0V4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBibG9ja1Jlc3RyaWN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmxvY2tSZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrU3Vic3RpdHV0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmxvY2tTdWJzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gYWJzKQotICAgIHsKLSAgICAgICAgX2FicyA9IGFiczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCbG9jayhib29sZWFuIGV4dGVuc2lvbiwgYm9vbGVhbiByZXN0cmljdGlvbiwgYm9vbGVhbiBzdWJzdGl0dXRpb24pCi0gICAgewotICAgICAgICBtdXRhdGUoKTsKLSAgICAgICAgX2Jsb2NrRXh0ID0gZXh0ZW5zaW9uOwotICAgICAgICBfYmxvY2tSZXN0ID0gcmVzdHJpY3Rpb247Ci0gICAgICAgIF9ibG9ja1N1YnN0ID0gc3Vic3RpdHV0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxBcnJheVR5cGUoU09BUEFycmF5VHlwZSBhcnJheVR5cGUpCi0gICAgewotICAgICAgICBfd3NkbEFycmF5VHlwZSA9IGFycmF5VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEFycmF5VHlwZSBnZXRXU0RMQXJyYXlUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfd3NkbEFycmF5VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGl0eUNvbnN0cmFpbnRzKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbXSBjb25zdHJhaW50cykgewotICAgICAgICBtdXRhdGUoKTsKLSAgICAgICAgX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGdldElkZW50aXR5Q29uc3RyYWludHMoKSB7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbX2NvbnN0cmFpbnRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHJlc3VsdC5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSBfY29uc3RyYWludHNbaV0uZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbXSBnZXRJZGVudGl0eUNvbnN0cmFpbnRSZWZzKCkgewotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbX2NvbnN0cmFpbnRzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2NvbnN0cmFpbnRzLCAwLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYU1vZGVsR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTU1MjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFNb2RlbEdyb3VwSW1wbCBpbXBsZW1lbnRzIFNjaGVtYU1vZGVsR3JvdXAKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW0gX3R5cGVTeXN0ZW07Ci0gICAgcHJpdmF0ZSBRTmFtZSBfbmFtZTsKLSAgICBwcml2YXRlIFhtbE9iamVjdCBfcGFyc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhcnNlVE5TOwotICAgIHByaXZhdGUgYm9vbGVhbiBfY2hhbWVsZW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcmVkZWZpbml0aW9uOwotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXBJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKLSAgICB7Ci0gICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtLCBRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcyh0eXBlU3lzdGVtKTsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoUU5hbWUgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uLCBYbWxPYmplY3QgeCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfbmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCBfbmFtZSApOwotICAgICAgICAKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgICAgIF9yZWRlZmluaXRpb24gPSByZWRlZmluaXRpb247Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHg7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGdldFBhcnNlT2JqZWN0KCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlT2JqZWN0OyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZVROUzsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUmVkZWZpbml0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX3JlZGVmaW5pdGlvbjsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFNb2RlbEdyb3VwLlJlZiBfc2VsZnJlZiA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwLlJlZih0aGlzKTsKLSAgICAKLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFQYXJ0aWNsZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVBhcnRpY2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmVhMmQzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVBhcnRpY2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUGFydGljbGVJbXBsIGltcGxlbWVudHMgU2NoZW1hUGFydGljbGUKLXsKLSAgICBwcml2YXRlIGludCBfcGFydGljbGVUeXBlOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfbWluT2NjdXJzOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfbWF4T2NjdXJzOwotICAgIHByaXZhdGUgU2NoZW1hUGFydGljbGVbXSBfcGFydGljbGVDaGlsZHJlbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzSW1tdXRhYmxlOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX3N0YXJ0U2V0OwotICAgIHByaXZhdGUgUU5hbWVTZXQgX2V4Y2x1ZGVOZXh0U2V0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNTa2lwcGFibGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0RldGVybWluaXN0aWM7Ci0gICAgcHJpdmF0ZSBpbnQgX2ludE1pbk9jY3VyczsKLSAgICBwcml2YXRlIGludCBfaW50TWF4T2NjdXJzOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX3dpbGRjYXJkU2V0OwotICAgIHByaXZhdGUgaW50IF93aWxkY2FyZFByb2Nlc3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHRUZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNEZWZhdWx0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNGaXhlZDsKLSAgICBwcml2YXRlIFFOYW1lIF9xTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzTmlsbGFibGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfdHlwZXJlZjsKLSAgICBwcm90ZWN0ZWQgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsKLSAgICBwcml2YXRlIFhtbFZhbHVlUmVmIF9kZWZhdWx0VmFsdWU7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBtdXRhdGUoKQotICAgICAgICB7IGlmIChfaXNJbW11dGFibGUpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW1tdXRhYmxlKCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2lzSW1tdXRhYmxlID0gdHJ1ZTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVHJhbnNpdGlvblJ1bGVzKCkKLSAgICAgICAgeyByZXR1cm4gKF9zdGFydFNldCAhPSBudWxsKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVHJhbnNpdGlvbk5vdGVzKCkKLSAgICAgICAgeyByZXR1cm4gKF9leGNsdWRlTmV4dFNldCAhPSBudWxsKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNpdGlvblJ1bGVzKFFOYW1lU2V0IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2tpcHBhYmxlKQotICAgIHsKLSAgICAgICAgX3N0YXJ0U2V0ID0gc3RhcnQ7Ci0gICAgICAgIF9pc1NraXBwYWJsZSA9IGlzU2tpcHBhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaXRpb25Ob3RlcyhRTmFtZVNldCBleGNsdWRlTmV4dCwgYm9vbGVhbiBpc0RldGVybWluaXN0aWMpCi0gICAgewotICAgICAgICBfZXhjbHVkZU5leHRTZXQgPSBleGNsdWRlTmV4dDsKLSAgICAgICAgX2lzRGV0ZXJtaW5pc3RpYyA9IGlzRGV0ZXJtaW5pc3RpYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdGFydFdpdGhFbGVtZW50KFFOYW1lIG5hbWUpCi0gICAgICAgIHsgcmV0dXJuIG5hbWUgIT0gbnVsbCAmJiBfc3RhcnRTZXQuY29udGFpbnMobmFtZSk7IH0KLQotICAgIHB1YmxpYyBRTmFtZVNldCBhY2NlcHRlZFN0YXJ0TmFtZXMoKQotICAgICAgICB7IHJldHVybiBfc3RhcnRTZXQ7IH0KLQotICAgIHB1YmxpYyBRTmFtZVNldCBnZXRFeGNsdWRlTmV4dFNldCgpCi0gICAgICAgIHsgcmV0dXJuIF9leGNsdWRlTmV4dFNldDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwcGFibGUoKQotICAgICAgICB7IHJldHVybiBfaXNTa2lwcGFibGU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpCi0gICAgICAgIHsgcmV0dXJuIF9pc0RldGVybWluaXN0aWM7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFydGljbGVUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnRpY2xlVHlwZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFydGljbGVUeXBlKGludCBwVHlwZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX3BhcnRpY2xlVHlwZSA9IHBUeXBlOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZXRvbigpCi0gICAgICAgIHsgcmV0dXJuIF9tYXhPY2N1cnMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICBfbWF4T2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICBfbWluT2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMDsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX21pbk9jY3VyczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIgbWluKQotICAgICAgICB7IG11dGF0ZSgpOyBfbWluT2NjdXJzID0gbWluOyBfaW50TWluT2NjdXJzID0gcGVnQmlnSW50ZWdlcihtaW4pOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludE1pbk9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF9pbnRNaW5PY2N1cnM7IH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF9tYXhPY2N1cnM7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50TWF4T2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX2ludE1heE9jY3VyczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXJzKEJpZ0ludGVnZXIgbWF4KQotICAgICAgICB7IG11dGF0ZSgpOyBfbWF4T2NjdXJzID0gbWF4OyBfaW50TWF4T2NjdXJzID0gcGVnQmlnSW50ZWdlcihtYXgpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUGFydGljbGVbXSBnZXRQYXJ0aWNsZUNoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVBhcnRpY2xlW19wYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3BhcnRpY2xlQ2hpbGRyZW4sIDAsIHJlc3VsdCwgMCwgX3BhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aWNsZUNoaWxkcmVuKFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9wYXJ0aWNsZUNoaWxkcmVuID0gY2hpbGRyZW47IH0KLQotICAgIHB1YmxpYyBTY2hlbWFQYXJ0aWNsZSBnZXRQYXJ0aWNsZUNoaWxkKGludCBpKQotICAgICAgICB7IHJldHVybiBfcGFydGljbGVDaGlsZHJlbltpXTsgfQotCi0gICAgcHVibGljIGludCBjb3VudE9mUGFydGljbGVDaGlsZCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJ0aWNsZUNoaWxkcmVuID09IG51bGwgPyAwIDogX3BhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFNldChRTmFtZVNldCBzZXQpCi0gICAgICAgIHsgbXV0YXRlKCk7IF93aWxkY2FyZFNldCA9IHNldDsgfQotCi0gICAgcHVibGljIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCkKLSAgICAgICAgeyByZXR1cm4gX3dpbGRjYXJkU2V0OyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFByb2Nlc3MoaW50IHByb2Nlc3MpCi0gICAgICAgIHsgbXV0YXRlKCk7IF93aWxkY2FyZFByb2Nlc3MgPSBwcm9jZXNzOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpCi0gICAgICAgIHsgcmV0dXJuIF93aWxkY2FyZFByb2Nlc3M7IH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21heGludCA9IEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcGVnQmlnSW50ZWdlcihCaWdJbnRlZ2VyIGJpKQotICAgIHsKLSAgICAgICAgaWYgKGJpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGlmIChiaS5zaWdudW0oKSA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChiaS5jb21wYXJlVG8oX21heGludCkgPj0gMCkKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGJpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQotICAgICAgICB7IHJldHVybiBfcU5hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVBbmRUeXBlUmVmKFFOYW1lIGZvcm1uYW1lLCBTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IG11dGF0ZSgpOyBfcU5hbWUgPSBmb3JtbmFtZTsgX3R5cGVyZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVSZXNvbHZlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKF90eXBlcmVmICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgewotICAgICAgICBpZiAoX3R5cGVyZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3R5cGVyZWYgPSB0eXBlcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlKCkKLSAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldFR5cGUoKQotICAgICAgICB7IGlmIChfdHlwZXJlZiA9PSBudWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuIF90eXBlcmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUZXh0KCkKLSAgICAgICAgeyByZXR1cm4gX2RlZmF1bHRUZXh0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKQotICAgICAgICB7IHJldHVybiBfaXNEZWZhdWx0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCkKLSAgICAgICAgeyByZXR1cm4gX2lzRml4ZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIGRlZnRleHQsIGJvb2xlYW4gaXNGaXhlZCwgWG1sT2JqZWN0IHBhcnNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7Ci0gICAgICAgIF9kZWZhdWx0VGV4dCA9IGRlZnRleHQ7Ci0gICAgICAgIF9pc0RlZmF1bHQgPSAoZGVmdGV4dCAhPSBudWxsKTsKLSAgICAgICAgX2lzRml4ZWQgPSBpc0ZpeGVkOwotICAgICAgICBfcGFyc2VPYmplY3QgPSBwYXJzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgICAgICAgeyByZXR1cm4gX2lzTmlsbGFibGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbGxhYmxlKGJvb2xlYW4gbmlsbGFibGUpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9pc05pbGxhYmxlID0gbmlsbGFibGU7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgICBpZiAoX2RlZmF1bHRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWUuZ2V0KCk7Ci0gICAgICAgIGlmIChfZGVmYXVsdFRleHQgIT0gbnVsbCAmJiBYbWxBbnlTaW1wbGVUeXBlLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShnZXRUeXBlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3BhcnNlT2JqZWN0ICE9IG51bGwgJiYgWG1sUU5hbWUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKGdldFR5cGUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoX3BhcnNlT2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCkubmV3VmFsdWUoX2RlZmF1bHRUZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLm5ld1ZhbHVlKF9kZWZhdWx0VGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShYbWxWYWx1ZVJlZiBkZWZhdWx0UmVmKQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7Ci0gICAgICAgIF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0UmVmOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVByb3BlcnR5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ODE0YzYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYVByb3BlcnR5SW1wbCBpbXBsZW1lbnRzIFNjaGVtYVByb3BlcnR5Ci17Ci0gICAgcHJpdmF0ZSBRTmFtZSBfbmFtZTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF90eXBlcmVmOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNBdHRyaWJ1dGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfY29udGFpbmVyVHlwZVJlZjsKLSAgICBwcml2YXRlIFN0cmluZyBfamF2YVByb3BlcnR5TmFtZTsKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgX21pbk9jY3VyczsKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgX21heE9jY3VyczsKLSAgICBwcml2YXRlIGludCBfaGFzTmlsbGFibGU7Ci0gICAgcHJpdmF0ZSBpbnQgX2hhc0RlZmF1bHQ7Ci0gICAgcHJpdmF0ZSBpbnQgX2hhc0ZpeGVkOwotICAgIHByaXZhdGUgU3RyaW5nIF9kZWZhdWx0VGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzSW1tdXRhYmxlOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2phdmFCYXNlZE9uVHlwZVJlZjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2V4dGVuZHNTaW5nbGV0b247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9leHRlbmRzQXJyYXk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9leHRlbmRzT3B0aW9uOwotICAgIHByaXZhdGUgaW50IF9qYXZhVHlwZUNvZGU7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCBfamF2YVNldHRlckRlbGltaXRlcjsKLSAgICBwcml2YXRlIFhtbFZhbHVlUmVmIF9kZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBTZXQgX2FjY2VwdGVkTmFtZXM7Ci0KLSAgICBwcml2YXRlIHZvaWQgbXV0YXRlKCkKLSAgICAgICAgeyBpZiAoX2lzSW1tdXRhYmxlKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEltbXV0YWJsZSgpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9pc0ltbXV0YWJsZSA9IHRydWU7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldENvbnRhaW5lclR5cGUoKQotICAgICAgICB7IHJldHVybiBfY29udGFpbmVyVHlwZVJlZi5nZXQoKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IG11dGF0ZSgpOyBfY29udGFpbmVyVHlwZVJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX25hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX25hbWUgPSBuYW1lOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFQcm9wZXJ0eU5hbWUoKQotICAgICAgICB7IHJldHVybiBfamF2YVByb3BlcnR5TmFtZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2phdmFQcm9wZXJ0eU5hbWUgPSBuYW1lOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0F0dHJpYnV0ZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKGJvb2xlYW4gaXNBdHRyaWJ1dGUpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9pc0F0dHJpYnV0ZSA9IGlzQXR0cmlidXRlOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldFR5cGUoKQotICAgICAgICB7IHJldHVybiBfdHlwZXJlZi5nZXQoKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IG11dGF0ZSgpOyBfdHlwZXJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGphdmFCYXNlZE9uVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9qYXZhQmFzZWRPblR5cGVSZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV4dGVuZHNKYXZhU2luZ2xldG9uKCkKLSAgICAgICAgeyByZXR1cm4gX2V4dGVuZHNTaW5nbGV0b247IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV4dGVuZHNKYXZhQXJyYXkoKQotICAgICAgICB7IHJldHVybiBfZXh0ZW5kc0FycmF5OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmRzSmF2YU9wdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9leHRlbmRzT3B0aW9uOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbmRzSmF2YShTY2hlbWFUeXBlLlJlZiBqYXZhQmFzZWRPblR5cGVSZWYsIGJvb2xlYW4gc2luZ2xldG9uLCBib29sZWFuIG9wdGlvbiwgYm9vbGVhbiBhcnJheSkKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOwotICAgICAgICBfamF2YUJhc2VkT25UeXBlUmVmID0gamF2YUJhc2VkT25UeXBlUmVmOwotICAgICAgICBfZXh0ZW5kc1NpbmdsZXRvbiA9IHNpbmdsZXRvbjsKLSAgICAgICAgX2V4dGVuZHNPcHRpb24gPSBvcHRpb247Ci0gICAgICAgIF9leHRlbmRzQXJyYXkgPSBhcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWVTZXQgZ2V0SmF2YVNldHRlckRlbGltaXRlcigpCi0gICAgICAgIHsgcmV0dXJuIF9qYXZhU2V0dGVyRGVsaW1pdGVyID09IG51bGwgPyBRTmFtZVNldC5FTVBUWSA6IF9qYXZhU2V0dGVyRGVsaW1pdGVyOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU2V0dGVyRGVsaW1pdGVyKFFOYW1lU2V0IHNldCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2phdmFTZXR0ZXJEZWxpbWl0ZXIgPSBzZXQ7IH0KLQotICAgIHB1YmxpYyBRTmFtZVtdIGFjY2VwdGVkTmFtZXMoKQotICAgIHsgCi0gICAgICAgIGlmIChfYWNjZXB0ZWROYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVtdIHsgX25hbWUgfTsKLQotICAgICAgICByZXR1cm4gKFFOYW1lW10pX2FjY2VwdGVkTmFtZXMudG9BcnJheShuZXcgUU5hbWVbX2FjY2VwdGVkTmFtZXMuc2l6ZSgpXSk7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjY2VwdGVkTmFtZXMoU2V0IHNldCkKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOyAKLSAgICAgICAgX2FjY2VwdGVkTmFtZXMgPSBzZXQ7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEFjY2VwdGVkTmFtZXMoUU5hbWVTZXQgc2V0KQotICAgIHsgCi0gICAgICAgIG11dGF0ZSgpOyAKLSAgICAgICAgX2FjY2VwdGVkTmFtZXMgPSBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpCi0gICAgICAgIHsgcmV0dXJuIF9taW5PY2N1cnM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VycyhCaWdJbnRlZ2VyIG1pbikKLSAgICAgICAgeyBtdXRhdGUoKTsgX21pbk9jY3VycyA9IG1pbjsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4T2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX21heE9jY3VyczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXJzKEJpZ0ludGVnZXIgbWF4KQotICAgICAgICB7IG11dGF0ZSgpOyBfbWF4T2NjdXJzID0gbWF4OyB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc05pbGxhYmxlKCkKLSAgICAgICAgeyByZXR1cm4gX2hhc05pbGxhYmxlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShpbnQgd2hlbikKLSAgICAgICAgeyBtdXRhdGUoKTsgX2hhc05pbGxhYmxlID0gd2hlbjsgfQotCi0gICAgcHVibGljIGludCBoYXNEZWZhdWx0KCkKLSAgICAgICAgeyByZXR1cm4gX2hhc0RlZmF1bHQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoaW50IHdoZW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9oYXNEZWZhdWx0ID0gd2hlbjsgfQotCi0gICAgcHVibGljIGludCBoYXNGaXhlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9oYXNGaXhlZDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rml4ZWQoaW50IHdoZW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9oYXNGaXhlZCA9IHdoZW47IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKQotICAgICAgICB7IHJldHVybiBfZGVmYXVsdFRleHQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRUZXh0KFN0cmluZyB2YWwpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9kZWZhdWx0VGV4dCA9IHZhbDsgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZGVmYXVsdFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRWYWx1ZS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShYbWxWYWx1ZVJlZiBkZWZhdWx0UmVmKQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7Ci0gICAgICAgIF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0UmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SmF2YVR5cGVDb2RlKCkKLSAgICAgICAgeyByZXR1cm4gX2phdmFUeXBlQ29kZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVR5cGVDb2RlKGludCBjb2RlKQotICAgICAgICB7IG11dGF0ZSgpOyBfamF2YVR5cGVDb2RlID0gY29kZTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZiODg2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hU3RyaW5nRW51bUVudHJ5OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbCBpbXBsZW1lbnRzIFNjaGVtYVN0cmluZ0VudW1FbnRyeQotewotICAgIHByaXZhdGUgU3RyaW5nIF9zdHJpbmc7Ci0gICAgcHJpdmF0ZSBpbnQgX2ludDsKLSAgICBwcml2YXRlIFN0cmluZyBfZW51bU5hbWU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbChTdHJpbmcgc3RyLCBpbnQgaSwgU3RyaW5nIGVudW1OYW1lKQotICAgIHsKLSAgICAgICAgX3N0cmluZyA9IHN0cjsKLSAgICAgICAgX2ludCA9IGk7Ci0gICAgICAgIF9lbnVtTmFtZSA9IGVudW1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbnVtTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2VudW1OYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVDb2RlUHJpbnRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUNvZGVQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDZkYjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUNvZGVQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTM0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OYW1lVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLS8qKgotICogUHJpbnRzIHRoZSBqYXZhIGNvZGUgZm9yIGEgc2luZ2xlIHNjaGVtYSB0eXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTY2hlbWFUeXBlQ29kZVByaW50ZXIKLXsKLSAgICBXcml0ZXIgX3dyaXRlcjsKLSAgICBpbnQgICAgX2luZGVudDsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPQotICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgPT0gbnVsbAotICAgICAgICAgICAgPyAiXG4iCi0gICAgICAgICAgICA6IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1NQQUNFUyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICBzdGF0aWMgZmluYWwgaW50IElOREVOVF9JTkNSRU1FTlQgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQ0xBU1NOQU1FID0gIlR5cGVTeXN0ZW1Ib2xkZXIiOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGVDb2RlUHJpbnRlciAoIFdyaXRlciB3cml0ZXIgKQotICAgIHsKLSAgICAgICAgX3dyaXRlciA9IHdyaXRlcjsKLSAgICAgICAgX2luZGVudCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBpbmRlbnQoKQotICAgIHsKLSAgICAgICAgX2luZGVudCArPSBJTkRFTlRfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHZvaWQgb3V0ZGVudCgpCi0gICAgewotICAgICAgICBfaW5kZW50IC09IElOREVOVF9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIGVuY29kZVN0cmluZyAoIFN0cmluZyBzICkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoICciJyApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzLmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnIicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXFwnICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXCInICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXFwnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xyJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdyJyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICduJyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICd0JyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggY2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCggJyInICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBlbWl0KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBpbmRlbnQgPSBfaW5kZW50OwotICAgICAgICAKLSAgICAgICAgaWYgKGluZGVudCA+IE1BWF9TUEFDRVMubGVuZ3RoKCkgLyAyKQotICAgICAgICAgICAgaW5kZW50ID0gTUFYX1NQQUNFUy5sZW5ndGgoKSAvIDQgKyBpbmRlbnQgLyAyOwotICAgICAgICAKLSAgICAgICAgaWYgKGluZGVudCA+IE1BWF9TUEFDRVMubGVuZ3RoKCkpCi0gICAgICAgICAgICBpbmRlbnQgPSBNQVhfU1BBQ0VTLmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgX3dyaXRlci53cml0ZShNQVhfU1BBQ0VTLnN1YnN0cmluZygwLCBpbmRlbnQpKTsKLSAgICAgICAgX3dyaXRlci53cml0ZShzKTsKLSAgICAgICAgX3dyaXRlci53cml0ZShMSU5FX1NFUEFSQVRPUik7Ci0gICAgICAgIAotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50KE1BWF9TUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VHlwZUltcGwgKCBXcml0ZXIgd3JpdGVyLCBTY2hlbWFUeXBlIHNUeXBlICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBuZXcgU2NoZW1hVHlwZUNvZGVQcmludGVyKCB3cml0ZXIgKS5wcmludFR5cGVJbXBsKCBzVHlwZSwgc1R5cGUuZ2V0VHlwZVN5c3RlbSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VHlwZSAoIFdyaXRlciB3cml0ZXIsIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ldyBTY2hlbWFUeXBlQ29kZVByaW50ZXIoIHdyaXRlciApLiBwcmludFR5cGUoIHNUeXBlLCBzVHlwZS5nZXRUeXBlU3lzdGVtKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRMb2FkZXIgKCBXcml0ZXIgd3JpdGVyLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbmV3IFNjaGVtYVR5cGVDb2RlUHJpbnRlciggd3JpdGVyICkucHJpbnRJbmRleFR5cGUoIHN5c3RlbSApOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRUeXBlKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHByaW50VG9wQ29tbWVudChzVHlwZSk7Ci0gICAgICAgIHByaW50UGFja2FnZShzVHlwZSwgdHJ1ZSk7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBwcmludElubmVyVHlwZShzVHlwZSwgc3lzdGVtKTsKLSAgICAgICAgX3dyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRUeXBlSW1wbChTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBwcmludFRvcENvbW1lbnQoc1R5cGUpOwotICAgICAgICBwcmludFBhY2thZ2Uoc1R5cGUsIGZhbHNlKTsKLSAgICAgICAgcHJpbnRJbm5lclR5cGVJbXBsKHNUeXBlLCBzeXN0ZW0sIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW5jZSBub3QgYWxsIHNjaGVtYSB0eXBlcyBoYXZlIGphdmEgdHlwZXMsIHRoaXMgc2tpcHMKLSAgICAgKiBvdmVyIGFueSB0aGF0IGRvbid0IGFuZCBnaXZlcyB5b3UgdGhlIG5lYXJlc3QgamF2YSBiYXNlIHR5cGUuCi0gICAgICovCi0gICAgU3RyaW5nIGZpbmRKYXZhVHlwZSAoIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsICkKLSAgICAgICAgICAgIHNUeXBlID0gc1R5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHByZXR0eVFOYW1lKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiKEAiICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiKSI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludElubmVyVHlwZUphdmFEb2MoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBRTmFtZSBuYW1lID0gc1R5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICBuYW1lID0gc1R5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgbmFtZSA9IHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbmFtZSA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgZW1pdCgiICogQSBkb2N1bWVudCBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUobmFtZSkgKyAiIGVsZW1lbnQuIik7Ci0gICAgICAgIGVsc2UgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICAgICAgZW1pdCgiICogQSBkb2N1bWVudCBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUobmFtZSkgKyAiIGF0dHJpYnV0ZS4iKTsKLSAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgZW1pdCgiICogQW4gWE1MICIgKyBwcmV0dHlRTmFtZShuYW1lKSArICIuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVtaXQoIiAqIEFuIGFub255bW91cyBpbm5lciBYTUwgdHlwZS4iKTsKLSAgICAgICAgZW1pdCgiICoiKTsKLSAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5OT1RfU0lNUExFOgotICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYSBjb21wbGV4IHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYW4gYXRvbWljIHR5cGUgdGhhdCBpcyBhIHJlc3RyaWN0aW9uIG9mICIgKyBzVHlwZS5nZXRCYXNlVHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYSBsaXN0IHR5cGUgd2hvc2UgaXRlbXMgYXJlICIgKyBzVHlwZS5nZXRMaXN0SXRlbVR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKSArICIuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogVGhpcyBpcyBhIHVuaW9uIHR5cGUuIEluc3RhbmNlcyBhcmUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6Iik7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBzVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIiAqICAgICAiICsgbWVtYmVyc1tpXS5nZXRGdWxsSmF2YU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhDbGFzc0ZvclN5c3RlbShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gc3lzdGVtLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG5hbWUgKyAiLiIgKyBJTkRFWF9DTEFTU05BTUU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBzaG9ydEluZGV4Q2xhc3NGb3JTeXN0ZW0oU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pCi0gICAgewotICAgICAgICByZXR1cm4gSU5ERVhfQ0xBU1NOQU1FOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTdGF0aWNUeXBlRGVjbGFyYXRpb24oU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUgdHlwZSA9IChvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUpIiArCi0gICAgICAgICAgICAgICAgaW5kZXhDbGFzc0ZvclN5c3RlbShzeXN0ZW0pICsKLSAgICAgICAgICAgICAgICAiLnR5cGVTeXN0ZW0ucmVzb2x2ZUhhbmRsZShcIiIgKwotICAgICAgICAgICAgICAgICgoU2NoZW1hVHlwZVN5c3RlbUltcGwpc3lzdGVtKS5oYW5kbGVGb3JUeXBlKHNUeXBlKSArICJcIik7Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEluZGV4VHlwZShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc2hvcnRJbmRleENsYXNzRm9yU3lzdGVtKHN5c3RlbSk7Ci0gICAgICAgIGVtaXQoInBhY2thZ2UgIiArIHN5c3RlbS5nZXROYW1lKCkgKyAiOyIpOwotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgZW1pdCgicHVibGljIGZpbmFsIGNsYXNzICIgKyBzaG9ydE5hbWUpOwotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0KCJwcml2YXRlICIgKyBzaG9ydE5hbWUgKyAiKCkgeyB9Iik7Ci0gICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0gPSBsb2FkVHlwZVN5c3RlbSgpOyIpOwotICAgICAgICBlbWl0KCJzdGF0aWMgeyB0eXBlU3lzdGVtLnJlc29sdmUoKTsgfSIpOwotICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW0gbG9hZFR5cGVTeXN0ZW0oKSIpOwotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0KCJ0cnkgeyByZXR1cm4gKG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbSlDbGFzcy5mb3JOYW1lKFwib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlU3lzdGVtSW1wbFwiLCB0cnVlLCAiICsgc2hvcnROYW1lICsgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IENsYXNzLmNsYXNzIH0pLm5ld0luc3RhbmNlKG5ldyBqYXZhLmxhbmcuT2JqZWN0W10geyAiICsgc2hvcnROYW1lICsgIi5jbGFzcyB9KTsgfSIpOwotICAgICAgICBlbWl0KCJjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGxvYWQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLlNjaGVtYVR5cGVTeXN0ZW1JbXBsOiBtYWtlIHN1cmUgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGguXCIsIGUpOyB9Iik7Ci0gICAgICAgIGVtaXQoImNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBTY2hlbWFUeXBlU3lzdGVtSW1wbCAoXCIgKyBlLnRvU3RyaW5nKCkgKyBcIik6IGlzIHRoZSB2ZXJzaW9uIG9mIHhiZWFuLmphciBjb3JyZWN0P1wiLCBlKTsgfSIpOwotICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgIGVtaXQoIn0iKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludElubmVyVHlwZShTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICBwcmludElubmVyVHlwZUphdmFEb2Moc1R5cGUpOwotCi0gICAgICAgIHN0YXJ0SW50ZXJmYWNlKHNUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHByaW50U3RhdGljVHlwZURlY2xhcmF0aW9uKHNUeXBlLCBzeXN0ZW0pOwotCi0gICAgICAgIGlmIChzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBwcmludFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcHMgPSBzVHlwZS5nZXREZXJpdmVkUHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcHJvcHNbaV07Ci0KLSAgICAgICAgICAgICAgICBwcmludFByb3BlcnR5R2V0dGVycygKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuaXNBdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlRm9yUHJvcGVydHkocHJvcCksCi0gICAgICAgICAgICAgICAgICAgIHhtbFR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFBcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzUmVhZE9ubHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50UHJvcGVydHlTZXR0ZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpbnROZXN0ZWRJbm5lclR5cGVzKHNUeXBlLCBzeXN0ZW0pOwotCi0gICAgICAgIHByaW50RmFjdG9yeShzVHlwZSk7Ci0KLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50RmFjdG9yeShTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgbmVlZCBmdWxsIGZhY3RvcmllcyBmb3IgdG9wLWxldmVsIHR5cGVzCi0gICAgICAgIGJvb2xlYW4gZnVsbEZhY3RvcnkgPSB0cnVlOwotICAgICAgICBpZiAoc1R5cGUuaXNBbm9ueW1vdXNUeXBlKCkgJiYgISBzVHlwZS5pc0RvY3VtZW50VHlwZSgpICYmICFzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIGZ1bGxGYWN0b3J5ID0gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0KLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIGVtaXQoIi8qKiIpOwotICAgICAgICBlbWl0KCIgKiBBIGZhY3RvcnkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIik7Ci0gICAgICAgIGVtaXQoIiAqIG9mIHRoaXMgdHlwZS4iKTsKLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICAvLyBCVUdCVUcgLSBDYW4gSSB1c2UgdGhlIG5hbWUgbG9hZGVyIGhlcmU/ICBjb3VsZCBpdCBiZSBhCi0gICAgICAgIC8vIG5lc3RlZCB0eXBlIG5hbWU/ICBJdCBpcyBsb3dlciBjYXNlIQotICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkiKTsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLQotICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG9iaikgeyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdJbnN0YW5jZSgpIHsiKTsKLSAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeyIpOwotICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgaWYgKGZ1bGxGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgicHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZCIpOwotICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgIGVtaXQoIn0iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50TmVzdGVkSW5uZXJUeXBlcyhTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlW10gYW5vblR5cGVzID0gc1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9uVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbm9uVHlwZXNbaV0uaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpKQotICAgICAgICAgICAgICAgIHByaW50TmVzdGVkSW5uZXJUeXBlcyhhbm9uVHlwZXNbaV0sIHN5c3RlbSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRJbm5lclR5cGUoYW5vblR5cGVzW2ldLCBzeXN0ZW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFRvcENvbW1lbnQoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIvKiIpOwotICAgICAgICBpZiAoc1R5cGUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIiAqIFhNTCBUeXBlOiAgIiArIHNUeXBlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBlbWl0KCIgKiBOYW1lc3BhY2U6ICIgKyBzVHlwZS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgdGhlbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoZW5hbWUgPSBzVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogQW4gWE1MIGRvY3VtZW50IHR5cGUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGVuYW1lID0gc1R5cGUuZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgKiBBbiBYTUwgYXR0cmlidXRlIHR5cGUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotCi0gICAgICAgICAgICBhc3NlcnQoIHRoZW5hbWUgIT0gbnVsbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0KCIgKiBMb2NhbG5hbWU6ICIgKyB0aGVuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIE5hbWVzcGFjZTogIiArIHRoZW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVtaXQoIiAqIEphdmEgdHlwZTogIiArIHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpKTsKLSAgICAgICAgZW1pdCgiICoiKTsKLSAgICAgICAgZW1pdCgiICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgLSBkbyBub3QgbW9kaWZ5LiIpOwotICAgICAgICBlbWl0KCIgKi8iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UGFja2FnZShTY2hlbWFUeXBlIHNUeXBlLCBib29sZWFuIGludGYpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGZxam47Ci0gICAgICAgIGlmIChpbnRmKQotICAgICAgICAgICAgZnFqbiA9IHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcWpuID0gc1R5cGUuZ2V0RnVsbEphdmFJbXBsTmFtZSgpOwotCi0gICAgICAgIGludCBsYXN0ZG90ID0gZnFqbi5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAobGFzdGRvdCA8IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFN0cmluZyBwa2cgPSBmcWpuLnN1YnN0cmluZygwLCBsYXN0ZG90KTsKLSAgICAgICAgZW1pdCgicGFja2FnZSAiICsgcGtnICsgIjsiKTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0SW50ZXJmYWNlKFNjaGVtYVR5cGUgc1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IHNUeXBlLmdldFNob3J0SmF2YU5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiYXNlSW50ZXJmYWNlID0gZmluZEphdmFUeXBlKHNUeXBlLmdldEJhc2VUeXBlKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzcGVjaWFsaXplZEludGVyZmFjZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQyAmJgotICAgICAgICAgICAgc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpID09IFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBiaXRzID0gc1R5cGUuZ2V0RGVjaW1hbFNpemUoKTsKLSAgICAgICAgICAgIGlmIChiaXRzID09IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUikKLSAgICAgICAgICAgICAgICBzcGVjaWFsaXplZEludGVyZmFjZXMuYXBwZW5kKCIsIG9yZy5hcGFjaGUueG1sYmVhbnMuQmlnSW50ZWdlclZhbHVlIik7Ci0gICAgICAgICAgICBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgICAgICBzcGVjaWFsaXplZEludGVyZmFjZXMuYXBwZW5kKCIsIG9yZy5hcGFjaGUueG1sYmVhbnMuTG9uZ1ZhbHVlIik7Ci0gICAgICAgICAgICBpZiAoYml0cyA8PSBTY2hlbWFUeXBlLlNJWkVfSU5UKQotICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgb3JnLmFwYWNoZS54bWxiZWFucy5JbnRWYWx1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzLmFwcGVuZCgiLCBvcmcuYXBhY2hlLnhtbGJlYW5zLkxpc3RWYWx1ZSIpOwotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBjdHlwZSA9IHNUeXBlLmdldFVuaW9uQ29tbW9uQmFzZVR5cGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhVHlwZUhvbGRlciA9IGphdmFUeXBlSG9sZGVyRm9yVHlwZShjdHlwZSk7Ci0gICAgICAgICAgICBpZiAoamF2YVR5cGVIb2xkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzcGVjaWFsaXplZEludGVyZmFjZXMuYXBwZW5kKCIsICIgKyBqYXZhVHlwZUhvbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICBlbWl0KCJwdWJsaWMgaW50ZXJmYWNlICIgKyBzaG9ydE5hbWUgKyAiIGV4dGVuZHMgIiArIGJhc2VJbnRlcmZhY2UpOwotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0U3BlY2lhbGl6ZWRBY2Nlc3NvcnMoc1R5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0U3BlY2lhbGl6ZWRBY2Nlc3NvcnMoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuQVRPTUlDICYmCi0gICAgICAgICAgICBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGJpdHMgPSBzVHlwZS5nZXREZWNpbWFsU2l6ZSgpOwotICAgICAgICAgICAgaW50IHBhcmVudEJpdHMgPSBzVHlwZS5nZXRCYXNlVHlwZSgpLmdldERlY2ltYWxTaXplKCk7Ci0gICAgICAgICAgICBpZiAoYml0cyAhPSBwYXJlbnRCaXRzIHx8IHNUeXBlLmdldEJhc2VUeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoamF2YS5tYXRoLkJpZ0ludGVnZXIgYmkpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiamF2YS5tYXRoLkJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChqYXZhLm1hdGguQmlnSW50ZWdlciBiaSk7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0xPTkcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCJsb25nIGdldExvbmdWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldExvbmdWYWx1ZShsb25nIGwpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgibG9uZyBsb25nVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0KGxvbmcgbCk7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0lOVCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImludCBnZXRJbnRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldEludFZhbHVlKGludCBpKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImludCBpbnRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQoaW50IGkpOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChiaXRzID09IFNjaGVtYVR5cGUuU0laRV9TSE9SVCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInNob3J0IGdldFNob3J0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHMpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgic2hvcnQgc2hvcnRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQoc2hvcnQgcyk7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0JZVEUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCJieXRlIGdldEJ5dGVWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldEJ5dGVWYWx1ZShieXRlIGIpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiYnl0ZSBieXRlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0KGJ5dGUgYik7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldE9iamVjdFZhbHVlKGphdmEubGFuZy5PYmplY3QgdmFsKTsiKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgZW1pdCgiamF2YS5sYW5nLk9iamVjdCBvYmplY3RWYWx1ZSgpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIG9iamVjdFNldChqYXZhLmxhbmcuT2JqZWN0IHZhbCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUgaW5zdGFuY2VUeXBlKCk7Iik7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGN0eXBlID0gc1R5cGUuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOwotICAgICAgICAgICAgaWYgKGN0eXBlICE9IG51bGwgJiYgY3R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pOwotICAgICAgICAgICAgICAgIGVtaXRTcGVjaWFsaXplZEFjY2Vzc29ycyhjdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgZ2V0TGlzdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCB4Z2V0TGlzdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldExpc3RWYWx1ZShqYXZhLnV0aWwuTGlzdCBsaXN0KTsiKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgbGlzdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0IHhsaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQoamF2YS51dGlsLkxpc3QgbGlzdCk7Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0QmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgfQotICAgIHZvaWQgZW5kQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgZW1pdCgifSIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRKYXZhRG9jKFN0cmluZyBzZW50ZW5jZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgIGVtaXQoIiAqICIgKyBzZW50ZW5jZSk7Ci0gICAgICAgIGVtaXQoIiAqLyIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTaG9ydEphdmFEb2MoU3RyaW5nIHNlbnRlbmNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoIi8qKiAiICsgc2VudGVuY2UgKyAiICovIik7Ci0gICAgfQotCi0gICAgc3RhdGljIFNjaGVtYVR5cGUgZmluZEJhc2VFbnVtVHlwZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKHNUeXBlLmdldEJhc2VUeXBlKCkuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgc1R5cGUgPSBzVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICByZXR1cm4gc1R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgamF2YVN0cmluZ0VzY2FwZShTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgLy8gZm9yYmlkZGVuOiBcbiwgXHIsIFwiLCBcXC4KLSAgICAgICAgdGVzdDogewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayB0ZXN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTdHJpbmdFbnVtZXJhdGlvbihTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZUVudW1UeXBlID0gZmluZEJhc2VFbnVtVHlwZShzVHlwZSk7Ci0gICAgICAgIFN0cmluZyBiYXNlRW51bUNsYXNzID0gYmFzZUVudW1UeXBlLmdldEZ1bGxKYXZhTmFtZSgpOwotCi0gICAgICAgIGlmIChiYXNlRW51bVR5cGUgPT0gc1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICAgICAgZW1pdCgib3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSgpOyIpOwotICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQob3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGUpOyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGVudHJpZXMgPSBzVHlwZS5nZXRTdHJpbmdFbnVtRW50cmllcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBlbnVtVmFsdWUgPSBlbnRyaWVzW2ldLmdldFN0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIGNvbnN0TmFtZSA9IGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChiYXNlRW51bVR5cGUgIT0gc1R5cGUpCi0gICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsICIgKyBiYXNlRW51bUNsYXNzICsgIi5FbnVtICIgKyBjb25zdE5hbWUgKyAiID0gIiArIGJhc2VFbnVtQ2xhc3MgKyAiLiIgKyBjb25zdE5hbWUgKyAiOyIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXQoInN0YXRpYyBmaW5hbCBFbnVtICIgKyBjb25zdE5hbWUgKyAiID0gRW51bS5mb3JTdHJpbmcoXCIiICsgamF2YVN0cmluZ0VzY2FwZShlbnVtVmFsdWUpICsgIlwiKTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gIklOVF8iICsgZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOwotICAgICAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSAhPSBzVHlwZSkKLSAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgaW50ICIgKyBjb25zdE5hbWUgKyAiID0gIiArIGJhc2VFbnVtQ2xhc3MgKyAiLiIgKyBjb25zdE5hbWUgKyAiOyIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXQoInN0YXRpYyBmaW5hbCBpbnQgIiArIGNvbnN0TmFtZSArICIgPSBFbnVtLiIgKyBjb25zdE5hbWUgKyAiOyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYXNlRW51bVR5cGUgPT0gc1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBFbnVtZXJhdGlvbiB2YWx1ZSBjbGFzcyBmb3IgIiArIGJhc2VFbnVtQ2xhc3MgKyAiLiIpOwotICAgICAgICAgICAgZW1pdCgiICogVGhlc2UgZW51bSB2YWx1ZXMgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIDxwcmU+Iik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBlbnVtLnRvU3RyaW5nKCk7IC8vIHJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZW51bSIpOwotICAgICAgICAgICAgZW1pdCgiICogZW51bS5pbnRWYWx1ZSgpOyAvLyByZXR1cm5zIGFuIGludCB2YWx1ZSwgdXNlZnVsIGZvciBzd2l0Y2hlcyIpOwotICAgICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIGVtaXQoIiAqIC8vIGUuZy4sIGNhc2UgRW51bS5JTlRfIiArIGVudHJpZXNbMF0uZ2V0RW51bU5hbWUoKSk7Ci0gICAgICAgICAgICBlbWl0KCIgKiBFbnVtLmZvclN0cmluZyhzKTsgLy8gcmV0dXJucyB0aGUgZW51bSB2YWx1ZSBmb3IgYSBzdHJpbmciKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIEVudW0uZm9ySW50KGkpOyAvLyByZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhbiBpbnQiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIDwvcHJlPiIpOwotICAgICAgICAgICAgZW1pdCgiICogRW51bWVyYXRpb24gb2JqZWN0cyBhcmUgaW1tdXRhYmxlIHNpbmdsZXRvbiBvYmplY3RzIHRoYXQiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIGNhbiBiZSBjb21wYXJlZCB1c2luZyA9PSBvYmplY3QgZXF1YWxpdHkuIFRoZXkgaGF2ZSBubyIpOwotICAgICAgICAgICAgZW1pdCgiICogcHVibGljIGNvbnN0cnVjdG9yLiBTZWUgdGhlIGNvbnN0YW50cyBkZWZpbmVkIHdpdGhpbiB0aGlzIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBjbGFzcyBmb3IgYWxsIHRoZSB2YWxpZCB2YWx1ZXMuIik7Ci0gICAgICAgICAgICBlbWl0KCIgKi8iKTsKLSAgICAgICAgICAgIGVtaXQoInN0YXRpYyBmaW5hbCBjbGFzcyBFbnVtIGV4dGVuZHMgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlIik7Ci0gICAgICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiIpOwotICAgICAgICAgICAgZW1pdCgiICogUmV0dXJucyB0aGUgZW51bSB2YWx1ZSBmb3IgYSBzdHJpbmcsIG9yIG51bGwgaWYgbm9uZS4iKTsKLSAgICAgICAgICAgIGVtaXQoIiAqLyIpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBFbnVtIGZvclN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHMpIik7Ci0gICAgICAgICAgICBlbWl0KCIgICAgeyByZXR1cm4gKEVudW0pdGFibGUuZm9yU3RyaW5nKHMpOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIFJldHVybnMgdGhlIGVudW0gdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBpbnQsIG9yIG51bGwgaWYgbm9uZS4iKTsKLSAgICAgICAgICAgIGVtaXQoIiAqLyIpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBFbnVtIGZvckludChpbnQgaSkiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgICB7IHJldHVybiAoRW51bSl0YWJsZS5mb3JJbnQoaSk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICAgICAgZW1pdCgicHJpdmF0ZSBFbnVtKGphdmEubGFuZy5TdHJpbmcgcywgaW50IGkpIik7Ci0gICAgICAgICAgICBlbWl0KCIgICAgeyBzdXBlcihzLCBpKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnN0TmFtZSA9ICJJTlRfIiArIGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKTsKLSAgICAgICAgICAgICAgICBpbnQgaW50VmFsdWUgPSBlbnRyaWVzW2ldLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGludCAiICsgY29uc3ROYW1lICsgIiA9ICIgKyBpbnRWYWx1ZSArICI7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlLlRhYmxlIHRhYmxlID0iKTsKLSAgICAgICAgICAgIGVtaXQoIiAgICBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlLlRhYmxlIik7Ci0gICAgICAgICAgICBlbWl0KCIoIik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIm5ldyBFbnVtW10iKTsKLSAgICAgICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbnVtVmFsdWUgPSBlbnRyaWVzW2ldLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb25zdE5hbWUgPSAiSU5UXyIgKyBlbnRyaWVzW2ldLmdldEVudW1OYW1lKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgibmV3IEVudW0oXCIiICsgamF2YVN0cmluZ0VzY2FwZShlbnVtVmFsdWUpICsgIlwiLCAiICsgY29uc3ROYW1lICsgIiksIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgICAgICBlbWl0KCIpOyIpOwotICAgICAgICAgICAgZW1pdCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Iik7Ci0gICAgICAgICAgICBlbWl0KCJwcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZFJlc29sdmUoKSB7IHJldHVybiBmb3JJbnQoaW50VmFsdWUoKSk7IH0gIik7Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgeG1sVHlwZUZvclByb3BlcnR5KFNjaGVtYVByb3BlcnR5IHNQcm9wKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNQcm9wLmphdmFCYXNlZE9uVHlwZSgpOwotICAgICAgICByZXR1cm4gZmluZEphdmFUeXBlKHNUeXBlKS5yZXBsYWNlKCckJywgJy4nKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiB4bWxUeXBlRm9yUHJvcGVydHlJc1VuaW9uKFNjaGVtYVByb3BlcnR5IHNQcm9wKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNQcm9wLmphdmFCYXNlZE9uVHlwZSgpOwotICAgICAgICByZXR1cm4gKHNUeXBlLmlzU2ltcGxlVHlwZSgpICYmIHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgamF2YVR5cGVGb3JQcm9wZXJ0eShTY2hlbWFQcm9wZXJ0eSBzUHJvcCkKLSAgICB7Ci0gICAgICAgIC8vIFRoZSB0eXBlIHRvIHVzZSBpcyB0aGUgWE1MIG9iamVjdC4uLi4KLSAgICAgICAgaWYgKHNQcm9wLmdldEphdmFUeXBlQ29kZSgpID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBzUHJvcC5qYXZhQmFzZWRPblR5cGUoKTsKLSAgICAgICAgICAgIHJldHVybiBmaW5kSmF2YVR5cGUoc1R5cGUpLnJlcGxhY2UoJyQnLCAnLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzUHJvcC5nZXRKYXZhVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImZsb2F0IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJieXRlIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNob3J0IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJsb25nIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5tYXRoLkJpZ0RlY2ltYWwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5tYXRoLkJpZ0ludGVnZXIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJieXRlW10iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb24iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLnV0aWwuRGF0ZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS51dGlsLkxpc3QiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS51dGlsLkNhbGVuZGFyIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNQcm9wLmphdmFCYXNlZE9uVHlwZSgpLmdldEJhc2VFbnVtVHlwZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmaW5kSmF2YVR5cGUoc1R5cGUpLnJlcGxhY2UoJyQnLCAnLicpICsgIi5FbnVtIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEubGFuZy5PYmplY3QiOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFByb3BlcnR5R2V0dGVycyhRTmFtZSBxTmFtZSwgYm9vbGVhbiBpc0F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBqYXZhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUsIFN0cmluZyB4dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuaWxsYWJsZSwgYm9vbGVhbiBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXZlcmFsLCBib29sZWFuIHNpbmdsZXRvbikKLSAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZGVzYyA9ICJcIiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIiIgKyAoaXNBdHRyID8gIiBhdHRyaWJ1dGUiIDogIiBlbGVtZW50Iik7Ci0gICAgICAgIGJvb2xlYW4geG1sdHlwZSA9IChqYXZhVHlwZSA9PSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUKTsKLQotICAgICAgICBpZiAoc2luZ2xldG9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyBmaXJzdCAiIDogIkdldHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCh0eXBlICsgIiBnZXQiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIkdldHMgKGFzIHhtbCkgZmlyc3QgIiA6ICJHZXRzIChhcyB4bWwpIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiB4Z2V0IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJUZXN0cyBmb3IgbmlsIGZpcnN0ICIgOiAiVGVzdHMgZm9yIG5pbCAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJib29sZWFuIGlzTmlsIiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25hbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlRydWUgaWYgaGFzIGF0IGxlYXN0IG9uZSAiIDogIlRydWUgaWYgaGFzICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgiYm9vbGVhbiBpc1NldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V2ZXJhbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IHByb3BlcnR5TmFtZSArICJBcnJheSI7Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjICsgInMiKTsKLSAgICAgICAgICAgIGVtaXQodHlwZSArICJbXSBnZXQiICsgYXJyYXlOYW1lICsgIigpOyIpOwotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KHR5cGUgKyAiIGdldCIgKyBhcnJheU5hbWUgKyAiKGludCBpKTsiKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyAoYXMgeG1sKSBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjICsgInMiKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIltdIHhnZXQiICsgYXJyYXlOYW1lICsgIigpOyIpOwotCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIChhcyB4bWwpIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIHhnZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlRlc3RzIGZvciBuaWwgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiYm9vbGVhbiBpc05pbCIgKyBhcnJheU5hbWUgKyAiKGludCBpKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJSZXR1cm5zIG51bWJlciBvZiAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgiaW50IHNpemVPZiIgKyBhcnJheU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UHJvcGVydHlTZXR0ZXJzKFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHh0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5pbGxhYmxlLCBib29sZWFuIG9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldmVyYWwsIGJvb2xlYW4gc2luZ2xldG9uKQotICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNhZmVWYXJOYW1lID0gTmFtZVV0aWwubm9uSmF2YUtleXdvcmQoTmFtZVV0aWwubG93ZXJDYW1lbENhc2UocHJvcGVydHlOYW1lKSk7Ci0gICAgICAgIGlmIChzYWZlVmFyTmFtZS5lcXVhbHMoImkiKSkKLSAgICAgICAgICAgIHNhZmVWYXJOYW1lID0gImlWYWx1ZSI7Ci0gICAgICAgIGJvb2xlYW4geG1sdHlwZSA9IChqYXZhVHlwZSA9PSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUKTsKLQotICAgICAgICBTdHJpbmcgcHJvcGRlc2MgPSAiXCIiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiXCIiICsgKGlzQXR0ciA/ICIgYXR0cmlidXRlIiA6ICIgZWxlbWVudCIpOwotCi0gICAgICAgIGlmIChzaW5nbGV0b24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJTZXRzIGZpcnN0ICIgOiAiU2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJTZXRzIChhcyB4bWwpIGZpcnN0ICIgOiAiU2V0cyAoYXMgeG1sKSB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCB4c2V0IiArIHByb3BlcnR5TmFtZSArICIoIiArIHh0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHhtbHR5cGUgJiYgIXNldmVyYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5ICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgYWRkTmV3IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJOaWxzIHRoZSBmaXJzdCAiIDogIk5pbHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TmlsIiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25hbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlJlbW92ZXMgZmlyc3QgIiA6ICJVbnNldHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgidm9pZCB1bnNldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V2ZXJhbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IHByb3BlcnR5TmFtZSArICJBcnJheSI7Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0IiArIGFycmF5TmFtZSArICIoIiArIHR5cGUgKyAiW10gIiArIHNhZmVWYXJOYW1lICsgIkFycmF5KTsiKTsKLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSwgIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIChhcyB4bWwpIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgeHNldCIgKyBhcnJheU5hbWUgKyAiKCIgKyB4dHlwZSArICJbXSIgKyBzYWZlVmFyTmFtZSArICJBcnJheSk7Iik7Ci0KLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgKGFzIHhtbCkgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCB4c2V0IiArIGFycmF5TmFtZSArICIoaW50IGksICIgKyB4dHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIk5pbHMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TmlsIiArIGFycmF5TmFtZSArICIoaW50IGkpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJJbnNlcnRzIHRoZSB2YWx1ZSBhcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidm9pZCBpbnNlcnQiICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSwgIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIHRoZSB2YWx1ZSBhcyB0aGUgbGFzdCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgYWRkIiArIHByb3BlcnR5TmFtZSArICIoIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoeG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkluc2VydHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgdmFsdWUgKGFzIHhtbCkgYXMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIGluc2VydE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpKTsiKTsKLSAgICAKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgdmFsdWUgKGFzIHhtbCkgYXMgdGhlIGxhc3QgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiBhZGROZXciICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlJlbW92ZXMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgidm9pZCByZW1vdmUiICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSk7Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0QXRvbWljUmVzdHJpY3Rpb25UeXBlKFNjaGVtYVR5cGUgc1R5cGUpIHsKLSAgICAgICAgU2NoZW1hVHlwZSBwVHlwZSA9IHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKTsKLSAgICAgICAgc3dpdGNoIChwVHlwZS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxBbnlTaW1wbGVUeXBlSW1wbCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFCb29sZWFuSG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJhc2U2NEhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUhleEJpbmFyeUhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVVyaUhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFRTmFtZUhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFOb3RhdGlvbkhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFGbG9hdEhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRG91YmxlSG9sZGVyRXgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0RGVjaW1hbFNpemUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRGVjaW1hbEhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUludGVnZXJIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUxvbmdIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JZVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUludEhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFTdHJpbmdIb2xkZXJFeCI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhR0RhdGVIb2xkZXJFeCI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFHRHVyYXRpb25Ib2xkZXJFeCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAidW5yZWNvZ25pemVkIHByaW1pdGl2ZSB0eXBlIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFUeXBlIGZpbmRCYXNlVHlwZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0QmFzZUNsYXNzKFNjaGVtYVR5cGUgc1R5cGUpIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZSA9IGZpbmRCYXNlVHlwZShzVHlwZS5nZXRCYXNlVHlwZSgpKTsKLQotICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk5PVF9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgLy8gbm9uLXNpbXBsZS1jb250ZW50OiBpbmhlcml0IGZyb20gYmFzZSB0eXBlIGltcGwKLSAgICAgICAgICAgICAgICBpZiAoIVhtbE9iamVjdC50eXBlLmVxdWFscyhiYXNlVHlwZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZS5nZXRGdWxsSmF2YUltcGxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbENvbXBsZXhDb250ZW50SW1wbCI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmb3IgcmVzdHJpY3Rpb25zCi0gICAgICAgICAgICAgICAgYXNzZXJ0KCEgc1R5cGUuaXNCdWlsdGluVHlwZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXRvbWljUmVzdHJpY3Rpb25UeXBlKHNUeXBlKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbExpc3RJbXBsIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxVbmlvbkltcGwiOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRDb25zdHJ1Y3RvcihTY2hlbWFUeXBlIHNUeXBlLCBTdHJpbmcgc2hvcnROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgZW1pdCgicHVibGljICIgKyBzaG9ydE5hbWUgKyAiKG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSBzVHlwZSkiKTsKLSAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICBlbWl0KCJzdXBlcihzVHlwZSIgKyAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTk9UX1NJTVBMRSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiICsgIXNUeXBlLmlzU2ltcGxlVHlwZSgpKSArCi0gICAgICAgICAgICAgIik7Iik7Ci0gICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLk5PVF9TSU1QTEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICAgICAgZW1pdCgicHJvdGVjdGVkICIgKyBzaG9ydE5hbWUgKyAiKG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSBzVHlwZSwgYm9vbGVhbiBiKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdCgic3VwZXIoc1R5cGUsIGIpOyIpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRDbGFzcyhTY2hlbWFUeXBlIHNUeXBlLCBib29sZWFuIGlzSW5uZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IHNUeXBlLmdldFNob3J0SmF2YUltcGxOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBiYXNlQ2xhc3MgPSBnZXRCYXNlQ2xhc3Moc1R5cGUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgaW50ZXJmYWNlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50ZXJmYWNlcy5hcHBlbmQoc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkucmVwbGFjZSgnJCcsICcuJykpOwotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikgewotICAgICAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlclR5cGVzID0gc1R5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgIGludGVyZmFjZXMuYXBwZW5kKCIsICIgKyBtZW1iZXJUeXBlc1tpXS5nZXRGdWxsSmF2YU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCJwdWJsaWMgIiArICggaXNJbm5lciA/ICJzdGF0aWMgIjogIiIgKSArICJjbGFzcyAiICsgc2hvcnROYW1lICsKLSAgICAgICAgICAgICIgZXh0ZW5kcyAiICsgYmFzZUNsYXNzICsgIiBpbXBsZW1lbnRzICIgKyBpbnRlcmZhY2VzLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICB9Ci0KLSAgICB2b2lkIG1ha2VBdHRyaWJ1dGVEZWZhdWx0VmFsdWUoU3RyaW5nIGp0YXJnZXRUeXBlLCBTY2hlbWFQcm9wZXJ0eSBwcm9wLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBqdGFyZ2V0VHlwZTsKLSAgICAgICAgaWYgKGZ1bGxOYW1lID09IG51bGwpCi0gICAgICAgICAgICBmdWxsTmFtZSA9IHByb3AuamF2YUJhc2VkT25UeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0KLSAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyBmdWxsTmFtZSArICIpZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3ZhbHVlKCIgKyBpZGVudGlmaWVyICsgIik7Iik7Ci0gICAgfQotCi0gICAgdm9pZCBtYWtlTWlzc2luZ1ZhbHVlKGludCBqYXZhVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzd2l0Y2ggKGphdmFUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gZmFsc2U7Iik7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIDAuMGY7Iik7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAwLjA7Iik7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIDA7Iik7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzoKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gMEw7Iik7IGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIG51bGw7Iik7IGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEpHZXRBcnJheVZhbHVlKGludCBqYXZhVHlwZSwgU3RyaW5nIHR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoamF2YVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgotICAgICAgICAgICAgICAgIGVtaXQodHlwZSArICJbXSByZXN1bHQgPSBuZXcgIiArIHR5cGUgKyAiW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXRMaXN0LnRvQXJyYXkocmVzdWx0KTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgZW1pdCgiYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEJvb2xlYW5WYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgZW1pdCgiZmxvYXRbXSByZXN1bHQgPSBuZXcgZmxvYXRbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0RmxvYXRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgICAgIGVtaXQoImRvdWJsZVtdIHJlc3VsdCA9IG5ldyBkb3VibGVbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0RG91YmxlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6Ci0gICAgICAgICAgICAgICAgZW1pdCgiYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEJ5dGVWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgZW1pdCgic2hvcnRbXSByZXN1bHQgPSBuZXcgc2hvcnRbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0U2hvcnRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgICAgIGVtaXQoImludFtdIHJlc3VsdCA9IG5ldyBpbnRbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0SW50VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6Ci0gICAgICAgICAgICAgICAgZW1pdCgibG9uZ1tdIHJlc3VsdCA9IG5ldyBsb25nW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldExvbmdWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS5tYXRoLkJpZ0RlY2ltYWxbXSByZXN1bHQgPSBuZXcgamF2YS5tYXRoLkJpZ0RlY2ltYWxbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLm1hdGguQmlnSW50ZWdlcltdIHJlc3VsdCA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlclt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKLSAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLmxhbmcuU3RyaW5nW10gcmVzdWx0ID0gbmV3IGphdmEubGFuZy5TdHJpbmdbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0U3RyaW5nVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6Ci0gICAgICAgICAgICAgICAgZW1pdCgiYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbdGFyZ2V0TGlzdC5zaXplKCldW107Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCeXRlQXJyYXlWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkNhbGVuZGFyW10gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5DYWxlbmRhclt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRDYWxlbmRhclZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5EYXRlW10gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5EYXRlW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldERhdGVWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6Ci0gICAgICAgICAgICAgICAgZW1pdCgib3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVtdIHJlc3VsdCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEdEYXRlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjoKLSAgICAgICAgICAgICAgICBlbWl0KCJvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbltdIHJlc3VsdCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvblt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRHRHVyYXRpb25WYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHJlc3VsdCA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFFOYW1lVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3RbXSByZXN1bHQgPSBuZXcgamF2YS51dGlsLkxpc3RbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0TGlzdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS5sYW5nLk9iamVjdFtdIHJlc3VsdCA9IG5ldyBqYXZhLmxhbmcuT2JqZWN0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldE9iamVjdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotICAgICAgICBlbWl0KCJyZXR1cm4gcmVzdWx0OyIpOwotICAgIH0KLSAgICB2b2lkIHByaW50SkdldFZhbHVlKGludCBqYXZhVHlwZSwgU3RyaW5nIHR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoamF2YVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldDsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEJvb2xlYW5WYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEZsb2F0VmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0RG91YmxlVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEJ5dGVWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldFNob3J0VmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0SW50VmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldExvbmdWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEJpZ0RlY2ltYWxWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEJpZ0ludGVnZXJWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRTdHJpbmdWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRHRGF0ZVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEdEdXJhdGlvblZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0Q2FsZW5kYXJWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0RGF0ZVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0UU5hbWVWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0TGlzdFZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuICgiICsgdHlwZSArICIpdGFyZ2V0LmdldEVudW1WYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRPYmplY3RWYWx1ZSgpOyIpOyBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBqc2V0TWV0aG9kKGludCBqYXZhVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzd2l0Y2ggKGphdmFUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0IjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0Qm9vbGVhblZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEZsb2F0VmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldERvdWJsZVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0Qnl0ZVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldFNob3J0VmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEludFZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0TG9uZ1ZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJpZ0RlY2ltYWxWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRCaWdJbnRlZ2VyVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldFN0cmluZ1ZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0Qnl0ZUFycmF5VmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0R0RhdGVWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0R0R1cmF0aW9uVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0Q2FsZW5kYXJWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldERhdGVWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRRTmFtZVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0TGlzdFZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0RW51bVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRPYmplY3RWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldElkZW50aWZpZXIoTWFwIHFOYW1lTWFwLCBRTmFtZSBxTmFtZSkgewotICAgICAgICByZXR1cm4gKChTdHJpbmdbXSlxTmFtZU1hcC5nZXQocU5hbWUpKVswXTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0U2V0SWRlbnRpZmllcihNYXAgcU5hbWVNYXAsIFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIFN0cmluZ1tdIGlkZW50aWZpZXJzID0gKFN0cmluZ1tdKXFOYW1lTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBpZGVudGlmaWVyc1sxXSA9PSBudWxsID8gaWRlbnRpZmllcnNbMF0gOiBpZGVudGlmaWVyc1sxXTsKLSAgICB9Ci0KLSAgICBNYXAgcHJpbnRTdGF0aWNGaWVsZHMoU2NoZW1hUHJvcGVydHlbXSBwcm9wZXJ0aWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXAgcmVzdWx0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gaWRlbnRpZmllcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICAgICAgZmluYWwgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHByb3BlcnRpZXNbaV07Ci0gICAgICAgICAgICBmaW5hbCBRTmFtZSBuYW1lID0gcHJvcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICByZXN1bHRzLnB1dChuYW1lLCBpZGVudGlmaWVycyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgamF2YU5hbWUgPSBwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgIGlkZW50aWZpZXJzWzBdID0gKGphdmFOYW1lICsgIiQiICsgKGkgKiAyKSkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmlTdHJpbmcgPSAgIlwiIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXCIiOwotCi0gICAgICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lICIgKyBpZGVudGlmaWVyc1swXSArCi0gICAgICAgICAgICAgICAgICIgPSAiICk7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCIgKwotICAgICAgICAgICAgICAgICB1cmlTdHJpbmcgKyAiLCBcIiIgKyBuYW1lLmdldExvY2FsUGFydCgpICsgIlwiKTsiKTsKLSAgICAgICAgICAgIG91dGRlbnQoKTsKLQotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbaV0uYWNjZXB0ZWROYW1lcygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUU5hbWVbXSBxbmFtZXMgPSBwcm9wZXJ0aWVzW2ldLmFjY2VwdGVkTmFtZXMoKTsKLQotICAgICAgICAgICAgICAgIGlmIChxbmFtZXMubGVuZ3RoID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzWzFdID0gKGphdmFOYW1lICsgIiQiICsgKGkqMisxKSkudG9VcHBlckNhc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0ICIgKyBpZGVudGlmaWVyc1sxXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiID0gb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldC5mb3JBcnJheSggbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSB7ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwIDsgaiA8IHFuYW1lcy5sZW5ndGggOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoIm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKFwiIiArIHFuYW1lc1tqXS5nZXROYW1lc3BhY2VVUkkoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiLCBcIiIgKyBxbmFtZXNbal0uZ2V0TG9jYWxQYXJ0KCkgKyAiXCIpLCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIn0pOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgdm9pZCBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgic3luY2hyb25pemVkIChtb25pdG9yKCkpIik7Ci0gICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGVtaXQoImNoZWNrX29ycGhhbmVkKCk7Iik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgIGVtaXQoIn0iKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBlbWl0QWRkVGFyZ2V0KFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIGlzQXR0ciwgYm9vbGVhbiBkZWNsYXJlVGFyZ2V0LCBTdHJpbmcgeHR5cGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGRlY2xhcmVUYXJnZXQpCi0gICAgICAgICAgICBlbWl0KHh0eXBlICsgIiB0YXJnZXQ7Iik7Ci0gICAgICAgIGlmIChpc0F0dHIpCi0gICAgICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIHh0eXBlICsgIilnZXRfc3RvcmUoKS5hZGRfYXR0cmlidXRlX3VzZXIoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuYWRkX2VsZW1lbnRfdXNlcigiICsgaWRlbnRpZmllciArICIpOyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RISU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX05FV19WQUxVRSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9XX0VYQ0VQVElPTiA9IDQ7Ci0KLSAgICB2b2lkIGVtaXRHZXRUYXJnZXQoU3RyaW5nIHNldElkZW50aWZpZXIsIAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRlbnRpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0F0dHIsIAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5kZXgsIAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVsbEJlaGF2aW91ciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHh0eXBlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydCBzZXRJZGVudGlmaWVyICE9IG51bGwgJiYgaWRlbnRpZmllciAhPSBudWxsOwotCi0gICAgICAgIGVtaXQoeHR5cGUgKyAiIHRhcmdldCA9IG51bGw7Iik7Ci0KLSAgICAgICAgaWYgKGlzQXR0cikKLSAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmZpbmRfYXR0cmlidXRlX3VzZXIoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuZmluZF9lbGVtZW50X3VzZXIoIiArIHNldElkZW50aWZpZXIgKyAiLCAiICsgaW5kZXggKyAiKTsiKTsKLQotICAgICAgICBpZiAobnVsbEJlaGF2aW91ciA9PSBOT1RISU5HKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkiKTsKLQotICAgICAgICBzdGFydEJsb2NrKCk7Ci0KLSAgICAgICAgc3dpdGNoIChudWxsQmVoYXZpb3VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEFERF9ORVdfVkFMVUU6Ci0gICAgICAgICAgICAgICAgZW1pdEFkZFRhcmdldChpZGVudGlmaWVyLCBpc0F0dHIsIGZhbHNlLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVEhST1dfRVhDRVBUSU9OOgotICAgICAgICAgICAgICAgIGVtaXQoInRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTk9USElORzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAiQmFkIGJlaGF2aW91ciB0eXBlOiAiICsgbnVsbEJlaGF2aW91cjsKLSAgICAgICAgfQotCi0gICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEdldHRlckltcGxzKAotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wLCBRTmFtZSBxTmFtZSwgYm9vbGVhbiBpc0F0dHIsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIGludCBqYXZhVHlwZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB4dHlwZSwgYm9vbGVhbiBuaWxsYWJsZSwKLSAgICAgICAgYm9vbGVhbiBvcHRpb25hbCwgYm9vbGVhbiBzZXZlcmFsLCBib29sZWFuIHNpbmdsZXRvbiwKLSAgICAgICAgYm9vbGVhbiBpc3VuaW9uLAotICAgICAgICBTdHJpbmcgaWRlbnRpZmllciwgU3RyaW5nIHNldElkZW50aWZpZXIgKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgcHJvcGRlc2MgPSAiXCIiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiXCIiICsgKGlzQXR0ciA/ICIgYXR0cmlidXRlIiA6ICIgZWxlbWVudCIpOwotICAgICAgICBib29sZWFuIHhtbHR5cGUgPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCk7Ci0gICAgICAgIFN0cmluZyBqdGFyZ2V0VHlwZSA9IChpc3VuaW9uIHx8ICF4bWx0eXBlKSA/ICJvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlIiA6IHh0eXBlOwotCi0gICAgICAgIGlmIChzaW5nbGV0b24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFZhbHVlIGdldFByb3AoKQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIkdldHMgZmlyc3QgIiA6ICJHZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgdHlwZSArICIgZ2V0IiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLQotICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgTk9USElORywganRhcmdldFR5cGUpOwotCi0gICAgICAgICAgICBpZiAoaXNBdHRyICYmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCgiaWYgKHRhcmdldCA9PSBudWxsKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBtYWtlQXR0cmlidXRlRGVmYXVsdFZhbHVlKGp0YXJnZXRUeXBlLCBwcm9wLCBpZGVudGlmaWVyKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW1pdCgiaWYgKHRhcmdldCA9PSBudWxsKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgbWFrZU1pc3NpbmdWYWx1ZShqYXZhVHlwZSk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0KLSAgICAgICAgICAgIHByaW50SkdldFZhbHVlKGphdmFUeXBlLCB0eXBlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0KLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBWYWx1ZSB4Z2V0UHJvcCgpCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIkdldHMgKGFzIHhtbCkgZmlyc3QgIiA6ICJHZXRzIChhcyB4bWwpIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiB4Z2V0IiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIE5PVEhJTkcsIHh0eXBlKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc0F0dHIgJiYgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUF0dHJpYnV0ZURlZmF1bHRWYWx1ZSh4dHlwZSwgcHJvcCwgaWRlbnRpZmllcik7Ci0gICAgICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBpc05pbFByb3AoKQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJUZXN0cyBmb3IgbmlsIGZpcnN0ICIgOiAiVGVzdHMgZm9yIG5pbCAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgYm9vbGVhbiBpc05pbCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBOT1RISU5HLCB4dHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiBmYWxzZTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmlzTmlsKCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25hbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYm9vbGVhbiBpc1NldFByb3AoKQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlRydWUgaWYgaGFzIGF0IGxlYXN0IG9uZSAiIDogIlRydWUgaWYgaGFzICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIGJvb2xlYW4gaXNTZXQiICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0KLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0F0dHIpCi0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIGdldF9zdG9yZSgpLmZpbmRfYXR0cmlidXRlX3VzZXIoIiArIGlkZW50aWZpZXIgKyIpICE9IG51bGw7Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIGdldF9zdG9yZSgpLmNvdW50X2VsZW1lbnRzKCIgKyBzZXRJZGVudGlmaWVyICsgIikgIT0gMDsiKTsKLQotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldmVyYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhcnJheU5hbWUgPSBwcm9wZXJ0eU5hbWUgKyAiQXJyYXkiOwotCi0gICAgICAgICAgICAvLyBWYWx1ZVtdIGdldFByb3AoKQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MgKyAicyIpOwotICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB0eXBlICsgIltdIGdldCIgKyBhcnJheU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0KLSAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0IHRhcmdldExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOyIpOwotICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkuZmluZF9hbGxfZWxlbWVudF91c2VycygiICsgc2V0SWRlbnRpZmllciArICIsIHRhcmdldExpc3QpOyIpOwotCi0gICAgICAgICAgICBwcmludEpHZXRBcnJheVZhbHVlKGphdmFUeXBlLCB0eXBlKTsKLQotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICAvLyBWYWx1ZSBnZXRQcm9wKGludCBpKQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB0eXBlICsgIiBnZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0KLSAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwganRhcmdldFR5cGUpOwotICAgICAgICAgICAgcHJpbnRKR2V0VmFsdWUoamF2YVR5cGUsIHR5cGUpOwotCi0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBWYWx1ZVtdIHhnZXRQcm9wKCkKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgKGFzIHhtbCkgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyArICJzIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICJbXSB4Z2V0IiArIGFycmF5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0IHRhcmdldExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImdldF9zdG9yZSgpLmZpbmRfYWxsX2VsZW1lbnRfdXNlcnMoIiArIHNldElkZW50aWZpZXIgKyAiLCB0YXJnZXRMaXN0KTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIltdIHJlc3VsdCA9IG5ldyAiICsgeHR5cGUgKyAiW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXRMaXN0LnRvQXJyYXkocmVzdWx0KTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gcmVzdWx0OyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBWYWx1ZSB4Z2V0UHJvcChpbnQgaSkKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgKGFzIHhtbCkgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICIgeGdldCIgKyBhcnJheU5hbWUgKyAiKGludCBpKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAoIiArIHh0eXBlICsgIil0YXJnZXQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBpc05pbChpbnQgaSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJUZXN0cyBmb3IgbmlsIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyBib29sZWFuIGlzTmlsIiArIGFycmF5TmFtZSArICIoaW50IGkpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5pc05pbCgpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGludCBjb3VudFByb3AoKTsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygiUmV0dXJucyBudW1iZXIgb2YgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBpbnQgc2l6ZU9mIiArIGFycmF5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgIGVtaXQoInJldHVybiBnZXRfc3RvcmUoKS5jb3VudF9lbGVtZW50cygiICsgc2V0SWRlbnRpZmllciArIik7Iik7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50U2V0dGVySW1wbHMoUU5hbWUgcU5hbWUsIGJvb2xlYW4gaXNBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgeHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmlsbGFibGUsIGJvb2xlYW4gb3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V2ZXJhbCwgYm9vbGVhbiBzaW5nbGV0b24sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXN1bmlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIsIFN0cmluZyBzZXRJZGVudGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzYWZlVmFyTmFtZSA9IE5hbWVVdGlsLm5vbkphdmFLZXl3b3JkKE5hbWVVdGlsLmxvd2VyQ2FtZWxDYXNlKHByb3BlcnR5TmFtZSkpOwotICAgICAgICBpZiAoc2FmZVZhck5hbWUuZXF1YWxzKCJpIikpCi0gICAgICAgICAgICBzYWZlVmFyTmFtZSA9ICJpVmFsdWUiOwotICAgICAgICBlbHNlIGlmIChzYWZlVmFyTmFtZS5lcXVhbHMoInRhcmdldCIpKQotICAgICAgICAgICAgc2FmZVZhck5hbWUgPSAidGFyZ2V0VmFsdWUiOwotCi0gICAgICAgIGJvb2xlYW4geG1sdHlwZSA9IChqYXZhVHlwZSA9PSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUKTsKLSAgICAgICAgYm9vbGVhbiBpc29iaiA9IChqYXZhVHlwZSA9PSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVCk7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJzdEdyb3VwID0gaWRlbnRpZmllciAhPSBzZXRJZGVudGlmaWVyOwotICAgICAgICBTdHJpbmcgalNldCA9IGpzZXRNZXRob2QoamF2YVR5cGUpOwotICAgICAgICBTdHJpbmcganRhcmdldFR5cGUgPSAoaXN1bmlvbiB8fCAheG1sdHlwZSkgPyAib3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSIgOiB4dHlwZTsKLQotICAgICAgICBTdHJpbmcgcHJvcGRlc2MgPSAiXCIiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiXCIiICsgKGlzQXR0ciA/ICIgYXR0cmlidXRlIiA6ICIgZWxlbWVudCIpOwotCi0gICAgICAgIGlmIChzaW5nbGV0b24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHZvaWQgc2V0UHJvcChWYWx1ZSB2KTsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJTZXRzIGZpcnN0ICIgOiAiU2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXQiICsgcHJvcGVydHlOYW1lICsgIigiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBBRERfTkVXX1ZBTFVFLCBqdGFyZ2V0VHlwZSk7Ci0gICAgICAgICAgICBlbWl0KGpTZXQgKyAiKCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdm9pZCB4c2V0UHJvcChWYWx1ZSB2KQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJTZXRzIChhcyB4bWwpIGZpcnN0ICIgOiAiU2V0cyAoYXMgeG1sKSB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgeHNldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB4dHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBBRERfTkVXX1ZBTFVFLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldCgiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4bWx0eXBlICYmICFzZXZlcmFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFZhbHVlIGFkZE5ld1Byb3AoKQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIGFkZE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0QWRkVGFyZ2V0KGlkZW50aWZpZXIsIGlzQXR0ciwgdHJ1ZSwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJOaWxzIHRoZSBmaXJzdCAiIDogIk5pbHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldE5pbCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBBRERfTkVXX1ZBTFVFLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldE5pbCgpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9uYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJSZW1vdmVzIGZpcnN0ICIgOiAiVW5zZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHVuc2V0IiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgIGlmIChpc0F0dHIpCi0gICAgICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkucmVtb3ZlX2F0dHJpYnV0ZSgiICsgaWRlbnRpZmllciArICIpOyIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXQoImdldF9zdG9yZSgpLnJlbW92ZV9lbGVtZW50KCIgKyBzZXRJZGVudGlmaWVyICsgIiwgMCk7Iik7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V2ZXJhbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IHByb3BlcnR5TmFtZSArICJBcnJheSI7Ci0KLSAgICAgICAgICAgIC8vIEpTRVRfSU5ERVgKLSAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKCIgKyB0eXBlICsgIltdICIgKyBzYWZlVmFyTmFtZSArICJBcnJheSkiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc29iaikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzU3Vic3RHcm91cCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidW5pb25BcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiKTsiICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ1bmlvbkFycmF5U2V0dGVySGVscGVyKCIgKyBzYWZlVmFyTmFtZSArICJBcnJheSIgKyAiLCAiICsgaWRlbnRpZmllciArICIsICIgKyBzZXRJZGVudGlmaWVyICsgIik7IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNTdWJzdEdyb3VwKQotICAgICAgICAgICAgICAgICAgICBlbWl0KCJhcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiKTsiICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlbWl0KCJhcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiLCAiICsgc2V0SWRlbnRpZmllciArICIpOyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0IiArIGFycmF5TmFtZSArICIoaW50IGksICIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwganRhcmdldFR5cGUpOwotICAgICAgICAgICAgZW1pdChqU2V0ICsgIigiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyAoYXMgeG1sKSBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCB4c2V0IiArIGFycmF5TmFtZSArICIoIiArIHh0eXBlICsgIltdIiArIHNhZmVWYXJOYW1lICsgIkFycmF5KSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXQoImFycmF5U2V0dGVySGVscGVyKCIgKyBzYWZlVmFyTmFtZSArICJBcnJheSIgKyAiLCAiICsgaWRlbnRpZmllciArICIpOyIgKTsKLQotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgKGFzIHhtbCkgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgeHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldCgiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJOaWxzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXROaWwiICsgYXJyYXlOYW1lICsgIihpbnQgaSkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXQuc2V0TmlsKCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiSW5zZXJ0cyB0aGUgdmFsdWUgYXMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIGluc2VydCIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KGp0YXJnZXRUeXBlICsgIiB0YXJnZXQgPSAiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzU3Vic3RHcm91cCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiKCIgKyBqdGFyZ2V0VHlwZSArICIpZ2V0X3N0b3JlKCkuaW5zZXJ0X2VsZW1lbnRfdXNlcigiICsgaWRlbnRpZmllciArICIsIGkpOyIpOwotICAgICAgICAgICAgICAgIGVsc2UgLy8gVGhpcyBpcyBhIHN1YnN0IGdyb3VwIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgZW1pdCAoIigiICsganRhcmdldFR5cGUgKyIpZ2V0X3N0b3JlKCkuaW5zZXJ0X2VsZW1lbnRfdXNlcigiICsgc2V0SWRlbnRpZmllciArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgKyAiLCBpKTsiKTsKLSAgICAgICAgICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgICAgICAgICAgZW1pdChqU2V0ICsgIigiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIHRoZSB2YWx1ZSBhcyB0aGUgbGFzdCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIGFkZCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRBZGRUYXJnZXQoaWRlbnRpZmllciwgaXNBdHRyLCB0cnVlLCBqdGFyZ2V0VHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdChqU2V0ICsgIigiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoeG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkluc2VydHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgdmFsdWUgKGFzIHhtbCkgYXMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIGluc2VydE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIHRhcmdldDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIHh0eXBlICsgIilnZXRfc3RvcmUoKS5pbnNlcnRfZWxlbWVudF91c2VyKCIgKyBpZGVudGlmaWVyICsgIiwgaSk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgIAotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSB2YWx1ZSAoYXMgeG1sKSBhcyB0aGUgbGFzdCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIGFkZE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0QWRkVGFyZ2V0KGlkZW50aWZpZXIsIGlzQXR0ciwgdHJ1ZSwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJSZW1vdmVzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHJlbW92ZSIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgIGVtaXQoImdldF9zdG9yZSgpLnJlbW92ZV9lbGVtZW50KCIgKyBzZXRJZGVudGlmaWVyICsgIiwgaSk7Iik7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBnZXRUeXBlTmFtZShDbGFzcyBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLSAgICAgICAgaW50IGFycmF5Q291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYy5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGMgPSBjLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGFycmF5Q291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZChjLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgYXJyYXlDb3VudDsgaSsrKQotICAgICAgICAgICAgc2IuYXBwZW5kKCJbXSIpOwotCi0gICAgfQotCi0gICAgdm9pZCBwcmludElubmVyVHlwZUltcGwoCi0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtLCBib29sZWFuIGlzSW5uZXIgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSBzVHlwZS5nZXRTaG9ydEphdmFJbXBsTmFtZSgpOwotCi0gICAgICAgIHByaW50SW5uZXJUeXBlSmF2YURvYyhzVHlwZSk7Ci0KLSAgICAgICAgc3RhcnRDbGFzcyhzVHlwZSwgaXNJbm5lcik7Ci0KLSAgICAgICAgcHJpbnRDb25zdHJ1Y3RvcihzVHlwZSwgc2hvcnROYW1lKTsKLQotICAgICAgICBpZiAoIXNUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNvbnRlbnQgdHlwZXMgaW1wbHMgZGVyaXZlIGRpcmVjdGx5IGZyb20gImhvbGRlciIgaW1wbHMKLSAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgdGhlIGNhc2UgKGZvciBpbnRzIG9yIHN0cmluZyBlbnVtcyBlLmcuKSB3aGVyZQotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgc2ltcGxlIHR5cGUgcmVzdHJpY3Rpb24uICBTbyBwcm9wZXJ0eSBnZXR0ZXJzIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBiZSBpbXBsZW1lbnRlZCAiZnJvbSBzY3JhdGNoIiBmb3IgZWFjaCBkZXJpdmVkIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzVHlwZS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY29tcGxleCBjb250ZW50IHR5cGUgaW1wbGVtZW50YXRpb25zIGRlcml2ZSBmcm9tIGJhc2UgdHlwZSBpbXBscwotICAgICAgICAgICAgICAgIC8vIHNvIGRlcml2ZWQgcHJvcGVydHkgaW1wbHMgY2FuIGJlIHJldXNlZAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzVHlwZS5nZXREZXJpdmVkUHJvcGVydGllcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBNYXAgcU5hbWVNYXAgPSBwcmludFN0YXRpY0ZpZWxkcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBwcm9wZXJ0aWVzW2ldOwotCi0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHByb3AuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxUeXBlID0geG1sVHlwZUZvclByb3BlcnR5KCBwcm9wICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcHJpbnRHZXR0ZXJJbXBscygKLSAgICAgICAgICAgICAgICAgICAgcHJvcCwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5pc0F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhVHlwZUNvZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgamF2YVR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgeG1sVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFBcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCksCi0gICAgICAgICAgICAgICAgICAgIHhtbFR5cGVGb3JQcm9wZXJ0eUlzVW5pb24ocHJvcCksCi0gICAgICAgICAgICAgICAgICAgIGdldElkZW50aWZpZXIocU5hbWVNYXAsIG5hbWUpLAotICAgICAgICAgICAgICAgICAgICBnZXRTZXRJZGVudGlmaWVyKHFOYW1lTWFwLCBuYW1lKQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXByb3AuaXNSZWFkT25seSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRTZXR0ZXJJbXBscygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSAhPSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFPcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFBcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sVHlwZUZvclByb3BlcnR5SXNVbmlvbihwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldElkZW50aWZpZXIocU5hbWVNYXAsIG5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2V0SWRlbnRpZmllcihxTmFtZU1hcCwgbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmludE5lc3RlZFR5cGVJbXBscyhzVHlwZSwgc3lzdGVtKTsKLQotICAgICAgICBlbmRCbG9jaygpOwotICAgIH0KLSAgICB2b2lkIHByaW50TmVzdGVkVHlwZUltcGxzKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSBhbm9uVHlwZXMgPSBzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFub25UeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFub25UeXBlc1tpXS5pc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkpCi0gICAgICAgICAgICAgICAgcHJpbnROZXN0ZWRUeXBlSW1wbHMoYW5vblR5cGVzW2ldLCBzeXN0ZW0pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50SW5uZXJUeXBlSW1wbChhbm9uVHlwZXNbaV0sIHN5c3RlbSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlODhkMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcwotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTY2hlbWFUeXBlSW1wbCBpbXBsZW1lbnRzIFNjaGVtYVR5cGUsIFR5cGVTdG9yZVVzZXJGYWN0b3J5Ci17Ci0gICAgLy8gZ2xvYmFsIHR5cGVzIGhhdmUgbmFtZXMKLSAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotCi0gICAgLy8gY29tcGlsYXRpb24gc3VwcG9ydAotICAgIHByaXZhdGUgaW50IF9yZXNvbHZlUGhhc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOUkVTT0xWRUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZJTkdfU0dTID0gMTsgLy8gRm9yIGRvY3VtZW50IHR5cGVzIG9ubHkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWRURfU0dTID0gMjsgIC8vIEZvciBkb2N1bWVudCB0eXBlcyBvbmx5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVklORyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVEID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQUlaSU5HID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQUlaRUQgPSA2OwotCi0gICAgLy8gYW5vbnltb3VzIHR5cGUgc3VwcG9ydAotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX291dGVyU2NoZW1hVHlwZVJlZjsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYUNvbXBvbmVudC5SZWYgX2NvbnRhaW5lckZpZWxkUmVmOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hRmllbGQgX2NvbnRhaW5lckZpZWxkOwotICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IF9jb250YWluZXJGaWVsZENvZGU7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgX2NvbnRhaW5lckZpZWxkSW5kZXg7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZltdIF9hbm9ueW1vdXNUeXBlcmVmczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzRG9jdW1lbnRUeXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNBdHRyaWJ1dGVUeXBlOwotICAgIC8vIHByaXZhdGUgYm9vbGVhbiBfc2tpcHBlZEFub255bW91c1R5cGU7Ci0KLSAgICAvLyBjb21waWxldGltZSBqYXZhIHR5cGUgc3VwcG9ydAotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNDb21waWxlZDsKLSAgICBwcml2YXRlIFN0cmluZyBfc2hvcnRKYXZhTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfZnVsbEphdmFOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9zaG9ydEphdmFJbXBsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfZnVsbEphdmFJbXBsTmFtZTsKLQotICAgIC8vIHJ1bnRpbWUgamF2YSB0eXBlIHN1cHBvcnQ6IHZvbGF0aWxlIGJlY2F1c2UgdGhleSdyZSBjYWNoZWQKLSAgICBwcml2YXRlIHZvbGF0aWxlIENsYXNzIF9qYXZhQ2xhc3M7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDbGFzcyBfamF2YUVudW1DbGFzczsKLSAgICBwcml2YXRlIHZvbGF0aWxlIENsYXNzIF9qYXZhSW1wbENsYXNzOwotICAgIHByaXZhdGUgdm9sYXRpbGUgQ29uc3RydWN0b3IgX2phdmFJbXBsQ29uc3RydWN0b3I7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDb25zdHJ1Y3RvciBfamF2YUltcGxDb25zdHJ1Y3RvcjI7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIF9pbXBsTm90QXZhaWxhYmxlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBfY3RyQXJncyA9IG5ldyBPYmplY3RbXSB7IHRoaXMgfTsKLQotICAgIC8vIHJlZmxlY3RpdmUgc3VwcG9ydAotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFN0cmluZyBfZmlsZW5hbWU7Ci0KLSAgICAvLyBjb21wbGV4IGNvbnRlbnQgc3VwcG9ydAotICAgIHByaXZhdGUgU2NoZW1hUGFydGljbGUgX2NvbnRlbnRNb2RlbDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYUxvY2FsRWxlbWVudFtdIF9sb2NhbEVsdHM7IC8vIGxhemlseSBjb21wdXRlZAotICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwIF9lbHRUb0luZGV4TWFwOyAvLyBsYXppbHkgY29tcHV0ZWQKLSAgICBwcml2YXRlIHZvbGF0aWxlIE1hcCBfYXR0clRvSW5kZXhNYXA7IC8vIGxhemlseSBjb21wdXRlZAotICAgIHByaXZhdGUgTWFwIF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZTsKLSAgICBwcml2YXRlIE1hcCBfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2hhc0FsbENvbnRlbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9vcmRlclNlbnNpdGl2ZTsKLSAgICBwcml2YXRlIFFOYW1lU2V0IF90eXBlZFdpbGRjYXJkRWxlbWVudHM7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCBfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9oYXNXaWxkY2FyZEVsZW1lbnRzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzV2lsZGNhcmRBdHRyaWJ1dGVzOwotICAgIC8vIHNldCBvZiB2YWxpZCBRTmFtZXMgdGhhdCBjYW4gYmUgc3Vic3RpdHV0ZWQgZm9yIGEgcHJvcGVydHkKLSAgICBwcml2YXRlIFNldCBfdmFsaWRTdWJzdGl0dXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCi0gICAgLy8gc2ltcGxlIGNvbnRlbnQgc3VwcG9ydAotICAgIHByaXZhdGUgaW50IF9jb21wbGV4VHlwZVZhcmlldHk7Ci0gICAgcHJpdmF0ZSBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBfYXR0cmlidXRlTW9kZWw7Ci0KLSAgICAvLyBzaW1wbGUgdHlwZSBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBpbnQgX2J1aWx0aW5UeXBlQ29kZTsKLQotICAgIHByaXZhdGUgaW50IF9zaW1wbGVUeXBlVmFyaWV0eTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzU2ltcGxlVHlwZTsKLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2Jhc2VUeXBlcmVmOyAvLyB2aWEgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uCi0gICAgcHJpdmF0ZSBpbnQgX2Jhc2VEZXB0aDsgLy8gaG93IG1hbnkgaW5oZXJpdGFuY2Ugc3RlcHMgdG8gQW55VHlwZQotICAgIHByaXZhdGUgaW50IF9kZXJpdmF0aW9uVHlwZTsKLQotICAgIC8vIGZhY2V0cwotICAgIHByaXZhdGUgWG1sVmFsdWVSZWZbXSBfZmFjZXRBcnJheTsKLSAgICBwcml2YXRlIGJvb2xlYW5bXSBfZml4ZWRGYWNldEFycmF5OwotCi0gICAgLy8gZnVuZGFtZW50YWwgZmFjZXRzCi0gICAgcHJpdmF0ZSBpbnQgX29yZGVyZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0Zpbml0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzQm91bmRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzTnVtZXJpYzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBfYWJzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxFeHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbFJlc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbExpc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbFVuaW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBfYmxvY2tFeHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja1Jlc3Q7Ci0KLSAgICAvLyB3aGl0ZXNwYWNlIGZhY2V0Ci0gICAgcHJpdmF0ZSBpbnQgX3doaXRlU3BhY2VSdWxlOwotCi0gICAgLy8gcmVnZXggcGF0dGVybnMKLSAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1BhdHRlcm5zOyAvLyBhbHNvIHRha2VzIGludG8gYWNjb3VudCBiYXNlIGNsYXNzZXMKLSAgICBwcml2YXRlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIF9wYXR0ZXJuczsKLQotICAgIC8vIGVudW1lcmF0ZWQgdmFsdWVzCi0gICAgcHJpdmF0ZSBYbWxWYWx1ZVJlZltdIF9lbnVtZXJhdGlvblZhbHVlczsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9iYXNlRW51bVR5cGVyZWY7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9zdHJpbmdFbnVtRW5zdXJlZDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIE1hcCBfbG9va3VwU3RyaW5nRW51bTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIExpc3QgX2xpc3RPZlN0cmluZ0VudW07Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBNYXAgX2xvb2t1cFN0cmluZ0VudW1FbnRyeTsKLSAgICBwcml2YXRlIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIF9zdHJpbmdFbnVtRW50cmllczsKLQotICAgIC8vIGZvciBsaXN0cyBvbmx5Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfbGlzdEl0ZW1UeXBlcmVmOwotCi0gICAgLy8gZm9yIHVuaW9ucyBvbmx5Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc1VuaW9uT2ZMaXN0czsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmW10gX3VuaW9uTWVtYmVyVHlwZXJlZnM7Ci0gICAgcHJpdmF0ZSBpbnQgX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYVR5cGVbXSBfdW5pb25Db25zdGl0dWVudFR5cGVzOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hVHlwZVtdIF91bmlvblN1YlR5cGVzOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hVHlwZSBfdW5pb25Db21tb25CYXNlVHlwZTsKLQotICAgIC8vIGZvciBhdG9taWMgdHlwZXMgb25seQotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3ByaW1pdGl2ZVR5cGVSZWY7Ci0KLSAgICAvLyBmb3IgZGVjaW1hbCByZXN0cmljdGlvbnMgb25seQotICAgIHByaXZhdGUgaW50IF9kZWNpbWFsU2l6ZTsKLQotICAgIC8vIGxhenkgbG9hZGluZyBzdXBwb3J0Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIF91bmxvYWRlZDsKLQotICAgIC8vIGZvciBkb2N1bWVudCB0eXBlcyBvbmx5IC0gb25seSB2YWxpZCBkdXJpbmcgY29tcGlsYXRpb24KLSAgICBwcml2YXRlIFFOYW1lIF9zZzsKLSAgICBwcml2YXRlIExpc3QgX3NnTWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzVW5sb2FkZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91bmxvYWRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hMb2FkaW5nKCkKLSAgICB7Ci0gICAgICAgIF91bmxvYWRlZCA9IGZhbHNlOwotICAgIH0KLQotCi0KLSAgICBTY2hlbWFUeXBlSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0pCi0gICAgewotICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZUltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtLCBib29sZWFuIHVubG9hZGVkKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgICAgICBfdW5sb2FkZWQgPSB1bmxvYWRlZDsKLSAgICAgICAgaWYgKHVubG9hZGVkKQotICAgICAgICAgICAgZmluaXNoUXVpY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NHUmVzb2x2ZWQoKQotICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlID49IFJFU09MVkVEX1NHUzsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTR1Jlc29sdmluZygpCi0gICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPj0gUkVTT0xWSU5HX1NHUzsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPj0gUkVTT0xWRUQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb2x2aW5nKCkKLSAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA9PSBSRVNPTFZJTkc7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVW5qYXZhaXplZCgpCi0gICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPCBKQVZBSVpFRDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNKYXZhaXplZCgpCi0gICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPT0gSkFWQUlaRUQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UmVzb2x2aW5nU0dzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFVOUkVTT0xWRUQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBSRVNPTFZJTkdfU0dTOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaFJlc29sdmluZ1NHcygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZJTkdfU0dTKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gUkVTT0xWRURfU0dTOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UmVzb2x2aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmICggKF9pc0RvY3VtZW50VHlwZSAmJiBfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEX1NHUykgfHwKLSAgICAgICAgICAgICAoIV9pc0RvY3VtZW50VHlwZSAmJiBfcmVzb2x2ZVBoYXNlICE9IFVOUkVTT0xWRUQpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gUkVTT0xWSU5HOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaFJlc29sdmluZygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZJTkcpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBSRVNPTFZFRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEphdmFpemluZygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZFRCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IEpBVkFJWklORzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hKYXZhaXppbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gSkFWQUlaSU5HKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gSkFWQUlaRUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmlzaFF1aWNrKCkKLSAgICB7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBKQVZBSVpFRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VW5yZXNvbHZlZCgpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBVTlJFU09MVkVEICYmICFfdW5sb2FkZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNHUmVzb2x2aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVklOR19TR1MgJiYgIV91bmxvYWRlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U0dSZXNvbHZlZCgpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZFRF9TR1MgJiYgIV91bmxvYWRlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVzb2x2aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVklORyAmJiAhX3VubG9hZGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXNvbHZlZCgpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBSRVNPTFZFRCAmJiAhX3VubG9hZGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRKYXZhaXppbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gSkFWQUlaSU5HICYmICFfdW5sb2FkZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQotICAgICAgICB7IHJldHVybiBfbmFtZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX25hbWUgPSBuYW1lOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQotICAgIHsKLSAgICAgICAgaWYgKF9maWxlbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9maWxlbmFtZTsKLSAgICAgICAgaWYgKGdldE91dGVyVHlwZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2V0T3V0ZXJUeXBlKCkuZ2V0U291cmNlTmFtZSgpOwotCi0gICAgICAgIFNjaGVtYUZpZWxkIGZpZWxkID0gZ2V0Q29udGFpbmVyRmllbGQoKTsKLSAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hR2xvYmFsRWxlbWVudClmaWVsZCkuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsQXR0cmlidXRlKQotICAgICAgICAgICAgICAgIHJldHVybiAoKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSlmaWVsZCkuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9maWxlbmFtZSA9IGZpbGVuYW1lOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuVFlQRTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXNUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX25hbWUgPT0gbnVsbDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBfaXNEb2N1bWVudFR5cGU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0F0dHJpYnV0ZVR5cGU7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXREb2N1bWVudEVsZW1lbnROYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaXNEb2N1bWVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHNwID0gZ2V0Q29udGVudE1vZGVsKCk7Ci0gICAgICAgICAgICBpZiAoc3AgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3AuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaXNBdHRyaWJ1dGVUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBzYW0gPSBnZXRBdHRyaWJ1dGVNb2RlbCgpOwotICAgICAgICAgICAgaWYgKHNhbSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gc2xhQXJyYXkgPSBzYW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGlmIChzbGFBcnJheSAhPSBudWxsICYmIHNsYUFycmF5Lmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBzbGEgPSBzbGFBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsYS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRUeXBlKGJvb2xlYW4gaXNEb2N1bWVudCkKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9pc0RvY3VtZW50VHlwZSA9IGlzRG9jdW1lbnQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoYm9vbGVhbiBpc0F0dHJpYnV0ZSkKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9pc0F0dHJpYnV0ZVR5cGUgPSBpc0F0dHJpYnV0ZTsgfQotCi0gICAgcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jb21wbGV4VHlwZVZhcmlldHk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXhUeXBlVmFyaWV0eShpbnQgY29tcGxleFR5cGVWYXJpZXR5KQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfY29tcGxleFR5cGVWYXJpZXR5ID0gY29tcGxleFR5cGVWYXJpZXR5OyB9Ci0KLSAgICAvKiogU2V0IHRoZSBhYnN0cmFjdCBhbmQgZmluYWwgZmxhZ3MgZm9yIGEgY29tcGxleCB0eXBlICovCi0gICAgdm9pZCBzZXRBYnN0cmFjdEZpbmFsKAotICAgICAgICBib29sZWFuIGFicywgYm9vbGVhbiBmaW5hbEV4dCwgYm9vbGVhbiBmaW5hbFJlc3QsIGJvb2xlYW4gZmluYWxMaXN0LCBib29sZWFuIGZpbmFsVW5pb24pCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2FicyA9IGFiczsKLSAgICAgICAgX2ZpbmFsRXh0ID0gZmluYWxFeHQ7IF9maW5hbFJlc3QgPSBmaW5hbFJlc3Q7Ci0gICAgICAgIF9maW5hbExpc3QgPSBmaW5hbExpc3Q7IF9maW5hbFVuaW9uID0gZmluYWxVbmlvbjsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBmaW5hbCBmbGFncyBmb3IgYSBzaW1wbGUgdHlwZSAqLwotICAgIHZvaWQgc2V0U2ltcGxlRmluYWwoYm9vbGVhbiBmaW5hbFJlc3QsIGJvb2xlYW4gZmluYWxMaXN0LCBib29sZWFuIGZpbmFsVW5pb24pCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsgX2ZpbmFsUmVzdCA9IGZpbmFsUmVzdDsgX2ZpbmFsTGlzdCA9IGZpbmFsTGlzdCA7IF9maW5hbFVuaW9uID0gZmluYWxVbmlvbjsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEJsb2NrKGJvb2xlYW4gYmxvY2tFeHQsIGJvb2xlYW4gYmxvY2tSZXN0KQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7IF9ibG9ja0V4dCA9IGJsb2NrRXh0IDsgX2Jsb2NrUmVzdCA9IGJsb2NrUmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBibG9ja1Jlc3RyaWN0aW9uKCkKLSAgICB7IHJldHVybiBfYmxvY2tSZXN0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpCi0gICAgeyByZXR1cm4gX2Jsb2NrRXh0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkKLSAgICB7IHJldHVybiBfYWJzOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbEV4dGVuc2lvbigpCi0gICAgeyByZXR1cm4gX2ZpbmFsRXh0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFJlc3RyaWN0aW9uKCkKLSAgICB7IHJldHVybiBfZmluYWxSZXN0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbExpc3QoKQotICAgIHsgcmV0dXJuIF9maW5hbExpc3Q7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsVW5pb24oKQotICAgIHsgcmV0dXJuIF9maW5hbFVuaW9uOyB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFNjaGVtYUZpZWxkIGdldENvbnRhaW5lckZpZWxkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfY29udGFpbmVyRmllbGRDb2RlICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIG91dGVyID0gZ2V0T3V0ZXJUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoX2NvbnRhaW5lckZpZWxkQ29kZSA9PSAwKQotICAgICAgICAgICAgICAgIF9jb250YWluZXJGaWVsZCA9IF9jb250YWluZXJGaWVsZFJlZiA9PSBudWxsID8gbnVsbCA6IChTY2hlbWFGaWVsZClfY29udGFpbmVyRmllbGRSZWYuZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChfY29udGFpbmVyRmllbGRDb2RlID09IDEpCi0gICAgICAgICAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gb3V0ZXIuZ2V0QXR0cmlidXRlTW9kZWwoKS5nZXRBdHRyaWJ1dGVzKClbX2NvbnRhaW5lckZpZWxkSW5kZXhdOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9jb250YWluZXJGaWVsZCA9ICgoU2NoZW1hVHlwZUltcGwpb3V0ZXIpLmdldExvY2FsRWxlbWVudEJ5SW5kZXgoX2NvbnRhaW5lckZpZWxkSW5kZXgpOwotICAgICAgICAgICAgX2NvbnRhaW5lckZpZWxkQ29kZSA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfY29udGFpbmVyRmllbGQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyRmllbGQoU2NoZW1hRmllbGQgZmllbGQpCi0gICAgewotICAgICAgICBhc3NlcnRVbnJlc29sdmVkKCk7Ci0gICAgICAgIF9jb250YWluZXJGaWVsZCA9IGZpZWxkOwotICAgICAgICBfY29udGFpbmVyRmllbGRDb2RlID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyRmllbGRSZWYoU2NoZW1hQ29tcG9uZW50LlJlZiByZWYpCi0gICAgewotICAgICAgICBhc3NlcnRVbnJlc29sdmVkKCk7Ci0gICAgICAgIF9jb250YWluZXJGaWVsZFJlZiA9IHJlZjsKLSAgICAgICAgX2NvbnRhaW5lckZpZWxkQ29kZSA9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyRmllbGRJbmRleChzaG9ydCBjb2RlLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBhc3NlcnRVbnJlc29sdmVkKCk7Ci0gICAgICAgIF9jb250YWluZXJGaWVsZENvZGUgPSBjb2RlOwotICAgICAgICBfY29udGFpbmVyRmllbGRJbmRleCA9IGluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldE91dGVyVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9vdXRlclNjaGVtYVR5cGVSZWYgPT0gbnVsbCA/IG51bGwgOiBfb3V0ZXJTY2hlbWFUeXBlUmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRlclNjaGVtYVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9vdXRlclNjaGVtYVR5cGVSZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGVkKCkKLSAgICAgICAgeyByZXR1cm4gX2lzQ29tcGlsZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVkKGJvb2xlYW4gZikKLSAgICAgICAgeyBhc3NlcnRKYXZhaXppbmcoKTsgX2lzQ29tcGlsZWQgPSBmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX291dGVyU2NoZW1hVHlwZVJlZi5nZXQoKS5nZXRCYXNlVHlwZSgpID09IHRoaXM7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRKYXZhTmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zaG9ydEphdmFOYW1lOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydEphdmFOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX3Nob3J0SmF2YU5hbWUgPSBuYW1lOwotICAgICAgICBTY2hlbWFUeXBlIG91dGVyID0gX291dGVyU2NoZW1hVHlwZVJlZi5nZXQoKTsKLSAgICAgICAgd2hpbGUgKG91dGVyLmdldEZ1bGxKYXZhTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICBvdXRlciA9IG91dGVyLmdldE91dGVyVHlwZSgpOwotCi0gICAgICAgIF9mdWxsSmF2YU5hbWUgPSBvdXRlci5nZXRGdWxsSmF2YU5hbWUoKSArICIkIiArIF9zaG9ydEphdmFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbEphdmFOYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX2Z1bGxKYXZhTmFtZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbEphdmFOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX2Z1bGxKYXZhTmFtZSA9IG5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IE1hdGgubWF4KF9mdWxsSmF2YU5hbWUubGFzdEluZGV4T2YoJyQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z1bGxKYXZhTmFtZS5sYXN0SW5kZXhPZignLicpKSArIDE7Ci0gICAgICAgIF9zaG9ydEphdmFOYW1lID0gX2Z1bGxKYXZhTmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0SmF2YUltcGxOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX3Nob3J0SmF2YUltcGxOYW1lID0gbmFtZTsKLSAgICAgICAgU2NoZW1hVHlwZSBvdXRlciA9IF9vdXRlclNjaGVtYVR5cGVSZWYuZ2V0KCk7Ci0gICAgICAgIHdoaWxlIChvdXRlci5nZXRGdWxsSmF2YUltcGxOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIG91dGVyID0gb3V0ZXIuZ2V0T3V0ZXJUeXBlKCk7Ci0KLSAgICAgICAgX2Z1bGxKYXZhSW1wbE5hbWUgPSBvdXRlci5nZXRGdWxsSmF2YUltcGxOYW1lKCkgKyAiJCIgKyBfc2hvcnRKYXZhSW1wbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbEphdmFJbXBsTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmVkKCk7Ci0gICAgICAgIF9mdWxsSmF2YUltcGxOYW1lID0gbmFtZTsKLSAgICAgICAgaW50IGluZGV4ID0gTWF0aC5tYXgoX2Z1bGxKYXZhSW1wbE5hbWUubGFzdEluZGV4T2YoJyQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z1bGxKYXZhSW1wbE5hbWUubGFzdEluZGV4T2YoJy4nKSkgKyAxOwotICAgICAgICBfc2hvcnRKYXZhSW1wbE5hbWUgPSBfZnVsbEphdmFJbXBsTmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbEphdmFJbXBsTmFtZSgpIHsgcmV0dXJuIF9mdWxsSmF2YUltcGxOYW1lO30KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0SmF2YUltcGxOYW1lKCkgeyByZXR1cm4gX3Nob3J0SmF2YUltcGxOYW1lO30KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQotICAgICAgICB7IHJldHVybiBfdHlwZVN5c3RlbTsgfQotCi0gICAgcHVibGljIFNjaGVtYVBhcnRpY2xlIGdldENvbnRlbnRNb2RlbCgpCi0gICAgICAgIHsgcmV0dXJuIF9jb250ZW50TW9kZWw7IH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYnVpbGRFbHRMaXN0KExpc3QgZWx0TGlzdCwgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHN3aXRjaCAoY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgZWx0TGlzdC5hZGQoY29udGVudE1vZGVsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkRWx0TGlzdChlbHRMaXN0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRMb2NhbEVsdHMoKQotICAgIHsKLSAgICAgICAgTGlzdCBlbHRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBidWlsZEVsdExpc3QoZWx0TGlzdCwgX2NvbnRlbnRNb2RlbCk7Ci0gICAgICAgIF9sb2NhbEVsdHMgPSAoU2NoZW1hTG9jYWxFbGVtZW50W10pZWx0TGlzdC50b0FycmF5KG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRbZWx0TGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTG9jYWxFbGVtZW50IGdldExvY2FsRWxlbWVudEJ5SW5kZXgoaW50IGkpCi0gICAgewotICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRbXSBlbHRzID0gX2xvY2FsRWx0czsKLSAgICAgICAgaWYgKGVsdHMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRMb2NhbEVsdHMoKTsKLSAgICAgICAgICAgIGVsdHMgPSBfbG9jYWxFbHRzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbHRzW2ldOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhGb3JMb2NhbEVsZW1lbnQoU2NoZW1hTG9jYWxFbGVtZW50IGVsdCkKLSAgICB7Ci0gICAgICAgIE1hcCBsb2NhbEVsdE1hcCA9IF9lbHRUb0luZGV4TWFwOwotICAgICAgICBpZiAobG9jYWxFbHRNYXAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sb2NhbEVsdHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBidWlsZExvY2FsRWx0cygpOwotICAgICAgICAgICAgbG9jYWxFbHRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9jYWxFbHRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2FsRWx0TWFwLnB1dChfbG9jYWxFbHRzW2ldLCBuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZWx0VG9JbmRleE1hcCA9IGxvY2FsRWx0TWFwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKEludGVnZXIpbG9jYWxFbHRNYXAuZ2V0KGVsdCkpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJbmRleEZvckxvY2FsQXR0cmlidXRlKFNjaGVtYUxvY2FsQXR0cmlidXRlIGF0dHIpCi0gICAgewotICAgICAgICBNYXAgbG9jYWxBdHRyTWFwID0gX2F0dHJUb0luZGV4TWFwOwotICAgICAgICBpZiAobG9jYWxBdHRyTWFwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvY2FsQXR0ck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gdGhpcy5fYXR0cmlidXRlTW9kZWwuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbEF0dHJNYXAucHV0KGF0dHJzW2ldLCBuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfYXR0clRvSW5kZXhNYXAgPSBsb2NhbEF0dHJNYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoSW50ZWdlcilsb2NhbEF0dHJNYXAuZ2V0KGF0dHIpKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBnZXRBdHRyaWJ1dGVNb2RlbCgpCi0gICAgICAgIHsgcmV0dXJuIF9hdHRyaWJ1dGVNb2RlbDsgfQotCi0gICAgcHVibGljIFNjaGVtYVByb3BlcnR5W10gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlUHJvcGVydGllcygpOwotCi0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsaXN0LmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCkpOwotICAgICAgICBsaXN0LmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS52YWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hUHJvcGVydHlbXSlsaXN0LnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hUHJvcGVydHlbXSBOT19QUk9QRVJUSUVTID0gbmV3IFNjaGVtYVByb3BlcnR5WzBdOwotCi0gICAgcHVibGljIFNjaGVtYVByb3BlcnR5W10gZ2V0RGVyaXZlZFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZSA9IGdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICBMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0cy5hZGRBbGwoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLnZhbHVlcygpKTsKLQotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdHMuYWRkQWxsKF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLnZhbHVlcygpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzdWx0cy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IGJhc2VQcm9wID0gcHJvcC5pc0F0dHJpYnV0ZSgpID8KLSAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShwcm9wLmdldE5hbWUoKSkgOgotICAgICAgICAgICAgICAgIGJhc2VUeXBlLmdldEVsZW1lbnRQcm9wZXJ0eShwcm9wLmdldE5hbWUoKSk7Ci0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkZXJpdmVkIHByb3BlcnR5IGZyb20gdGhlIHJlc3VsdHMgaWYgaXQgaXMKLSAgICAgICAgICAgIC8vIEEpIHByZXNlbnQgaW4gdGhlIGJhc2UgdHlwZSBhbmQKLSAgICAgICAgICAgIC8vIEIpIGFsbCB0aGUgZGV0YWlscyBhcmUgdGhlIHNhbWUgKGNhcmRpbmFsaXR5LCBuaWxsYWJpbGl0eSkKLQotICAgICAgICAgICAgaWYgKGJhc2VQcm9wICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBlcShwcm9wLmdldE1pbk9jY3VycygpLCBiYXNlUHJvcC5nZXRNaW5PY2N1cnMoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIGVxKHByb3AuZ2V0TWF4T2NjdXJzKCksIGJhc2VQcm9wLmdldE1heE9jY3VycygpKSAmJgotICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpID09IGJhc2VQcm9wLmhhc05pbGxhYmxlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTY2hlbWFQcm9wZXJ0eVtdKXJlc3VsdHMudG9BcnJheShuZXcgU2NoZW1hUHJvcGVydHlbcmVzdWx0cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKEJpZ0ludGVnZXIgYSwgQmlnSW50ZWdlciBiKQotICAgIHsKLSAgICAgICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGE9PSBudWxsIHx8IGIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGEuZXF1YWxzKGIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVtdIGdldEVsZW1lbnRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBOT19QUk9QRVJUSUVTOwotCi0gICAgICAgIHJldHVybiAoU2NoZW1hUHJvcGVydHlbXSkKLSAgICAgICAgICAgICAgICBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hUHJvcGVydHlbX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVtdIGdldEF0dHJpYnV0ZVByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gTk9fUFJPUEVSVElFUzsKLQotICAgICAgICByZXR1cm4gKFNjaGVtYVByb3BlcnR5W10pCi0gICAgICAgICAgICAgICAgX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hUHJvcGVydHlbX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVByb3BlcnR5IGdldEVsZW1lbnRQcm9wZXJ0eShRTmFtZSBlbHROYW1lKQotICAgICAgICB7IHJldHVybiBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgPT0gbnVsbCA/IG51bGwgOiAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLmdldChlbHROYW1lKTsgfQotCi0gICAgcHVibGljIFNjaGVtYVByb3BlcnR5IGdldEF0dHJpYnV0ZVByb3BlcnR5KFFOYW1lIGF0dHJOYW1lKQotICAgICAgICB7IHJldHVybiBfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSA9PSBudWxsID8gbnVsbCA6IChTY2hlbWFQcm9wZXJ0eSlfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS5nZXQoYXR0ck5hbWUpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBbGxDb250ZW50KCkKLSAgICAgICAgeyByZXR1cm4gX2hhc0FsbENvbnRlbnQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3JkZXJTZW5zaXRpdmUoKQotICAgICAgICB7IHJldHVybiBfb3JkZXJTZW5zaXRpdmU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyU2Vuc2l0aXZlKGJvb2xlYW4gc2Vuc2l0aXZlKQotICAgICAgICB7IGFzc2VydEphdmFpemluZygpOyBfb3JkZXJTZW5zaXRpdmUgPSBzZW5zaXRpdmU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbCgKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCwKLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGF0dHJNb2RlbCwKLSAgICAgICAgICAgIE1hcCBwcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSwKLSAgICAgICAgICAgIE1hcCBwcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgYm9vbGVhbiBpc0FsbCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmluZygpOwotICAgICAgICBfY29udGVudE1vZGVsID0gY29udGVudE1vZGVsOwotICAgICAgICBfYXR0cmlidXRlTW9kZWwgPSBhdHRyTW9kZWw7Ci0gICAgICAgIF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSA9IHByb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lOwotICAgICAgICBfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWU7Ci0gICAgICAgIF9oYXNBbGxDb250ZW50ID0gaXNBbGw7Ci0KLQotICAgICAgICAvLyBBZGQgZW50cmllcyBmb3IgZWFjaCBlbGVtZW50IHByb3BlcnR5IGZvciBzdWJzdGl0dXRpb24gZ3JvdXAgbWVtYmVycwotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92YWxpZFN1YnN0aXR1dGlvbnMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBlbHRQcm9wcyA9IF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS52YWx1ZXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbHRQcm9wcy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSAoU2NoZW1hUHJvcGVydHkpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFFOYW1lW10gbmFtZXMgPSBwcm9wLmFjY2VwdGVkTmFtZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBuYW1lcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoISBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUuY29udGFpbnNLZXkobmFtZXNbaV0pKQotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbGlkU3Vic3RpdHV0aW9ucy5hZGQobmFtZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0VsZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50VHlwZSgpID09IEVMRU1FTlRfQ09OVEVOVCB8fAotICAgICAgICAgICAgICAgZ2V0Q29udGVudFR5cGUoKSA9PSBNSVhFRF9DT05URU5UOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZVdpbGRjYXJkcygpCi0gICAgewotICAgICAgICByZXR1cm4gX2hhc1dpbGRjYXJkQXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFbGVtZW50V2lsZGNhcmRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaGFzV2lsZGNhcmRFbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkU3Vic3RpdHV0aW9uKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbGlkU3Vic3RpdHV0aW9ucy5jb250YWlucyhuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRFbGVtZW50VHlwZShRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlLCBTY2hlbWFUeXBlTG9hZGVyIHdpbGRjYXJkVHlwZUxvYWRlcikKLSAgICB7Ci0gICAgICAgIGlmIChpc1NpbXBsZVR5cGUoKSB8fCAhY29udGFpbnNFbGVtZW50cygpIHx8IGlzTm9UeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLQotICAgICAgICBTY2hlbWFUeXBlIHR5cGU7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLmdldChlbHROYW1lKTsKLSAgICAgICAgaWYgKHByb3AgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IHByb3AuZ2V0VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfdHlwZWRXaWxkY2FyZEVsZW1lbnRzLmNvbnRhaW5zKGVsdE5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotCi0gICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kRWxlbWVudChlbHROYW1lKTsKLSAgICAgICAgICAgIGlmIChlbHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIHR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhzaVR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBpdHlwZSA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kVHlwZSh4c2lUeXBlKTsKLQotICAgICAgICAgICAgLy8gTk9URTogYSBwcmV2aW91cyB2ZXJzaW9uIG9mIFhNTEJlYW5zIHVzZWQgU1RfTk9fVFlQRSBpZiB0aGUKLSAgICAgICAgICAgIC8vIHhzaVR5cGUgd2FzIG5vdCBkZXJpdmVkIGZyb20gJ3R5cGUnLCBidXQgdGhpcyByZXN1bHRzIGluIGEKLSAgICAgICAgICAgIC8vIENsYXNzQ2FzdEV4Y2VwdGlvbi4gIEluc3RlYWQgd2UgaWdub3JlIHhzaTp0eXBlIGlmIGl0J3Mgbm90Ci0gICAgICAgICAgICAvLyBmb3VuZCBvciBhIGRlcml2ZWQgdHlwZS4KLSAgICAgICAgICAgIGlmIChpdHlwZSAhPSBudWxsICYmIHR5cGUuaXNBc3NpZ25hYmxlRnJvbShpdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRBdHRyaWJ1dGVUeXBlKFFOYW1lIGF0dHJOYW1lLCBTY2hlbWFUeXBlTG9hZGVyIHdpbGRjYXJkVHlwZUxvYWRlcikKLSAgICB7Ci0gICAgICAgIGlmIChpc1NpbXBsZVR5cGUoKSB8fCBpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0KLSAgICAgICAgaWYgKGlzVVJUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLQotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLmdldChhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcHJvcC5nZXRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKCFfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0ck5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0KLSAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGF0dHIgPSB3aWxkY2FyZFR5cGVMb2FkZXIuZmluZEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChhdHRyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY3JlYXRlRWxlbWVudFR5cGUoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBudWxsOwotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gbnVsbDsKLSAgICAgICAgaWYgKGlzU2ltcGxlVHlwZSgpIHx8ICFjb250YWluc0VsZW1lbnRzKCkgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5nZXQoZWx0TmFtZSk7Ci0gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSBwcm9wLmdldFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFfdHlwZWRXaWxkY2FyZEVsZW1lbnRzLmNvbnRhaW5zKGVsdE5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAhX3ZhbGlkU3Vic3RpdHV0aW9ucy5jb250YWlucyhlbHROYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kRWxlbWVudChlbHROYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh4c2lUeXBlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBpdHlwZSA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kVHlwZSh4c2lUeXBlKTsKLQotICAgICAgICAgICAgICAgIC8vIE5PVEU6IGEgcHJldmlvdXMgdmVyc2lvbiBvZiBYTUxCZWFucyB1c2VkIFNUX05PX1RZUEUgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8geHNpVHlwZSB3YXMgbm90IGRlcml2ZWQgZnJvbSAndHlwZScsIGJ1dCB0aGlzIHJlc3VsdHMgaW4gYQotICAgICAgICAgICAgICAgIC8vIENsYXNzQ2FzdEV4Y2VwdGlvbi4gIEluc3RlYWQgd2UgaWdub3JlIHhzaTp0eXBlIGlmIGl0J3Mgbm90Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgb3IgYSBkZXJpdmVkIHR5cGUuCi0gICAgICAgICAgICAgICAgaWYgKGl0eXBlICE9IG51bGwgJiYgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGl0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gaXR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoKFNjaGVtYVR5cGVJbXBsKXR5cGUpLmNyZWF0ZVVuYXR0YWNoZWROb2RlKHByb3ApOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZVR5cGUoUU5hbWUgYXR0ck5hbWUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBudWxsOwotICAgICAgICBpZiAoaXNTaW1wbGVUeXBlKCkgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaXNVUlR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLmdldChhdHRyTmFtZSk7Ci0gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSAoU2NoZW1hVHlwZUltcGwpcHJvcC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghX3R5cGVkV2lsZGNhcmRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgYXR0ciA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kQXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0eXBlID0gKFNjaGVtYVR5cGVJbXBsKWF0dHIuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlVW5hdHRhY2hlZE5vZGUocHJvcCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lsZGNhcmRTdW1tYXJ5KFFOYW1lU2V0IGVsZW1lbnRTZXQsIGJvb2xlYW4gaGFzd2NFbHQsIFFOYW1lU2V0IGF0dHJpYnV0ZVNldCwgYm9vbGVhbiBoYXN3Y0F0dCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmluZygpOyBfdHlwZWRXaWxkY2FyZEVsZW1lbnRzID0gZWxlbWVudFNldDsgX2hhc1dpbGRjYXJkRWxlbWVudHMgPSBoYXN3Y0VsdDsgX3R5cGVkV2lsZGNhcmRBdHRyaWJ1dGVzID0gYXR0cmlidXRlU2V0OyBfaGFzV2lsZGNhcmRBdHRyaWJ1dGVzID0gaGFzd2NBdHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBnZXRBbm9ueW1vdXNUeXBlcygpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX2Fub255bW91c1R5cGVyZWZzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0W2ldID0gX2Fub255bW91c1R5cGVyZWZzW2ldLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFub255bW91c1R5cGVSZWZzKFNjaGVtYVR5cGUuUmVmW10gYW5vbnltb3VzVHlwZXJlZnMpCi0gICAgewotICAgICAgICBfYW5vbnltb3VzVHlwZXJlZnMgPSBhbm9ueW1vdXNUeXBlcmVmczsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVbXSBzdGFDb3B5KFNjaGVtYVR5cGVbXSBhKQotICAgIHsKLSAgICAgICAgaWYgKGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVthLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYSwgMCwgcmVzdWx0LCAwLCBhLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbltdIGJvYUNvcHkoYm9vbGVhbltdIGEpCi0gICAgewotICAgICAgICBpZiAoYSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW2EubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLCAwLCByZXN1bHQsIDAsIGEubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0U2ltcGxlVHlwZVZhcmlldHkoaW50IHZhcmlldHkpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9zaW1wbGVUeXBlVmFyaWV0eSA9IHZhcmlldHk7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U2ltcGxlVmFyaWV0eSgpCi0gICAgICAgIHsgcmV0dXJuIF9zaW1wbGVUeXBlVmFyaWV0eTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVUlR5cGUoKQotICAgICAgICB7IHJldHVybiBfYnVpbHRpblR5cGVDb2RlID09IEJUQ19BTllfVFlQRSB8fCBfYnVpbHRpblR5cGVDb2RlID09IEJUQ19BTllfU0lNUExFOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIHRoaXMgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2lzU2ltcGxlVHlwZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2ltcGxlVHlwZShib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfaXNTaW1wbGVUeXBlID0gZjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmlvbk9mTGlzdHMoKQotICAgICAgICB7IHJldHVybiBfaXNVbmlvbk9mTGlzdHM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVuaW9uT2ZMaXN0cyhib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9pc1VuaW9uT2ZMaXN0cyA9IGY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldFByaW1pdGl2ZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfcHJpbWl0aXZlVHlwZVJlZiA9PSBudWxsID8gbnVsbCA6IF9wcmltaXRpdmVUeXBlUmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmltaXRpdmVUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9wcmltaXRpdmVUeXBlUmVmID0gdHlwZXJlZjsgfQotCi0gICAgcHVibGljIGludCBnZXREZWNpbWFsU2l6ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9kZWNpbWFsU2l6ZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjaW1hbFNpemUoaW50IGJpdHMpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9kZWNpbWFsU2l6ZSA9IGJpdHM7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldEJhc2VUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2Jhc2VUeXBlcmVmID09IG51bGwgPyBudWxsIDogX2Jhc2VUeXBlcmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfYmFzZVR5cGVyZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEJhc2VEZXB0aCgpCi0gICAgICAgIHsgcmV0dXJuIF9iYXNlRGVwdGg7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEZXB0aChpbnQgZGVwdGgpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9iYXNlRGVwdGggPSBkZXB0aDsgfQotCi0gICAgcHVibGljIGludCBnZXREZXJpdmF0aW9uVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9kZXJpdmF0aW9uVHlwZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVyaXZhdGlvblR5cGUoaW50IHR5cGUpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9kZXJpdmF0aW9uVHlwZSA9IHR5cGU7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldExpc3RJdGVtVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9saXN0SXRlbVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfbGlzdEl0ZW1UeXBlcmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0SXRlbVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2xpc3RJdGVtVHlwZXJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gZ2V0VW5pb25NZW1iZXJUeXBlcygpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX3VuaW9uTWVtYmVyVHlwZXJlZnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSBfdW5pb25NZW1iZXJUeXBlcmVmc1tpXS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVbmlvbk1lbWJlclR5cGVSZWZzKFNjaGVtYVR5cGUuUmVmW10gdHlwZXJlZnMpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF91bmlvbk1lbWJlclR5cGVyZWZzID0gdHlwZXJlZnM7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCkKLSAgICAgICAgeyByZXR1cm4gX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKGludCBpKQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCA9IGk7IH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZVtdIGdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOwotICAgICAgICByZXR1cm4gc3RhQ29weShfdW5pb25Db25zdGl0dWVudFR5cGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VW5pb25Db25zdGl0dWVudFR5cGVzKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICAgICAgeyBfdW5pb25Db25zdGl0dWVudFR5cGVzID0gdHlwZXM7IH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZVtdIGdldFVuaW9uU3ViVHlwZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmlvbkNvbW1vbkJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICBjb21wdXRlRmxhdFVuaW9uTW9kZWwoKTsKLSAgICAgICAgcmV0dXJuIHN0YUNvcHkoX3VuaW9uU3ViVHlwZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRVbmlvblN1YlR5cGVzKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICAgICAgeyBfdW5pb25TdWJUeXBlcyA9IHR5cGVzOyB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFNjaGVtYVR5cGUgZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpCi0gICAgewotICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOwotICAgICAgICByZXR1cm4gX3VuaW9uQ29tbW9uQmFzZVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVuaW9uQ29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7IF91bmlvbkNvbW1vbkJhc2VUeXBlID0gdHlwZTsgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpCi0gICAgewotICAgICAgICBTZXQgY29uc3RpdHVlbnRNZW1iZXJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBhbGxTdWJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIFNjaGVtYVR5cGUgY29tbW9uQmFzZVR5cGUgPSBudWxsOwotCi0gICAgICAgIGFsbFN1YlR5cGVzLmFkZCh0aGlzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF91bmlvbk1lbWJlclR5cGVyZWZzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbClfdW5pb25NZW1iZXJUeXBlcmVmc1tpXS5nZXQoKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMuYWRkKG1JbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgYWxsU3ViVHlwZXMuYWRkKG1JbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uQmFzZVR5cGUgPSBtSW1wbC5nZXRDb21tb25CYXNlVHlwZShjb21tb25CYXNlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtSW1wbC5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtSW1wbC5nZXRVbmlvblN1YlR5cGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBvdGhlckNvbW1vbkJhc2VUeXBlID0gbUltcGwuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJDb21tb25CYXNlVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uQmFzZVR5cGUgPSBvdGhlckNvbW1vbkJhc2VUeXBlLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGQobUltcGwpOwotICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGQobUltcGwpOwotICAgICAgICAgICAgICAgICAgICBjb21tb25CYXNlVHlwZSA9IG1JbXBsLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygoU2NoZW1hVHlwZVtdKQotICAgICAgICAgICAgICAgIGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMudG9BcnJheShTdHNjU3RhdGUuRU1QVFlfU1RfQVJSQVkpKTsKLSAgICAgICAgc2V0VW5pb25TdWJUeXBlcygoU2NoZW1hVHlwZVtdKQotICAgICAgICAgICAgICAgIGFsbFN1YlR5cGVzLnRvQXJyYXkoU3RzY1N0YXRlLkVNUFRZX1NUX0FSUkFZKSk7Ci0gICAgICAgIHNldFVuaW9uQ29tbW9uQmFzZVR5cGUoY29tbW9uQmFzZVR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgICAgIHsgcmV0dXJuIF9zZzsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uR3JvdXAoUU5hbWUgc2cpCi0gICAgICAgIHsgYXNzZXJ0U0dSZXNvbHZpbmcoKTsgX3NnID0gc2c7IH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKFFOYW1lIG1lbWJlcikKLSAgICAgICAgeyBhc3NlcnRTR1Jlc29sdmVkKCk7IF9zZ01lbWJlcnMuYWRkKG1lbWJlcik7IH0KLQotICAgIHB1YmxpYyBRTmFtZVtdIGdldFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpCi0gICAgewotICAgICAgICBRTmFtZVtdIHJlc3VsdCA9IG5ldyBRTmFtZVtfc2dNZW1iZXJzLnNpemUoKV07Ci0gICAgICAgIHJldHVybiAoUU5hbWVbXSlfc2dNZW1iZXJzLnRvQXJyYXkocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdoaXRlU3BhY2VSdWxlKCkKLSAgICAgICAgeyByZXR1cm4gX3doaXRlU3BhY2VSdWxlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaGl0ZVNwYWNlUnVsZShpbnQgd3MpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF93aGl0ZVNwYWNlUnVsZSA9IHdzOyB9Ci0KLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXRGYWNldChpbnQgZmFjZXRDb2RlKQotICAgIHsKLSAgICAgICAgaWYgKF9mYWNldEFycmF5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgWG1sVmFsdWVSZWYgcmVmID0gX2ZhY2V0QXJyYXlbZmFjZXRDb2RlXTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiByZWYuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWNldEZpeGVkKGludCBmYWNldENvZGUpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpeGVkRmFjZXRBcnJheVtmYWNldENvZGVdOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0QmFzaWNGYWNldHMoKQotICAgIHsKLSAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIHJlc3VsdCA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW1NjaGVtYVR5cGUuTEFTVF9GQUNFVCArIDFdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBTY2hlbWFUeXBlLkxBU1RfRkFDRVQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gZ2V0RmFjZXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbltdIGdldEZpeGVkRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBib2FDb3B5KF9maXhlZEZhY2V0QXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2ljRmFjZXRzKFhtbFZhbHVlUmVmW10gdmFsdWVzLCBib29sZWFuW10gZml4ZWQpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2ZhY2V0QXJyYXkgPSB2YWx1ZXM7Ci0gICAgICAgIF9maXhlZEZhY2V0QXJyYXkgPSBmaXhlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG9yZGVyZWQoKQotICAgICAgICB7IHJldHVybiBfb3JkZXJlZDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3JkZXJlZChpbnQgb3JkZXJpbmcpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9vcmRlcmVkID0gb3JkZXJpbmc7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmRlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0JvdW5kZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kZWQoYm9vbGVhbiBmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaXNCb3VuZGVkID0gZjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaW5pdGUoKQotICAgICAgICB7IHJldHVybiBfaXNGaW5pdGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbml0ZShib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9pc0Zpbml0ZSA9IGY7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTnVtZXJpYygpCi0gICAgICAgIHsgcmV0dXJuIF9pc051bWVyaWM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bWVyaWMoYm9vbGVhbiBmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaXNOdW1lcmljID0gZjsgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXR0ZXJuRmFjZXQoKQotICAgICAgICB7IHJldHVybiBfaGFzUGF0dGVybnM7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5GYWNldChib29sZWFuIGhhc1BhdHRlcm5zKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaGFzUGF0dGVybnMgPSBoYXNQYXR0ZXJuczsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuRmFjZXQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoIV9oYXNQYXR0ZXJucykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChfcGF0dGVybnMgIT0gbnVsbCAmJiBfcGF0dGVybnMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3BhdHRlcm5zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcGF0dGVybnNbaV0ubWF0Y2hlcyhzKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA+PSBfcGF0dGVybnMubGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRCYXNlVHlwZSgpLm1hdGNoUGF0dGVybkZhY2V0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXR0ZXJucygpCi0gICAgewotICAgICAgICBpZiAoX3BhdHRlcm5zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSBuZXcgU3RyaW5nW19wYXR0ZXJucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8IF9wYXR0ZXJucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHBhdHRlcm5zW2ldID0gX3BhdHRlcm5zW2ldLmdldFBhdHRlcm4oKTsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5zOwotICAgIH0KLQotICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBnZXRQYXR0ZXJuRXhwcmVzc2lvbnMoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXR0ZXJucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bMF07Ci0gICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHJlc3VsdCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bX3BhdHRlcm5zLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3BhdHRlcm5zLCAwLCByZXN1bHQsIDAsIF9wYXR0ZXJucy5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5zKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIGxpc3QpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9wYXR0ZXJucyA9IGxpc3Q7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0RW51bWVyYXRpb25WYWx1ZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9lbnVtZXJhdGlvblZhbHVlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSByZXN1bHQgPSBuZXcgWG1sQW55U2ltcGxlVHlwZVtfZW51bWVyYXRpb25WYWx1ZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFZhbHVlUmVmIHJlZiA9IF9lbnVtZXJhdGlvblZhbHVlc1tpXTsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IChyZWYgPT0gbnVsbCA/IG51bGwgOiByZWYuZ2V0KCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGlvblZhbHVlcyhYbWxWYWx1ZVJlZltdIGEpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9lbnVtZXJhdGlvblZhbHVlcyA9IGE7IH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JTdHJpbmcoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOwotICAgICAgICBpZiAoX2xvb2t1cFN0cmluZ0VudW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xvb2t1cFN0cmluZ0VudW0uZ2V0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpCi0gICAgewotICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOwotICAgICAgICBpZiAoX2xpc3RPZlN0cmluZ0VudW0gPT0gbnVsbCB8fCBpIDwgMCB8fCBpID49IF9saXN0T2ZTdHJpbmdFbnVtLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xpc3RPZlN0cmluZ0VudW0uZ2V0KGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnkgZW51bUVudHJ5Rm9yU3RyaW5nKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgZW5zdXJlU3RyaW5nRW51bUluZm8oKTsKLSAgICAgICAgaWYgKF9sb29rdXBTdHJpbmdFbnVtRW50cnkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFNjaGVtYVN0cmluZ0VudW1FbnRyeSlfbG9va3VwU3RyaW5nRW51bUVudHJ5LmdldChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iYXNlRW51bVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZUVudW1UeXBlcmVmLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VFbnVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiBiYXNlRW51bVR5cGVyZWYpCi0gICAgewotICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUVudW1UeXBlcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBnZXRTdHJpbmdFbnVtRW50cmllcygpCi0gICAgewotICAgICAgICBpZiAoX3N0cmluZ0VudW1FbnRyaWVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gcmVzdWx0ID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeVtfc3RyaW5nRW51bUVudHJpZXMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfc3RyaW5nRW51bUVudHJpZXMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nRW51bUVudHJpZXMoU2NoZW1hU3RyaW5nRW51bUVudHJ5IHNFbnVtc1tdKQotICAgIHsKLSAgICAgICAgYXNzZXJ0SmF2YWl6aW5nKCk7Ci0gICAgICAgIF9zdHJpbmdFbnVtRW50cmllcyA9IHNFbnVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU3RyaW5nRW51bUluZm8oKQotICAgIHsKLSAgICAgICAgaWYgKF9zdHJpbmdFbnVtRW5zdXJlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBzRW51bXMgPSBfc3RyaW5nRW51bUVudHJpZXM7Ci0gICAgICAgIGlmIChzRW51bXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0cmluZ0VudW1FbnN1cmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBsb29rdXBTdHJpbmdFbnVtID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7Ci0gICAgICAgIExpc3QgbGlzdE9mU3RyaW5nRW51bSA9IG5ldyBBcnJheUxpc3Qoc0VudW1zLmxlbmd0aCArIDEpOwotICAgICAgICBNYXAgbG9va3VwU3RyaW5nRW51bUVudHJ5ID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW1FbnRyeS5wdXQoc0VudW1zW2ldLmdldFN0cmluZygpLCBzRW51bXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgamMgPSBfYmFzZUVudW1UeXBlcmVmLmdldCgpLmdldEVudW1KYXZhQ2xhc3MoKTsKLSAgICAgICAgaWYgKGpjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSAoU3RyaW5nRW51bUFic3RyYWN0QmFzZS5UYWJsZSlqYy5nZXRGaWVsZCgidGFibGUiKS5nZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IHNFbnVtc1tpXS5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWwgPSB0YWJsZS5mb3JJbnQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW0ucHV0KHNFbnVtc1tpXS5nZXRTdHJpbmcoKSwgZW51bVZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaXN0T2ZTdHJpbmdFbnVtLnNpemUoKSA8PSBqKQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RPZlN0cmluZ0VudW0uc2V0KGosIGVudW1WYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvbWV0aGluZyB3cm9uZzogY291bGQgbm90IGxvY2F0ZSBlbnVtIHRhYmxlIGZvciAiICsgamMpOwotICAgICAgICAgICAgICAgIGpjID0gbnVsbDsKLSAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGpjID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0VudW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBqID0gc0VudW1zW2ldLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzRW51bXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsID0gbmV3IFN0cmluZ0VudW1WYWx1ZShzLCBqKTsKLSAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLnB1dChzLCBlbnVtVmFsKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGlzdE9mU3RyaW5nRW51bS5zaXplKCkgPD0gaikKLSAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5zZXQoaiwgZW51bVZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmluZ0VudW1FbnN1cmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sb29rdXBTdHJpbmdFbnVtID0gbG9va3VwU3RyaW5nRW51bTsKLSAgICAgICAgICAgICAgICBfbGlzdE9mU3RyaW5nRW51bSA9IGxpc3RPZlN0cmluZ0VudW07Ci0gICAgICAgICAgICAgICAgX2xvb2t1cFN0cmluZ0VudW1FbnRyeSA9IGxvb2t1cFN0cmluZ0VudW1FbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBIQUNLSEFDSzogdHdvIHN5bmNyaG9uaXplZCBibG9ja3MgZm9yY2UgYSBtZW1vcnkgYmFycmllcjoKLSAgICAgICAgLy8gQlVHQlVHOiB0aGlzIGJlaGF2aW9yIGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIFZNcwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdHJpbmdFbnVtRW5zdXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdHJpbmdFbnVtVmFsdWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nRW51bUVudHJpZXMgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRpb25WYWx1ZXMoU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2VudW1lcmF0aW9uVmFsdWVzID0gYmFzZUltcGwuX2VudW1lcmF0aW9uVmFsdWVzOwotICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUltcGwuX2Jhc2VFbnVtVHlwZXJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpCi0gICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGU7IH0gLy8gc3BlY2lhbDogc2V0IHVwIHByZS1pbml0Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsdGluVHlwZUNvZGUoaW50IGJ1aWx0aW5UeXBlQ29kZSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2J1aWx0aW5UeXBlQ29kZSA9IGJ1aWx0aW5UeXBlQ29kZTsgfQotCi0gICAgcHVibGljIENsYXNzIGdldEphdmFDbGFzcygpCi0gICAgewotICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgotICAgICAgICBpZiAoX2phdmFDbGFzcyA9PSBudWxsICYmIGdldEZ1bGxKYXZhTmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsgX2phdmFDbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0RnVsbEphdmFOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIGNsYXNzIG5hbWUgIiArIGdldEZ1bGxKYXZhTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlYXJjaGVkIGluIGNsYXNzbG9hZGVyICIgKyBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBfamF2YUNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhSW1wbENsYXNzKCkgewotICAgICAgICBpZiAoX2ltcGxOb3RBdmFpbGFibGUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX2phdmFJbXBsQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RnVsbEphdmFJbXBsTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9qYXZhSW1wbENsYXNzID0gQ2xhc3MuZm9yTmFtZShnZXRGdWxsSmF2YUltcGxOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9pbXBsTm90QXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBfaW1wbE5vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2phdmFJbXBsQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnN0cnVjdG9yIGdldEphdmFJbXBsQ29uc3RydWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yID09IG51bGwgJiYgIV9pbXBsTm90QXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsID0gZ2V0SmF2YUltcGxDbGFzcygpOwotICAgICAgICAgICAgaWYgKGltcGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfamF2YUltcGxDb25zdHJ1Y3RvciA9IGltcGwuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBTY2hlbWFUeXBlLmNsYXNzIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2phdmFJbXBsQ29uc3RydWN0b3I7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uc3RydWN0b3IgZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcjIoKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yMiA9PSBudWxsICYmICFfaW1wbE5vdEF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgaW1wbCA9IGdldEphdmFJbXBsQ2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2phdmFJbXBsQ29uc3RydWN0b3IyID0gaW1wbC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGUuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUltcGxDb25zdHJ1Y3RvcjI7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpCi0gICAgewotICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgotICAgICAgICBpZiAoX2phdmFFbnVtQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0QmFzZUVudW1UeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkgKyAiJEVudW0iLCBmYWxzZSwgX3R5cGVTeXN0ZW0uZ2V0Q2xhc3NMb2FkZXIoKSk7IH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IG51bGw7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUVudW1DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoQ2xhc3MgamF2YUNsYXNzKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX2phdmFDbGFzcyA9IGphdmFDbGFzczsKLSAgICAgICAgc2V0RnVsbEphdmFOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKGdldEJ1aWx0aW5UeXBlQ29kZSgpID49IEJUQ19GSVJTVF9QUklNSVRJVkUgJiYKLSAgICAgICAgICAgICAgICBnZXRCdWlsdGluVHlwZUNvZGUoKSA8PSBCVENfTEFTVF9QUklNSVRJVkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVpbHRpblR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBjcmVhdGVVbndyYXBwZWROb2RlKCkKLSAgICB7Ci0gICAgICAgIC8vIFRvZG86IGF0dGFjaCBhIG5ldyB4bWwgc3RvcmUhCi0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVVbmF0dGFjaGVkTm9kZShudWxsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlU3RvcmVVc2VyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZVR5cGVTdG9yZVVzZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKWNyZWF0ZVVuYXR0YWNoZWROb2RlKG51bGwpOwotICAgIH0KLQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsaWRhdGluZ1ZhbHVlKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCB0cnVlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsdWUoT2JqZWN0IG9iaiwgYm9vbGVhbiB2YWxpZGF0ZU9uU2V0KQotICAgIHsKLSAgICAgICAgaWYgKCFpc1NpbXBsZVR5cGUoKSAmJiBnZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IC8vIHZhbHVlcyBtdXN0IGJlIHNpbXBsZQotCi0gICAgICAgIFhtbE9iamVjdEJhc2UgcmVzdWx0ID0gKFhtbE9iamVjdEJhc2UpY3JlYXRlVW5hdHRhY2hlZE5vZGUobnVsbCk7Ci0gICAgICAgIGlmICh2YWxpZGF0ZU9uU2V0KQotICAgICAgICAgICAgcmVzdWx0LnNldFZhbGlkYXRlT25TZXQoKTsKLQotICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0cmVlIGNvcHksIG5lZWQgdG8gY2FsbCBhIHNwZWNsYSBzZXR0ZXIgdG8gYXZvaWQKLSAgICAgICAgLy8gc2V0KFhtbE9iamVjdCkKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdCkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRfbmV3VmFsdWUoKFhtbE9iamVjdClvYmopOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQub2JqZWN0U2V0KG9iaik7Ci0KLSAgICAgICAgcmVzdWx0LmNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJbW11dGFibGUoKTsKLQotICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkTm9kZShTY2hlbWFQcm9wZXJ0eSBwcm9wKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCFpc0J1aWx0aW5UeXBlKCkgJiYgIWlzTm9UeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB0byBsb2FkIGltcGwgY2xhc3M6ICIgKyBnZXRGdWxsSmF2YUltcGxOYW1lKCkpOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RyID0gZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcigpOwotICAgICAgICAgICAgaWYgKGN0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZWVkZWQhIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KWN0ci5uZXdJbnN0YW5jZShfY3RyQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUJ1aWx0aW5JbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm8gcmVzdWx0LCB3ZSBtdXN0IGJlIGEgcmVzdHJpY3Rpb24gb2Ygc29tZSBjb21waWxlZCB0eXBlCi0gICAgICAgIGZvciAoU2NoZW1hVHlwZSBzVHlwZSA9IHRoaXM7IHJlc3VsdCA9PSBudWxsOyBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCkpCi0gICAgICAgICAgICByZXN1bHQgPSAoKFNjaGVtYVR5cGVJbXBsKXNUeXBlKS5jcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3ModGhpcyk7Ci0KLSAgICAgICAgKChYbWxPYmplY3RCYXNlKXJlc3VsdCkuaW5pdF9mbGFncyhwcm9wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3MoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICghaXNCdWlsdGluVHlwZSgpICYmICFpc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dGVtcHRpbmcgdG8gbG9hZCBpbXBsIGNsYXNzOiAiICsgZ2V0RnVsbEphdmFJbXBsTmFtZSgpKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0ciA9IGdldEphdmFJbXBsQ29uc3RydWN0b3IyKCk7Ci0gICAgICAgICAgICBpZiAoY3RyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2NlZWRlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpY3RyLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHNUeXBlLCBzVHlwZS5pc1NpbXBsZVR5cGUoKSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUUgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0aW5TdWJjbGFzcyhzVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVCdWlsdGluSW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChnZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBCVENfTk9UX0JVSUxUSU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlUeXBlSW1wbChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJvb2xlYW5JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJhc2U2NEJpbmFyeUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxIZXhCaW5hcnlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VXJpSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxRTmFtZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm90YXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZsb2F0SW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRG91YmxlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbERlY2ltYWxJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbER1cmF0aW9uSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVGltZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEYXRlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdZZWFySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhEYXlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTG9uZ0ltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2hvcnRJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5lZ2F0aXZlSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFBvc2l0aXZlSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZExvbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRTaG9ydEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEJ5dGVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19UT0tFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFRva2VuSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExhbmd1YWdlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19JRFJFRlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZFJlZnNJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxFbnRpdHlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5zSW1wbCgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgY3JlYXRlQnVpbHRpblN1YmNsYXNzKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBib29sZWFuIGNvbXBsZXggPSAhc1R5cGUuaXNTaW1wbGVUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAoZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PVF9CVUlMVElOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRSk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19BTllfVFlQRToKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVF9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbENvbXBsZXhDb250ZW50SW1wbChzVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExpc3RJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBVTklPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5pb25JbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQm9vbGVhblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlVcmlSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFFOYW1lUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb3RhdGlvblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRmxvYXRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEb3VibGVSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGVjaW1hbFJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU3RyaW5nUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEdXJhdGlvbkltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxUaW1lSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19EQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoRGF5SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRlZ2VyUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExvbmdSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19TSE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRMb25nSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRCeXRlSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1RPS0VOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVG9rZW5JbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTGFuZ3VhZ2VJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbElkUmVmc0ltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfRU5USVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRW50aXR5SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm1Ub2tlbkltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxObVRva2Vuc0ltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgLy8gbnVsbCB0eXBlIGlzIHRyZWF0ZWQgYXMgdGhlIG5vLXR5cGUKLSAgICAgICAgaWYgKHRoaXMgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgdHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIC8vIGFueSB0eXBlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlOyBub1R5cGUgaXMgdGhlIHVuaXZlcnNhbCBkZXJpdmVkIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotCi0gICAgICAgIC8vIHRoZSByZWd1bGFyIGNhc2U6Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMSA9IChTY2hlbWFUeXBlSW1wbCl0eXBlOwotICAgICAgICB3aGlsZSAoc0ltcGwxLmdldEJhc2VEZXB0aCgpID4gZ2V0QmFzZURlcHRoKCkpCi0gICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMiA9IHRoaXM7Ci0gICAgICAgIHdoaWxlIChzSW1wbDIuZ2V0QmFzZURlcHRoKCkgPiBzSW1wbDEuZ2V0QmFzZURlcHRoKCkpCi0gICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbDEuZXF1YWxzKHNJbXBsMikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnQoc0ltcGwxICE9IG51bGwgJiYgc0ltcGwyICE9IG51bGwpOyAvLyBtdXN0IG1lZXQgYXQgYW55VHlwZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzSW1wbDE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGludCBkZXB0aCA9ICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0QmFzZURlcHRoKCkgLSBnZXRCYXNlRGVwdGgoKTsKLSAgICAgICAgaWYgKGRlcHRoIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGRlcHRoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIGRlcHRoIC09IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh0eXBlLmVxdWFscyh0aGlzKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChnZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiVD0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKGlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gIkQ9IiArIFFOYW1lSGVscGVyLnByZXR0eShnZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOwotCi0gICAgICAgIGlmIChpc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAiUj0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkpOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXg7Ci0KLSAgICAgICAgaWYgKGdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gKGdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJRPSIgOiAiRT0iKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJBPSIgOiAiVT0iKSkKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGlmIChnZXRPdXRlclR5cGUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiQCIgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuICJOPSI7Ci0gICAgICAgIGVsc2UgaWYgKGdldE91dGVyVHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIm5vb3V0ZXIiOwotICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRCYXNlVHlwZSgpID09IHRoaXMpCi0gICAgICAgICAgICBwcmVmaXggPSAiQj0iOwotICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcHJlZml4ID0gIkk9IjsKLSAgICAgICAgZWxzZSBpZiAoZ2V0T3V0ZXJUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgICAgICBwcmVmaXggPSAiTT0iICsgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZWZpeCA9ICJzdHJhbmdlPSI7Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeCArICJ8IiArIGdldE91dGVyVHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgcGFyc2VPYmplY3QsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgICAgIF9yZWRlZmluaXRpb24gPSByZWRlZmluaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbWVsZW9uICggKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hVHlwZS5SZWYodGhpcyk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcyOTIyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3IuVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNheEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmFjdG9yeUhvb2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY2hlbWFUeXBlTG9hZGVyQmFzZSBpbXBsZW1lbnRzIFNjaGVtYVR5cGVMb2FkZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX3Jvb3RCdWlsZGVyID0gZ2V0TWV0aG9kKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3QiLCAibmV3U3RvcmUiLCBuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGVMb2FkZXIuY2xhc3MsIFNjaGVtYVR5cGUuY2xhc3MsIFhtbE9wdGlvbnMuY2xhc3MgfSApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfcGF0aENvbXBpbGVyID0gZ2V0TWV0aG9kKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlBhdGgiLCAiZ2V0Q29tcGlsZWRQYXRoIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFhtbE9wdGlvbnMuY2xhc3MgfSApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfcXVlcnlDb21waWxlciA9IGdldE1ldGhvZCggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5QYXRoIiwgImdldENvbXBpbGVkUXVlcnkiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9ICk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kICggU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJncyApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSggY2xhc3NOYW1lICkuCi0gICAgICAgICAgICAgICAgICAgIGdldERlY2xhcmVkTWV0aG9kKCBtZXRob2ROYW1lLCBhcmdzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgZmluZCAiICsgY2xhc3NOYW1lICsgIi4iICsgbWV0aG9kTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIuICB2ZXJpZnkgdGhhdCB4bWxzdG9yZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIoZnJvbSB4YmVhbi5qYXIpIGlzIG9uIGNsYXNzcGF0aCIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QgKCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSggbWV0aG9kLCBhcmdzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgaXNlLmluaXRDYXVzZSggZSApOwotICAgICAgICAgICAgdGhyb3cgaXNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgIGlzZS5pbml0Q2F1c2UoIGUgKTsKLSAgICAgICAgICAgIHRocm93IGlzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU3RvcmUgY3JlYXRlTmV3U3RvcmUgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChYbWxTdG9yZSkKLSAgICAgICAgICAgICAgICBpbnZva2VNZXRob2QoIF9yb290QnVpbGRlciwgbmV3IE9iamVjdFtdIHsgdGhpcywgdHlwZSwgb3B0aW9ucyB9ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRvQ29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsgcmV0dXJuIChTdHJpbmcpIGludm9rZU1ldGhvZCggX3BhdGhDb21waWxlciwgbmV3IE9iamVjdFtdIHsgcGF0aEV4cHIsIG9wdGlvbnMgfSApOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRvQ29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkgeyByZXR1cm4gKFN0cmluZykgaW52b2tlTWV0aG9kKCBfcXVlcnlDb21waWxlciwgbmV3IE9iamVjdFtdIHsgcXVlcnlFeHByLCBvcHRpb25zIH0gKTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZFR5cGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlZiA9IGZpbmRUeXBlUmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hVHlwZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZERvY3VtZW50VHlwZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVmID0gZmluZERvY3VtZW50VHlwZVJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZWYgPSBmaW5kQXR0cmlidXRlVHlwZVJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwIGZpbmRNb2RlbEdyb3VwKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwLlJlZiByZWYgPSBmaW5kTW9kZWxHcm91cFJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXAgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cCBmaW5kQXR0cmlidXRlR3JvdXAoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiByZWYgPSBmaW5kQXR0cmlidXRlR3JvdXBSZWYobmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgZmluZEVsZW1lbnQoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHJlZiA9IGZpbmRFbGVtZW50UmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBmaW5kQXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIHJlZiA9IGZpbmRBdHRyaWJ1dGVSZWYobmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLm5ld0luc3RhbmNlKCB0aGlzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCB0eXBlLCBvcHRpb25zICkuZ2V0T2JqZWN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFN0cmluZyB4bWxUZXh0LCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCB4bWxUZXh0LCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggeG1sVGV4dCwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7Ci0gICAgICAgIGlmIChob29rICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaG9vay5wYXJzZSggdGhpcywgeGlzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggeGlzLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIEZpbGUgZmlsZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSwgZmlsZS50b1VSSSgpLm5vcm1hbGl6ZSgpLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKCEgb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOwotICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIGZpbGUudG9VUkkoKS5ub3JtYWxpemUoKS50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZSggZmlzLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBVUkwgdXJsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCB1cmwudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoISBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCBvcHRpb25zICk7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSwgdXJsLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgIGRvd25sb2FkOiB0cnkKLSAgICAgICAgewotCi0gICAgICAgICAgICBib29sZWFuIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiQkVBIFhNTCBCZWFucy8xLjAiKTsKLSAgICAgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOwotICAgICAgICAgICAgICAgIGlmIChjb25uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBodHRwY29uID0gKEh0dHBVUkxDb25uZWN0aW9uKWNvbm47Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gaHR0cGNvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZCA9IChjb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTU9WRURfUEVSTSB8fCBjb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTU9WRURfVEVNUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdGVkICYmIGNvdW50ID4gNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld0xvY2F0aW9uID0gaHR0cGNvbi5nZXRIZWFkZXJGaWVsZCgiTG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKG5ld0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHJlZGlyZWN0ZWQpOwotCi0gICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2UoIHN0cmVhbSwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIElucHV0U3RyZWFtIGppb2lzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7Ci0gICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGRpZ2VzdFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHNldHVwRGlnZXN0OiBpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9NRVNTQUdFX0RJR0VTVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3Qgc2hhOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hhID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0dXBEaWdlc3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZ2VzdFN0cmVhbSA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShqaW9pcywgc2hhKTsKLSAgICAgICAgICAgIGppb2lzID0gZGlnZXN0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCBqaW9pcywgdHlwZSwgb3B0aW9ucyApOwotCi0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLmxvYWRYbWwoIGppb2lzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgaWYgKGRpZ2VzdFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50UHJvcGVydGllcygpLnNldE1lc3NhZ2VEaWdlc3QoZGlnZXN0U3RyZWFtLmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIGppb3IsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCBqaW9yLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggamlvciwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOwotICAgICAgICBpZiAoaG9vayAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5sb2FkWG1sKCBub2RlLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLm5ld1htbFNheEhhbmRsZXIoIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5uZXdTYXhIYW5kbGVyKCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVQYXRoKCBwYXRoRXhwciwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gZG9Db21waWxlUGF0aCggcGF0aEV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVRdWVyeSggcXVlcnlFeHByLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvQ29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGxvYWQgYSB0eXBlIGZyb20gYSBzaWduYXR1cmUuCi0gICAgICoKLSAgICAgKiBBIHNpZ25hdHVyZSBpcyB0aGUgc3RyaW5nIHlvdSBnZXQgZnJvbSB0eXBlLnRvU3RyaW5nKCkuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvclNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKQotICAgIHsKLSAgICAgICAgaW50IGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCdAJyk7Ci0gICAgICAgIFN0cmluZyB1cmk7Ci0KLSAgICAgICAgaWYgKGVuZCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICAgICAgZW5kID0gc2lnbmF0dXJlLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdXJpID0gc2lnbmF0dXJlLnN1YnN0cmluZyhlbmQgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVuZDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmV4dGMgPSBzaWduYXR1cmUuaW5kZXhPZignOicsIGluZGV4KTsKLSAgICAgICAgICAgIGludCBuZXh0ZCA9IHNpZ25hdHVyZS5pbmRleE9mKCd8JywgaW5kZXgpOwotICAgICAgICAgICAgaW50IG5leHQgPSAobmV4dGMgPCAwID8gbmV4dGQgOiBuZXh0ZCA8IDAgPyBuZXh0YyA6IG5leHRjIDwgbmV4dGQgPyBuZXh0YyA6IG5leHRkKTsKLSAgICAgICAgICAgIGlmIChuZXh0IDwgMCB8fCBuZXh0ID4gZW5kKQotICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydCA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoaW5kZXgsIG5leHQpOwotICAgICAgICAgICAgcGFydHMuYWRkKHBhcnQpOwotICAgICAgICAgICAgaW5kZXggPSBuZXh0ICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUgY3VyVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgb3V0ZXI6IGZvciAoaW50IGkgPSBwYXJ0cy5zaXplKCkgLSAxOyBpID49IDA7IGkgLT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSAoU3RyaW5nKXBhcnRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCgpIDwgMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKHBhcnQubGVuZ3RoKCkgPj0gMiAmJiBwYXJ0LmNoYXJBdCgxKSA9PSAnPScpID8gMiA6IDE7Ci0gICAgICAgICAgICBjYXNlczogc3dpdGNoIChwYXJ0LmNoYXJBdCgwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGZpbmRUeXBlKFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gZmluZERvY3VtZW50VHlwZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdDJzogLy8gZGVwcmVjYXRlZAotICAgICAgICAgICAgICAgIGNhc2UgJ1InOiAvLyBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBmaW5kQXR0cmlidXRlVHlwZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgICAgICBjYXNlICdVJzogLy8gZGlzdGluZ3Vpc2ggcXVhbGlmaWVkL3VucXVhbGlmaWVkIFRCRAotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5nZXRDb250ZW50VHlwZSgpIDwgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFydC5zdWJzdHJpbmcob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzdWJUeXBlc1tqXS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmICFmaWVsZC5pc0F0dHJpYnV0ZSgpICYmIGZpZWxkLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2FzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IGZpbmRFbGVtZW50KFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnUSc6IC8vIGRpc3Rpbmd1aXNoIHF1YWxpZmllZC91bnF1YWxpZmllZCBUQkQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFydC5zdWJzdHJpbmcob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzdWJUeXBlc1tqXS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmlzQXR0cmlidXRlKCkgJiYgZmllbGQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBjYXNlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyID0gZmluZEF0dHJpYnV0ZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGF0dHIuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBzdWJUeXBlcyA9IGN1clR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJUeXBlcy5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gSW50ZWdlci5wYXJzZUludChwYXJ0LnN1YnN0cmluZyhvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCA8PSBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1clR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjVjZDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhCZWFuRGVidWc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVMb2FkZXJJbXBsIGV4dGVuZHMgU2NoZW1hVHlwZUxvYWRlckJhc2UKLXsKLSAgICBwcml2YXRlIFJlc291cmNlTG9hZGVyIF9yZXNvdXJjZUxvYWRlcjsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIF9jbGFzc0xvYWRlcjsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXJbXSBfc2VhcmNoUGF0aDsKLQotICAgIHByaXZhdGUgTWFwIF9jbGFzc3BhdGhUeXBlU3lzdGVtczsKLSAgICBwcml2YXRlIE1hcCBfY2xhc3NMb2FkZXJUeXBlU3lzdGVtczsKLSAgICBwcml2YXRlIE1hcCBfZWxlbWVudENhY2hlOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfbW9kZWxHcm91cENhY2hlOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVHcm91cENhY2hlOwotICAgIHByaXZhdGUgTWFwIF9pZENvbnN0cmFpbnRDYWNoZTsKLSAgICBwcml2YXRlIE1hcCBfdHlwZUNhY2hlOwotICAgIHByaXZhdGUgTWFwIF9kb2N1bWVudENhY2hlOwotICAgIHByaXZhdGUgTWFwIF9jbGFzc25hbWVDYWNoZTsKLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXJJbXBsIGJ1aWxkQ29udGV4dFR5cGVMb2FkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlTG9hZGVySW1wbChuZXcgU2NoZW1hVHlwZUxvYWRlcltdIHsgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCkgfSAsIG51bGwsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsIF90aHJlYWRUeXBlU3lzdGVtcyA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkgeyByZXR1cm4gbmV3IFdlYWtIYXNoTWFwKCk7IH0KLSAgICAgICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlckltcGwgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKQotICAgIHsKLSAgICAgICAgV2Vha0hhc2hNYXAgY2FuZGlkYXRlcyA9IChXZWFrSGFzaE1hcCkgX3RocmVhZFR5cGVTeXN0ZW1zLmdldCgpOwotICAgICAgICBDbGFzc0xvYWRlciB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBTY2hlbWFUeXBlTG9hZGVySW1wbCBjYW5kaWRhdGUgPSAoU2NoZW1hVHlwZUxvYWRlckltcGwpIGNhbmRpZGF0ZXMuZ2V0KCB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgKTsKLQotICAgICAgICBpZiAoY2FuZGlkYXRlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGJ1aWxkQ29udGV4dFR5cGVMb2FkZXIoKTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMucHV0KCB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIsIGNhbmRpZGF0ZSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYW5kaWRhdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlciBidWlsZChTY2hlbWFUeXBlTG9hZGVyW10gc2VhcmNoUGF0aCwgUmVzb3VyY2VMb2FkZXIgcmVzb3VyY2VMb2FkZXIsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAgIHsKLSAgICAgICAgaWYgKHNlYXJjaFBhdGggPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc2VhcmNoUGF0aCA9IEVNUFRZX1NDSEVNQVRZUEVMT0FERVJfQVJSQVk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhc3NlbWJsZSBhIGZsYXR0ZW5lZCBzZWFyY2ggcGF0aCB3aXRoIG5vIGR1cGxpY2F0ZXMKLSAgICAgICAgICAgIFN1YkxvYWRlckxpc3QgbGlzdCA9IG5ldyBTdWJMb2FkZXJMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlYXJjaFBhdGhbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VhcmNoUGF0aFsiICsgaSArICJdIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICBpZiAoIShzZWFyY2hQYXRoW2ldIGluc3RhbmNlb2YgU2NoZW1hVHlwZUxvYWRlckltcGwpKQotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzZWFyY2hQYXRoW2ldKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlTG9hZGVySW1wbCBzdWIgPSAoU2NoZW1hVHlwZUxvYWRlckltcGwpc2VhcmNoUGF0aFtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yi5fY2xhc3NMb2FkZXIgIT0gbnVsbCB8fCBzdWIuX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzdWIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGZvciAoaW50IGogPSAwOyBqIDwgc3ViLl9zZWFyY2hQYXRoLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoc3ViLl9zZWFyY2hQYXRoW2pdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZWFyY2hQYXRoID0gbGlzdC50b0FycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VhcmNoUGF0aC5sZW5ndGggPT0gMSAmJiByZXNvdXJjZUxvYWRlciA9PSBudWxsICYmIGNsYXNzTG9hZGVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc2VhcmNoUGF0aFswXTsKLQotICAgICAgICByZXR1cm4gbmV3IFNjaGVtYVR5cGVMb2FkZXJJbXBsKHNlYXJjaFBhdGgsIHJlc291cmNlTG9hZGVyLCBjbGFzc0xvYWRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSnVzdCB1c2VkIHRvIGF2b2lkIGR1cGxpY2F0ZSBwYXRoIGVudHJpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdWJMb2FkZXJMaXN0Ci0gICAgewotICAgICAgICBwcml2YXRlIExpc3QgdGhlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBNYXAgc2VlbiA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2Vlbi5jb250YWluc0tleShsb2FkZXIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHRoZUxpc3QuYWRkKGxvYWRlcik7Ci0gICAgICAgICAgICBzZWVuLnB1dChsb2FkZXIsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXJbXSB0b0FycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlTG9hZGVyW10pdGhlTGlzdC50b0FycmF5KEVNUFRZX1NDSEVNQVRZUEVMT0FERVJfQVJSQVkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFNjaGVtYVR5cGVMb2FkZXJJbXBsIHRoYXQgc2VhcmNoZXMgZm9yIG9iamVjdHMKLSAgICAgKiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICAgICAqCi0gICAgICogKDEpIEZpcnN0IG9uIHRoZSBzZWFyY2hQYXRoIG9mIG90aGVyIFNjaGVtYVR5cGVTeXN0ZW1zIHN1cHBsaWVkLAotICAgICAqICAgICBpbiBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZC4KLSAgICAgKiAoMikgTmV4dCBvbiB0aGUgY2xhc3NwYXRoIG9mIC5qYXIgZmlsZXMgb3IgZGlyZWN0b3JpZXMgc3VwcGxpZWQsCi0gICAgICogICAgIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZC4gV2hlbiB0eXBlcyBhcmUgcmV0dXJuZWQgaW4KLSAgICAgKiAgICAgdGhpcyB3YXksIHRoZXkgYXJlIGluc3RhbnRpYXRlZCBmcm9tIGEgcHJpdmF0ZSB0eXBlc3lzdGVtLgotICAgICAqICAgICBJbiBvdGhlciB3b3JkcywgaWYgYSB0eXBlIGlzIGxvYWRlZCBmcm9tIGFub3RoZXIgU2NoZW1hVHlwZUxvYWRlckltcGwKLSAgICAgKiAgICAgdGhhdCB3YXMgaW5pdGlhbGl6ZWQgb24gdGhlIHNhbWUgZmlsZSwgdGhlIGluc3RhbmNlIG9mIHRoZSB0eXBlIHdpbGwKLSAgICAgKiAgICAgYmUgZGlmZmVyZW50LgotICAgICAqICgzKSBGaW5hbGx5IG9uIHRoZSBjbGFzc2xvYWRlciBzdXBwbGllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXJJbXBsKFNjaGVtYVR5cGVMb2FkZXJbXSBzZWFyY2hQYXRoLCBSZXNvdXJjZUxvYWRlciByZXNvdXJjZUxvYWRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gICAgewotICAgICAgICBpZiAoc2VhcmNoUGF0aCA9PSBudWxsKQotICAgICAgICAgICAgX3NlYXJjaFBhdGggPSBFTVBUWV9TQ0hFTUFUWVBFTE9BREVSX0FSUkFZOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfc2VhcmNoUGF0aCA9IHNlYXJjaFBhdGg7Ci0gICAgICAgIF9yZXNvdXJjZUxvYWRlciA9IHJlc291cmNlTG9hZGVyOwotICAgICAgICBfY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLQotICAgICAgICBpbml0Q2FjaGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNhY2hlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdENhY2hlcygpCi0gICAgewotICAgICAgICBfY2xhc3NwYXRoVHlwZVN5c3RlbXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9jbGFzc0xvYWRlclR5cGVTeXN0ZW1zID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfZWxlbWVudENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfYXR0cmlidXRlQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9tb2RlbEdyb3VwQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9hdHRyaWJ1dGVHcm91cENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfaWRDb25zdHJhaW50Q2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF90eXBlQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9kb2N1bWVudENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICBfY2xhc3NuYW1lQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgdHlwZVN5c3RlbUZvckNvbXBvbmVudChTdHJpbmcgc2VhcmNoZGlyLCBRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHNlYXJjaGZvciA9IHNlYXJjaGRpciArIFFOYW1lSGVscGVyLmhleHNhZmVkaXIobmFtZSkgKyAiLnhzYiI7Ci0gICAgICAgIFN0cmluZyB0c25hbWUgPSBudWxsOwotCi0gICAgICAgIGlmIChfcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHRzbmFtZSA9IGNyYWNrRW50cnkoX3Jlc291cmNlTG9hZGVyLCBzZWFyY2hmb3IpOwotCi0gICAgICAgIGlmIChfY2xhc3NMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHRzbmFtZSA9IGNyYWNrRW50cnkoX2NsYXNzTG9hZGVyLCBzZWFyY2hmb3IpOwotCi0gICAgICAgIGlmICh0c25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbUltcGwpdHlwZVN5c3RlbUZvck5hbWUodHNuYW1lKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtRm9yTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSByZXN1bHQgPSBnZXRUeXBlU3lzdGVtT25DbGFzc3BhdGgobmFtZSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfY2xhc3NMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSByZXN1bHQgPSBnZXRUeXBlU3lzdGVtT25DbGFzc2xvYWRlcihuYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHR5cGVTeXN0ZW1Gb3JDbGFzc25hbWUoU3RyaW5nIHNlYXJjaGRpciwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgc2VhcmNoZm9yID0gc2VhcmNoZGlyICsgbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIueHNiIjsKLQotICAgICAgICBpZiAoX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0c25hbWUgPSBjcmFja0VudHJ5KF9yZXNvdXJjZUxvYWRlciwgc2VhcmNoZm9yKTsKLSAgICAgICAgICAgIGlmICh0c25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZVN5c3RlbU9uQ2xhc3NwYXRoKHRzbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2NsYXNzTG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0c25hbWUgPSBjcmFja0VudHJ5KF9jbGFzc0xvYWRlciwgc2VhcmNoZm9yKTsKLSAgICAgICAgICAgIGlmICh0c25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZVN5c3RlbU9uQ2xhc3Nsb2FkZXIodHNuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGdldFR5cGVTeXN0ZW1PbkNsYXNzcGF0aChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlU3lzdGVtSW1wbClfY2xhc3NwYXRoVHlwZVN5c3RlbXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlU3lzdGVtSW1wbChfcmVzb3VyY2VMb2FkZXIsIG5hbWUsIHRoaXMpOwotICAgICAgICAgICAgX2NsYXNzcGF0aFR5cGVTeXN0ZW1zLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgZ2V0VHlwZVN5c3RlbU9uQ2xhc3Nsb2FkZXIoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJGaW5kaW5nIHR5cGUgc3lzdGVtICIgKyBuYW1lICsgIiBvbiBjbGFzc2xvYWRlciIsIDApOwotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZVN5c3RlbUltcGwpX2NsYXNzTG9hZGVyVHlwZVN5c3RlbXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlR5cGUgc3lzdGVtICIgKyBuYW1lICsgIiBub3QgY2FjaGVkIC0gY29uc3VsdGluZyBmaWVsZCIsIDApOwotICAgICAgICAgICAgcmVzdWx0ID0gU2NoZW1hVHlwZVN5c3RlbUltcGwuZm9yTmFtZShuYW1lLCBfY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgX2NsYXNzTG9hZGVyVHlwZVN5c3RlbXMucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNyYWNrRW50cnkoUmVzb3VyY2VMb2FkZXIgbG9hZGVyLCBTdHJpbmcgc2VhcmNoZm9yKQotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShzZWFyY2hmb3IpOwotICAgICAgICBpZiAoaXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gY3JhY2tQb2ludGVyKGlzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNyYWNrRW50cnkoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgc2VhcmNoZm9yKQotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oc2VhcmNoZm9yKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBjcmFja1BvaW50ZXIoc3RyZWFtKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNyYWNrUG9pbnRlcihJbnB1dFN0cmVhbSBzdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuY3JhY2tQb2ludGVyKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VEZWZpbmVkKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgaWYgKF9zZWFyY2hQYXRoW2ldLmlzTmFtZXNwYWNlRGVmaW5lZChuYW1lc3BhY2UpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAKLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvbmFtZXNwYWNlLyIsIG5ldyBRTmFtZShuYW1lc3BhY2UsICJ4bWxucyIpKTsKLSAgICAgICAgcmV0dXJuIChzdHMgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZXN1bHQgPSAoU2NoZW1hVHlwZS5SZWYpX3R5cGVDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX3R5cGVDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZFR5cGVSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL3R5cGUvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kVHlwZVJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3R5cGVDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkKLSAgICB7Ci0gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQotICAgICAgICBTY2hlbWFUeXBlIHJlc3VsdCA9IChTY2hlbWFUeXBlKV9jbGFzc25hbWVDYWNoZS5nZXQoY2xhc3NuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfY2xhc3NuYW1lQ2FjaGUuY29udGFpbnNLZXkoY2xhc3NuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0udHlwZUZvckNsYXNzbmFtZShjbGFzc25hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDbGFzc25hbWUoInNjaGVtYS9qYXZhbmFtZS8iLCBjbGFzc25hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMudHlwZUZvckNsYXNzbmFtZShjbGFzc25hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgdHlwZSAiICsgY2xhc3NuYW1lICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfY2xhc3NuYW1lQ2FjaGUucHV0KGNsYXNzbmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kRG9jdW1lbnRUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZXN1bHQgPSAoU2NoZW1hVHlwZS5SZWYpX2RvY3VtZW50Q2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9kb2N1bWVudENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kRG9jdW1lbnRUeXBlUmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9lbGVtZW50LyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZERvY3VtZW50VHlwZVJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IGNvbnRhaW4gZG9jdW1lbnQgdHlwZSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2RvY3VtZW50Q2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZEF0dHJpYnV0ZVR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlc3VsdCA9IChTY2hlbWFUeXBlLlJlZilfYXR0cmlidXRlQ2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9hdHRyaWJ1dGVDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZEF0dHJpYnV0ZVR5cGVSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2F0dHJpYnV0ZS8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRBdHRyaWJ1dGVUeXBlUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCBjb250YWluIGF0dHJpYnV0ZSB0eXBlIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfYXR0cmlidXRlQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZmluZEVsZW1lbnRSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilfZWxlbWVudENhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfZWxlbWVudENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kRWxlbWVudFJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvZWxlbWVudC8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRFbGVtZW50UmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgZWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZWxlbWVudENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiByZXN1bHQgPSAoU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZilfYXR0cmlidXRlQ2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9hdHRyaWJ1dGVDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZEF0dHJpYnV0ZVJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvYXR0cmlidXRlLyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZEF0dHJpYnV0ZVJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGF0dHJpYnV0ZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfYXR0cmlidXRlQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZmluZE1vZGVsR3JvdXBSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXAuUmVmIHJlc3VsdCA9IChTY2hlbWFNb2RlbEdyb3VwLlJlZilfbW9kZWxHcm91cENhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfbW9kZWxHcm91cENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kTW9kZWxHcm91cFJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvbW9kZWxncm91cC8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRNb2RlbEdyb3VwUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgbW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX21vZGVsR3JvdXBDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZilfYXR0cmlidXRlR3JvdXBDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2F0dHJpYnV0ZUdyb3VwQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRBdHRyaWJ1dGVHcm91cFJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvYXR0cmlidXRlZ3JvdXAvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kQXR0cmlidXRlR3JvdXBSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2F0dHJpYnV0ZUdyb3VwQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBmaW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIHJlc3VsdCA9IChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKV9pZENvbnN0cmFpbnRDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2lkQ29uc3RyYWludENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9pZGVudGl0eWNvbnN0cmFpbnQvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgaWRlbnRpdHkgY29uc3RyYWludCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfaWRDb25zdHJhaW50Q2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmICghc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgICAgICBzb3VyY2VOYW1lID0gIi8iICsgc291cmNlTmFtZTsKLQotICAgICAgICBpZiAoX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBfcmVzb3VyY2VMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic2NoZW1hL3NyYyIgKyBzb3VyY2VOYW1lKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgX2NsYXNzTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2NsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oInNjaGVtYS9zcmMiICsgc291cmNlTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlTG9hZGVyW10gRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlTG9hZGVyWzBdOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwYTg0My4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgY29tLmJlYS54MjAwMi54MDkueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKLWltcG9ydCBjb20uYmVhLngyMDAyLngwOS54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbmZpZy5TY2hlbWFDb25maWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVTeXN0ZW1Db21waWxlcgotewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVycwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFbXSBzY2hlbWFzOwotICAgICAgICBwcml2YXRlIENvbmZpZ1tdIGNvbmZpZ3M7Ci0gICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlciBsaW5rVG87Ci0gICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyBvcHRpb25zOwotICAgICAgICBwcml2YXRlIENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lcjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGphdmFpemU7Ci0gICAgICAgIHByaXZhdGUgVVJJIGJhc2VVUkk7Ci0gICAgICAgIHByaXZhdGUgTWFwIHNvdXJjZXNUb0NvcHlNYXA7Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYURvY3VtZW50LlNjaGVtYVtdIGdldFNjaGVtYXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2NoZW1hczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYXMoU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2NoZW1hcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb25maWdEb2N1bWVudC5Db25maWdbXSBnZXRDb25maWdzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdzKENvbmZpZ0RvY3VtZW50LkNvbmZpZ1tdIGNvbmZpZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlncyA9IGNvbmZpZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRMaW5rVG8oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGlua1RvOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TGlua1RvKFNjaGVtYVR5cGVMb2FkZXIgbGlua1RvKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpbmtUbyA9IGxpbmtUbzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBYbWxPcHRpb25zIGdldE9wdGlvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbnMoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlcnJvckxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXJyb3JMaXN0ZW5lciA9IGVycm9yTGlzdGVuZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0phdmFpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YWl6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEphdmFpemUoYm9vbGVhbiBqYXZhaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmphdmFpemUgPSBqYXZhaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVSSSBnZXRCYXNlVVJJKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJhc2VVUkk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVVJJKFVSSSBiYXNlVVJJKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJhc2VVUkkgPSBiYXNlVVJJOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1hcCBnZXRTb3VyY2VzVG9Db3B5TWFwKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZXNUb0NvcHlNYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VzVG9Db3B5TWFwKE1hcCBzb3VyY2VzVG9Db3B5TWFwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZXNUb0NvcHlNYXAgPSBzb3VyY2VzVG9Db3B5TWFwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGNvbXBpbGUoUGFyYW1ldGVycyBwYXJhbXMpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGlsZUltcGwocGFyYW1zLmdldE5hbWUoKSwgcGFyYW1zLmdldFNjaGVtYXMoKSwgcGFyYW1zLmdldENvbmZpZ3MoKSwgcGFyYW1zLmdldExpbmtUbygpLCBwYXJhbXMuZ2V0T3B0aW9ucygpLCBwYXJhbXMuZ2V0RXJyb3JMaXN0ZW5lcigpLCBwYXJhbXMuaXNKYXZhaXplKCksIHBhcmFtcy5nZXRCYXNlVVJJKCksIHBhcmFtcy5nZXRTb3VyY2VzVG9Db3B5TWFwKCkpOwotICAgIH0KLSAgICAKLSAgICAvKiBwYWNrYWdlISEhICovIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbCBjb21waWxlSW1wbCgKLSAgICAgICAgU3RyaW5nIG5hbWUsIFNjaGVtYVtdIHNjaGVtYXMsIENvbmZpZ1tdIGNvbmZpZ3MsCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbGlua1RvLCBYbWxPcHRpb25zIG9wdGlvbnMsIENvbGxlY3Rpb24gb3V0c2lkZUVycm9ycywgYm9vbGVhbiBqYXZhaXplLCBVUkkgYmFzZVVSSSwgTWFwIHNvdXJjZXNUb0NvcHlNYXApCi0gICAgewotICAgICAgICBpZiAobGlua1RvID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHN1cHBseSBsaW5rVG8iKTsKLQotICAgICAgICBYbWxFcnJvcldhdGNoZXIgZXJyb3JXYXRjaGVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcihvdXRzaWRlRXJyb3JzKTsKLQotICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIHN0YXRlCi0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5zdGFydCgpOwotICAgICAgICBib29sZWFuIHZhbGlkYXRlID0gKG9wdGlvbnMgPT0gbnVsbCB8fCAhb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX05PX1ZBTElEQVRJT04pKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLnNldEVycm9yTGlzdGVuZXIoZXJyb3JXYXRjaGVyKTsKLSAgICAgICAgICAgIHN0YXRlLnNldFNjaGVtYUNvbmZpZyhTY2hlbWFDb25maWcuZm9yQ29uZmlnRG9jdW1lbnRzKGNvbmZpZ3MpKTsKLSAgICAgICAgICAgIHN0YXRlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRHaXZlblR5cGVTeXN0ZW1OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKGJhc2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zZXRCYXNlVXJpKGJhc2VVUkkpOwotCi0gICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGNsYXNzcGF0aCAoeW91IGFsd2F5cyBnZXQgdGhlIGJ1aWx0aW4gdHlwZXMpCi0gICAgICAgICAgICBsaW5rVG8gPSBTY2hlbWFUeXBlTG9hZGVySW1wbC5idWlsZChuZXcgU2NoZW1hVHlwZUxvYWRlcltdIHsgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCksIGxpbmtUbyB9LCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIHN0YXRlLnNldEltcG9ydGluZ1R5cGVMb2FkZXIobGlua1RvKTsKLQotICAgICAgICAgICAgTGlzdCB2YWxpZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KHNjaGVtYXMubGVuZ3RoKTsKLQotICAgICAgICAgICAgLy8gbG9hZCBhbGwgdGhlIHhzZCBmaWxlcyBpbnRvIGl0Ci0gICAgICAgICAgICBpZiAodmFsaWRhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYXNbaV0udmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9yV2F0Y2hlcikpKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRTY2hlbWFzLmFkZChzY2hlbWFzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRTY2hlbWFzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNjaGVtYXMpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2NoZW1hW10gc3RhcnRXaXRoID0gKFNjaGVtYVtdKXZhbGlkU2NoZW1hcy50b0FycmF5KG5ldyBTY2hlbWFbdmFsaWRTY2hlbWFzLnNpemUoKV0pOwotCi0gICAgICAgICAgICAvLyBkZWFsIHdpdGggaW1wb3J0cyBhbmQgaW5jbHVkZXMKLSAgICAgICAgICAgIFN0c2NJbXBvcnRlci5TY2hlbWFUb1Byb2Nlc3NbXSBzY2hlbWFzQW5kQ2hhbWVsZW9ucyA9IFN0c2NJbXBvcnRlci5yZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKHN0YXJ0V2l0aCk7Ci0KLSAgICAgICAgICAgIC8vIGNhbGwgdGhlIHRyYW5zbGF0b3Igc28gdGhhdCBpdCBtYXkgYWxzbyBwZXJmb3JtIG1hZ2ljCi0gICAgICAgICAgICBTdHNjVHJhbnNsYXRvci5hZGRBbGxEZWZpbml0aW9ucyhzY2hlbWFzQW5kQ2hhbWVsZW9ucyk7Ci0KLSAgICAgICAgICAgIC8vIGNhbGwgdGhlIHJlc29sdmVyIHRvIGRvIGl0cyBtYWdpYwotICAgICAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVBbGwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY2FsbCB0aGUgY2hlY2tlciB0byBjaGVjayBib3RoIHJlc3RyaWN0aW9ucyBhbmQgZGVmYXVsdHMKLSAgICAgICAgICAgIFN0c2NDaGVja2VyLmNoZWNrQWxsKCk7Ci0KLSAgICAgICAgICAgIC8vIGNhbGwgdGhlIGphdmFpemVyIHRvIGRvIGl0cyBtYWdpYwotICAgICAgICAgICAgU3RzY0phdmFpemVyLmphdmFpemVBbGxUeXBlcyhqYXZhaXplKTsKLQotICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBsb2FkZXIgb3V0IG9mIHRoZSBzdGF0ZQotICAgICAgICAgICAgc3RhdGUuZ2V0KCkuc3RzKCkubG9hZEZyb21TdHNjU3RhdGUoc3RhdGUpOwotCi0gICAgICAgICAgICAvLyBmaWxsIGluIHRoZSBzb3VyY2UtY29weSBtYXAKLSAgICAgICAgICAgIGlmIChzb3VyY2VzVG9Db3B5TWFwICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc291cmNlc1RvQ29weU1hcC5wdXRBbGwoc3RhdGUuc291cmNlQ29weU1hcCgpKTsKLQotICAgICAgICAgICAgLy8gaWYgYW55IGVycm9ycywgcmV0dXJuIG51bGwKLSAgICAgICAgICAgIGlmIChlcnJvcldhdGNoZXIuaGFzRXJyb3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmdldCgpLnN0cygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ1NzIzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OYW1lVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWEJlYW5EZWJ1ZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbE9iamVjdEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNjaGVtYVdTRExBcnJheVR5cGU7Ci1pbXBvcnQgY29tLmJlYS54MjAwMi54MDkueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKLWltcG9ydCBjb20uYmVhLngyMDAyLngwOS54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkdyb3VwRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5BdHRyaWJ1dGVHcm91cERvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hVHlwZVN5c3RlbUltcGwgZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyQmFzZSBpbXBsZW1lbnRzIFNjaGVtYVR5cGVTeXN0ZW0KLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX0JBQkUgPSAweERBN0FCQUJFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSk9SX1ZFUlNJT04gPSAyOyAgLy8gbXVzdCBtYXRjaCA9PSB0byBiZSBjb21wYXRpYmxlCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfVkVSU0lPTiA9IDE4OyAvLyBtdXN0IGJlIDw9IHRvIGJlIGNvbXBhdGlibGUKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxFQVNFX05VTUJFUiA9IDA7IC8vIHNob3VsZCBiZSBjb21wYXRpYmxlIGV2ZW4gaWYgPCBvciA+Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFJTkRFWCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BVFlQRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BRUxFTUVOVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BSURFTlRJVFlDT05TVFJBSU5UID0gODsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9TS0lQUEFCTEUgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSVhFRCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX05JTExBQkxFID0gODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tFWFQgPSAxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tSRVNUID0gMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLU1VCU1QgPSA2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQUJTVFJBQ1QgPSAxMjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0ZJTkFMRVhUID0gMjU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTFJFU1QgPSA1MTI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSVNBVFRSID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFPUFRJT05BTCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFBUlJBWSA9IDg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9OT05FID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9HTE9CQUwgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0xPQ0FMQVRUUiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTE9DQUxFTFQgPSAzOwotCi0gICAgLy8gdHlwZSBmbGFncwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TSU1QTEVfVFlQRSAgICAgPSAweDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPQ1VNRU5UX1RZUEUgICA9IDB4MjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJFRCAgICAgICAgID0gMHg0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CT1VOREVEICAgICAgICAgPSAweDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTklURSAgICAgICAgICA9IDB4MTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX05VTUVSSUMgICAgICAgICA9IDB4MjA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1NUUklOR0VOVU0gICAgICA9IDB4NDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1VOSU9OX09GX0xJU1RTICA9IDB4ODA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU19QQVRURVJOICAgICA9IDB4MTAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PUkRFUl9TRU5TSVRJVkUgPSAweDIwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfVE9UQUxfT1JERVIgICAgID0gMHg0MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0NPTVBJTEVEICAgICAgICA9IDB4ODAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19FWFQgICAgICAgPSAweDEwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0JMT0NLX1JFU1QgICAgICA9IDB4MjAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfRVhUICAgICAgID0gMHg0MDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9SRVNUICAgICAgPSAweDgwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX1VOSU9OICAgICA9IDB4MTAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0xJU1QgICAgICA9IDB4MjAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0FCU1RSQUNUICAgICAgICA9IDB4NDAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0FUVFJJQlVURV9UWVBFICA9IDB4ODAwMDA7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lVG9QYXRoU3RyaW5nKFN0cmluZyBuYW1lRm9yU3lzdGVtKQotICAgIHsKLSAgICAgICAgbmFtZUZvclN5c3RlbSA9IG5hbWVGb3JTeXN0ZW0ucmVwbGFjZSgnLicsICcvJyk7Ci0KLSAgICAgICAgaWYgKCFuYW1lRm9yU3lzdGVtLmVuZHNXaXRoKCIvIikgJiYgbmFtZUZvclN5c3RlbS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBuYW1lRm9yU3lzdGVtID0gbmFtZUZvclN5c3RlbSArICIvIjsKLQotICAgICAgICByZXR1cm4gbmFtZUZvclN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbUltcGwoQ2xhc3MgaW5kZXhjbGFzcykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBmdWxsbmFtZSA9IGluZGV4Y2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBfbmFtZSA9IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBmdWxsbmFtZS5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiTG9hZGluZyB0eXBlIHN5c3RlbSAiICsgX25hbWUsIDEpOwotICAgICAgICBfYmFzZVBhY2thZ2UgPSBuYW1lVG9QYXRoU3RyaW5nKF9uYW1lKTsKLSAgICAgICAgX2NsYXNzbG9hZGVyID0gaW5kZXhjbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBfbGlua2VyID0gU2NoZW1hVHlwZUxvYWRlckltcGwuYnVpbGQobnVsbCwgbnVsbCwgX2NsYXNzbG9hZGVyKTsKLSAgICAgICAgX3Jlc291cmNlTG9hZGVyID0gbmV3IENsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIoX2NsYXNzbG9hZGVyKTsKLSAgICAgICAgaW5pdEZyb21IZWFkZXIoKTsKLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiRmluaXNoZWQgbG9hZGluZyB0eXBlIHN5c3RlbSAiICsgX25hbWUsIC0xKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFbXSBFTVBUWV9TQ0hFTUFfQVJSQVkgPSBuZXcgU2NoZW1hWzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZ1tdIEVNUFRZX0NPTkZJR19BUlJBWSA9IG5ldyBDb25maWdbMF07Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGZvclNjaGVtYVhtbCgKLSAgICAgICAgWG1sT2JqZWN0W10gaW5wdXQsIFNjaGVtYVR5cGVMb2FkZXIgbGlua1RvLCBYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbChvcHRpb25zKTsKLSAgICAgICAgQXJyYXlMaXN0IHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEFycmF5TGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnB1dFtpXSBpbnN0YW5jZW9mIFNjaGVtYSkKLSAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZChpbnB1dFtpXSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChpbnB1dFtpXSBpbnN0YW5jZW9mIFNjaGVtYURvY3VtZW50ICYmICgoU2NoZW1hRG9jdW1lbnQpaW5wdXRbaV0pLmdldFNjaGVtYSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2NoZW1hcy5hZGQoKChTY2hlbWFEb2N1bWVudClpbnB1dFtpXSkuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRbaV0gaW5zdGFuY2VvZiBDb25maWcpCi0gICAgICAgICAgICAgICAgY29uZmlncy5hZGQoaW5wdXRbaV0pOwotICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRbaV0gaW5zdGFuY2VvZiBDb25maWdEb2N1bWVudCAmJiAoKENvbmZpZ0RvY3VtZW50KWlucHV0W2ldKS5nZXRDb25maWcoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbmZpZ3MuYWRkKCgoQ29uZmlnRG9jdW1lbnQpaW5wdXRbaV0pLmdldENvbmZpZygpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCJUaHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgICI6IFRoZSAiICsgaSArICJ0aCBzdXBwbGllZCBpbnB1dCBpcyBub3QgYSBzY2hlbWEgb3IgYSBjb25maWcgZG9jdW1lbnQ6IGl0cyB0eXBlIGlzICIgKyBpbnB1dFtpXS5zY2hlbWFUeXBlKCkpOwotICAgICAgICB9Ci0KLQotCi0gICAgICAgIENvbGxlY3Rpb24gdXNlckVycm9ycyA9IChDb2xsZWN0aW9uKW9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuRVJST1JfTElTVEVORVIpOwotICAgICAgICBYbWxFcnJvcldhdGNoZXIgZXJyb3JXYXRjaGVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcih1c2VyRXJyb3JzKTsKLQotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCBzdHNpID0KLSAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5jb21waWxlSW1wbCgKLSAgICAgICAgICAgICAgICBudWxsLCAoU2NoZW1hW10pc2NoZW1hcy50b0FycmF5KEVNUFRZX1NDSEVNQV9BUlJBWSksCi0gICAgICAgICAgICAgICAgKENvbmZpZ1tdKWNvbmZpZ3MudG9BcnJheShFTVBUWV9DT05GSUdfQVJSQVkpLCBsaW5rVG8sIG9wdGlvbnMsIGVycm9yV2F0Y2hlciwgZmFsc2UsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGlmIChlcnJvcldhdGNoZXIuaGFzRXJyb3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbihlcnJvcldhdGNoZXIuZmlyc3RFcnJvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHNpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlQ29udGFpbnNUeXBlU3lzdGVtKEZpbGUgZmlsZSwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgaW5kZXhuYW1lID0gbmFtZVRvUGF0aFN0cmluZyhuYW1lKSArICJpbmRleC54c2IiOwotCi0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAobmV3IEZpbGUoZmlsZSwgaW5kZXhuYW1lKSkuaXNGaWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBaaXBGaWxlIHppcGZpbGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgemlwZmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gemlwZmlsZS5nZXRFbnRyeShpbmRleG5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAoZW50cnkgIT0gbnVsbCAmJiAhZW50cnkuaXNEaXJlY3RvcnkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLmxvZygiUHJvYmxlbSBsb2FkaW5nIFNjaGVtYVR5cGVTeXN0ZW0sIHppcGZpbGVuYW1lICIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgbmFtZSwgImluZGV4IiwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7IHppcGZpbGUuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgZm9yTmFtZShTdHJpbmcgbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKG5hbWUgKyAiLiIgKyBTY2hlbWFUeXBlQ29kZVByaW50ZXIuSU5ERVhfQ0xBU1NOQU1FLCB0cnVlLCBsb2FkZXIpOwotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlU3lzdGVtSW1wbCljLmdldEZpZWxkKCJ0eXBlU3lzdGVtIikuZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbUltcGwoUmVzb3VyY2VMb2FkZXIgcmVzb3VyY2VMb2FkZXIsIFN0cmluZyBuYW1lLCBTY2hlbWFUeXBlTG9hZGVyIGxpbmtlcikKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgX2Jhc2VQYWNrYWdlID0gbmFtZVRvUGF0aFN0cmluZyhfbmFtZSk7Ci0gICAgICAgIF9saW5rZXIgPSBsaW5rZXI7Ci0gICAgICAgIF9yZXNvdXJjZUxvYWRlciA9IHJlc291cmNlTG9hZGVyOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdEZyb21IZWFkZXIoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBYQmVhbkRlYnVnLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhCZWFuRGVidWcubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0RnJvbUhlYWRlcigpCi0gICAgewotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZWFkaW5nIHVucmVzb2x2ZWQgaGFuZGxlcyBmb3IgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAwKTsKLSAgICAgICAgWHNiUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlLCB3aGljaCBzdGFydHMgd2l0aCBhIGhlYWRlci4KLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBYc2JSZWFkZXIoImluZGV4IiwgRklMRVRZUEVfU0NIRU1BSU5ERVgpOwotCi0gICAgICAgICAgICAvLyBoYXMgYSBoYW5kbGUgcG9vbCAoY291bnQsIGhhbmRsZS90eXBlLCBoYW5kbGUvdHlwZS4uLikKLSAgICAgICAgICAgIF9sb2NhbEhhbmRsZXMgPSBuZXcgSGFuZGxlUG9vbCgpOwotICAgICAgICAgICAgcmVhZGVyLnJlYWRIYW5kbGVQb29sKF9sb2NhbEhhbmRsZXMpOwotCi0gICAgICAgICAgICAvLyB0aGVuIGEgcW5hbWUgbWFwIG9mIGdsb2JhbCBlbGVtZW50cyAoY291bnQsIHFuYW1lL2hhbmRsZSwgcW5hbWUvaGFuZGxlLi4uKQotICAgICAgICAgICAgX2dsb2JhbEVsZW1lbnRzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIF9nbG9iYWxBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgbW9kZWwgZ3JvdXBzCi0gICAgICAgICAgICBfbW9kZWxHcm91cHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBhdHRyaWJ1dGUgZ3JvdXBzCi0gICAgICAgICAgICBfYXR0cmlidXRlR3JvdXBzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICBfaWRlbnRpdHlDb25zdHJhaW50cyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCB0eXBlcwotICAgICAgICAgICAgX2dsb2JhbFR5cGVzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZG9jdW1lbnQgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGVsZW1lbnQKLSAgICAgICAgICAgIF9kb2N1bWVudFR5cGVzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXBlIG9mIGF0dHJpYnV0ZSB0eXBlcywgYnkgdGhlIHFuYW1lIG9mIHRoZSBjb250YWluZWQgYXR0cmlidXRlCi0gICAgICAgICAgICBfYXR0cmlidXRlVHlwZXMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHN0cmluZyBtYXAgb2YgYWxsIHR5cGVzLCBieSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lCi0gICAgICAgICAgICBfdHlwZVJlZnNCeUNsYXNzbmFtZSA9IHJlYWRlci5yZWFkQ2xhc3NuYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gcmVhZGVyLnJlYWROYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIHJlZGVmaW5lLCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCi0gICAgICAgICAgICBpZiAocmVhZGVyLmF0TGVhc3QoMiwgMTUsIDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9yZWRlZmluZWRHbG9iYWxUeXBlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLSAgICAgICAgICAgICAgICBfcmVkZWZpbmVkTW9kZWxHcm91cHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0gICAgICAgICAgICAgICAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWFkZXIucmVhZEVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlSW5kZXgoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9ICJpbmRleCI7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVJbmRleERhdGEoKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BSU5ERVgpOwotICAgICAgICBzYXZlci53cml0ZUluZGV4RGF0YSgpOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHZvaWQgc2F2ZVBvaW50ZXJzKCkKLSAgICB7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoZ2xvYmFsRWxlbWVudHMoKSwgInNjaGVtYS9lbGVtZW50LyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKGdsb2JhbEF0dHJpYnV0ZXMoKSwgInNjaGVtYS9hdHRyaWJ1dGUvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMobW9kZWxHcm91cHMoKSwgInNjaGVtYS9tb2RlbGdyb3VwLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKGF0dHJpYnV0ZUdyb3VwcygpLCAic2NoZW1hL2F0dHJpYnV0ZWdyb3VwLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKGdsb2JhbFR5cGVzKCksICJzY2hlbWEvdHlwZS8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhpZGVudGl0eUNvbnN0cmFpbnRzKCksICJzY2hlbWEvaWRlbnRpdHljb25zdHJhaW50LyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JOYW1lc3BhY2VzKF9uYW1lc3BhY2VzLCAic2NoZW1hL25hbWVzcGFjZS8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ2xhc3NuYW1lcyhfdHlwZVJlZnNCeUNsYXNzbmFtZS5rZXlTZXQoKSwgInNjaGVtYS9qYXZhbmFtZS8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhyZWRlZmluZWRNb2RlbEdyb3VwcygpLCAic2NoZW1hL3JlZGVmaW5lZG1vZGVsZ3JvdXAvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMocmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCksICJzY2hlbWEvcmVkZWZpbmVkYXR0cmlidXRlZ3JvdXAvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMocmVkZWZpbmVkR2xvYmFsVHlwZXMoKSwgInNjaGVtYS9yZWRlZmluZWR0eXBlLyIpOwotICAgIH0KLQotICAgIHZvaWQgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhTY2hlbWFDb21wb25lbnRbXSBjb21wb25lbnRzLCBTdHJpbmcgZGlyKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlUG9pbnRlckZpbGUoZGlyICsgUU5hbWVIZWxwZXIuaGV4c2FmZWRpcihjb21wb25lbnRzW2ldLmdldE5hbWUoKSksIF9uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2F2ZVBvaW50ZXJzRm9yQ2xhc3NuYW1lcyhTZXQgY2xhc3NuYW1lcywgU3RyaW5nIGRpcikKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsYXNzbmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBzYXZlUG9pbnRlckZpbGUoZGlyICsgY2xhc3NuYW1lLnJlcGxhY2UoJy4nLCAnLycpLCBfbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVQb2ludGVyc0Zvck5hbWVzcGFjZXMoU2V0IG5hbWVzcGFjZXMsIFN0cmluZyBkaXIpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBzYXZlUG9pbnRlckZpbGUoZGlyICsgUU5hbWVIZWxwZXIuaGV4c2FmZWRpcihuZXcgUU5hbWUobnMsICJ4bWxucyIpKSwgX25hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlUG9pbnRlckZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoZmlsZW5hbWUpOwotICAgICAgICBzYXZlci53cml0ZVN0cmluZyhuYW1lKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGZpbGVuYW1lLCBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSKTsKLSAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT25seSB1c2VkIGluIHRoZSBub25ib290c3RyYXBwZWQgY2FzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoKQotICAgIHsKLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChhdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgLy8gbm93IGZ1bGx5IGphdmFpemUgZXZlcnl0aGluZyBkZWVwbHkuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGdUeXBlID0gKFNjaGVtYVR5cGUpYWxsU2VlblR5cGVzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnVHlwZS5nZXRGdWxsSmF2YU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKSwgZ1R5cGUuZ2V0UmVmKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdUeXBlLmdldEFub255bW91c1R5cGVzKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGJ1aWxkVHlwZVJlZnNCeUNsYXNzbmFtZShNYXAgdHlwZXNCeUNsYXNzbmFtZSkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlc0J5Q2xhc3NuYW1lLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgcmVzdWx0LnB1dChjbGFzc05hbWUsICgoU2NoZW1hVHlwZSl0eXBlc0J5Q2xhc3NuYW1lLmdldChjbGFzc05hbWUpKS5nZXRSZWYoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRDb21wb25lbnRSZWZNYXAoU2NoZW1hQ29tcG9uZW50W10gY29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpLCBjb21wb25lbnRzW2ldLmdldENvbXBvbmVudFJlZigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGREb2N1bWVudE1hcChTY2hlbWFUeXBlW10gdHlwZXMpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQodHlwZXNbaV0uZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpLCB0eXBlc1tpXS5nZXRSZWYoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlVHlwZU1hcChTY2hlbWFUeXBlW10gdHlwZXMpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQodHlwZXNbaV0uZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKSwgdHlwZXNbaV0uZ2V0UmVmKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFJhbmRvbSBfcmFuZG9tOwotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBfbWFzayA9IG5ldyBieXRlWzEyOCAvIDhdOwotCi0gICAgLyoqCi0gICAgICogRnVuLCBmdW4uICBQcm9kdWNlIDEyOCBiaXRzIG9mIHVuaXF1ZW5lc3MgcmFuZG9tbHkuCi0gICAgICogV2UgdXNlZCB0byB1c2UgU2VjdXJlUmFuZG9tLCBidXQgbm93IHdlIGRvbid0IGJlY2F1c2UgU2VjdXJlUmFuZG9tCi0gICAgICogaGl0cyB0aGUgZmlsZXN5c3RlbSBhbmQgaGFuZ3MgdXMgb24gYSBmaWxlc3lzdGVtIGxvY2suICBJdCBhbHNvIGVhdHMKLSAgICAgKiBhIHRocmVhZCBhbmQgb3RoZXIgZXhwZW5zaXZlIHJlc291cmNlcy4uIDotKS4KLSAgICAgKgotICAgICAqIFdlIGRvbid0IHJlYWxseSBjYXJlIHRoYXQgbm9uLXNlY3VyZSBSYW5kb20oKSBjYW4gb25seSBkbyA0OCBiaXRzIG9mCi0gICAgICogcmFuZG9tbmVzcywgc2luY2Ugd2UncmUgY2VydGFpbmx5IG5vdCBnb2luZyB0byBiZSBjYWxsZWQgbW9yZSB0aGFuIDJeNDgKLSAgICAgKiB0aW1lcyB3aXRoaW4gb3VyIHByb2Nlc3MgbGlmZXRpbWUuCi0gICAgICoKLSAgICAgKiBPdXIgcmVhbCBjb25jZXJuIGlzIHRoYXQgYnkgc2VlZGluZyBSYW5kb20oKSB3aXRoIHRoZSBjdXJyZW50Ci0gICAgICogdGltZSwgdHdvIHVzZXJzIHdpbGwgZW5kIHVwIHdpdGggdGhlIHNhbWUgYml0cyBpZiB0aGV5IHN0YXJ0IGEKLSAgICAgKiBzY2hlbWEgY29tcGlsYXRpb24gd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kLiAgVGhhdCBtYWtlcyB0aGUKLSAgICAgKiBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb24gaW4gdGhlIHJlYWwgd29ybGQgc2xpZ2h0bHkgdG9vIGhpZ2guCi0gICAgICogV2UncmUgZ29pbmcgdG8gaGF2ZSBtaWxsaW9ucyBvZiB1c2VycywgcmVtZW1iZXI/ICBXaXRoIGEgbWlsbGlvbgotICAgICAqIHVzZXJzLCBhbmQgb25lLWNvbXBpbGF0aW9uLXBlci1kYXkgZWFjaCwgd2UnZCBzZWUgYSBjb2xsaXNpb24gZXZlcnkKLSAgICAgKiBmZXcgbW9udGhzLgotICAgICAqCi0gICAgICogU28gd2UnbGwganVzdCB4b3IgdGhlIHJlc3VsdHMgb2YgcmFuZG9tIHdpdGggb3VyIGZldyBleHRyYQotICAgICAqIGJpdHMgb2YgaW5mb3JtYXRpb24gY29tcHV0ZWQgYmVsb3cgdG8gaGVscCByZWR1Y2UgdGhlIHByb2JhYmlsaXR5Ci0gICAgICogb2YgY29sbGlzaW9uIGJ5IGEgZmV3IGRlY2ltYWwgcGxhY2VzLiAgVG8gY29sbGlkZSwgeW91IHdpbGwgaGF2ZSBoYWQKLSAgICAgKiB0byBoYXZlIHRoZSBzYW1lIGFtb3VudCBvZiBmcmVlIG1lbW9yeSwgdGhlIHNhbWUgdXNlciBuYW1lLCB0aW1lem9uZSwKLSAgICAgKiBhbmQgY291bnRyeSwgdGhlIHNhbWUgY3VycmVudCBkaXJlY3RvcnksIHRoZSBzYW1lIGphdmEgY2xhc3NwYXRoLAotICAgICAqIHRoZSBzYW1lIG9wZXJhdGluZyBzeXN0ZW0gYW5kIGp2bSB2ZXJzaW9uLCBhbmQgdGhlIHNhbWUgY2hvaWNlcyBvZgotICAgICAqIGlkZW50aXR5IGhhc2hjb2RlcyBmb3IgYSBmZXcgb2JqZWN0cy4gQW5kIGJlIHN0YXJ0ZWQgd2l0aGluIHRoZSBzYW1lCi0gICAgICogbWlsbGlzZWNvbmQuIE9yIHlvdSBjYW4gY29sbGlkZSBpZiB5b3UgaGF2ZSBhIGNvc21pYyAxMjgtYml0IG1hdGhlbWF0aWNhbAotICAgICAqIGNvaW5jaWRlbmNlLiBObyB3b3JyaWVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIG5leHRCeXRlcyhieXRlW10gcmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKF9yYW5kb20gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbSBkYW9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYmFvcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdCBsZWFzdCAxMCBiaXRzIG9mIHVucWlldWVuZXNzLCByaWdodD8gIE1heWJlIGV2ZW4gNTAgb3IgNjAuCi0gICAgICAgICAgICAgICAgZGFvcy53cml0ZUludChTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShTY2hlbWFUeXBlU3lzdGVtSW1wbC5jbGFzcykpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb3BzID0gbmV3IFN0cmluZ1tdIHsgInVzZXIubmFtZSIsICJ1c2VyLmRpciIsICJ1c2VyLnRpbWV6b25lIiwgInVzZXIuY291bnRyeSIsICJqYXZhLmNsYXNzLnBhdGgiLCAiamF2YS5ob21lIiwgImphdmEudmVuZG9yIiwgImphdmEudmVyc2lvbiIsICJvcy52ZXJzaW9uIiB9OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhb3Mud3JpdGVVVEYocHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYW9zLndyaXRlSW50KFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHByb3ApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkYW9zLndyaXRlTG9uZyhSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpOwotICAgICAgICAgICAgICAgIGRhb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBqID0gaSAlIF9tYXNrLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgX21hc2tbal0gKj0gMjE7Ci0gICAgICAgICAgICAgICAgICAgIF9tYXNrW2pdICs9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9yYW5kb20gPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgfQotICAgICAgICBfcmFuZG9tLm5leHRCeXRlcyhyZXN1bHQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGogPSBpICYgX21hc2subGVuZ3RoOwotICAgICAgICAgICAgcmVzdWx0W2ldIF49IF9tYXNrW2pdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsKFN0cmluZyBuYW1lRm9yU3lzdGVtKQotICAgIHsKLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBuYW1lLCBzZWxlY3QgYSByYW5kb20gb25lCi0gICAgICAgIGlmIChuYW1lRm9yU3lzdGVtID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGdldCAxMjggcmFuZG9tIGJpdHMgKHRoYXQnbGwgYmUgMzIgaGV4IGRpZ2l0cykKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEyOC84XTsKLSAgICAgICAgICAgIG5leHRCeXRlcyhieXRlcyk7Ci0gICAgICAgICAgICBuYW1lRm9yU3lzdGVtID0gInMiICsgbmV3IFN0cmluZyhIZXhCaW4uZW5jb2RlKGJ5dGVzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBfbmFtZSA9ICJzY2hlbWEuc3lzdGVtLiIgKyBuYW1lRm9yU3lzdGVtOwotICAgICAgICBfYmFzZVBhY2thZ2UgPSBuYW1lVG9QYXRoU3RyaW5nKF9uYW1lKTsKLSAgICAgICAgX2NsYXNzbG9hZGVyID0gbnVsbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRGcm9tQnVpbGRlcihTY2hlbWFHbG9iYWxFbGVtZW50W10gZ2xvYmFsRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGdsb2JhbEF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBhdHRyaWJ1dGVUeXBlcykKLSAgICB7Ci0gICAgICAgIGFzc2VydChfY2xhc3Nsb2FkZXIgPT0gbnVsbCk7Ci0gICAgICAgIF9sb2NhbEhhbmRsZXMgPSBuZXcgSGFuZGxlUG9vbCgpOwotICAgICAgICBfZ2xvYmFsRWxlbWVudHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChnbG9iYWxFbGVtZW50cyk7Ci0gICAgICAgIF9nbG9iYWxBdHRyaWJ1dGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoZ2xvYmFsQXR0cmlidXRlcyk7Ci0gICAgICAgIF9nbG9iYWxUeXBlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKGdsb2JhbFR5cGVzKTsKLSAgICAgICAgX2RvY3VtZW50VHlwZXMgPSBidWlsZERvY3VtZW50TWFwKGRvY3VtZW50VHlwZXMpOwotICAgICAgICBfYXR0cmlidXRlVHlwZXMgPSBidWlsZERvY3VtZW50TWFwKGF0dHJpYnV0ZVR5cGVzKTsKLSAgICAgICAgX3R5cGVSZWZzQnlDbGFzc25hbWUgPSBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoKTsKLSAgICAgICAgX25hbWVzcGFjZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRGcm9tU3RzY1N0YXRlKFN0c2NTdGF0ZSBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydChfY2xhc3Nsb2FkZXIgPT0gbnVsbCk7Ci0gICAgICAgIF9sb2NhbEhhbmRsZXMgPSBuZXcgSGFuZGxlUG9vbCgpOwotICAgICAgICBfZ2xvYmFsRWxlbWVudHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5nbG9iYWxFbGVtZW50cygpKTsKLSAgICAgICAgX2dsb2JhbEF0dHJpYnV0ZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5nbG9iYWxBdHRyaWJ1dGVzKCkpOwotICAgICAgICBfbW9kZWxHcm91cHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5tb2RlbEdyb3VwcygpKTsKLSAgICAgICAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUucmVkZWZpbmVkTW9kZWxHcm91cHMoKSk7Ci0gICAgICAgIF9hdHRyaWJ1dGVHcm91cHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5hdHRyaWJ1dGVHcm91cHMoKSk7Ci0gICAgICAgIF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKSk7Ci0gICAgICAgIF9nbG9iYWxUeXBlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmdsb2JhbFR5cGVzKCkpOwotICAgICAgICBfcmVkZWZpbmVkR2xvYmFsVHlwZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5yZWRlZmluZWRHbG9iYWxUeXBlcygpKTsKLSAgICAgICAgX2RvY3VtZW50VHlwZXMgPSBidWlsZERvY3VtZW50TWFwKHN0YXRlLmRvY3VtZW50VHlwZXMoKSk7Ci0gICAgICAgIF9hdHRyaWJ1dGVUeXBlcyA9IGJ1aWxkQXR0cmlidXRlVHlwZU1hcChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKTsKLSAgICAgICAgX3R5cGVSZWZzQnlDbGFzc25hbWUgPSBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoc3RhdGUudHlwZXNCeUNsYXNzbmFtZSgpKTsKLSAgICAgICAgX2lkZW50aXR5Q29uc3RyYWludHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5pZENvbnN0cmFpbnRzKCkpOwotICAgICAgICBfbmFtZXNwYWNlcyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3Qoc3RhdGUuZ2V0TmFtZXNwYWNlcygpKSk7Ci0gICAgfQotCi0gICAgZmluYWwgU2NoZW1hVHlwZVN5c3RlbUltcGwgZ2V0VHlwZVN5c3RlbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgU3RyaW5nUG9vbAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IGludHNUb1N0cmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByaXZhdGUgTWFwIHN0cmluZ3NUb0ludHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfaGFuZGxlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBTdHJpbmdQb29sIHRvIGJlIGZpbGxlZCB3aXRoIHN0cmluZ3MuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmdQb29sKFN0cmluZyBoYW5kbGUsIFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaGFuZGxlID0gaGFuZGxlOwotICAgICAgICAgICAgX25hbWUgPSBuYW1lOwotICAgICAgICAgICAgaW50c1RvU3RyaW5ncy5hZGQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY29kZUZvclN0cmluZyhTdHJpbmcgc3RyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKXN0cmluZ3NUb0ludHMuZ2V0KHN0cik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEludGVnZXIoaW50c1RvU3RyaW5ncy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGludHNUb1N0cmluZ3MuYWRkKHN0cik7Ci0gICAgICAgICAgICAgICAgc3RyaW5nc1RvSW50cy5wdXQoc3RyLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHN0cmluZ0ZvckNvZGUoaW50IGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZylpbnRzVG9TdHJpbmdzLmdldChjb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUbyhEYXRhT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGludHNUb1N0cmluZ3Muc2l6ZSgpID4gU2hvcnQuTUFYX1ZBTFVFKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJUb28gbWFueSBzdHJpbmdzICgiICsgaW50c1RvU3RyaW5ncy5zaXplKCkgKyAiKSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklOVF9UT09fTEFSR0UpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVTaG9ydChpbnRzVG9TdHJpbmdzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGludHNUb1N0cmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkubmV4dCgpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVVURihzdHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWFkRnJvbShEYXRhSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnRzVG9TdHJpbmdzLnNpemUoKSAhPSAxIHx8IHN0cmluZ3NUb0ludHMuc2l6ZSgpICE9IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGlucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGlucHV0LnJlYWRVVEYoKS5pbnRlcm4oKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBjb2RlRm9yU3RyaW5nKHN0cik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IGkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogIklPIEV4Y2VwdGlvbiIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBIYW5kbGVQb29sCi0gICAgewotICAgICAgICBwcml2YXRlIE1hcCBfaGFuZGxlc1RvUmVmcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgTWFwIF9jb21wb25lbnRzVG9IYW5kbGVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsgLy8gcG9wdWxhdGVkIG9uIHdyaXRlCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBfc3RhcnRlZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBIYW5kbGVQb29sIHRvIGJlIHBvcHVsYXRlZC4KLSAgICAgICAgICovCi0gICAgICAgIEhhbmRsZVBvb2woKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBhZGRVbmlxdWVIYW5kbGUoU2NoZW1hQ29tcG9uZW50IG9iaiwgU3RyaW5nIGJhc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UgPSBiYXNlLnRvTG93ZXJDYXNlKCk7ICAvLyB3ZSBsb3dlcmNhc2UgaGFuZGxlcyBiZWNhdXNlIG9mIGNhc2UtaW5zZW5zaXRpdmUgV2luZG93cyBmaWxlbmFtZXMhISEKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSBiYXNlOwotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAyOyBfaGFuZGxlc1RvUmVmcy5jb250YWluc0tleShoYW5kbGUpOyBpbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGJhc2UgKyBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9oYW5kbGVzVG9SZWZzLnB1dChoYW5kbGUsIG9iai5nZXRDb21wb25lbnRSZWYoKSk7Ci0gICAgICAgICAgICBfY29tcG9uZW50c1RvSGFuZGxlcy5wdXQob2JqLCBoYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JDb21wb25lbnQoU2NoZW1hQ29tcG9uZW50IGNvbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFNjaGVtYVR5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvclR5cGUoKFNjaGVtYVR5cGUpY29tcCk7Ci0gICAgICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvckVsZW1lbnQoKFNjaGVtYUdsb2JhbEVsZW1lbnQpY29tcCk7Ci0gICAgICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9yQXR0cmlidXRlKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpY29tcCk7Ci0gICAgICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFNjaGVtYU1vZGVsR3JvdXApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvck1vZGVsR3JvdXAoKFNjaGVtYU1vZGVsR3JvdXApY29tcCk7Ci0gICAgICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFNjaGVtYUF0dHJpYnV0ZUdyb3VwKQotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JBdHRyaWJ1dGVHcm91cCgoU2NoZW1hQXR0cmlidXRlR3JvdXApY29tcCk7Ci0gICAgICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9ySWRlbnRpdHlDb25zdHJhaW50KChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpY29tcCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb21wb25lbnQgdHlwZSBjYW5ub3QgaGF2ZSBhIGhhbmRsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvckVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudCBlbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOwotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGFkZFVuaXF1ZUhhbmRsZShlbGVtZW50LCBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShlbGVtZW50LmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiRWxlbWVudCIpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlIGF0dHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylfY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoYXR0cmlidXRlKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoYXR0cmlidXRlLCBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShhdHRyaWJ1dGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSArICJBdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9yTW9kZWxHcm91cChTY2hlbWFNb2RlbEdyb3VwIGdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChncm91cC5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylfY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoZ3JvdXApOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGFkZFVuaXF1ZUhhbmRsZShncm91cCwgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoZ3JvdXAuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSArICJNb2RlbEdyb3VwIik7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvckF0dHJpYnV0ZUdyb3VwKFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChncm91cC5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylfY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoZ3JvdXApOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGFkZFVuaXF1ZUhhbmRsZShncm91cCwgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoZ3JvdXAuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSArICJBdHRyaWJ1dGVHcm91cCIpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JJZGVudGl0eUNvbnN0cmFpbnQoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlkYyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKGlkYy5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylfY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoaWRjKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoaWRjLCBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShpZGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSArICJJZGVudGl0eUNvbnN0cmFpbnQiKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9yVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylfY29tcG9uZW50c1RvSGFuZGxlcy5nZXQodHlwZSk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdWZmaXggPSAiIjsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHR5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIkRvYyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHR5cGUuZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJBdHRyVHlwZSI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5nZXRDb250YWluZXJGaWVsZCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0eXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gdHlwZS5nZXRDb250YWluZXJGaWVsZCgpLmlzQXR0cmlidXRlKCkgPyAiQXR0ciIgOiAiRWxlbSI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZU5hbWU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVuaXEgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHR5cGUudG9TdHJpbmcoKS5oYXNoQ29kZSgpIHwgMHg4MDAwMDAwMCkuc3Vic3RyaW5nKDQpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYmFzZU5hbWUgPSAiQW5vbiIgKyB1bmlxICsgIlR5cGUiOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYmFzZU5hbWUgPSBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShuYW1lLmdldExvY2FsUGFydCgpKSArIHVuaXEgKyBzdWZmaXggKyAiVHlwZSI7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUodHlwZSwgYmFzZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hQ29tcG9uZW50LlJlZiByZWZGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYUNvbXBvbmVudC5SZWYpX2hhbmRsZXNUb1JlZnMuZ2V0KGhhbmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgZ2V0QWxsSGFuZGxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfaGFuZGxlc1RvUmVmcy5rZXlTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc3RhcnRXcml0ZU1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBfY29tcG9uZW50c1RvSGFuZGxlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaGFuZGxlc1RvUmVmcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKWkubmV4dCgpOwotLy8gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXcml0aW5nIHByZWV4aXN0aW5nIGhhbmRsZSAiICsgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFDb21wb25lbnQgY29tcCA9ICgoU2NoZW1hQ29tcG9uZW50LlJlZilfaGFuZGxlc1RvUmVmcy5nZXQoaGFuZGxlKSkuZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgICAgICAgICAgX2NvbXBvbmVudHNUb0hhbmRsZXMucHV0KGNvbXAsIGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9iYXNlUGFja2FnZTsKLQotICAgIC8vIGNsYXNzbG9hZGVyIGlzIGF2YWlsYWJsZSBmb3Igc3RzJ3MgdGhhdCB3ZXJlIGNvbXBpbGVkIGFuZCBsb2FkZWQsIG5vdCBkeW5hbWljIG9uZXMKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIF9jbGFzc2xvYWRlcjsKLQotICAgIC8vIHRoZSBsb2FkZXIgZm9yIGxvYWRpbmcgLnhzYiByZXNvdXJjZXMKLSAgICBwcml2YXRlIFJlc291cmNlTG9hZGVyIF9yZXNvdXJjZUxvYWRlcjsKLQotICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgdXNlZCB0byBsaW5rIHJlZmVyZW5jZXMgZHVyaW5nIGxvYWQKLSAgICBTY2hlbWFUeXBlTG9hZGVyIF9saW5rZXI7Ci0KLSAgICBwcml2YXRlIEhhbmRsZVBvb2wgX2xvY2FsSGFuZGxlczsKLSAgICBwcml2YXRlIEZpbGUgX2Jhc2VTYXZlRGlyOwotCi0gICAgLy8gYWN0dWFsIHR5cGUgc3lzdGVtIGRhdGEsIG1hcCBRTmFtZXMgLT4gU2NoZW1hQ29tcG9uZW50LlJlZgotICAgIHByaXZhdGUgTWFwIF9yZWRlZmluZWRNb2RlbEdyb3VwczsKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzOwotICAgIHByaXZhdGUgTWFwIF9yZWRlZmluZWRHbG9iYWxUeXBlczsKLQotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxFbGVtZW50czsKLSAgICBwcml2YXRlIE1hcCBfZ2xvYmFsQXR0cmlidXRlczsKLSAgICBwcml2YXRlIE1hcCBfbW9kZWxHcm91cHM7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUdyb3VwczsKLSAgICBwcml2YXRlIE1hcCBfZ2xvYmFsVHlwZXM7Ci0gICAgcHJpdmF0ZSBNYXAgX2RvY3VtZW50VHlwZXM7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZVR5cGVzOwotICAgIHByaXZhdGUgTWFwIF9pZGVudGl0eUNvbnN0cmFpbnRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIHByaXZhdGUgTWFwIF90eXBlUmVmc0J5Q2xhc3NuYW1lID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFNldCBfbmFtZXNwYWNlczsKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFNjaGVtYVR5cGVbXSBFTVBUWV9TVF9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlWzBdOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBFTVBUWV9HRV9BUlJBWSA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50WzBdOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIEVNUFRZX0dBX0FSUkFZID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVswXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFNb2RlbEdyb3VwW10gRU1QVFlfTUdfQVJSQVkgPSBuZXcgU2NoZW1hTW9kZWxHcm91cFswXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIEVNUFRZX0FHX0FSUkFZID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwWzBdOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIEVNUFRZX0lDX0FSUkFZID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFswXTsKLQotICAgIHB1YmxpYyB2b2lkIHNhdmVUb0RpcmVjdG9yeShGaWxlIGNsYXNzRGlyKQotICAgIHsKLSAgICAgICAgX2Jhc2VTYXZlRGlyID0gY2xhc3NEaXI7Ci0KLSAgICAgICAgX2xvY2FsSGFuZGxlcy5zdGFydFdyaXRlTW9kZSgpOwotICAgICAgICBzYXZlVHlwZXNSZWN1cnNpdmVseShnbG9iYWxUeXBlcygpKTsKLSAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkoZG9jdW1lbnRUeXBlcygpKTsKLSAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkoYXR0cmlidXRlVHlwZXMoKSk7Ci0gICAgICAgIHNhdmVHbG9iYWxFbGVtZW50cyhnbG9iYWxFbGVtZW50cygpKTsKLSAgICAgICAgc2F2ZUdsb2JhbEF0dHJpYnV0ZXMoZ2xvYmFsQXR0cmlidXRlcygpKTsKLSAgICAgICAgc2F2ZU1vZGVsR3JvdXBzKG1vZGVsR3JvdXBzKCkpOwotICAgICAgICBzYXZlQXR0cmlidXRlR3JvdXBzKGF0dHJpYnV0ZUdyb3VwcygpKTsKLSAgICAgICAgc2F2ZUlkZW50aXR5Q29uc3RyYWludHMoaWRlbnRpdHlDb25zdHJhaW50cygpKTsKLQotICAgICAgICBzYXZlVHlwZXNSZWN1cnNpdmVseShyZWRlZmluZWRHbG9iYWxUeXBlcygpKTsKLSAgICAgICAgc2F2ZU1vZGVsR3JvdXBzKHJlZGVmaW5lZE1vZGVsR3JvdXBzKCkpOwotICAgICAgICBzYXZlQXR0cmlidXRlR3JvdXBzKHJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpKTsKLQotICAgICAgICBzYXZlSW5kZXgoKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlVHlwZXNSZWN1cnNpdmVseShTY2hlbWFUeXBlW10gdHlwZXMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZXNbaV0uZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHNhdmVUeXBlKHR5cGVzW2ldKTsKLSAgICAgICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KHR5cGVzW2ldLmdldEFub255bW91c1R5cGVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUdsb2JhbEVsZW1lbnRzKFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBlbHRzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbHRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlR2xvYmFsRWxlbWVudChlbHRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVHbG9iYWxBdHRyaWJ1dGVzKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGF0dHJzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZUdsb2JhbEF0dHJpYnV0ZShhdHRyc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlTW9kZWxHcm91cHMoU2NoZW1hTW9kZWxHcm91cFtdIGdyb3VwcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlTW9kZWxHcm91cChncm91cHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUF0dHJpYnV0ZUdyb3VwcyhTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIGdyb3VwcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlQXR0cmlidXRlR3JvdXAoZ3JvdXBzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVJZGVudGl0eUNvbnN0cmFpbnRzKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGlkY3MpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkY3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVJZGVudGl0eUNvbnN0cmFpbnQoaWRjc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlR2xvYmFsRWxlbWVudChTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvckVsZW1lbnQoZWx0KTsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZVBhcnRpY2xlRGF0YSgoU2NoZW1hUGFydGljbGUpZWx0KTsKLSAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcoZWx0LmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQpOwotICAgICAgICBzYXZlci53cml0ZVBhcnRpY2xlRGF0YSgoU2NoZW1hUGFydGljbGUpZWx0KTsKLSAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcoZWx0LmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUdsb2JhbEF0dHJpYnV0ZShTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgYXR0cikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvckF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZUF0dHJpYnV0ZURhdGEoYXR0cik7Ci0gICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKGF0dHIuZ2V0U291cmNlTmFtZSgpKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFKTsKLSAgICAgICAgc2F2ZXIud3JpdGVBdHRyaWJ1dGVEYXRhKGF0dHIpOwotICAgICAgICBzYXZlci53cml0ZVN0cmluZyhhdHRyLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZU1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cCBncnApCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JNb2RlbEdyb3VwKGdycCk7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVNb2RlbEdyb3VwRGF0YShncnApOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQKTsKLSAgICAgICAgc2F2ZXIud3JpdGVNb2RlbEdyb3VwRGF0YShncnApOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVBdHRyaWJ1dGVHcm91cChTY2hlbWFBdHRyaWJ1dGVHcm91cCBncnApCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JBdHRyaWJ1dGVHcm91cChncnApOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlQXR0cmlidXRlR3JvdXBEYXRhKGdycCk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQKTsKLSAgICAgICAgc2F2ZXIud3JpdGVBdHRyaWJ1dGVHcm91cERhdGEoZ3JwKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlSWRlbnRpdHlDb25zdHJhaW50KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpZGMpCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JJZGVudGl0eUNvbnN0cmFpbnQoaWRjKTsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZUlkQ29uc3RyYWludERhdGEoaWRjKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BSURFTlRJVFlDT05TVFJBSU5UKTsKLSAgICAgICAgc2F2ZXIud3JpdGVJZENvbnN0cmFpbnREYXRhKGlkYyk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JUeXBlKHR5cGUpOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlVHlwZURhdGEodHlwZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQVRZUEUpOwotICAgICAgICBzYXZlci53cml0ZVR5cGVEYXRhKHR5cGUpOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyYWNrUG9pbnRlcihJbnB1dFN0cmVhbSBzdHJlYW0pCi0gICAgewotICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW5wdXQgPSBuZXcgRGF0YUlucHV0U3RyZWFtKHN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGludCBtYWdpYyA9IGlucHV0LnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGlmIChtYWdpYyAhPSBEQVRBX0JBQkUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGludCBtYWpvcnZlciA9IGlucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICAgICAgaW50IG1pbm9ydmVyID0gaW5wdXQucmVhZFNob3J0KCk7Ci0KLSAgICAgICAgICAgIGlmIChtYWpvcnZlciAhPSBNQUpPUl9WRVJTSU9OKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpZiAobWlub3J2ZXIgPiBNSU5PUl9WRVJTSU9OKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpZiAobWFqb3J2ZXIgPiAyIHx8IG1ham9ydmVyID09IDIgJiYgbWlub3J2ZXIgPj0gMTgpCi0gICAgICAgICAgICAgICAgaW5wdXQucmVhZFNob3J0KCk7IC8vIHJlbGVhc2UgbnVtYmVyIHByZXNlbnQgaW4gYXRMZWFzdCgyLCAxOCwgMCkKLQotICAgICAgICAgICAgaW50IGFjdHVhbGZpbGV0eXBlID0gaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsZmlsZXR5cGUgIT0gRklMRVRZUEVfU0NIRU1BUE9JTlRFUikKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgU3RyaW5nUG9vbCBzdHJpbmdQb29sID0gbmV3IFN0cmluZ1Bvb2woInBvaW50ZXIiLCAidW5rIik7Ci0gICAgICAgICAgICBzdHJpbmdQb29sLnJlYWRGcm9tKGlucHV0KTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2wuc3RyaW5nRm9yQ29kZShpbnB1dC5yZWFkU2hvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdHJ5IHsgaW5wdXQuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgWHNiUmVhZGVyCi0gICAgewotICAgICAgICBEYXRhSW5wdXRTdHJlYW0gX2lucHV0OwotICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIF9vdXRwdXQ7Ci0gICAgICAgIFN0cmluZ1Bvb2wgX3N0cmluZ1Bvb2w7Ci0gICAgICAgIFN0cmluZyBfaGFuZGxlOwotICAgICAgICBwcml2YXRlIGludCBfbWFqb3J2ZXI7Ci0gICAgICAgIHByaXZhdGUgaW50IF9taW5vcnZlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX3JlbGVhc2VubzsKLSAgICAgICAgaW50IF9hY3R1YWxmaWxldHlwZTsKLQotICAgICAgICBwdWJsaWMgWHNiUmVhZGVyKFN0cmluZyBoYW5kbGUsIGludCBmaWxldHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlbmFtZSA9IF9iYXNlUGFja2FnZSArIGhhbmRsZSArICIueHNiIjsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHJhd2lucHV0ID0gZ2V0TG9hZGVyU3RyZWFtKHJlc291cmNlbmFtZSk7Ci0gICAgICAgICAgICBpZiAocmF3aW5wdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogQ291bGQgbm90IGxvY2F0ZSBjb21waWxlZCBzY2hlbWEgcmVzb3VyY2UgIiArIHJlc291cmNlbmFtZSwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5OT19SRVNPVVJDRSk7Ci0KLSAgICAgICAgICAgIF9pbnB1dCA9IG5ldyBEYXRhSW5wdXRTdHJlYW0ocmF3aW5wdXQpOwotICAgICAgICAgICAgX2hhbmRsZSA9IGhhbmRsZTsKLQotICAgICAgICAgICAgaW50IG1hZ2ljID0gcmVhZEludCgpOwotICAgICAgICAgICAgaWYgKG1hZ2ljICE9IERBVEFfQkFCRSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogV3JvbmcgbWFnaWMgY29va2llIiwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19NQUdJQ19DT09LSUUpOwotCi0gICAgICAgICAgICBfbWFqb3J2ZXIgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIF9taW5vcnZlciA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgICAgICBpZiAoX21ham9ydmVyICE9IE1BSk9SX1ZFUlNJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IFdyb25nIG1ham9yIHZlcnNpb24gLSBleHBlY3RpbmcgIiArIE1BSk9SX1ZFUlNJT04gKyAiLCBnb3QgIiArIF9tYWpvcnZlciwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19NQUpPUl9WRVJTSU9OKTsKLQotICAgICAgICAgICAgaWYgKF9taW5vcnZlciA+IE1JTk9SX1ZFUlNJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IEluY29tcGF0aWJsZSBtaW5vciB2ZXJzaW9uIC0gZXhwZWN0aW5nIHVwIHRvICIgKyBNSU5PUl9WRVJTSU9OICsgIiwgZ290ICIgKyBfbWlub3J2ZXIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfTUlOT1JfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgIC8vIENsaXAgdG8gMTQgYmVjYXVzZSB3ZSdyZSBub3QgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIKLSAgICAgICAgICAgIC8vIG1pbm9yIHZlcnNpb25zLiAgUmVtb3ZlIHRoaXMgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXcgbWFqb3IKLSAgICAgICAgICAgIC8vIHZlcnNpb24KLQotICAgICAgICAgICAgaWYgKF9taW5vcnZlciA8IDE0KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBJbmNvbXBhdGlibGUgbWlub3IgdmVyc2lvbiAtIGV4cGVjdGluZyBhdCBsZWFzdCAxNCwgZ290ICIgKyBfbWlub3J2ZXIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfTUlOT1JfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE4LCAwKSkKLSAgICAgICAgICAgICAgICBfcmVsZWFzZW5vID0gcmVhZFNob3J0KCk7Ci0KLSAgICAgICAgICAgIGludCBhY3R1YWxmaWxldHlwZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgaWYgKGFjdHVhbGZpbGV0eXBlICE9IGZpbGV0eXBlICYmIGZpbGV0eXBlICE9IC0xKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBGaWxlIGhhcyB0aGUgd3JvbmcgdHlwZSAtIGV4cGVjdGluZyB0eXBlICIgKyBmaWxldHlwZSArICIsIGdvdCB0eXBlICIgKyBhY3R1YWxmaWxldHlwZSwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19GSUxFX1RZUEUpOwotCi0gICAgICAgICAgICBfc3RyaW5nUG9vbCA9IG5ldyBTdHJpbmdQb29sKF9oYW5kbGUsIF9uYW1lKTsKLSAgICAgICAgICAgIF9zdHJpbmdQb29sLnJlYWRGcm9tKF9pbnB1dCk7Ci0KLSAgICAgICAgICAgIF9hY3R1YWxmaWxldHlwZSA9IGFjdHVhbGZpbGV0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXRMZWFzdChpbnQgbWFqb3J2ZXIsIGludCBtaW5vcnZlciwgaW50IHJlbGVhc2VubykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9tYWpvcnZlciA+IG1ham9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKF9tYWpvcnZlciA8IG1ham9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPiBtaW5vcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPCBtaW5vcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gKF9yZWxlYXNlbm8gPj0gcmVsZWFzZW5vKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGF0TW9zdChpbnQgbWFqb3J2ZXIsIGludCBtaW5vcnZlciwgaW50IHJlbGVhc2VubykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9tYWpvcnZlciA+IG1ham9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPCBtYWpvcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPiBtaW5vcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoX21pbm9ydmVyIDwgbWlub3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gKF9yZWxlYXNlbm8gPD0gcmVsZWFzZW5vKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRBY3R1YWxGaWxldHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYWN0dWFsZmlsZXR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBYc2JSZWFkZXIoU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2hhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgICAgIF9zdHJpbmdQb29sID0gbmV3IFN0cmluZ1Bvb2woX2hhbmRsZSwgX25hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVJlYWxIZWFkZXIoU3RyaW5nIGhhbmRsZSwgaW50IGZpbGV0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoYWNrZXJvbzogaWYgaGFuZGxlIGNvbnRhaW5zIGEgIi8iIGl0J3Mgbm90IHJlbGF0aXZlLgotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlbmFtZTsKLQotICAgICAgICAgICAgaWYgKGhhbmRsZS5pbmRleE9mKCcvJykgPj0gMCkKLSAgICAgICAgICAgICAgICByZXNvdXJjZW5hbWUgPSBoYW5kbGUgKyAiLnhzYiI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VuYW1lID0gX2Jhc2VQYWNrYWdlICsgaGFuZGxlICsgIi54c2IiOwotCi0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gcmF3b3V0cHV0ID0gZ2V0U2F2ZXJTdHJlYW0ocmVzb3VyY2VuYW1lKTsKLSAgICAgICAgICAgIGlmIChyYXdvdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGNvbXBpbGVkIHNjaGVtYSByZXNvdXJjZSAiICsgcmVzb3VyY2VuYW1lLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5PVF9XUklURUFCTEUpOwotCi0gICAgICAgICAgICBfb3V0cHV0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ocmF3b3V0cHV0KTsKLSAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7Ci0KLSAgICAgICAgICAgIHdyaXRlSW50KERBVEFfQkFCRSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KE1BSk9SX1ZFUlNJT04pOwotICAgICAgICAgICAgd3JpdGVTaG9ydChNSU5PUl9WRVJTSU9OKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoUkVMRUFTRV9OVU1CRVIpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChmaWxldHlwZSk7Ci0KLSAgICAgICAgICAgIF9zdHJpbmdQb29sLndyaXRlVG8oX291dHB1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlYWRFbmQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2lucHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9pbnB1dC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gb2gsIHdlbGwuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfaW5wdXQgPSBudWxsOwotICAgICAgICAgICAgX3N0cmluZ1Bvb2wgPSBudWxsOwotICAgICAgICAgICAgX2hhbmRsZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlRW5kKCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9vdXRwdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgX291dHB1dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX291dHB1dCA9IG51bGw7Ci0gICAgICAgICAgICBfc3RyaW5nUG9vbCA9IG51bGw7Ci0gICAgICAgICAgICBfaGFuZGxlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaWxlVHlwZUZyb21Db21wb25lbnRUeXBlKGludCBjb21wb25lbnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQVRZUEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQUVMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUDsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUDsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5JREVOVElUWV9DT05TVFJBSU5UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BSURFTlRJVFlDT05TVFJBSU5UOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY29tcG9uZW50IHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVJbmRleERhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoYXMgYSBoYW5kbGUgcG9vbCAoY291bnQsIGhhbmRsZS90eXBlLCBoYW5kbGUvdHlwZS4uLikKLSAgICAgICAgICAgIHdyaXRlSGFuZGxlUG9vbChfbG9jYWxIYW5kbGVzKTsKLQotICAgICAgICAgICAgLy8gdGhlbiBhIHFuYW1lIG1hcCBvZiBnbG9iYWwgZWxlbWVudHMgKGNvdW50LCBxbmFtZS9oYW5kbGUsIHFuYW1lL2hhbmRsZS4uLikKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoZ2xvYmFsRWxlbWVudHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChnbG9iYWxBdHRyaWJ1dGVzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgbW9kZWwgZ3JvdXBzCi0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKG1vZGVsR3JvdXBzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgYXR0cmlidXRlIGdyb3VwcwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChhdHRyaWJ1dGVHcm91cHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBpZGVudGl0eSBjb25zdHJhaW50cwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChpZGVudGl0eUNvbnN0cmFpbnRzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIHR5cGVzCi0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKGdsb2JhbFR5cGVzKCkpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZG9jdW1lbnQgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGVsZW1lbnQKLSAgICAgICAgICAgIHdyaXRlRG9jdW1lbnRUeXBlTWFwKGRvY3VtZW50VHlwZXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBhdHRyaWJ1dGUgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGF0dHJpYnV0ZQotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVUeXBlTWFwKGF0dHJpYnV0ZVR5cGVzKCkpOwotCi0gICAgICAgICAgICAvLyBhbGwgdGhlIHR5cGVzIGJ5IGNsYXNzbmFtZQotICAgICAgICAgICAgd3JpdGVDbGFzc25hbWVNYXAoX3R5cGVSZWZzQnlDbGFzc25hbWUpOwotCi0gICAgICAgICAgICAvLyBhbGwgdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgICAgIHdyaXRlTmFtZXNwYWNlcyhfbmFtZXNwYWNlcyk7Ci0KLSAgICAgICAgICAgIC8vIFZFUlNJT04gMi4xNSBhbmQgbmV3ZXIgYmVsb3cKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAocmVkZWZpbmVkR2xvYmFsVHlwZXMoKSk7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKHJlZGVmaW5lZE1vZGVsR3JvdXBzKCkpOwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChyZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlSGFuZGxlUG9vbChIYW5kbGVQb29sIHBvb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocG9vbC5fY29tcG9uZW50c1RvSGFuZGxlcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcG9vbC5fY29tcG9uZW50c1RvSGFuZGxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudCBjb21wID0gKFNjaGVtYUNvbXBvbmVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylwb29sLl9jb21wb25lbnRzVG9IYW5kbGVzLmdldChjb21wKTsKLSAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGZpbGVUeXBlRnJvbUNvbXBvbmVudFR5cGUoY29tcC5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChjb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVhZEhhbmRsZVBvb2woSGFuZGxlUG9vbCBwb29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG9vbC5faGFuZGxlc1RvUmVmcy5zaXplKCkgIT0gMCB8fCBwb29sLl9zdGFydGVkKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vbmVtcHR5IGhhbmRsZSBzZXQgYmVmb3JlIHJlYWQiKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgc2hvcnQgY29kZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFUWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwLlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BSURFTlRJVFlDT05TVFJBSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiU2NoZW1hIGluZGV4IGhhcyBhbiB1bnJlY29nbml6ZWQgZW50cnkgb2YgdHlwZSAiICsgY29kZSwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5VTlJFQ09HTklaRURfSU5ERVhfRU5UUlkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb29sLl9oYW5kbGVzVG9SZWZzLnB1dChoYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaG9ydCByZWFkU2hvcnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlU2hvcnQoaW50IHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzID4gU2hvcnQuTUFYX1ZBTFVFIHx8IHMgPCBTaG9ydC5NSU5fVkFMVUUpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlZhbHVlICIgKyBzICsgIiBvdXQgb2YgcmFuZ2U6IG11c3QgZml0IGluIGEgMTYtYml0IHNob3J0LiIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklOVF9UT09fTEFSR0UpOwotICAgICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9vdXRwdXQud3JpdGVTaG9ydChzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmVhZEludCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZEludCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlSW50KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX291dHB1dC53cml0ZUludChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVhZFN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfc3RyaW5nUG9vbC5zdHJpbmdGb3JDb2RlKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvZGUgPSBfc3RyaW5nUG9vbC5jb2RlRm9yU3RyaW5nKHN0cik7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWUgcmVhZFFOYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbG5hbWUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobG9jYWxuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVRTmFtZShRTmFtZSBxbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHFuYW1lID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcobnVsbCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcobnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVTdHJpbmcocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSByZWFkU09BUEFycmF5VHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcmVhZFFOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGltZW5zaW9ucyA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChxTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQQXJyYXlUeXBlKHFOYW1lLCBkaW1lbnNpb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVTT0FQQXJyYXlUeXBlKFNPQVBBcnJheVR5cGUgYXJyYXlUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJyYXlUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZShudWxsKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGFycmF5VHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhhcnJheVR5cGUuc29hcDExRGltZW5zaW9uU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hQ29tcG9uZW50LlJlZiByZWFkSGFuZGxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGhhbmRsZS5jaGFyQXQoMCkgIT0gJ18nKQotICAgICAgICAgICAgICAgIHJldHVybiBfbG9jYWxIYW5kbGVzLnJlZkZvckhhbmRsZShoYW5kbGUpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGhhbmRsZS5jaGFyQXQoMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnSSc6IC8vIF9CSV8gLSBidWlsdC1pbiBzY2hlbWEgdHlwZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hVHlwZSlCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5nZXQoKS5yZXNvbHZlSGFuZGxlKGhhbmRsZSkpLmdldFJlZigpOwotICAgICAgICAgICAgICAgIGNhc2UgJ1QnOiAvLyBfWFRfIC0gZXh0ZXJuYWwgdHlwZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kVHlwZVJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRSc6IC8vIF9YRV8gLSBleHRlcm5hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRFbGVtZW50UmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKLSAgICAgICAgICAgICAgICBjYXNlICdBJzogLy8gX1hBXyAtIGV4dGVybmFsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kQXR0cmlidXRlUmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKLSAgICAgICAgICAgICAgICBjYXNlICdNJzogLy8gX1hNXyAtIGV4dGVybmFsIG1vZGVsIGdyb3VwCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKLSAgICAgICAgICAgICAgICBjYXNlICdOJzogLy8gX1hOXyAtIGV4dGVybmFsIGF0dHJpYnV0ZSBncm91cAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kQXR0cmlidXRlR3JvdXBSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOwotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOiAvLyBfWERfIC0gZXh0ZXJuYWwgaWRlbnRpdHkgY29uc3RyYWludAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKLSAgICAgICAgICAgICAgICBjYXNlICdSJzogLy8gX1hSXyAtIGV4dGVybmFsIHJlZiB0byBhdHRyaWJ1dGUncyB0eXBlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRBdHRyaWJ1dGUoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpLmdldFR5cGUoKS5nZXRSZWYoKTsKLSAgICAgICAgICAgICAgICBjYXNlICdTJzogLy8gX1hTXyAtIGV4dGVybmFsIHJlZiB0byBlbGVtZW50J3MgdHlwZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kRWxlbWVudChRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSkuZ2V0VHlwZSgpLmdldFJlZigpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgcmVzb2x2ZSBoYW5kbGUgIiArIGhhbmRsZSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uQkFEX0hBTkRMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlSGFuZGxlKFNjaGVtYUNvbXBvbmVudCBjb21wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcCA9PSBudWxsIHx8IGNvbXAuZ2V0VHlwZVN5c3RlbSgpID09IGdldFR5cGVTeXN0ZW0oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhfbG9jYWxIYW5kbGVzLmhhbmRsZUZvckNvbXBvbmVudChjb21wKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURToKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YQV8iICsgUU5hbWVIZWxwZXIucHJldHR5KGNvbXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5NT0RFTF9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YTV8iICsgUU5hbWVIZWxwZXIucHJldHR5KGNvbXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWE5fIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YRV8iICsgUU5hbWVIZWxwZXIucHJldHR5KGNvbXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5JREVOVElUWV9DT05TVFJBSU5UOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hEXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY29tcC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IChTY2hlbWFUeXBlKWNvbXA7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQnVpbHRpblR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9CSV8iICsgdHlwZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZml4IGZvciBDUjEyMDc1OSAtIGFkZGVkIG91dHB1dCBvZiB0eXBlcyBfWFJfICYgX1hTXwotICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGFuIGF0dHJpYnV0ZSAoX1hSXykgb3IgZWxlbWVudCAoX1hTXykgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlcyByZWYgdG8gcmVmZXIgdG8gYW4gYXR0cmlidXRlIG9yIGVsZW1lbnQgaW4gYW5vdGhlcgotICAgICAgICAgICAgICAgICAgICAvLyBzY2hlbWEgYW5kIHRoZSB0eXBlIG9mIHRoYXQgYXR0cmlidXRlIG9yIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gaXMgYW4gYW5vbnltb3VzIChsb2NhbCkgdHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YVF8iICsgUU5hbWVIZWxwZXIucHJldHR5KHR5cGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFGaWVsZCBzZiA9IHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoc2YgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2YuaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hSXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc2YuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YU18iICsgUU5hbWVIZWxwZXIucHJldHR5KHNmLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSBoYW5kbGUgZm9yIGNvbXBvbmVudCAiICsgY29tcCwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uQkFEX0hBTkRMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZWFkVHlwZVJlZigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZS5SZWYpcmVhZEhhbmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZUhhbmRsZSh0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCByZWFkUU5hbWVSZWZNYXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50LlJlZiBvYmogPSByZWFkSGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChuYW1lLCBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVRTmFtZU1hcChTY2hlbWFDb21wb25lbnRbXSBjb21wb25lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGNvbXBvbmVudHMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShjb21wb25lbnRzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVEb2N1bWVudFR5cGVNYXAoU2NoZW1hVHlwZVtdIGRvY3R5cGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGRvY3R5cGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3R5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoZG9jdHlwZXNbaV0uZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShkb2N0eXBlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlQXR0cmlidXRlVHlwZU1hcChTY2hlbWFUeXBlW10gYXR0cnR5cGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGF0dHJ0eXBlcy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRydHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZShhdHRydHlwZXNbaV0uZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoYXR0cnR5cGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVhZFR5cGVSZWZBcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlLlJlZltdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlLlJlZltzaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlYWRUeXBlUmVmKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVR5cGVBcnJheShTY2hlbWFUeXBlW10gYXJyYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoYXJyYXkubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoYXJyYXlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIHJlYWRDbGFzc25hbWVSZWZNYXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFDb21wb25lbnQuUmVmIG9iaiA9IHJlYWRIYW5kbGUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KG5hbWUsIG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUNsYXNzbmFtZU1hcChNYXAgdHlwZXNCeUNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHR5cGVzQnlDbGFzcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXNCeUNsYXNzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZSgoKFNjaGVtYVR5cGUuUmVmKXR5cGVzQnlDbGFzcy5nZXQoY2xhc3NOYW1lKSkuZ2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2V0IHJlYWROYW1lc3BhY2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVOYW1lc3BhY2VzKFNldCBuYW1lc3BhY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KG5hbWVzcGFjZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE91dHB1dFN0cmVhbSBnZXRTYXZlclN0cmVhbShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoX2Jhc2VTYXZlRGlyLCBuYW1lKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gZ2V0TG9hZGVyU3RyZWFtKFN0cmluZyByZXNvdXJjZW5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcmVzb3VyY2VMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZW5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZpbmlzaGVzIGxvYWRpbmcgYW4gZWxlbWVudCBhZnRlciB0aGUgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgZmluaXNoTG9hZGluZ0VsZW1lbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGltcGwgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwoZ2V0VHlwZVN5c3RlbSgpKTsKLSAgICAgICAgICAgICAgICBzaG9ydCBwYXJ0aWNsZVR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFydGljbGVUeXBlICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJXcm9uZyBwYXJ0aWNsZSB0eXBlICIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9QQVJUSUNMRV9UWVBFKTsKLSAgICAgICAgICAgICAgICBsb2FkUGFydGljbGUoaW1wbCwgU2NoZW1hUGFydGljbGUuRUxFTUVOVCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRGaWxlbmFtZShyZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBmaW5pc2hMb2FkaW5nQXR0cmlidXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCBpbXBsID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwoZ2V0VHlwZVN5c3RlbSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGUoaW1wbCk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRGaWxlbmFtZShyZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hTW9kZWxHcm91cCBmaW5pc2hMb2FkaW5nTW9kZWxHcm91cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGltcGwgPSBuZXcgU2NoZW1hTW9kZWxHcm91cEltcGwoZ2V0VHlwZVN5c3RlbSgpKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9hZE1vZGVsR3JvdXAoaW1wbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGZpbmlzaExvYWRpbmdJZGVudGl0eUNvbnN0cmFpbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwgaW1wbCA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsKGdldFR5cGVTeXN0ZW0oKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXROYW1lKHJlYWRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldENvbnN0cmFpbnRDYXRlZ29yeShyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRTZWxlY3RvcihyZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gZmllbGRzID0gbmV3IFN0cmluZ1tyZWFkU2hvcnQoKV07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZmllbGRzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0RmllbGRzKGZpZWxkcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW1wbC5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFJlZmVyZW5jZWRLZXkoKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYpcmVhZEhhbmRsZSgpKTsKLQotICAgICAgICAgICAgICAgIGludCBtYXBDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIE1hcCBuc01hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtYXBDb3VudCA7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5zTWFwcGluZ3MucHV0KHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXROU01hcChuc01hcHBpbmdzKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGZpbmlzaExvYWRpbmdBdHRyaWJ1dGVHcm91cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBpbXBsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbChnZXRUeXBlU3lzdGVtKCkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2FkQXR0cmlidXRlR3JvdXAoaW1wbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYVR5cGUgZmluaXNoTG9hZGluZ1R5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBpbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKGdldFR5cGVTeXN0ZW0oKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXROYW1lKHJlYWRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEJhc2VEZXB0aChyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRCYXNlVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldERlcml2YXRpb25UeXBlKHJlYWRTaG9ydCgpKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAocmVhZFNob3J0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX0dMT0JBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Q29udGFpbmVyRmllbGRSZWYocmVhZEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMQVRUUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Q29udGFpbmVyRmllbGRJbmRleCgoc2hvcnQpMSwgcmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxFTFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRhaW5lckZpZWxkSW5kZXgoKHNob3J0KTIsIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbXBsLnNldEZ1bGxKYXZhTmFtZShyZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0RnVsbEphdmFJbXBsTmFtZShyZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgaW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhyZWFkVHlwZVJlZkFycmF5KCkpOwotCi0gICAgICAgICAgICAgICAgaW1wbC5zZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwocmVhZFNob3J0KCkpOwotCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzOwotICAgICAgICAgICAgICAgIGZsYWdzID0gcmVhZEludCgpOwotCi0KLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQ29tcGxleFR5cGUgPSAoKGZsYWdzICYgRkxBR19TSU1QTEVfVFlQRSkgPT0gMCk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRDb21waWxlZCgoZmxhZ3MgJiBGTEFHX0NPTVBJTEVEKSAhPSAwKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldERvY3VtZW50VHlwZSgoZmxhZ3MgJiBGTEFHX0RPQ1VNRU5UX1RZUEUpICE9IDApOwotICAgICAgICAgICAgICAgIGltcGwuc2V0QXR0cmlidXRlVHlwZSgoZmxhZ3MgJiBGTEFHX0FUVFJJQlVURV9UWVBFKSAhPSAwKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldFNpbXBsZVR5cGUoIWlzQ29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICAgICAgc2hvcnQgY29tcGxleFZhcmlldHkgPSBTY2hlbWFUeXBlLk5PVF9DT01QTEVYX1RZUEU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxleFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEFic3RyYWN0RmluYWwoKGZsYWdzICYgRkxBR19BQlNUUkFDVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfRVhUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19GSU5BTF9SRVNUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19GSU5BTF9MSVNUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19GSU5BTF9VTklPTikgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0QmxvY2soKGZsYWdzICYgRkxBR19CTE9DS19FWFQpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0JMT0NLX1JFU1QpICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0T3JkZXJTZW5zaXRpdmUoKGZsYWdzICYgRkxBR19PUkRFUl9TRU5TSVRJVkUpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBjb21wbGV4VmFyaWV0eSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShjb21wbGV4VmFyaWV0eSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIE1vZGVsIFRhYmxlCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgYXR0ckNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyTW9kZWwuYWRkQXR0cmlidXRlKHJlYWRBdHRyaWJ1dGVEYXRhKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGF0dHJNb2RlbC5zZXRXaWxkY2FyZFNldChyZWFkUU5hbWVTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJNb2RlbC5zZXRXaWxkY2FyZFByb2Nlc3MocmVhZFNob3J0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBQcm9wZXJ0eSBUYWJsZQotICAgICAgICAgICAgICAgICAgICBNYXAgYXR0clByb3BlcnRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICBzaG9ydCBhdHRyUHJvcENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0clByb3BDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcmVhZFByb3BlcnR5RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkF0dHJpYnV0ZSBwcm9wZXJ0eSAiICsgaSArICIgaXMgbm90IGFuIGF0dHJpYnV0ZSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX1BST1BFUlRZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0clByb3BlcnRpZXMucHV0KHByb3AuZ2V0TmFtZSgpLCBwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBlbGVtUHJvcGVydGllcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0IGlzQWxsID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgfHwgY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250ZW50IE1vZGVsIFRyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxsID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRzID0gcmVhZFBhcnRpY2xlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TW9kZWwgPSBwYXJ0c1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNvbnRlbnQgbW9kZWwgbm90IHdlbGwtZm9ybWVkIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTUFMRk9STUVEX0NPTlRFTlRfTU9ERUwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IFByb3BlcnR5IFRhYmxlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1Qcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGVsZW1Qcm9wQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbVByb3BDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSByZWFkUHJvcGVydHlEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AuaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkVsZW1lbnQgcHJvcGVydHkgIiArIGkgKyAiIGlzIG5vdCBhbiBlbGVtZW50IiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfUFJPUEVSVFlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVByb3BlcnRpZXMucHV0KHByb3AuZ2V0TmFtZSgpLCBwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBlbGVtUHJvcGVydGllcywgYXR0clByb3BlcnRpZXMsIGlzQWxsID09IDEpOwotICAgICAgICAgICAgICAgICAgICBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5XaWxkY2FyZFJlc3VsdCB3Y0VsdCA9IFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLnN1bW1hcml6ZUVsdFdpbGRjYXJkcyhjb250ZW50TW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5XaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5zdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KHdjRWx0LnR5cGVkV2lsZGNhcmRzLCB3Y0VsdC5oYXNXaWxkY2FyZHMsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUeXBlIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaG9ydCBzaW1wbGVWYXJpZXR5ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoc2ltcGxlVmFyaWV0eSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1N0cmluZ0VudW0gPSAoKGZsYWdzICYgRkxBR19TVFJJTkdFTlVNKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldE9yZGVyZWQoKGZsYWdzICYgRkxBR19PUkRFUkVEKSAhPSAwID8gU2NoZW1hVHlwZS5VTk9SREVSRUQgOiAoKGZsYWdzICYgRkxBR19UT1RBTF9PUkRFUikgIT0gMCA/IFNjaGVtYVR5cGUuVE9UQUxfT1JERVIgOiBTY2hlbWFUeXBlLlBBUlRJQUxfT1JERVIpKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRCb3VuZGVkKChmbGFncyAmIEZMQUdfQk9VTkRFRCkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RmluaXRlKChmbGFncyAmIEZMQUdfRklOSVRFKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXROdW1lcmljKChmbGFncyAmIEZMQUdfTlVNRVJJQykgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0VW5pb25PZkxpc3RzKChmbGFncyAmIEZMQUdfVU5JT05fT0ZfTElTVFMpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFNpbXBsZUZpbmFsKChmbGFncyAmIEZMQUdfRklOQUxfUkVTVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfTElTVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfVU5JT04pICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbFZhbHVlUmVmW10gZmFjZXRzID0gbmV3IFhtbFZhbHVlUmVmW1NjaGVtYVR5cGUuTEFTVF9GQUNFVCArIDFdOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuW10gZml4ZWRGYWNldHMgPSBuZXcgYm9vbGVhbltTY2hlbWFUeXBlLkxBU1RfRkFDRVQgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgZmFjZXRDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0Q291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZmFjZXRDb2RlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldHNbZmFjZXRDb2RlXSA9IHJlYWRYbWxWYWx1ZU9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRGYWNldHNbZmFjZXRDb2RlXSA9IChyZWFkU2hvcnQoKSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEJhc2ljRmFjZXRzKGZhY2V0cywgZml4ZWRGYWNldHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0V2hpdGVTcGFjZVJ1bGUocmVhZFNob3J0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0UGF0dGVybkZhY2V0KChmbGFncyAmIEZMQUdfSEFTX1BBVFRFUk4pICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgIHNob3J0IHBhdHRlcm5Db3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBwYXR0ZXJucyA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bcGF0dGVybkNvdW50XTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnNbaV0gPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uKHJlYWRTdHJpbmcoKSwgIlgiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFBhdHRlcm5zKHBhdHRlcm5zKTsKLQotICAgICAgICAgICAgICAgICAgICBzaG9ydCBlbnVtQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sVmFsdWVSZWZbXSBlbnVtVmFsdWVzID0gbmV3IFhtbFZhbHVlUmVmW2VudW1Db3VudF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bUNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZXNbaV0gPSByZWFkWG1sVmFsdWVPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEVudW1lcmF0aW9uVmFsdWVzKGVudW1Db3VudCA9PSAwID8gbnVsbCA6IGVudW1WYWx1ZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0QmFzZUVudW1UeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmdFbnVtKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzZUNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBlbnRyaWVzID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeVtzZUNvdW50XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXNbaV0gPSBuZXcgU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbChyZWFkU3RyaW5nKCksIHJlYWRTaG9ydCgpLCByZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRTdHJpbmdFbnVtRW50cmllcyhlbnRyaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2ltcGxlVmFyaWV0eSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXREZWNpbWFsU2l6ZShyZWFkSW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRMaXN0SXRlbVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRVbmlvbk1lbWJlclR5cGVSZWZzKHJlYWRUeXBlUmVmQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlNpbXBsZSB0eXBlIGRvZXMgbm90IGhhdmUgYSByZWNvZ25pemVkIHZhcmlldHkiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19TSU1QTEVfVkFSSUVUWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbXBsLnNldEZpbGVuYW1lKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVHlwZURhdGEoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKHR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldE91dGVyVHlwZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoKChTY2hlbWFUeXBlSW1wbCl0eXBlKS5nZXRCYXNlRGVwdGgoKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRCYXNlVHlwZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5nZXREZXJpdmF0aW9uVHlwZSgpKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldENvbnRhaW5lckZpZWxkKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KEZJRUxEX05PTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5nZXRPdXRlclR5cGUoKS5pc0F0dHJpYnV0ZVR5cGUoKSB8fCB0eXBlLmdldE91dGVyVHlwZSgpLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChGSUVMRF9HTE9CQUwpOwotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKChTY2hlbWFDb21wb25lbnQpdHlwZS5nZXRDb250YWluZXJGaWVsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoRklFTERfTE9DQUxBVFRSKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KCgoU2NoZW1hVHlwZUltcGwpdHlwZS5nZXRPdXRlclR5cGUoKSkuZ2V0SW5kZXhGb3JMb2NhbEF0dHJpYnV0ZSgoU2NoZW1hTG9jYWxBdHRyaWJ1dGUpdHlwZS5nZXRDb250YWluZXJGaWVsZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChGSUVMRF9MT0NBTEVMVCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgoKFNjaGVtYVR5cGVJbXBsKXR5cGUuZ2V0T3V0ZXJUeXBlKCkpLmdldEluZGV4Rm9yTG9jYWxFbGVtZW50KChTY2hlbWFMb2NhbEVsZW1lbnQpdHlwZS5nZXRDb250YWluZXJGaWVsZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyh0eXBlLmdldEZ1bGxKYXZhTmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHR5cGUuZ2V0RnVsbEphdmFJbXBsTmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZUFycmF5KHR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCkpOwotCi0gICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19TSU1QTEVfVFlQRTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19ET0NVTUVOVF9UWVBFOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19BVFRSSUJVVEVfVFlQRTsKLSAgICAgICAgICAgIGlmICh0eXBlLm9yZGVyZWQoKSAhPSBTY2hlbWFUeXBlLlVOT1JERVJFRCkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX09SREVSRUQ7Ci0gICAgICAgICAgICBpZiAodHlwZS5vcmRlcmVkKCkgPT0gU2NoZW1hVHlwZS5UT1RBTF9PUkRFUikKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1RPVEFMX09SREVSOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNCb3VuZGVkKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19CT1VOREVEOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNGaW5pdGUoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0ZJTklURTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzTnVtZXJpYygpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfTlVNRVJJQzsKLSAgICAgICAgICAgIGlmICh0eXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1NUUklOR0VOVU07Ci0gICAgICAgICAgICBpZiAoKChTY2hlbWFUeXBlSW1wbCl0eXBlKS5pc1VuaW9uT2ZMaXN0cygpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfVU5JT05fT0ZfTElTVFM7Ci0gICAgICAgICAgICBpZiAodHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0hBU19QQVRURVJOOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNPcmRlclNlbnNpdGl2ZSgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfT1JERVJfU0VOU0lUSVZFOwotCi0gICAgICAgICAgICBpZiAodHlwZS5ibG9ja0V4dGVuc2lvbigpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQkxPQ0tfRVhUOwotICAgICAgICAgICAgaWYgKHR5cGUuYmxvY2tSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQkxPQ0tfUkVTVDsKLSAgICAgICAgICAgIGlmICh0eXBlLmZpbmFsRXh0ZW5zaW9uKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5BTF9FWFQ7Ci0gICAgICAgICAgICBpZiAodHlwZS5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5BTF9FWFQ7Ci0gICAgICAgICAgICBpZiAodHlwZS5maW5hbExpc3QoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0ZJTkFMX0xJU1Q7Ci0gICAgICAgICAgICBpZiAodHlwZS5maW5hbFVuaW9uKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5BTF9VTklPTjsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQWJzdHJhY3QoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0FCU1RSQUNUOwotCi0gICAgICAgICAgICB3cml0ZUludChmbGFncyk7Ci0KLSAgICAgICAgICAgIGlmICghdHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuZ2V0Q29udGVudFR5cGUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgTW9kZWwgVGFibGUKLSAgICAgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhdHRyTW9kZWwgPSB0eXBlLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBhdHRycyA9IGF0dHJNb2RlbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGF0dHJzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVEYXRhKGF0dHJzW2ldKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWVTZXQoYXR0ck1vZGVsLmdldFdpbGRjYXJkU2V0KCkpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYXR0ck1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpKTsKLQotICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBQcm9wZXJ0eSBUYWJsZQotICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gYXR0clByb3BlcnRpZXMgPSB0eXBlLmdldEF0dHJpYnV0ZVByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGF0dHJQcm9wZXJ0aWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyUHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eURhdGEoYXR0clByb3BlcnRpZXNbaV0pOwotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCB8fAotICAgICAgICAgICAgICAgICAgICB0eXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGVudCBNb2RlbCBUcmVlCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5oYXNBbGxDb250ZW50KCkgPyAxIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldENvbnRlbnRNb2RlbCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IG5ldyBTY2hlbWFQYXJ0aWNsZVtdIHsgdHlwZS5nZXRDb250ZW50TW9kZWwoKSB9OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IG5ldyBTY2hlbWFQYXJ0aWNsZVswXTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZVBhcnRpY2xlQXJyYXkocGFydHMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgUHJvcGVydHkgVGFibGUKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wZXJ0aWVzID0gdHlwZS5nZXRFbGVtZW50UHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGVsdFByb3BlcnRpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbHRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eURhdGEoZWx0UHJvcGVydGllc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZS5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKTsKLQotICAgICAgICAgICAgICAgIGludCBmYWNldENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBTY2hlbWFUeXBlLkxBU1RfRkFDRVQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0RmFjZXQoaSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0Q291bnQrKzsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGZhY2V0Q291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IFNjaGVtYVR5cGUuTEFTVF9GQUNFVDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBmYWNldCA9IHR5cGUuZ2V0RmFjZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuaXNGYWNldEZpeGVkKGkpID8gMSA6IDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldFdoaXRlU3BhY2VSdWxlKCkpOwotCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gcGF0dGVybnMgPSAoKFNjaGVtYVR5cGVJbXBsKXR5cGUpLmdldFBhdHRlcm5FeHByZXNzaW9ucygpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQocGF0dGVybnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhwYXR0ZXJuc1tpXS5nZXRQYXR0ZXJuKCkpOwotCi0gICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIGVudW1WYWx1ZXMgPSB0eXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgwKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGVudW1WYWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFsdWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChlbnVtVmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBuZXcgZm9yIHZlcnNpb24gMi4zCi0gICAgICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUuZ2V0QmFzZUVudW1UeXBlKCkpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGVudHJpZXMgPSB0eXBlLmdldFN0cmluZ0VudW1FbnRyaWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoZW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGVudHJpZXNbaV0uZ2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChlbnRyaWVzW2ldLmdldEludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW50KHR5cGUuZ2V0RGVjaW1hbFNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldExpc3RJdGVtVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZUFycmF5KHR5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVTdHJpbmcodHlwZS5nZXRTb3VyY2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWFkRXh0ZW5zaW9uc0xpc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGFzc2VydCBjb3VudCA9PSAwOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSByZWFkQXR0cmlidXRlRGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCByZXN1bHQgPSBuZXcgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsKCk7Ci0gICAgICAgICAgICBsb2FkQXR0cmlidXRlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsb2FkTW9kZWxHcm91cChTY2hlbWFNb2RlbEdyb3VwSW1wbCByZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5pbml0KHJlYWRRTmFtZSgpLCByZWFkU3RyaW5nKCksIHJlYWRTaG9ydCgpID09IDEsIGF0TGVhc3QoMiwgMTUsIDApID8gcmVhZFNob3J0KCkgPT0gMSA6IGZhbHNlLCBHcm91cERvY3VtZW50LkZhY3RvcnkucGFyc2UoIHJlYWRTdHJpbmcoKSApLmdldEdyb3VwKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGxvYWRBdHRyaWJ1dGVHcm91cChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuaW5pdCggcmVhZFFOYW1lKCksIHJlYWRTdHJpbmcoKSwgcmVhZFNob3J0KCkgPT0gMSwgYXRMZWFzdCgyLCAxNSwgMCkgPyByZWFkU2hvcnQoKSA9PSAxIDogZmFsc2UsIEF0dHJpYnV0ZUdyb3VwRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSggcmVhZFN0cmluZygpICkuZ2V0QXR0cmlidXRlR3JvdXAoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbG9hZEF0dHJpYnV0ZShTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBuYW1lLCB0eXBlLCB1c2UsIGRlZnRleHQsIGRlZnZhbCwgZml4ZWQsIHNvYXBhcnJheXR5cGUKLSAgICAgICAgICAgIHJlc3VsdC5pbml0KHJlYWRRTmFtZSgpLCByZWFkVHlwZVJlZigpLCByZWFkU2hvcnQoKSwgcmVhZFN0cmluZygpLCBudWxsLCBhdExlYXN0KDIsIDE2LCAwKSA/IHJlYWRYbWxWYWx1ZU9iamVjdCgpIDogbnVsbCwgcmVhZFNob3J0KCkgPT0gMSwgcmVhZFNPQVBBcnJheVR5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlQXR0cmlidXRlRGF0YShTY2hlbWFMb2NhbEF0dHJpYnV0ZSBhdHRyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZShhdHRyLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGF0dHIuZ2V0VXNlKCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcoYXR0ci5nZXREZWZhdWx0VGV4dCgpKTsKLSAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QoYXR0ci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGF0dHIuaXNGaXhlZCgpID8gMSA6IDApOwotICAgICAgICAgICAgd3JpdGVTT0FQQXJyYXlUeXBlKCgoU2NoZW1hV1NETEFycmF5VHlwZSlhdHRyKS5nZXRXU0RMQXJyYXlUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUlkQ29uc3RyYWludERhdGEoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVRTmFtZShpZGMuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoaWRjLmdldENvbnN0cmFpbnRDYXRlZ29yeSgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKGlkYy5nZXRTZWxlY3RvcigpKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gZmllbGRzID0gaWRjLmdldEZpZWxkcygpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChmaWVsZHMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoZmllbGRzW2ldKTsKLQotCi0gICAgICAgICAgICBpZiAoaWRjLmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpCi0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoaWRjLmdldFJlZmVyZW5jZWRLZXkoKSk7Ci0KLSAgICAgICAgICAgIFNldCBtYXBwaW5ncyA9IGlkYy5nZXROU01hcCgpLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KG1hcHBpbmdzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWFwcGluZ3MuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZyllLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhwcmVmaXgpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKHVyaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcmVhZFBhcnRpY2xlQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFQYXJ0aWNsZVtyZWFkU2hvcnQoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZWFkUGFydGljbGVEYXRhKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVBhcnRpY2xlQXJyYXkoU2NoZW1hUGFydGljbGVbXSBzcGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoc3BhLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB3cml0ZVBhcnRpY2xlRGF0YShzcGFbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGUgcmVhZFBhcnRpY2xlRGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IHBhcnRpY2xlVHlwZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIHJlc3VsdDsKLSAgICAgICAgICAgIGlmIChwYXJ0aWNsZVR5cGUgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYUxvY2FsRWxlbWVudEltcGwoKTsKLSAgICAgICAgICAgIGxvYWRQYXJ0aWNsZShyZXN1bHQsIHBhcnRpY2xlVHlwZSwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbG9hZFBhcnRpY2xlKFNjaGVtYVBhcnRpY2xlSW1wbCByZXN1bHQsIGludCBwYXJ0aWNsZVR5cGUsIGJvb2xlYW4gZ2xvYmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG9ydCBwYXJ0aWNsZUZsYWdzID0gcmVhZFNob3J0KCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRQYXJ0aWNsZVR5cGUocGFydGljbGVUeXBlKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRNaW5PY2N1cnMocmVhZEJpZ0ludGVnZXIoKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TWF4T2NjdXJzKHJlYWRCaWdJbnRlZ2VyKCkpOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0VHJhbnNpdGlvblJ1bGVzKHJlYWRRTmFtZVNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9TS0lQUEFCTEUpICE9IDApOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRTZXQocmVhZFFOYW1lU2V0KCkpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRQcm9jZXNzKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgbHJlc3VsdCA9IChTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKXJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXROYW1lQW5kVHlwZVJlZihyZWFkUU5hbWUoKSwgcmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0RGVmYXVsdChyZWFkU3RyaW5nKCksIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0ZJWEVEKSAhPSAwLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTYsIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXREZWZhdWx0VmFsdWUocmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldE5pbGxhYmxlKChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX05JTExBQkxFKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXRCbG9jaygocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9CTE9DS0VYVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9CTE9DS1JFU1QpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tTVUJTVCkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0V3NkbEFycmF5VHlwZShyZWFkU09BUEFycmF5VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXRBYnN0cmFjdCgocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9BQlNUUkFDVCkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGdyZXN1bHQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpbHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZXN1bHQuc2V0RmluYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfRklOQUxFWFQpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfRklOQUxSRVNUKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTcsIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXN1bHQuc2V0U3Vic3RpdHV0aW9uR3JvdXAoKFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKXJlYWRIYW5kbGUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHN1YnN0R3JvdXBDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdEdyb3VwQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVzdWx0LmFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKHJlYWRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbXSBpZGNzID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbcmVhZFNob3J0KCldOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGlkY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgaWRjc1tpXSA9IChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKXJlYWRIYW5kbGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldElkZW50aXR5Q29uc3RyYWludHMoaWRjcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0UGFydGljbGVDaGlsZHJlbihyZWFkUGFydGljbGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHBhcnRpY2xlIHR5cGUgIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uQkFEX1BBUlRJQ0xFX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVBhcnRpY2xlRGF0YShTY2hlbWFQYXJ0aWNsZSBwYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpOwotICAgICAgICAgICAgc2hvcnQgZmxhZ3MgPSAwOwotICAgICAgICAgICAgaWYgKHBhcnQuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfU0tJUFBBQkxFOwotICAgICAgICAgICAgaWYgKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnQgbHBhcnQgPSAoU2NoZW1hTG9jYWxFbGVtZW50KXBhcnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0ZJWEVEOwotICAgICAgICAgICAgICAgIGlmIChscGFydC5pc05pbGxhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9OSUxMQUJMRTsKLSAgICAgICAgICAgICAgICBpZiAobHBhcnQuYmxvY2tFeHRlbnNpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0JMT0NLRVhUOwotICAgICAgICAgICAgICAgIGlmIChscGFydC5ibG9ja1Jlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9CTE9DS1JFU1Q7Ci0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmJsb2NrU3Vic3RpdHV0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9CTE9DS1NVQlNUOwotICAgICAgICAgICAgICAgIGlmIChscGFydC5pc0Fic3RyYWN0KCkpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9BQlNUUkFDVDsKLQotICAgICAgICAgICAgICAgIGlmIChscGFydCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGdwYXJ0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnQpbHBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncGFydC5maW5hbEV4dGVuc2lvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0ZJTkFMRVhUOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ3BhcnQuZmluYWxSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0ZJTkFMUkVTVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGZsYWdzKTsKLSAgICAgICAgICAgIHdyaXRlQmlnSW50ZWdlcihwYXJ0LmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIHdyaXRlQmlnSW50ZWdlcihwYXJ0LmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWVTZXQocGFydC5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lU2V0KHBhcnQuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQocGFydC5nZXRXaWxkY2FyZFByb2Nlc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnQgbHBhcnQgPSAoU2NoZW1hTG9jYWxFbGVtZW50KXBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKGxwYXJ0LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGxwYXJ0LmdldERlZmF1bHRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KGxwYXJ0LmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTT0FQQXJyYXlUeXBlKCgoU2NoZW1hV1NETEFycmF5VHlwZSlscGFydCkuZ2V0V1NETEFycmF5VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwYXJ0IGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBncGFydCA9IChTY2hlbWFHbG9iYWxFbGVtZW50KWxwYXJ0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShncGFydC5zdWJzdGl0dXRpb25Hcm91cCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWVbXSBzdWJzdEdyb3VwTWVtYmVycyA9IGdwYXJ0LnN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChzdWJzdEdyb3VwTWVtYmVycy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdEdyb3VwTWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKHN1YnN0R3JvdXBNZW1iZXJzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGlkY3MgPSBscGFydC5nZXRJZGVudGl0eUNvbnN0cmFpbnRzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChpZGNzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGlkY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoaWRjc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVBhcnRpY2xlQXJyYXkocGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgcGFydGljbGUgdHlwZSAiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfUEFSVElDTEVfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFQcm9wZXJ0eSByZWFkUHJvcGVydHlEYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHByb3AgPSBuZXcgU2NoZW1hUHJvcGVydHlJbXBsKCk7Ci0gICAgICAgICAgICBwcm9wLnNldE5hbWUocmVhZFFOYW1lKCkpOwotICAgICAgICAgICAgcHJvcC5zZXRUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgc2hvcnQgcHJvcGZsYWdzID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBwcm9wLnNldEF0dHJpYnV0ZSgocHJvcGZsYWdzICYgRkxBR19QUk9QX0lTQVRUUikgIT0gMCk7Ci0gICAgICAgICAgICBwcm9wLnNldENvbnRhaW5lclR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldE1pbk9jY3VycyhyZWFkQmlnSW50ZWdlcigpKTsKLSAgICAgICAgICAgIHByb3Auc2V0TWF4T2NjdXJzKHJlYWRCaWdJbnRlZ2VyKCkpOwotICAgICAgICAgICAgcHJvcC5zZXROaWxsYWJsZShyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldERlZmF1bHQocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgcHJvcC5zZXRGaXhlZChyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldERlZmF1bHRUZXh0KHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIHByb3Auc2V0SmF2YVByb3BlcnR5TmFtZShyZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgcHJvcC5zZXRKYXZhVHlwZUNvZGUocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgcHJvcC5zZXRFeHRlbmRzSmF2YShyZWFkVHlwZVJlZigpLAotICAgICAgICAgICAgICAgICAgICAocHJvcGZsYWdzICYgRkxBR19QUk9QX0pBVkFTSU5HTEVUT04pICE9IDAsCi0gICAgICAgICAgICAgICAgICAgIChwcm9wZmxhZ3MgJiBGTEFHX1BST1BfSkFWQU9QVElPTkFMKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAocHJvcGZsYWdzICYgRkxBR19QUk9QX0pBVkFBUlJBWSkgIT0gMCk7Ci0gICAgICAgICAgICBwcm9wLnNldEphdmFTZXR0ZXJEZWxpbWl0ZXIocmVhZFFOYW1lU2V0KCkpOwotICAgICAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTYsIDApKQotICAgICAgICAgICAgICAgIHByb3Auc2V0RGVmYXVsdFZhbHVlKHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLQotICAgICAgICAgICAgaWYgKCFwcm9wLmlzQXR0cmlidXRlKCkgJiYgYXRMZWFzdCgyLCAxNywgMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hvcnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIExpbmtlZEhhc2hTZXQgcW5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQoc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2l6ZSA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgcW5hbWVzLmFkZChyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcHJvcC5zZXRBY2NlcHRlZE5hbWVzKHFuYW1lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIHByb3A7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUHJvcGVydHlEYXRhKFNjaGVtYVByb3BlcnR5IHByb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUocHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlKHByb3AuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoKHByb3AuaXNBdHRyaWJ1dGUoKSA/IEZMQUdfUFJPUF9JU0FUVFIgOiAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkgPyBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTiA6IDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHByb3AuZXh0ZW5kc0phdmFPcHRpb24oKSA/IEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgOiAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChwcm9wLmV4dGVuZHNKYXZhQXJyYXkoKSA/IEZMQUdfUFJPUF9KQVZBQVJSQVkgOiAwKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUocHJvcC5nZXRDb250YWluZXJUeXBlKCkpOwotICAgICAgICAgICAgd3JpdGVCaWdJbnRlZ2VyKHByb3AuZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgd3JpdGVCaWdJbnRlZ2VyKHByb3AuZ2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChwcm9wLmhhc05pbGxhYmxlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChwcm9wLmhhc0RlZmF1bHQoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHByb3AuaGFzRml4ZWQoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhwcm9wLmdldERlZmF1bHRUZXh0KCkpOwotCi0gICAgICAgICAgICB3cml0ZVN0cmluZyhwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHByb3AuZ2V0SmF2YVR5cGVDb2RlKCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlKHByb3AuamF2YUJhc2VkT25UeXBlKCkpOwotICAgICAgICAgICAgd3JpdGVRTmFtZVNldChwcm9wLmdldEphdmFTZXR0ZXJEZWxpbWl0ZXIoKSk7Ci0gICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KHByb3AuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0gICAgICAgICAgICBpZiAoISBwcm9wLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWVbXSBuYW1lcyA9IHByb3AuYWNjZXB0ZWROYW1lcygpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQobmFtZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBuYW1lcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobmFtZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZU1vZGVsR3JvdXBEYXRhKFNjaGVtYU1vZGVsR3JvdXAgZ3JwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBpbXBsID0gKFNjaGVtYU1vZGVsR3JvdXBJbXBsKWdycDsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUoaW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcoaW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCA/IDEgOiAwKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoaW1wbC5pc1JlZGVmaW5pdGlvbigpID8gMSA6IDApOyAvLyBuZXcgZm9yIHZlcnNpb24gMi4xNQotICAgICAgICAgICAgd3JpdGVTdHJpbmcoaW1wbC5nZXRQYXJzZU9iamVjdCgpLnhtbFRleHQobmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlT3V0ZXIoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUF0dHJpYnV0ZUdyb3VwRGF0YShTY2hlbWFBdHRyaWJ1dGVHcm91cCBncnApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBpbXBsID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClncnA7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKGltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKGltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChpbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwgPyAxIDogMCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGltcGwuaXNSZWRlZmluaXRpb24oKSA/IDEgOiAwKTsgLy8gbmV3IGZvciB2ZXJzaW9uIDIuMTUKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKGltcGwuZ2V0UGFyc2VPYmplY3QoKS54bWxUZXh0KG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZU91dGVyKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbFZhbHVlUmVmIHJlYWRYbWxWYWx1ZU9iamVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYgPSByZWFkVHlwZVJlZigpOwotICAgICAgICAgICAgaWYgKHR5cGVyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGludCBidGMgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIG51bGwpOwotICAgICAgICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodmFsdWVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgcmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHJlYWRCeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgcmVhZFFOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCBuZXcgRG91YmxlKHJlYWREb3VibGUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVhtbFZhbHVlT2JqZWN0KFhtbEFueVNpbXBsZVR5cGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUuc2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGUgaVR5cGUgPSAoKFNpbXBsZVZhbHVlKXZhbHVlKS5pbnN0YW5jZVR5cGUoKTsKLSAgICAgICAgICAgIGlmIChpVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoLTEpOwotICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gKChYbWxPYmplY3RCYXNlKXZhbHVlKS54Z2V0TGlzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh2YWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QoKFhtbEFueVNpbXBsZVR5cGUpaS5uZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYnRjID0gaVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYnRjKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnl0ZUFycmF5KCgoU2ltcGxlVmFsdWUpdmFsdWUpLmdldEJ5dGVBcnJheVZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoKChTaW1wbGVWYWx1ZSl2YWx1ZSkuZ2V0UU5hbWVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURvdWJsZSgoKFNpbXBsZVZhbHVlKXZhbHVlKS5nZXRGbG9hdFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURvdWJsZSgoKFNpbXBsZVZhbHVlKXZhbHVlKS5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRvdWJsZSByZWFkRG91YmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5yZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LndyaXRlRG91YmxlKGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lU2V0IHJlYWRRTmFtZVNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IGZsYWcgPSByZWFkU2hvcnQoKTsKLQotICAgICAgICAgICAgU2V0IHVyaVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBzaG9ydCB1cmlDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIHVyaVNldC5hZGQocmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgU2V0IHFuYW1lU2V0MSA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBzaG9ydCBxbmNvdW50MSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmNvdW50MTsgaSsrKQotICAgICAgICAgICAgICAgIHFuYW1lU2V0MS5hZGQocmVhZFFOYW1lKCkpOwotCi0gICAgICAgICAgICBTZXQgcW5hbWVTZXQyID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIHNob3J0IHFuY291bnQyID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuY291bnQyOyBpKyspCi0gICAgICAgICAgICAgICAgcW5hbWVTZXQyLmFkZChyZWFkUU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChmbGFnID09IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHModXJpU2V0LCBudWxsLCBxbmFtZVNldDEsIHFuYW1lU2V0Mik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHMobnVsbCwgdXJpU2V0LCBxbmFtZVNldDIsIHFuYW1lU2V0MSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUU5hbWVTZXQoUU5hbWVTZXQgc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGludmVydCA9IChzZXQuZXhjbHVkZWRVUklzKCkgIT0gbnVsbCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGludmVydCA/IDEgOiAwKTsKLQotICAgICAgICAgICAgU2V0IHVyaVNldCA9IGludmVydCA/IHNldC5leGNsdWRlZFVSSXMoKSA6IHNldC5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQodXJpU2V0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1cmlTZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygoU3RyaW5nKWkubmV4dCgpKTsKLQotICAgICAgICAgICAgU2V0IHFuYW1lU2V0MSA9IGludmVydCA/IHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkgOiBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChxbmFtZVNldDEuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHFuYW1lU2V0MS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoKFFOYW1lKWkubmV4dCgpKTsKLQotICAgICAgICAgICAgU2V0IHFuYW1lU2V0MiA9IGludmVydCA/IHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkgOiBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChxbmFtZVNldDIuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHFuYW1lU2V0Mi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoKFFOYW1lKWkubmV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSByZWFkQnl0ZUFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hvcnQgbGVuID0gX2lucHV0LnJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5dOwotICAgICAgICAgICAgICAgIF9pbnB1dC5yZWFkRnVsbHkocmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KGJ5dGVbXSBiYSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChiYS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9vdXRwdXQud3JpdGUoYmEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBCaWdJbnRlZ2VyIHJlYWRCaWdJbnRlZ2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHJlYWRCeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAxICYmIHJlc3VsdFswXSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAxICYmIHJlc3VsdFswXSA9PSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUJpZ0ludGVnZXIoQmlnSW50ZWdlciBiaSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJpID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJpLnNpZ251bSgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVCeXRlQXJyYXkoU0lOR0xFX1pFUk9fQllURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVCeXRlQXJyYXkoYmkudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBieXRlW10gU0lOR0xFX1pFUk9fQllURSA9IG5ldyBieXRlW10geyAoYnl0ZSkwIH07Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9ySGFuZGxlKFN0cmluZyBoYW5kbGUpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKF9yZXNvbHZlZEhhbmRsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfcmVzb2x2ZWRIYW5kbGVzLmdldChoYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckNsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVmID0gKFNjaGVtYVR5cGUuUmVmKV90eXBlUmVmc0J5Q2xhc3NuYW1lLmdldChjbGFzc25hbWUpOwotICAgICAgICByZXR1cm4gKHJlZiAhPSBudWxsKSA/IHJlZi5nZXQoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudCByZXNvbHZlSGFuZGxlKFN0cmluZyBoYW5kbGUpCi0gICAgewotICAgICAgICBTY2hlbWFDb21wb25lbnQgcmVzdWx0OwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoX3Jlc29sdmVkSGFuZGxlcykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUNvbXBvbmVudClfcmVzb2x2ZWRIYW5kbGVzLmdldChoYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgWHNiUmVhZGVyIHJlYWRlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlLCAtMSk7Ci0gICAgICAgICAgICBpbnQgZmlsZXR5cGUgPSByZWFkZXIuZ2V0QWN0dWFsRmlsZXR5cGUoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZmlsZXR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFUWVBFOgotICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgdHlwZSBmb3IgaGFuZGxlICIgKyBoYW5kbGUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIuZmluaXNoTG9hZGluZ1R5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgZWxlbWVudCBmb3IgaGFuZGxlICIgKyBoYW5kbGUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIuZmluaXNoTG9hZGluZ0VsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBhdHRyaWJ1dGUgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdBdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQOgotICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgbW9kZWwgZ3JvdXAgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdNb2RlbEdyb3VwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBhdHRyaWJ1dGUgZ3JvdXAgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdBdHRyaWJ1dGVHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVDoKLSAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGlkIGNvbnN0cmFpbnQgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdJZGVudGl0eUNvbnN0cmFpbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSWxsZWdhbCBoYW5kbGUgdHlwZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKF9yZXNvbHZlZEhhbmRsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFfcmVzb2x2ZWRIYW5kbGVzLmNvbnRhaW5zS2V5KGhhbmRsZSkpCi0gICAgICAgICAgICAgICAgICAgIF9yZXNvbHZlZEhhbmRsZXMucHV0KGhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFDb21wb25lbnQpX3Jlc29sdmVkSGFuZGxlcy5nZXQoaGFuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgTWFwIF9yZXNvbHZlZEhhbmRsZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBfYWxsTm9uR3JvdXBIYW5kbGVzUmVzb2x2ZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoKQotICAgIHsKLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2ZSBjYWxsZWQgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAwKTsKLSAgICAgICAgaWYgKF9hbGxOb25Hcm91cEhhbmRsZXNSZXNvbHZlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgYWxsIGhhbmRsZXMgZm9yIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgMSk7Ci0KLSAgICAgICAgTGlzdCByZWZzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZWZzLmFkZEFsbChfZ2xvYmFsRWxlbWVudHMudmFsdWVzKCkpOwotICAgICAgICByZWZzLmFkZEFsbChfZ2xvYmFsQXR0cmlidXRlcy52YWx1ZXMoKSk7Ci0gICAgICAgIHJlZnMuYWRkQWxsKF9nbG9iYWxUeXBlcy52YWx1ZXMoKSk7Ci0gICAgICAgIHJlZnMuYWRkQWxsKF9kb2N1bWVudFR5cGVzLnZhbHVlcygpKTsKLSAgICAgICAgcmVmcy5hZGRBbGwoX2F0dHJpYnV0ZVR5cGVzLnZhbHVlcygpKTsKLSAgICAgICAgcmVmcy5hZGRBbGwoX2lkZW50aXR5Q29uc3RyYWludHMudmFsdWVzKCkpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlZnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50LlJlZiByZWYgPSAoU2NoZW1hQ29tcG9uZW50LlJlZilpLm5leHQoKTsKLSAgICAgICAgICAgIHJlZi5nZXRDb21wb25lbnQoKTsgLy8gRm9yY2VzIHJlZiB0byBiZSByZXNvbHZlZAotICAgICAgICB9Ci0KLSAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiRmluaXNoZWQgcmVzb2x2aW5nIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgLTEpOwotICAgICAgICBfYWxsTm9uR3JvdXBIYW5kbGVzUmVzb2x2ZWQgPSB0cnVlOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VEZWZpbmVkKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX25hbWVzcGFjZXMuY29udGFpbnMobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZFR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hVHlwZS5SZWYpX2dsb2JhbFR5cGVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZERvY3VtZW50VHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlLlJlZilfZG9jdW1lbnRUeXBlcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRBdHRyaWJ1dGVUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUuUmVmKV9hdHRyaWJ1dGVUeXBlcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIGZpbmRFbGVtZW50UmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKV9nbG9iYWxFbGVtZW50cy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKV9nbG9iYWxBdHRyaWJ1dGVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZmluZE1vZGVsR3JvdXBSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hTW9kZWxHcm91cC5SZWYpX21vZGVsR3JvdXBzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIGZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYpX2F0dHJpYnV0ZUdyb3Vwcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgZmluZElkZW50aXR5Q29uc3RyYWludFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKV9pZGVudGl0eUNvbnN0cmFpbnRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGdsb2JhbFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZ2xvYmFsVHlwZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfZ2xvYmFsVHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZ2xvYmFsVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZS5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gcmVkZWZpbmVkR2xvYmFsVHlwZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZWRlZmluZWRHbG9iYWxUeXBlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW19yZWRlZmluZWRHbG9iYWxUeXBlcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9yZWRlZmluZWRHbG9iYWxUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFNvdXJjZUFzU3RyZWFtKFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCFzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgICAgIHNvdXJjZU5hbWUgPSAiLyIgKyBzb3VyY2VOYW1lOwotCi0gICAgICAgIHJldHVybiBfcmVzb3VyY2VMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic2NoZW1hL3NyYyIgKyBzb3VyY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9kb2N1bWVudFR5cGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVF9BUlJBWTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX2RvY3VtZW50VHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZG9jdW1lbnRUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBhdHRyaWJ1dGVUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX2F0dHJpYnV0ZVR5cGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVF9BUlJBWTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX2F0dHJpYnV0ZVR5cGVzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2F0dHJpYnV0ZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZ2xvYmFsRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0dFX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSByZXN1bHQgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudFtfZ2xvYmFsRWxlbWVudHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZ2xvYmFsRWxlbWVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZ2xvYmFsQXR0cmlidXRlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfR0FfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gcmVzdWx0ID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtfZ2xvYmFsQXR0cmlidXRlcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9nbG9iYWxBdHRyaWJ1dGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwW10gbW9kZWxHcm91cHMoKQotICAgIHsKLSAgICAgICAgaWYgKF9tb2RlbEdyb3Vwcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfTUdfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hTW9kZWxHcm91cFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwW19tb2RlbEdyb3Vwcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9tb2RlbEdyb3Vwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFNb2RlbEdyb3VwLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXBbXSByZWRlZmluZWRNb2RlbEdyb3VwcygpCi0gICAgewotICAgICAgICBpZiAoX3JlZGVmaW5lZE1vZGVsR3JvdXBzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9NR19BUlJBWTsKLQotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwW10gcmVzdWx0ID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBbX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYU1vZGVsR3JvdXAuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBhdHRyaWJ1dGVHcm91cHMoKQotICAgIHsKLSAgICAgICAgaWYgKF9hdHRyaWJ1dGVHcm91cHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0FHX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gcmVzdWx0ID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwW19hdHRyaWJ1dGVHcm91cHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfYXR0cmlidXRlR3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9BR19BUlJBWTsKLQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBpZGVudGl0eUNvbnN0cmFpbnRzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaWRlbnRpdHlDb25zdHJhaW50cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfSUNfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gcmVzdWx0ID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtfaWRlbnRpdHlDb25zdHJhaW50cy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pZGVudGl0eUNvbnN0cmFpbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2NsYXNzbG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgSU5URVJOQUxMWSBPTkxZIGJ5IHRoZSBjb2RlIGdlbmVyYXRvciBBRlRFUiB0aGUgdHlwZSBzeXN0ZW0gaGFzCi0gICAgICogYmVlbiBzYXZlZCBhbmQgYSBoYW5kbGUgaGFzIGJlZW4gZXN0YWJsaXNoZWQgZm9yIGVhY2ggdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGhhbmRsZUZvclR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yVHlwZSh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW1Gb3JOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9uYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoX25hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlVmlzaXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyMjgxNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlVmlzaXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoaXMgc3RhdGUgbWFjaGluZSB2YWxpZGF0ZXMgZWxlbWVudCBvcmRlciBiYXNlZCBvbiBhIGRldGVybWluaXN0aWMKLSAqIGNvbnRlbnQgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFUeXBlVmlzaXRvckltcGwgaW1wbGVtZW50cyBUeXBlU3RvcmVWaXNpdG9yCi17Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGl0IGJ5IHBhc3NpbmcgdGhlIHJvb3Qgb2YgdGhlIGNvbnRlbnQgbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVWaXNpdG9ySW1wbChTY2hlbWFQYXJ0aWNsZSBwYXJ0KQotICAgIHsKLSAgICAgICAgaW5pdChwYXJ0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKCkKLSAgICB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgewotICAgICAgICBpZiAoX3N0YWNrID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdGFjayA9IGV4cGFuZChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoX3JvbGxiYWNrID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yb2xsYmFjayA9IGV4cGFuZChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9zdGFja1NpemUgPSAwOwotICAgICAgICBfcm9sbGJhY2tTaXplID0gMDsKLQotICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoKHBhcnQpOwotICAgICAgICAgICAgX3JvbGxiYWNrSW5kZXggPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZpc2l0b3JTdGF0ZVtdIGV4cGFuZChWaXNpdG9yU3RhdGVbXSBvcmlnKQotICAgIHsKLSAgICAgICAgaW50IG5ld3NpemUgPSAob3JpZyA9PSBudWxsID8gNCA6IG9yaWcubGVuZ3RoICogMik7Ci0gICAgICAgIFZpc2l0b3JTdGF0ZVtdIHJlc3VsdCA9IG5ldyBWaXNpdG9yU3RhdGVbbmV3c2l6ZV07Ci0gICAgICAgIGlmIChvcmlnICE9IG51bGwpCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWcsIDAsIHJlc3VsdCwgMCwgb3JpZy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gKG9yaWcgPT0gbnVsbCA/IDAgOiBvcmlnLmxlbmd0aCk7IGkgPCBuZXdzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBWaXNpdG9yU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIFZpc2l0b3JTdGF0ZVtdIF9zdGFjazsKLSAgICBwcml2YXRlIFZpc2l0b3JTdGF0ZVtdIF9yb2xsYmFjazsKLSAgICBpbnQgX3N0YWNrU2l6ZTsKLSAgICBpbnQgX3JvbGxiYWNrU2l6ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzVmFsaWQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFQYXJ0aWNsZSBfbWF0Y2hlZFBhcnRpY2xlOwotICAgIHByaXZhdGUgVmlzaXRvclN0YXRlIF90b3A7Ci0gICAgcHJpdmF0ZSBpbnQgX3JvbGxiYWNrSW5kZXg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWaXNpdG9yU3RhdGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNvcHkoVmlzaXRvclN0YXRlIG9yaWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJQYXJ0ID0gb3JpZy5fY3VyUGFydDsKLSAgICAgICAgICAgIF9jdXJDb3VudCA9IG9yaWcuX2N1ckNvdW50OwotICAgICAgICAgICAgX2N1ck1pbiA9IG9yaWcuX2N1ck1pbjsKLSAgICAgICAgICAgIF9jdXJNYXggPSBvcmlnLl9jdXJNYXg7Ci0gICAgICAgICAgICBfcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IG9yaWcuX3Byb2Nlc3NlZENoaWxkQ291bnQ7Ci0gICAgICAgICAgICBfY2hpbGRDb3VudCA9IG9yaWcuX2NoaWxkQ291bnQ7Ci0gICAgICAgICAgICBfc2VlbiA9IG9yaWcuX3NlZW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbml0KFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJQYXJ0ID0gcGFydDsKLSAgICAgICAgICAgIF9jdXJNaW4gPSBwYXJ0LmdldEludE1pbk9jY3VycygpOwotICAgICAgICAgICAgX2N1ck1heCA9IHBhcnQuZ2V0SW50TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgICBfY3VyQ291bnQgPSAwOwotICAgICAgICAgICAgX3Byb2Nlc3NlZENoaWxkQ291bnQgPSAwOwotICAgICAgICAgICAgX2NoaWxkQ291bnQgPSBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7Ci0gICAgICAgICAgICBfc2VlbiA9IHBhcnQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBib29sZWFuW19jaGlsZENvdW50XSA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZSBfY3VyUGFydDsKLSAgICAgICAgaW50IF9jdXJDb3VudDsKLSAgICAgICAgaW50IF9jdXJNYXg7Ci0gICAgICAgIGludCBfY3VyTWluOwotICAgICAgICBpbnQgX3Byb2Nlc3NlZENoaWxkQ291bnQ7Ci0gICAgICAgIGludCBfY2hpbGRDb3VudDsKLSAgICAgICAgYm9vbGVhbltdIF9zZWVuOwotICAgIH0KLQotICAgIFZpc2l0b3JTdGF0ZSB0b3BSZWYoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdGFja1tfc3RhY2tTaXplIC0gMV07Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlQ29weShWaXNpdG9yU3RhdGUgcmVmKQotICAgIHsKLSAgICAgICAgaWYgKF9yb2xsYmFjay5sZW5ndGggPT0gX3JvbGxiYWNrU2l6ZSkKLSAgICAgICAgICAgIF9yb2xsYmFjayA9IGV4cGFuZChfcm9sbGJhY2spOwotCi0gICAgICAgIF9yb2xsYmFja1tfcm9sbGJhY2tTaXplXS5jb3B5KHJlZik7Ci0gICAgICAgIF9yb2xsYmFja1NpemUgKz0gMTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFBhcnRpY2xlKFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgewotICAgICAgICBpZiAoX3N0YWNrLmxlbmd0aCA9PSBfc3RhY2tTaXplKQotICAgICAgICAgICAgX3N0YWNrID0gZXhwYW5kKF9zdGFjayk7Ci0gICAgICAgIF9zdGFja1tfc3RhY2tTaXplXS5pbml0KHBhcnQpOwotICAgICAgICBfc3RhY2tTaXplICs9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlY29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQpCi0gICAgICogdG9wOiAgICAgIG51bGwgb3IgZGlzY2FyZGFibGUgZHVlIHRvIHBvcCBpbiBwcm9ncmVzcwotICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpIChlbXB0eSBhdCB0aGUgc3RhcnQgb2YgInZpc2l0IikKLSAgICAgKgotICAgICAqIFBvc3Rjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMykKLSAgICAgKiB0b3A6ICAgICAgRDQgPSBtdXRhYmxlIGNvcHkgb2YgUjQKLSAgICAgKiByb2xsYmFjayAgKFI4IFI3IFI2IFI1IFI0KQotICAgICAqLwotICAgIGJvb2xlYW4gcHJlcGFyZSgpCi0gICAgewotICAgICAgICBpZiAoX3JvbGxiYWNrSW5kZXggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX3RvcCA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBfdG9wID0gdG9wUmVmKCk7Ci0gICAgICAgIHNhdmVDb3B5KF90b3ApOwotICAgICAgICBfcm9sbGJhY2tJbmRleCA9IF9zdGFja1NpemUgLSAxOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENikKLSAgICAgKiB0b3A6ICAgICAgRDcKLSAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2IEQ3KQotICAgICAqIHRvcDogICAgICBEOCA9IG5ldyBzdGF0ZSBiYXNlZCBvbiBwYXJ0Ci0gICAgICogcm9sbGJhY2sgIChSOCBSNyBSNiBSNSkKLSAgICAgKi8KLSAgICB2b2lkIHB1c2goU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIGFkZFBhcnRpY2xlKHBhcnQpOwotICAgICAgICBfdG9wID0gdG9wUmVmKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlY29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYpCi0gICAgICogdG9wOiAgICAgIEQ3IGlzIGRpc2NhcmRhYmxlCi0gICAgICogcm9sbGJhY2s6IChSOCBSNyBSNiBSNSkKLSAgICAgKgotICAgICAqIFBvc3Rjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSkKLSAgICAgKiB0b3A6ICAgICAgRDYgKHNlZSBwcmVwYXJlIGluIGNhc2UgaXQncyBhbiBSIHN0YXRlKQotICAgICAqIHJvbGxiYWNrICAoUjggUjcgUjYgUjUpCi0gICAgICovCi0gICAgYm9vbGVhbiBwb3AoKQotICAgIHsKLSAgICAgICAgX3N0YWNrU2l6ZSAtPSAxOwotICAgICAgICBpZiAoX3N0YWNrU2l6ZSA8PSBfcm9sbGJhY2tJbmRleCkKLSAgICAgICAgICAgIHJldHVybiBwcmVwYXJlKCk7Ci0gICAgICAgIF90b3AgPSB0b3BSZWYoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlY29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYpCi0gICAgICogdG9wOiAgICAgIEQ3Ci0gICAgICogcm9sbGJhY2s6IChSOCBSNyBSNiBSNSkKLSAgICAgKgotICAgICAqIFBvc3Rjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENiBENykgLT4gYW5kIHJlbmFtZSB0byBEJ3MgdG8gUidzCi0gICAgICogdG9wOiAgICAgIG51bGwKLSAgICAgKiByb2xsYmFjayAgKCkKLSAgICAgKi8KLSAgICB2b2lkIGNvbW1pdCgpCi0gICAgewotICAgICAgICBfdG9wID0gbnVsbDsKLSAgICAgICAgX3JvbGxiYWNrSW5kZXggPSBfc3RhY2tTaXplOwotICAgICAgICBfcm9sbGJhY2tTaXplID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENikKLSAgICAgKiB0b3A6ICAgICAgRDcgaXMgZGlzY2FyZGFibGUKLSAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IFI1IFI2IFI3IFI4KQotICAgICAqIHRvcDogICAgICBudWxsCi0gICAgICogcm9sbGJhY2sgICgpCi0gICAgICovCi0gICAgdm9pZCByb2xsYmFjaygpCi0gICAgewotICAgICAgICB3aGlsZSAoX3JvbGxiYWNrU2l6ZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yb2xsYmFja1NpemUgLT0gMTsKLSAgICAgICAgICAgIFZpc2l0b3JTdGF0ZSB0ZW1wID0gX3N0YWNrW19yb2xsYmFja0luZGV4XTsKLSAgICAgICAgICAgIF9zdGFja1tfcm9sbGJhY2tJbmRleF0gPSBfcm9sbGJhY2tbX3JvbGxiYWNrU2l6ZV07Ci0gICAgICAgICAgICBfcm9sbGJhY2tbX3JvbGxiYWNrU2l6ZV0gPSB0ZW1wOwotICAgICAgICAgICAgX3JvbGxiYWNrSW5kZXggKz0gMTsKLSAgICAgICAgfQotICAgICAgICBfc3RhY2tTaXplID0gX3JvbGxiYWNrSW5kZXg7Ci0gICAgICAgIF90b3AgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gbm8gdmFsaWQgbmV4dCBzdGF0ZSBjYW4gYmUgZm91bmQsIHRoZW4gIm5vdFZhbGlkIgotICAgICAqIGlzIHJldHVybmVkLiBJdCByb2xscyBiYWNrIGFueSBjaGFuZ2VzIHRvIHRoZSBzdGF0ZQotICAgICAqIG1hY2hpbmUgc3RhY2ssIHNldHMgdG8gZmFsc2UgdGhlIHZhbGlkIGJpdCwgYW5kIGNsZWFycwotICAgICAqIHRoZSBtYXRjaGVkIGVsZW1lbnQgc3RhdGUgYmVmb3JlIHJldHVybmluZyBmYWxzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIG5vdFZhbGlkKCkKLSAgICB7Ci0gICAgICAgIF9pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIF9tYXRjaGVkUGFydGljbGUgPSBudWxsOwotICAgICAgICByb2xsYmFjaygpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBhIHZhbGlkIHN0YXRlIHRyYW5zaXRpb24gaGFzIGJlZW4gZG9uZSwgdGhlbiAib2siCi0gICAgICogaXMgcmV0dXJuZWQuIEl0IGNvbW1pdHMgdGhlIGNoYW5nZWQgc3RhdGUgbWFjaGluZSBzdGF0ZSwKLSAgICAgKiBzdG9yZXMgdGhlIG1hdGNoZWQgZWxlbWVudCBzdGF0ZSwgYW5kIHJldHVybnMgdHJ1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIG9rKFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgewotICAgICAgICBfbWF0Y2hlZFBhcnRpY2xlID0gcGFydDsKLSAgICAgICAgY29tbWl0KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qPT0gVklTSVRPUiBJTVBMRU1FTlRBVElPTiA9PSovCi0KLSAgICAvKioKLSAgICAgKiBUcmF2ZXJzZXMgYSBkZXRlcm1pbmlzdGljIGNvbnRlbnQgbW9kZWwsIGNoZWNraW5nIGZvcgotICAgICAqIHZhbGlkaXR5IGF0IGFueSBnaXZlbiBwb2ludC4KLSAgICAgKgotICAgICAqIENhbGwgdmlzaXQobnVsbCkgb25jZSBhdCB0aGUgZW5kIGlmIHlvdSdyZSBjaGVja2luZyBmb3IKLSAgICAgKiBjb21wbGV0ZSB2YWxpZGl0eSBvZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXQoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghcHJlcGFyZSgpKQotICAgICAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0KLSAgICAgICAgdHJhdmVyc2luZzogZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKF90b3AuX2N1ckNvdW50ID49IF90b3AuX2N1ck1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBvcCgpKQotICAgICAgICAgICAgICAgICAgICBicmVhayB0cmF2ZXJzaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtaW5tYXg6IHN3aXRjaCAoX3RvcC5fY3VyUGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfdG9wLl9jdXJQYXJ0LmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2soX3RvcC5fY3VyUGFydCk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghX3RvcC5fY3VyUGFydC5jYW5TdGFydFdpdGhFbGVtZW50KGVsdE5hbWUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fY3VyQ291bnQgPCBfdG9wLl9jdXJNaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBtaW5tYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9rKF90b3AuX2N1clBhcnQpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQ7IGkgPCBfdG9wLl9jaGlsZENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGNhbmRpZGF0ZSA9IF90b3AuX2N1clBhcnQuZ2V0UGFydGljbGVDaGlsZChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuY2FuU3RhcnRXaXRoRWxlbWVudChlbHROYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChjYW5kaWRhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyYXZlcnNpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50ICE9IDAgfHwgX3RvcC5fY3VyQ291bnQgPCBfdG9wLl9jdXJNaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3RWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF90b3AuX2NoaWxkQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY2FuZGlkYXRlID0gX3RvcC5fY3VyUGFydC5nZXRQYXJ0aWNsZUNoaWxkKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5jYW5TdGFydFdpdGhFbGVtZW50KGVsdE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b3AuX2N1ckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChjYW5kaWRhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyYXZlcnNpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF90b3AuX2N1ckNvdW50IDwgX3RvcC5fY3VyTWluICYmICFfdG9wLl9jdXJQYXJ0LmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlubWF4OwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHNraXBwZWQgPSBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50OwotICAgICAgICAgICAgICAgICAgICBhbGxzY2FuOiBmb3IgKGludCBpID0gMDsgaSA8IF90b3AuX2NoaWxkQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90b3AuX3NlZW5baV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgYWxsc2NhbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY2FuZGlkYXRlID0gX3RvcC5fY3VyUGFydC5nZXRQYXJ0aWNsZUNoaWxkKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5jYW5TdGFydFdpdGhFbGVtZW50KGVsdE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9wLl9zZWVuW2ldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNhbmRpZGF0ZS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZCA8IF90b3AuX2NoaWxkQ291bnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoX3RvcC5fc2VlbiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzb21lYm9keSBjYWxsZWQgImJyZWFrIG1pbm1heCIsIHNvIHBvcCBvdXQgb2YgbG9vcAotICAgICAgICAgICAgaWYgKCFwb3AoKSkKLSAgICAgICAgICAgICAgICBicmVhayB0cmF2ZXJzaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UndmUgY29tcGxldGVkIHRoZSBvdXRlcm1vc3QgbG9vcAotICAgICAgICBpZiAoZWx0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG9rKG51bGwpOwotCi0gICAgICAgIC8vIHRoaXMgbWVhbnMgd2UgaGF2ZSBleHRyYSBlbGVtZW50cyBhdCB0aGUgZW5kCi0gICAgICAgIHJldHVybiBub3RWYWxpZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgZWxlbWVudGZsYWdzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRfZWxlbWVudGZsYWdzKCkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyZW50UGFydGljbGUoKSA9PSBudWxsIHx8IGN1cnJlbnRQYXJ0aWNsZSgpLmdldFBhcnRpY2xlVHlwZSgpICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnQgZWx0ID0gKFNjaGVtYUxvY2FsRWxlbWVudCljdXJyZW50UGFydGljbGUoKTsKLQotICAgICAgICByZXR1cm4gKGVsdC5pc05pbGxhYmxlKCkgPyBUeXBlU3RvcmUuTklMTEFCTEUgOiAwKSB8Ci0gICAgICAgICAgICAgICAoZWx0LmlzRGVmYXVsdCgpID8gVHlwZVN0b3JlLkhBU0RFRkFVTFQgOiAwKSB8Ci0gICAgICAgICAgICAgICAoZWx0LmlzRml4ZWQoKSA/IFR5cGVTdG9yZS5GSVhFRCA6IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZGVmYXVsdCB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF90ZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyZW50UGFydGljbGUoKSA9PSBudWxsIHx8IGN1cnJlbnRQYXJ0aWNsZSgpLmdldFBhcnRpY2xlVHlwZSgpICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gKChTY2hlbWFMb2NhbEVsZW1lbnQpY3VycmVudFBhcnRpY2xlKCkpLmdldERlZmF1bHRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIGZpZWxkIGZvciB0aGlzIGZpZWxkLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkKCkgewotICAgICAgICBpZiAoY3VycmVudFBhcnRpY2xlKCkgaW5zdGFuY2VvZiBTY2hlbWFGaWVsZCkKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hRmllbGQpY3VycmVudFBhcnRpY2xlKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNjaGVtYSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVBhcnRpY2xlIGN1cnJlbnRQYXJ0aWNsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX21hdGNoZWRQYXJ0aWNsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudGlyZSBjb250ZW50IHVwIHRvIG5vdyBpcyB2YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbFZhbGlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaXNWYWxpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ2hlY2tlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4NWRhOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIFN0c2NDaGVja2VyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQWxsKCkKLSAgICB7Ci0gICAgICAgIC8vIHdhbGsgdGhlIHRyZWUgb2YgdHlwZXMKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5yZWRlZmluZWRHbG9iYWxUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKCFzdGF0ZS5ub1B2cigpICYmICAvLyBvcHRpb24gdG8gdHVybiBvZmYgcGFydGljbGUgcmVzdHJpY3Rpb24gY2hlY2tpbmcKLSAgICAgICAgICAgICAgICAhZ1R5cGUuaXNEb2N1bWVudFR5cGUoKSkgLy8gRG9uJ3QgY2hlY2sgZG9jIHR5cGVzIGZvciByZXN0cmljdGlvbi4gCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hlY2tSZXN0cmljdGlvbigoU2NoZW1hVHlwZUltcGwpZ1R5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tGaWVsZHMoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGVja1N1YnN0aXR1dGlvbkdyb3VwcyhzdGF0ZS5nbG9iYWxFbGVtZW50cygpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGNoZWNrcyBydWxlICM1IG9mIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3NzLWN0Ci0gICAgICogYXMgd2VsbCBhcyBhdHRyaWJ1dGUgKyBlbGVtZW50IGRlZmF1bHQvZml4ZWQgdmFsaWRpdHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrRmllbGRzKFNjaGVtYVR5cGVJbXBsIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IGxvY2F0aW9uID0gc1R5cGUuZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNBdHRyTW9kZWwgPSBzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOwotICAgICAgICBpZiAoc0F0dHJNb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIHNBdHRycyAgPSBzQXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIFFOYW1lIGlkQXR0ciA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNBdHRycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWG1sSUQudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHNBdHRyc1tpXS5nZXRUeXBlKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXR0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgaWRBdHRyID0gc0F0dHJzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJCb3RoICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaWRBdHRyKSArICIgYW5kICIgKyBzQXR0cnNbaV0uZ2V0TmFtZSgpICsgIiBhcmUgeHM6SUQgYXR0cmlidXRlczsgb25seSBvbmUgSUQgYXR0cmlidXRlIGlzIGFsbG93ZWQgb24gYSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzQXR0cnNbaV0uZ2V0RGVmYXVsdFRleHQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhdHRyaWJ1dGUgb2YgdHlwZSB4czpJRCBpcyBub3QgYWxsb3dlZCB0byBoYXZlIGEgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbnN0cmFpbnQgPSBzQXR0cnNbaV0uZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlQ29uc3RyYWludCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIHZhbCA9IHNBdHRyc1tpXS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC52YWxpZGF0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNQcm9wID0gKFNjaGVtYVByb3BlcnR5SW1wbClzVHlwZS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShzQXR0cnNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb3AgIT0gbnVsbCAmJiBzUHJvcC5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcC5zZXREZWZhdWx0VmFsdWUobmV3IFhtbFZhbHVlUmVmKHZhbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHJzW2ldLmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJUaGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShzQXR0cnNbaV0uZ2V0TmFtZSgpKSArICIgZWxlbWVudCBmaXhlZCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc0F0dHJzW2ldLmdldFR5cGUoKSksIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNBdHRyc1tpXS5nZXROYW1lKCkpICsgIiBlbGVtZW50IGRlZmF1bHQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNBdHRyc1tpXS5nZXRUeXBlKCkpLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjaGVja0VsZW1lbnREZWZhdWx0cyhzVHlwZS5nZXRDb250ZW50TW9kZWwoKSwgbG9jYXRpb24sIHNUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VsZW1lbnREZWZhdWx0cyhTY2hlbWFQYXJ0aWNsZSBtb2RlbCwgWG1sT2JqZWN0IGxvY2F0aW9uLCBTY2hlbWFUeXBlIHBhcmVudFR5cGUpCi0gICAgewotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3dpdGNoIChtb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IG1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tFbGVtZW50RGVmYXVsdHMoY2hpbGRyZW5baV0sIGxvY2F0aW9uLCBwYXJlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVDb25zdHJhaW50ID0gbW9kZWwuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVDb25zdHJhaW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0VHlwZSgpLmlzU2ltcGxlVHlwZSgpIHx8IG1vZGVsLmdldFR5cGUoKS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgdmFsID0gbW9kZWwuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwudmFsaWRhdGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzUHJvcCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpcGFyZW50VHlwZS5nZXRFbGVtZW50UHJvcGVydHkobW9kZWwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb3AgIT0gbnVsbCAmJiBzUHJvcC5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcC5zZXREZWZhdWx0VmFsdWUobmV3IFhtbFZhbHVlUmVmKHZhbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgZml4ZWQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKG1vZGVsLmdldFR5cGUoKSksIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgZGVmYXVsdCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUobW9kZWwuZ2V0VHlwZSgpKSwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5nZXRUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJUaGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShtb2RlbC5nZXROYW1lKCkpICsgIiBlbGVtZW50IGNhbm5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGJlY2F1c2UgaXRzIHR5cGUgaGFzIGVsZW1lbnQgY29udGVudCBvbmx5LiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuZ2V0VHlwZSgpLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgYmVjYXVzZSBpdHMgdHlwZSBoYXMgZW1wdHkgY29udGVudCBvbmx5LiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgb25seSBjaGVja3MgcnVsZSAjNSBvZiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbgotICAgICAqICAoRXZlcnl0aGluZyBlbHNlIGNhbiBhbmQgc2hvdWxkIGJlIGRvbmUgaW4gU3RzY1Jlc29sdmVyLCBiZWNhdXNlIHdlIGNhbiBnaXZlIG1vcmUgZGV0YWlsZWQgbGluZSAjIGluZm8gdGhlcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tSZXN0cmljdGlvbihTY2hlbWFUeXBlSW1wbCBzVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChzVHlwZS5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04gJiYgIXNUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlIGRvbid0IHJlbWVtYmVyIHZlcnkgcHJlY2lzZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwgYnV0IGl0J3MgYmV0dGVyIHRoYW4gbm90aGluLgotICAgICAgICAgICAgWG1sT2JqZWN0IGxvY2F0aW9uID0gc1R5cGUuZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgCi0gICAgICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlID0gc1R5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIGlmIChiYXNlVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhlIGJhc2UgdHlwZSBvZiBhIGNvbXBsZXggdHlwZSByZXN0cmljdGlvbiBtdXN0IGJlIGEgY29tcGxleCB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyA1IFRoZSBhcHByb3ByaWF0ZSBjYXNlIGFtb25nIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRDb250ZW50VHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4xIElmIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24gaXMgYSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uLCB0aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4xLjEgVGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYmUgYSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uIG9mIHdoaWNoIHRoZSB7Y29udGVudCB0eXBlfSBpcyBhILd2YWxpZCByZXN0cmljdGlvbrcgYXMgZGVmaW5lZCBpbiBEZXJpdmF0aW9uIFZhbGlkIChSZXN0cmljdGlvbiwgU2ltcGxlKSAopzMuMTQuNikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogd2UgZG9uJ3QgYWxsb3cgdGhlIGNvbnRlbnQgdHlwZSB0byBiZSBhbiAib24gdGhlIHNpZGUiIHNpbXBsZSB0eXBlLCBzbyBub3RoaW5nIGZhbmN5IHRvIGNoZWNrIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuMS4yIFRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYmUgbWl4ZWQgYW5kIGhhdmUgYSBwYXJ0aWNsZSB3aGljaCBpcyC3ZW1wdGlhYmxltyBhcyBkZWZpbmVkIGluIFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhIHNpbXBsZSBjb250ZW50IG1vZGVsIGNhbiBvbmx5IHJlc3RyaWN0IGEgbWl4ZWQgY29udGVudCBtb2RlbCB0aGF0IGhhcyBza2lwcGFibGUgZWxlbWVudHMuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGEgc2ltcGxlIGNvbnRlbnQgbW9kZWwgY2FuIG9ubHkgcmVzdHJpY3QgYSBzaW1wbGUgb3IgbWl4ZWQgY29udGVudCBtb2RlbC4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDUuMiBJZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIGNvbXBsZXggdHlwZSBpdHNlbGYgaXMgZW1wdHkgLCB0aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjIuMSBUaGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBhbHNvIGJlIGVtcHR5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuMi4yIFRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IGJlIGVsZW1lbnRPbmx5IG9yIG1peGVkIGFuZCBoYXZlIGEgcGFydGljbGUgd2hpY2ggaXMgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBFbXB0aWFibGUgKKczLjkuNikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRNb2RlbCgpICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldENvbnRlbnRNb2RlbCgpLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggYW4gZW1wdHkgY29udGVudCBtb2RlbCBjYW4gb25seSByZXN0cmljdCBhIGNvbnRlbnQgbW9kZWwgdGhhdCBoYXMgc2tpcHBhYmxlIGVsZW1lbnRzLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggYW4gZW1wdHkgY29udGVudCBtb2RlbCBjYW5ub3QgcmVzdHJpY3QgYSB0eXBlIHdpdGggYSBzaW1wbGUgY29udGVudCBtb2RlbC4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDUuMyBJZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gaXMgbWl4ZWQuLi4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggYSBtaXhlZCBjb250ZW50IG1vZGVsIGNhbiBvbmx5IHJlc3RyaWN0IGFub3RoZXIgdHlwZSB3aXRoIGEgbWl4ZWQgY29udGVudCBtb2RlbC4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBGQUxMVEhST1VHSAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDUuMyAuLi4gb3IgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBpdHNlbGYgaXMgZWxlbWVudC1vbmx5LC4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBlbGVtZW50IG9yIG1peGVkIGNvbnRlbnQgY2Fubm90IHJlc3RyaWN0IGFuIGVtcHR5IHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggZWxlbWVudCBvciBtaXhlZCBjb250ZW50IGNhbm5vdCByZXN0cmljdCBhIHNpbXBsZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIDUuMyAuLi4gdGhlbiB0aGUgcGFydGljbGUgb2YgdGhlIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIGl0c2VsZiBtdXN0IGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgcGFydGljbGUgb2YgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCA9IGJhc2VUeXBlLmdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwgPSBzVHlwZS5nZXRDb250ZW50TW9kZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGJhc2VNb2RlbCAhPSBudWxsICYmIGRlcml2ZWRNb2RlbCAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VNb2RlbCA9PSBudWxsIHx8IGRlcml2ZWRNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIk51bGwgbW9kZWxzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgRU1QVFlfQ09OVEVOVDogIiArIGJhc2VUeXBlICsgIiAoIiArIGJhc2VNb2RlbCArICIpLCAiICsgc1R5cGUgKyAiICgiICsgZGVyaXZlZE1vZGVsICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIHJlc3RyaWN0aW9uLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIDUuMyAuLi4gIGFzIGRlZmluZWQgaW4gUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4KLSAgICAgICAgICAgICAgICAgICAgTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFkZCB0aGUgbGFzdCBlcnJvciwgYmVjYXVzZSBpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbiBtYXkgYWRkIGVycm9ycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGNvbGxlY3Rpb24gdGhhdCBpdCBsYXRlciBjaGFuZ2VzIGl0cyBtaW5kIGFib3V0LCBvciBpdCBtYXkgKGluYWR2ZXJ0ZW50bHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JnZXQgdG8gZGVzY3JpYmUgYW4gZXJyb3IgaW50byB0aGUgY29sbGVjdGlvbi4uLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkludmFsaWQgcmVzdHJpY3Rpb24uIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nZXRFcnJvckxpc3RlbmVyKCkuYWRkKGVycm9ycy5nZXQoZXJyb3JzLnNpemUoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIHR3byBzY2hlbWEgcGFydGljbGUgdHlwZXMsIGEgYmFzZU1vZGVsLCBhbmQgYSBkZXJpdmVkIG1vZGVsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlCi0gICAgICogZGVyaXZlZE1vZGVsIGNhbiBiZSBlZ2l0aW1hdGVseSBiZSB1c2VkIGZvciByZXN0cmljdGlvbi4gIEVycm9ycyBhcmUgcHV0IGludG8gdGhlIGVycm9ycyBjb2xsZWN0aW9ucy4KLSAgICAgKiBAcGFyYW0gYmFzZU1vZGVsIC0gVGhlIGJhc2Ugc2NoZW1hIHBhcnRpY2xlCi0gICAgICogQHBhcmFtIGRlcml2ZWRNb2RlbCAtIFRoZSBkZXJpdmVkIChyZXN0cmljdGVkKSBzY2hlbWEgcGFydGljbGUKLSAgICAgKiBAcGFyYW0gZXJyb3JzIC0gSW52YWxpZCByZXN0cmljdGlvbiBlcnJvcnMgYXJlIHB1dCBpbnRvIHRoaXMgY29sbGVjdGlvbgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHJldHVybiBib29sZWFuLCB0cnVlIGlmIHZhbGlkIHJlc3RydWN0aW9uLCBmYWxzZSBpZiBpbnZhbGlkIHJlc3RyaWN0aW9uCi0gICAgICogQAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSAgewotICAgICAgICBib29sZWFuIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgLy8gMSBUaGV5IGFyZSB0aGUgc2FtZSBwYXJ0aWNsZS4KLSAgICAgICAgaWYgKGJhc2VNb2RlbC5lcXVhbHMoZGVyaXZlZE1vZGVsKSkgewotICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbXBsZW1lbnQgdGFibGUgZGVmaW5lZCBpbiBzY2hlbWEgc3BlYyBvbiByZXN0cmljdGlvbnMgYXQ6Ci0gICAgICAgICAgICAvLyAgIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QKLSAgICAgICAgICAgIHN3aXRjaCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuYW1lQW5kVHlwZU9LKChTY2hlbWFMb2NhbEVsZW1lbnQpIGJhc2VNb2RlbCwgKFNjaGVtYUxvY2FsRWxlbWVudCkgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuc0NvbXBhdChiYXNlTW9kZWwsIChTY2hlbWFMb2NhbEVsZW1lbnQpIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zU3Vic2V0KGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2VBc0lmR3JvdXAoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZVVub3JkZXJlZChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZUFzSWZHcm91cChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2VMYXgoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBtYXBBbmRTdW0oYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZUFzSWZHcm91cChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIEJhc2UgVHlwZSIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb25WYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hcEFuZFN1bShTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSAgewotICAgICAgICAvLyBtYXBBbmRTdW0gaXMgY2FsbCBpZiBiYXNlOiBDSE9JQ0UsIGRlcml2ZWQ6IFNFUVVFTkNFCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFOwotICAgICAgICBhc3NlcnQgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOwotICAgICAgICBib29sZWFuIG1hcEFuZFN1bVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChTZXF1ZW5jZTpDaG9pY2UgLS0gTWFwQW5kU3VtKQotICAgICAgICAvLyBGb3IgYSBzZXF1ZW5jZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYSBjaG9pY2UgZ3JvdXAgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgLy8gbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFRoZXJlIGlzIGEgY29tcGxldGUgZnVuY3Rpb25hbCBtYXBwaW5nIGZyb20gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiB0byB0aGUgcGFydGljbGVzIGluIHRoZQotICAgICAgICAvLyB7cGFydGljbGVzfSBvZiBCIHN1Y2ggdGhhdCBlYWNoIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgcGFydGljbGUgaW4KLSAgICAgICAgLy8gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgaXQgbWFwcyB0byBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNikuCi0gICAgICAgIC8vIGludGVycHJldGF0aW9uOiAgZWFjaCBwYXJ0aWNsZSBjaGlsZCBpbiBkZXJpdmVkIHNob3VsZCBoYXZlIGEgbWF0Y2ggaW4gYmFzZS4KLSAgICAgICAgLy8gMiBUaGUgcGFpciBjb25zaXN0aW5nIG9mIHRoZSBwcm9kdWN0IG9mIHRoZSB7bWluIG9jY3Vyc30gb2YgUiBhbmQgdGhlIGxlbmd0aCBvZiBpdHMge3BhcnRpY2xlc30gYW5kIHVuYm91bmRlZAotICAgICAgICAvLyBpZiB7bWF4IG9jY3Vyc30gaXMgdW5ib3VuZGVkIG90aGVyd2lzZSB0aGUgcHJvZHVjdCBvZiB0aGUge21heCBvY2N1cnN9IG9mIFIgYW5kIHRoZSBsZW5ndGggb2YgaXRzIHtwYXJ0aWNsZXN9Ci0gICAgICAgIC8vIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgotICAgICAgICAvLyBOT1RFOiBUaGlzIGNsYXVzZSBpcyBpbiBwcmluY2lwbGUgbW9yZSByZXN0cmljdGl2ZSB0aGFuIGFic29sdXRlbHkgbmVjZXNzYXJ5LCBidXQgaW4gcHJhY3RpY2Ugd2lsbCBjb3ZlcgotICAgICAgICAvLyBhbGwgdGhlIGxpa2VseSBjYXNlcywgYW5kIGlzIG11Y2ggZWFzaWVyIHRvIHNwZWNpZnkgdGhhbiB0aGUgZnVsbHkgZ2VuZXJhbCB2ZXJzaW9uLgotICAgICAgICAvLyBOT1RFOiBUaGlzIGNhc2UgYWxsb3dzIHRoZSAidW5mb2xkaW5nIiBvZiBpdGVyYXRlZCBkaXNqdW5jdGlvbnMgaW50byBzZXF1ZW5jZXMuIEl0IG1heSBiZSBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICAgICAgIC8vIHdoZW4gdGhlIGRpc2p1bmN0aW9uIGlzIGFuIGltcGxpY2l0IG9uZSBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiBzdWJzdGl0dXRpb24gZ3JvdXBzLgotCi0gICAgICAgIC8vIE1hcCBzdGVwIC0gZm9yIGVhY2ggbWVtYmVyIG9mIHRoZSBkZXJpdmVkIG1vZGVsJ3MgcGFydGljbGUgY2hpbGRyZW4gc2VhcmNoIGJhc2UgbW9kZWwncyBwYXJ0aWNsZSBjaGlsZHJlbgotICAgICAgICAvLyAgZm9yIG1hdGNoCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gZGVyaXZlZFBhcnRpY2xlQXJyYXkgPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGJhc2VQYXJ0aWNsZUFycmF5ID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlID0gZGVyaXZlZFBhcnRpY2xlQXJyYXlbaV07Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmFzZVBhcnRpY2xlQXJyYXkubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUgPSBiYXNlUGFydGljbGVBcnJheVtqXTsKLSAgICAgICAgICAgICAgICAvLyByZWN1cnNlIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGEgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBtYXRjaCB0aGVuIG5vIG5lZWQgdG8gY2hlY2sgYmFzZSBwYXJ0aWNsZXMgYW55bW9yZQotICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgbWFwQW5kU3VtVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRNYXBwaW5nRXJyb3IoKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3VtIHN0ZXAKLSAgICAgICAgQmlnSW50ZWdlciBkZXJpdmVkUmFuZ2VNaW4gPSBkZXJpdmVkTW9kZWwuZ2V0TWluT2NjdXJzKCkubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkubGVuZ3RoKSk7Ci0gICAgICAgIEJpZ0ludGVnZXIgZGVyaXZlZFJhbmdlTWF4ID0gbnVsbDsKLSAgICAgICAgQmlnSW50ZWdlciBVTkJPVU5ERUQgPSBudWxsOwotICAgICAgICBpZiAoZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgZGVyaXZlZFJhbmdlTWF4ID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlcml2ZWRSYW5nZU1heCA9IGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKS5tdWx0aXBseShCaWdJbnRlZ2VyLnZhbHVlT2YoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKS5sZW5ndGgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBjaGVjayBkZXJpdmVkUmFuZ2UgKGRlcml2ZWRSYW5nZU1pbiBhbmQgZGVyaXZlZFJhbmdlTWF4KSBhZ2FpbnN0IGJhc2UgbW9kZWwgb2NjdXJyZW5jZSByYW5nZQotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IE9jY3VycmVuY2UgUmFuZ2UgT0sKLSAgICAgICAgLy8gRm9yIGEgcGFydGljbGUncyBvY2N1cnJlbmNlIHJhbmdlIHRvIGJlIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgYW5vdGhlcidzIG9jY3VycmVuY2UgcmFuZ2UgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIEl0cyB7bWluIG9jY3Vyc30gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlcidzIHttaW4gb2NjdXJzfS4KLSAgICAgICAgLy8gMiBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vICAgMi4xIFRoZSBvdGhlcidzIHttYXggb2NjdXJzfSBpcyB1bmJvdW5kZWQuCi0gICAgICAgIC8vICAgMi4yIEJvdGgge21heCBvY2N1cnN9IGFyZSBudW1iZXJzLCBhbmQgdGhlIHBhcnRpY2xlJ3MgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlcidzLgotCi0gICAgICAgIGlmIChkZXJpdmVkUmFuZ2VNaW4uY29tcGFyZVRvKGJhc2VNb2RlbC5nZXRNaW5PY2N1cnMoKSkgPCAwKSB7Ci0gICAgICAgICAgICBtYXBBbmRTdW1WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvckNob2ljZVNlcXVlbmNlKGRlcml2ZWRSYW5nZU1pbiwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQgfHwgZGVyaXZlZFJhbmdlTWF4ICE9IFVOQk9VTkRFRCAmJiBkZXJpdmVkUmFuZ2VNYXguY29tcGFyZVRvKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSkgPiAwKSB7Ci0gICAgICAgICAgICBtYXBBbmRTdW1WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvckNob2ljZVNlcXVlbmNlKGRlcml2ZWRSYW5nZU1heCwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcEFuZFN1bVZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yQ2hvaWNlU2VxdWVuY2UoQmlnSW50ZWdlciBkZXJpdmVkUmFuZ2VNaW4sIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgdG90YWwgbWluT2NjdXJzIGZvciB0aGUgZGVyaXZlZCA8c2VxdWVuY2U+J3MgZWxlbWVudHM6ICIKLSAgICAgICAgICAgICAgICArIGRlcml2ZWRSYW5nZU1pbi50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAibXVzdCBub3QgYmUgbGVzcyB0aGFuIHRoZSBiYXNlIDxjaG9pY2U+J3MgbWluT2NjdXJzICgiCi0gICAgICAgICAgICAgICAgKyBiYXNlTW9kZWwuZ2V0TWluT2NjdXJzKCkudG9TdHJpbmcoKSArICIpIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvckNob2ljZVNlcXVlbmNlKEJpZ0ludGVnZXIgZGVyaXZlZFJhbmdlTWF4LCBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIHRvdGFsIG1heE9jY3VycyBmb3IgdGhlIGRlcml2ZWQgPHNlcXVlbmNlPidzIGVsZW1lbnRzICgiCi0gICAgICAgICAgICAgICAgKyBkZXJpdmVkUmFuZ2VNYXgudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIikgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBiYXNlIDxjaG9pY2U+J3MgbWF4T2NjdXJzICgiCi0gICAgICAgICAgICAgICAgKyBwcmludE1heE9jY3VycyhiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkpICsgIikiOwotICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRNYXBwaW5nRXJyb3IoKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIEF0IGxlYXN0IG9uZSByZXN0cmljdGVkIHR5cGUgZG9lcyBub3QgbWF0Y2guIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlY3Vyc2VBc0lmR3JvdXAoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICAvLyByZWN1cnNlQXNJZkdyb3VwIGlzIGNhbGxlZCBpZjoKLSAgICAgICAgLy8gYmFzZTogQUxMLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIC8vIGJhc2U6IENIT0lDRSwgZGVyaXZlZDogRUxFTUVOVAotICAgICAgICAvLyBiYXNlOiBTRVFVRU5DRSwgZGVyaXZlZDogRUxFTUVOVAotICAgICAgICBhc3NlcnQgKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICAgICAgfHwgKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICAgICAgfHwgKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCk7Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoRWx0OkFsbC9DaG9pY2UvU2VxdWVuY2UgLS0gUmVjdXJzZUFzSWZHcm91cCkKLQotICAgICAgICAvLyBGb3IgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYSBncm91cCBwYXJ0aWNsZQotICAgICAgICAvLyAoYWxsLCBjaG9pY2Ugb3Igc2VxdWVuY2UpIGEgZ3JvdXAgcGFydGljbGUgb2YgdGhlIHZhcmlldHkgY29ycmVzcG9uZGluZyB0byBCJ3MsIHdpdGgge21pbiBvY2N1cnN9IGFuZAotICAgICAgICAvLyB7bWF4IG9jY3Vyc30gb2YgMSBhbmQgd2l0aCB7cGFydGljbGVzfSBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIHBhcnRpY2xlIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uCi0gICAgICAgIC8vIG11c3QgYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBncm91cCBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIERlcml2YXRpb24gT0sKLSAgICAgICAgLy8gKEFsbDpBbGwsU2VxdWVuY2U6U2VxdWVuY2UgLS0gUmVjdXJzZSkgKKczLjkuNiksIFBhcnRpY2xlIERlcml2YXRpb24gT0sgKENob2ljZTpDaG9pY2UgLS0gUmVjdXJzZUxheCkKLSAgICAgICAgLy8gKKczLjkuNikgb3IgUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoQWxsOkFsbCxTZXF1ZW5jZTpTZXF1ZW5jZSAtLSBSZWN1cnNlKSAopzMuOS42KSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKLSAgICAgICAgLy8gdGhlIGdyb3VwIGlzIGFsbCwgY2hvaWNlIG9yIHNlcXVlbmNlCi0KLSAgICAgICAgLy8gaW50ZXJwcmV0YXRpb246ICBtYWtlIGEgZmFrZSBncm91cCBvZiB0aGUgcmlnaHQgdHlwZSwgd2l0aCBtaW4gb2NjdXJzIGFuZCBtYXggb2NjdXJzIG9mIDEKLSAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIGFzSWZQYXJ0ID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOwotICAgICAgICBhc0lmUGFydC5zZXRQYXJ0aWNsZVR5cGUoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0TWF4T2NjdXJzKEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0UGFydGljbGVDaGlsZHJlbihuZXcgU2NoZW1hUGFydGljbGVbXSB7IGRlcml2ZWRNb2RlbCB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRoZSByZWN1cnNlCi0gICAgICAgIHJldHVybiBpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihiYXNlTW9kZWwsIGFzSWZQYXJ0LCBlcnJvcnMsIGNvbnRleHQpOyAKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlY3Vyc2VMYXgoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgIHsKLSAgICAgICAgLy8gcmVjdXJzZUxheCBpcyBjYWxsZWQgaWYgYmFzZTogQ0hPSUNFLCBkZXJpdmVkOiBDSE9JQ0UKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRTsKLSAgICAgICAgYm9vbGVhbiByZWN1cnNlTGF4VmFsaWQgPSB0cnVlOwotICAgICAgICAvL1NjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoQ2hvaWNlOkNob2ljZSAtLSBSZWN1cnNlTGF4KQotICAgICAgICAvLyBGb3IgYSBjaG9pY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGFub3RoZXIgY2hvaWNlIGdyb3VwIHBhcnRpY2xlIGFsbCBvZiB0aGUKLSAgICAgICAgLy8gZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gMSBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZQotICAgICAgICAvLyBSYW5nZSBPSyAopzMuOS42KTsKLSAgICAgICAgLy8gMiBUaGVyZSBpcyBhIGNvbXBsZXRlILdvcmRlci1wcmVzZXJ2aW5ntyBmdW5jdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBSCi0gICAgICAgIC8vIHRvIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgc3VjaCB0aGF0IGVhY2ggcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgaXMgYQotICAgICAgICAvLyC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiBpdCBtYXBzIHRvIGFzIGRlZmluZWQgYnkKLSAgICAgICAgLy8gUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4KLSAgICAgICAgLy8gTk9URTogQWx0aG91Z2ggdGhlILd2YWxpZGF0aW9utyBzZW1hbnRpY3Mgb2YgYSBjaG9pY2UgZ3JvdXAgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBpdHMgcGFydGljbGVzLAotICAgICAgICAvLyBkZXJpdmVkIGNob2ljZSBncm91cHMgYXJlIHJlcXVpcmVkIHRvIG1hdGNoIHRoZSBvcmRlciBvZiB0aGVpciBiYXNlIGluIG9yZGVyIHRvIHNpbXBsaWZ5Ci0gICAgICAgIC8vIGNoZWNraW5nIHRoYXQgdGhlIGRlcml2YXRpb24gaXMgT0suCi0gICAgICAgIC8vIGludGVycHJldGF0aW9uOiAgY2hlY2sgZGVyaXZlZCBjaG9pY2VzIGZvciBtYXRjaCBpbiBvcmRlciwgbXVzdCBnZXQgYW4gaW4gb3JkZXIgbWF0Y2ggb24gYSBiYXNlIHBhcnRpY2xlLAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgYmFzZSBwYXJ0aWNsZXMgYXJlIHNraXBwYWJsZS4gIGEgbG90IGxpa2UgcmVjdXJzZQotCi0gICAgICAgIGlmICghb2NjdXJyZW5jZVJhbmdlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjeWNsZSB0aHJ1IGJvdGggZGVyaXZlZCBwYXJ0aWNsZSBjaGlsZHJlbiBhbmQgYmFzZSBwYXJ0aWNsZSBjaGlsZHJlbiBsb29raW5nIGZvciBtYXRjaGVzCi0gICAgICAgIC8vICBpZiB0aGUgZGVyaXZlZCBwYXJ0aWNsZSBkb2VzIG5vdCBtYXRjaCB0aGUgYmFzZSBwYXJ0aWNsZSB0aGVuIGJhc2UgcGFydGljbGUgY2FuIGJlIHNraXBwZWQKLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGRlcml2ZWRQYXJ0aWNsZUFycmF5ID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBiYXNlUGFydGljbGVBcnJheSA9IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGludCBpID0gMCwgaiA9IDA7Ci0gICAgICAgIGZvciAoOyBpIDwgZGVyaXZlZFBhcnRpY2xlQXJyYXkubGVuZ3RoICYmIGogPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGg7KSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUgPSBkZXJpdmVkUGFydGljbGVBcnJheVtpXTsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSA9IGJhc2VQYXJ0aWNsZUFycmF5W2pdOwotICAgICAgICAgICAgLy8gdHJ5IHRvIG1hdGNoIHRoZSB0d28gcGFydGljbGVzIGJ5IHJlY3Vyc2luZwotICAgICAgICAgICAgaWYgKGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlLCBlcnJvcnMsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29vbCBmb3VuZCBhIG1hdGNoLCBpbmNyZW1lbnQgYm90aCBpbmRleGVzCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBtYXRjaCwgaW5jcmVtZW50IHRoZSBiYXNlIHBhcnRpY2xlIGFycmF5IGluZGV4IG9ubHkKLSAgICAgICAgICAgICAgICAvLyBPaywgbGV0J3Mgc2tpcCB0aGlzIGJhc2UgcGFydGljbGUsIGluY3JlbWVudCBiYXNlIHBhcnRpY2xlIGFycmF5IGluZGV4IG9ubHkKLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvaywgZ290IHRvIHRoZSBlbmQgb2Ygb25lIG9mIHRoZSBhcnJheXMKLSAgICAgICAgLy8gaWYgYXQgZW5kIG9mIGJhc2UgcGFydGljbGUgYXJyYXkgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGRlcml2ZWQgcGFydGljbGUgYXJyYXkgdGhlbiByZW1haW5pbmcgZGVyaXZlZAotICAgICAgICAvLyAgcGFydGljbGVzIG11c3Qgbm90IG1hdGNoCi0gICAgICAgIGlmIChpIDwgZGVyaXZlZFBhcnRpY2xlQXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZWN1cnNlTGF4VmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZvdW5kIGRlcml2ZWQgcGFydGljbGVzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGluIHRoZSBiYXNlIGNvbnRlbnQgbW9kZWwuIjsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdERlcml2ZWRNYXBwaW5nRXJyb3IobWVzc2FnZSwgYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiByZWN1cnNlTGF4VmFsaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWN1cnNlVW5vcmRlcmVkKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gcmVjdXJzZVVub3JkZXIgaXMgY2FsbGVkIHdoZW4gYmFzZTogQUxMIGFuZCBkZXJpdmVkOiBTRVEKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOwotICAgICAgICBib29sZWFuIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCA9IHRydWU7Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoU2VxdWVuY2U6QWxsIC0tIFJlY3Vyc2VVbm9yZGVyZWQpCi0gICAgICAgIC8vIEZvciBhIHNlcXVlbmNlIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhbiBhbGwgZ3JvdXAgcGFydGljbGUgYWxsIG9mIHRoZQotICAgICAgICAvLyBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieQotICAgICAgICAvLyBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgotICAgICAgICAvLyAyIFRoZXJlIGlzIGEgY29tcGxldGUgZnVuY3Rpb25hbCBtYXBwaW5nIGZyb20gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiB0byB0aGUgcGFydGljbGVzCi0gICAgICAgIC8vIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHN1Y2ggdGhhdCBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDIuMSBObyBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiBpcyBtYXBwZWQgdG8gYnkgbW9yZSB0aGFuIG9uZSBvZiB0aGUgcGFydGljbGVzIGluCi0gICAgICAgIC8vIHRoZSB7cGFydGljbGVzfSBvZiBSOwotICAgICAgICAvLyAyLjIgRWFjaCBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiBpcyBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBCCi0gICAgICAgIC8vIGl0IG1hcHMgdG8gYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpOwotICAgICAgICAvLyAyLjMgQWxsIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiB3aGljaCBhcmUgbm90IG1hcHBlZCB0byBieSBhbnkgcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9Ci0gICAgICAgIC8vIG9mIFIgYXJlILdlbXB0aWFibGW3IGFzIGRlZmluZWQgYnkgUGFydGljbGUgRW1wdGlhYmxlICinMy45LjYpLgotICAgICAgICAvLyBOT1RFOiBBbHRob3VnaCB0aGlzIGNsYXVzZSBhbGxvd3MgcmVvcmRlcmluZywgYmVjYXVzZSBvZiB0aGUgbGltaXRzIG9uIHRoZSBjb250ZW50cyBvZiBhbGwgZ3JvdXBzIHRoZQotICAgICAgICAvLyBjaGVja2luZyBwcm9jZXNzIGNhbiBzdGlsbCBiZSBkZXRlcm1pbmlzdGljLgotICAgICAgICAvLyAxLCAyLjIsIGFuZCAyLjMgYXJlIHRoZSBzYW1lIGFzIHJlY3Vyc2UsIHNvIGRvIDIuMSBhbmQgdGhlbiBjYWxsIHJlY3Vyc2UKLQotICAgICAgICBpZiAoIW9jY3VycmVuY2VSYW5nZU9LKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWFkIGJhc2VQYXJ0aWNsZSBhcnJheSBRTmFtZXMgaW50byBoYXNobWFwCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gYmFzZVBhcnRpY2xlcyA9IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIEhhc2hNYXAgYmFzZVBhcnRpY2xlTWFwID0gbmV3IEhhc2hNYXAoMTApOwotICAgICAgICBPYmplY3QgTUFQUEVEID0gbmV3IE9iamVjdCgpOwotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBoYXNobWFwCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVBhcnRpY2xlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGJhc2VQYXJ0aWNsZU1hcC5wdXQoYmFzZVBhcnRpY2xlc1tpXS5nZXROYW1lKCksIGJhc2VQYXJ0aWNsZXNbaV0pOwotICAgICAgICAKLSAgICAgICAgLy8gZ28gdGhydSB0aGUgc2VxdWVuY2UgKGRlcml2ZWQgbW9kZWwncyBjaGlsZHJlbikgYW5kIGNoZWNrIG9mZiBmcm9tIGJhc2UgcGFydGljbGUgbWFwCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gZGVyaXZlZFBhcnRpY2xlcyA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZFBhcnRpY2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgbWF0Y2hlZEJhc2VQYXJ0aWNsZSA9IChTY2hlbWFQYXJ0aWNsZSkgYmFzZVBhcnRpY2xlTWFwLmdldChkZXJpdmVkUGFydGljbGVzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlZEJhc2VQYXJ0aWNsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZEFsbFNlcU1hcHBpbmdFcnJvcigpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGdvdCBhIG1hdGNoCi0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRCYXNlUGFydGljbGUgPT0gTUFQUEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdob2EsIHRoaXMgYmFzZSBwYXJ0aWNsZSBoYXMgYWxyZWFkeSBiZWVuIG1hdGNoZWQgKHNlZSAyLjEgYWJvdmUpCi0gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRNYXBwZWRNb3JlVGhhbk9uY2VFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlcml2ZWRQYXJ0aWNsZXNbaV0uZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWRQYXJ0aWNsZXNbaV0uZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRlcml2ZWQgcGFydGljbGVzIGNhbiBoYXZlIGEgbWF4IG9jY3VycyBncmVhdGVyIHRoYW4gMQotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRBbGxTZXFNYXhPY2N1cnNHcmVhdGVyVGhhbjFFcnJvcihkZXJpdmVkUGFydGljbGVzW2ldKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihtYXRjaGVkQmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGVzW2ldLCBlcnJvcnMsIGNvbnRleHQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhdmUgYW4gZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyBjb29sLCBnb3QgYSBtYXRjaCwgdXBkYXRlIHRvIE1BUFBFRAotICAgICAgICAgICAgICAgICAgICBiYXNlUGFydGljbGVNYXAucHV0KGRlcml2ZWRQYXJ0aWNsZXNbaV0uZ2V0TmFtZSgpLCBNQVBQRUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGV2ZXJ5dGhpbmcgaXMgY29vbCBzbyBmYXIgdGhlbiBjaGVjayB0byBzZWUgaWYgYW55IGJhc2UgcGFydGljbGVzIGFyZSBub3QgbWF0Y2hlZAotICAgICAgICBpZiAocmVjdXJzZVVub3JkZXJlZFZhbGlkKSB7Ci0gICAgICAgICAgICAvLyBnZXQgYWxsIHRoZSBoYXNobWFwIGtleXMgYW5kIGxvb3AgdGhydSBsb29raW5nIGZvciBOT1RfTUFQUEVECi0gICAgICAgICAgICBTZXQgYmFzZVBhcnRpY2xlQ29sbGVjdGlvbiA9IGJhc2VQYXJ0aWNsZU1hcC5rZXlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBiYXNlUGFydGljbGVDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBiYXNlUGFydGljbGVRTmFtZSA9IChRTmFtZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydGljbGVNYXAuZ2V0KGJhc2VQYXJ0aWNsZVFOYW1lKSAhPSBNQVBQRUQgJiYgISgoU2NoZW1hUGFydGljbGUpYmFzZVBhcnRpY2xlTWFwLmdldChiYXNlUGFydGljbGVRTmFtZSkpLmlzU2tpcHBhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBiYXNlIHBhcnRpY2xlIHdhcyBub3QgbWFwcGVkIGFuZCBpcyBub3QgInBhcnRpY2xlIGVtcHRpYWJsZSIgKHNraXBwYWJsZSkKLSAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEdyb3VwTWFwcGluZ0Vycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWN1cnNlVW5vcmRlcmVkVmFsaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEFsbFNlcU1heE9jY3Vyc0dyZWF0ZXJUaGFuMUVycm9yKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiIGhhcyBhIG1heE9jY3VycyBncmVhdCB0aGFuIDEgKCIKLSAgICAgICAgICAgICAgICArIHByaW50TWF4T2NjdXJzKGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgICAgICAgICArICIpLiAgV2hlbiByZXN0cmljdGluZyBhbiA8YWxsPiB3aXRoIGEgPHNlcXVlbmNlPiwgbm8gPGVsZW1lbnQ+IGNhbiBoYXZlIGEgbWF4T2NjdXJzID4gMSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEludmFsaWRBbGxTZXFNYXBwaW5nRXJyb3IoKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIEVhY2ggZWxlbWVudCBpbiB0aGUgZGVyaXZlZCBjb250ZW50IG1vZGVsIG11c3QgbWF0Y2ggYW4gZWxlbWVudCBpbiB0aGUgYmFzZSAiCi0gICAgICAgICAgICAgICAgKyAiY29udGVudCBtb2RlbC4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRHcm91cE1hcHBpbmdFcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWVtYmVycyBvZiB0aGUgZGVyaXZlZCBjb250ZW50IG1vZGVsIG11c3QgbWF0Y2ggdGhlIG1lbWJlcnMgb2YgdGhlIGJhc2UgIgotICAgICAgICAgICAgICAgICsgIiBjb250ZW50IG1vZGVsIHVubGVzcyB0aGUgbWVtYmVyIG9mIHRoZSBiYXNlIGNvbnRlbnQgbW9kZWwgaXMgb3B0aW9uYWwgKHBhcnRpY2xlIGVtcHRpYWJsZSkuIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0TWFwcGVkTW9yZVRoYW5PbmNlRXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgV2hlbiB1c2luZyBhIDxzZXF1ZW5jZT4gdG8gcmVzdHJpY3QgYW4gPGFsbD4gdGhlIGVsZW1lbnRzIGluIHRoZSA8YWxsPiBjYW4gYmUgbWFwcGVkIG9ubHkgb25jZS4gIgotICAgICAgICAgICAgICAgICsgIiBGb3VuZCBlbGVtZW50IGluIHRoZSA8c2VxdWVuY2U+IHRoYXQgbWFwcyBhbiBlbGVtZW50IGluIHRoZSA8YWxsPiBtb3JlIHRoYW4gb25jZS4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVjdXJzZShTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIHJlY3Vyc2UgaXMgY2FsbGVkIHdoZW4gYmFzZTogQUxMIGRlcml2ZWQ6IEFMTCBvciBiYXNlOiBTRVFVRU5DRSBkZXJpdmVkOiBTRVFVRU5DRQotICAgICAgICBib29sZWFuIHJlY3Vyc2VWYWxpZCA9IHRydWU7Ci0gICAgICAgIC8vIEZvciBhbiBhbGwgb3Igc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGFub3RoZXIgZ3JvdXAgcGFydGljbGUgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLyB7Y29tcG9zaXRvcn0gYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieQotICAgICAgICAvLyBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgotICAgICAgICAvLyAyIFRoZXJlIGlzIGEgY29tcGxldGUgt29yZGVyLXByZXNlcnZpbme3IGZ1bmN0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgdG8KLSAgICAgICAgLy8gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiBzdWNoIHRoYXQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAgIDIuMSBFYWNoIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9Ci0gICAgICAgIC8vICAgb2YgQiBpdCBtYXBzIHRvIGFzIGRlZmluZWQgYnkgUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4KLSAgICAgICAgLy8gICAyLjIgQWxsIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiB3aGljaCBhcmUgbm90IG1hcHBlZCB0byBieSBhbnkgcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9Ci0gICAgICAgIC8vICAgb2YgUiBhcmUgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBFbXB0aWFibGUgKKczLjkuNikuCi0gICAgICAgIC8vIE5PVEU6IEFsdGhvdWdoIHRoZSC3dmFsaWRhdGlvbrcgc2VtYW50aWNzIG9mIGFuIGFsbCBncm91cCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIGl0cyBwYXJ0aWNsZXMsCi0gICAgICAgIC8vIGRlcml2ZWQgYWxsIGdyb3VwcyBhcmUgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZWlyIGJhc2UgaW4gb3JkZXIgdG8gc2ltcGxpZnkgY2hlY2tpbmcgdGhhdAotICAgICAgICAvLyB0aGUgZGVyaXZhdGlvbiBpcyBPSy4KLSAgICAgICAgLy8gW0RlZmluaXRpb246XSAgQSBjb21wbGV0ZSBmdW5jdGlvbmFsIG1hcHBpbmcgaXMgb3JkZXItcHJlc2VydmluZyBpZiBlYWNoIHBhcnRpY2xlIHIgaW4gdGhlIGRvbWFpbiBSIG1hcHMKLSAgICAgICAgLy8gdG8gYSBwYXJ0aWNsZSBiIGluIHRoZSByYW5nZSBCIHdoaWNoIGZvbGxvd3MgKG5vdCBuZWNlc3NhcmlseSBpbW1lZGlhdGVseSkgdGhlIHBhcnRpY2xlIGluIHRoZSByYW5nZSBCCi0gICAgICAgIC8vIG1hcHBlZCB0byBieSB0aGUgcHJlZGVjZXNzb3Igb2YgciwgaWYgYW55LCB3aGVyZSAicHJlZGVjZXNzb3IiIGFuZCAiZm9sbG93cyIgYXJlIGRlZmluZWQgd2l0aCByZXNwZWN0IHRvCi0gICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGUgbGlzdHMgd2hpY2ggY29uc3RpdHV0ZSBSIGFuZCBCLgotCi0gICAgICAgIGlmICghb2NjdXJyZW5jZVJhbmdlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UgaXMgZm9ybWF0dGVkIGluIG9jY3VycmVuY1JhbmdlT0sgLi4uCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY3ljbGUgdGhydSBib3RoIGRlcml2ZWQgcGFydGljbGUgY2hpbGRyZW4gYW5kIGJhc2UgcGFydGljbGUgY2hpbGRyZW4gbG9va2luZyBmb3IgbWF0Y2hlcwotICAgICAgICAvLyAgaWYgdGhlIGRlcml2ZWQgcGFydGljbGUgZG9lcyBub3QgbWF0Y2ggdGhlIGJhc2UgcGFydGljbGUgdGhlbiBiYXNlIHBhcnRpY2xlIGNhbiBiZSBza2lwcGVkIGlmIGl0IGlzCi0gICAgICAgIC8vICBza2lwcGFibGUgKHNhbWUgYXMgInBhcnRpY2xlIGVtcHRpYWJsZSIpIG90aGVyd2lzZSBpcyBhbiBpbnZhbGlkIHJlc3RyaWN0aW9uLgotICAgICAgICAvLyBhZnRlciB0aGUgZGVyaXZlZCBwYXJ0aWNsZXMgaGF2ZSBiZWVuIGN5Y2xlZCBpZiB0aGVyZSBhcmUgYW55IGJhc2UgcGFydGljbGVzIGxlZnQgb3ZlciB0aGVuIHRoZXkKLSAgICAgICAgLy8gIG11c3QgYmUgc2tpcHBhYmxlIG9yIGludmFsaWQgcmVzdHJpY3Rpb24KLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGRlcml2ZWRQYXJ0aWNsZUFycmF5ID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBiYXNlUGFydGljbGVBcnJheSA9IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGludCBpID0gMCwgaiA9IDA7Ci0gICAgICAgIGZvciAoOyBpIDwgZGVyaXZlZFBhcnRpY2xlQXJyYXkubGVuZ3RoICYmIGogPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGg7KSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUgPSBkZXJpdmVkUGFydGljbGVBcnJheVtpXTsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSA9IGJhc2VQYXJ0aWNsZUFycmF5W2pdOwotICAgICAgICAgICAgLy8gdHJ5IHRvIG1hdGNoIHRoZSB0d28gcGFydGljbGVzIGJ5IHJlY3Vyc2luZwotICAgICAgICAgICAgaWYgKGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlLCBlcnJvcnMsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29vbCBmb3VuZCBhIG1hdGNoLCBpbmNyZW1lbnQgYm90aCBpbmRleGVzCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBtYXRjaCwgaW5jcmVtZW50IHRoZSBiYXNlIHBhcnRpY2xlIGFycmF5IGluZGV4IG9ubHkKLSAgICAgICAgICAgICAgICAvLyAgdGhhdCdzIG9rIGlmIHRoZSBiYXNlIHBhcnRpY2xlIGlzIHNraXBwYWJsZQotICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydGljbGUuaXNTa2lwcGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPaywgbGV0J3Mgc2tpcCB0aGlzIGJhc2UgcGFydGljbGUsIGluY3JlbWVudCBiYXNlIHBhcnRpY2xlIGFycmF5IGluZGV4IG9ubHkKLSAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdob2EsIHBhcnRpY2xlcyBhcmUgbm90IHZhbGlkIHJlc3RyaWN0aW9ucyBhbmQgYmFzZSBpcyBub3Qgc2tpcHBhYmxlIC0gRVJST1IKLSAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZvdW5kIG5vbi1vcHRpb25hbCBwYXJ0aWNsZSB0aGF0IGlzIG5vdCBtYXBwZWQgaW4gYmFzZSBjb250ZW50IG1vZGVsLiI7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdERlcml2ZWRNYXBwaW5nRXJyb3IobWVzc2FnZSwgYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9rLCBnb3QgdG8gdGhlIGVuZCBvZiBvbmUgb2YgdGhlIGFycmF5cwotICAgICAgICAvLyBpZiBhdCBlbmQgb2YgYmFzZSBwYXJ0aWNsZSBhcnJheSBhbmQgbm90IGF0IHRoZSBlbmQgb2YgZGVyaXZlZCBwYXJ0aWNsZSBhcnJheSB0aGVuIHJlbWFpbmluZyBkZXJpdmVkCi0gICAgICAgIC8vICBwYXJ0aWNsZXMgbXVzdCBub3QgbWF0Y2gKLSAgICAgICAgaWYgKGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlY3Vyc2VWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRm91bmQgZGVyaXZlZCBwYXJ0aWNsZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgaW4gdGhlIGJhc2UgY29udGVudCBtb2RlbC4iOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihtZXNzYWdlLCBiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIGF0IGVuZCBvZiBkZXJpdmVkIHBhcnRpY2xlIGFycmF5IGFuZCBub3QgYXQgZW5kIG9mIGJhc2UgcGFydGljbGUgYXJyYXkgdGhlbiBjaGNrIHJlbWFpbmluZwotICAgICAgICAgICAgLy8gIGJhc2UgcGFydGljbGVzIHRvIGFzc3VyZSB0aGV5IGFyZSBza2lwcGFibGUKLSAgICAgICAgICAgIGlmIChqIDwgYmFzZVBhcnRpY2xlQXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IGo7IGsgPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VQYXJ0aWNsZUFycmF5W2tdLmlzU2tpcHBhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRm91bmQgdHJhaWxpbmcgYmFzZSBwYXJ0aWNsZXMgdGhhdCBhcmUgbm90IG9wdGlvbmFsIGFuZCBhcmUgbm90ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwcmVzZW50ZWQgaW4gdGhlIGRlcml2ZWQgY29udGVudCBtb2RlbC4iOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihtZXNzYWdlLCBiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlY3Vyc2VWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihTdHJpbmcgbWVzc2FnZSwgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIGRlcml2ZWQgKHJlc3RyaWN0ZWQpIGNvbnRlbnQgbW9kZWwgbXVzdCBtYXRjaCB0aGUgYmFzZSBjb250ZW50IG1vZGVsIHVubGVzcyAiCi0gICAgICAgICAgICAgICAgKyAidGhlIHBhcnQgb2YgdGhlIGJhc2UgY29udGVudCBtb2RlbCB0aGF0IGRvZXMgbm90IG1hdGNoIGlzIG9wdGlvbmFsLiAgQSBtaXNtYXRjaCBmb3VuZCBiZXR3ZWVuIGEgYmFzZSAiICsKLSAgICAgICAgICAgICAgICBwcmludFBhcnRpY2xlKGJhc2VNb2RlbCkgKyAiIGFuZCBhIGRlcml2ZWQgIiArIHByaW50UGFydGljbGUoZGVyaXZlZE1vZGVsKSArICIuICAiICsgbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICAvLyBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5IGlzIGNhbGxlZCB3aGVuOgotICAgICAgICAvLyBiYXNlOiBBTlksIGRlcml2ZWQ6IEFMTAotICAgICAgICAvLyBiYXNlOiBBTlksIGRlcml2ZWQ6IENIT0lDRQotICAgICAgICAvLyBiYXNlOiBBTlksIGRlcml2ZWQ6IFNFUVVFTkNFCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQ7Ci0gICAgICAgIGFzc2VydCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCkKLSAgICAgICAgICAgICAgICB8fCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSkKLSAgICAgICAgICAgICAgICB8fCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKTsKLSAgICAgICAgYm9vbGVhbiBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5ID0gdHJ1ZTsKLSAgICAgICAgLy8gRm9yIGEgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgd2lsZGNhcmQgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIEV2ZXJ5IG1lbWJlciBvZiB0aGUge3BhcnRpY2xlc30gb2YgdGhlIGdyb3VwIGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgd2lsZGNhcmQgYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAvLyAgTm90ZTogIG5vdCBwb3NpdGl2ZSB3aGF0IHRoaXMgbWVhbnMuICBJbnRlcnByZXRpbmcgdG8gbWVhbiB0aGF0IGV2ZXJ5IHBhcnRpY2xlIG9mIHRoZSBncm91cCBtdXN0IGFkaGVyZSB0byB3aWxkY2FyZCBkZXJpdmF0aW9uIHJ1bGVzCi0gICAgICAgIC8vICAgICAgICAgaW4gYSByZWN1cnNpdmUgbWFubmVyCi0gICAgICAgIC8vICBMb29wIHRocnUgdGhlIGNoaWxkcmVuIHBhcnRpY2xlcyBvZiB0aGUgZ3JvdXAgYW5kIGludm9rZSB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIHdpbGRjYXJkIHJlc3RyaWN0aW9uIHZhbGlkaXR5Ci0gICAgICAgIAotICAgICAgICAvLyBCQVUgLSBhbiBlcnJhdGEgc2hvdWxkIGJlIHN1Ym1pdHRlZCBvbiB0aGlzIGNsYXVzZSBvZiB0aGUgc3BlYywgYmVjYXVzZSB0aGUKLSAgICAgICAgLy8gc3BlYyBtYWtlcyBubyBzZW5zZSwgYXMgdGhlIHhzdGMgcGFydGljbGVzUjAxMy54c2QgdGVzdCBleGVtcGxpZmllcy4KLSAgICAgICAgLy8gd2hhdCB3ZSBfc2hvdWxkXyBzbyBpcyBhbiAiYXMgaWYiIG9uIHRoZSB3aWxkY2FyZCwgYWxsb3dpbmcgaXQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLSAgICAgICAgLy8gYmVmb3JlIHJlY3Vyc2luZwotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgYXNJZlBhcnQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFBhcnRpY2xlVHlwZShiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpOwotICAgICAgICBhc0lmUGFydC5zZXRXaWxkY2FyZFByb2Nlc3MoYmFzZU1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0V2lsZGNhcmRTZXQoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkpOwotICAgICAgICBhc0lmUGFydC5zZXRNaW5PY2N1cnMoQmlnSW50ZWdlci5aRVJPKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0TWF4T2NjdXJzKG51bGwpOwotICAgICAgICBhc0lmUGFydC5zZXRUcmFuc2l0aW9uUnVsZXMoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCksIHRydWUpOwotICAgICAgICBhc0lmUGFydC5zZXRUcmFuc2l0aW9uTm90ZXMoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCksIHRydWUpOwotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydGljbGVDaGlsZHJlbiA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZUNoaWxkcmVuW2ldOwotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkIFdpbGRjYXJkL0VsZW1lbnQgZGVyaXZhdGlvbgotICAgICAgICAgICAgICAgICAgICBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5ID0gbnNDb21wYXQoYXNJZlBhcnQsIChTY2hlbWFMb2NhbEVsZW1lbnQpIHBhcnRpY2xlLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgV2lsZGNhcmQvV2lsZGNhcmQgZGVyaXZhdGlvbgotICAgICAgICAgICAgICAgICAgICBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5ID0gbnNTdWJzZXQoYXNJZlBhcnQsIHBhcnRpY2xlLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgV2lsZGNhcmQvR3JvdXAgZGVyaXZhdGlvbgotICAgICAgICAgICAgICAgICAgICBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5ID0gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShhc0lmUGFydCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIGFueSBwYXJ0aWNsZSBpcyBpbnZhbGlkIHRoZW4gYnJlYWsgdGhlIGxvb3AKLSAgICAgICAgICAgIGlmICghbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gMiBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIHRoZSBncm91cCwgYXMgZGVmaW5lZCBieSBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGFsbCBhbmQgc2VxdWVuY2UpICinMy44LjYpCi0gICAgICAgIC8vIChpZiB0aGUgZ3JvdXAgaXMgYWxsIG9yIHNlcXVlbmNlKSBvciBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGNob2ljZSkgKKczLjguNikgKGlmIGl0IGlzIGNob2ljZSkgaXMgYSB2YWxpZAotICAgICAgICAvLyByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0KLSAgICAgICAgaWYgKG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkpIHsKLSAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBjaGVja0dyb3VwT2NjdXJyZW5jZU9LKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0dyb3VwT2NjdXJyZW5jZU9LKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgYm9vbGVhbiBncm91cE9jY3VycmVuY2VPSyA9IHRydWU7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWluUmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4UmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBnZXRFZmZlY3RpdmVNaW5SYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VBbGxTZXEoZGVyaXZlZE1vZGVsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIG1pblJhbmdlID0gZ2V0RWZmZWN0aXZlTWluUmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKTsKLSAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBtaW4gb2NjdXJzIGZvciB2YWxpZGl0eQotICAgICAgICAvLyBkZXJpdmVkIG1pbiBvY2N1cnMgaXMgdmFsaWQgaWYgaXRzIHttaW4gb2NjdXJzfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3Mge21pbiBvY2N1cnN9LgotICAgICAgICBpZiAobWluUmFuZ2UuY29tcGFyZVRvKGJhc2VNb2RlbC5nZXRNaW5PY2N1cnMoKSkgPCAwKSB7Ci0gICAgICAgICAgICBncm91cE9jY3VycmVuY2VPSyA9IGZhbHNlOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0R3JvdXBNaW5PY2N1cnNFcnJvcihkZXJpdmVkTW9kZWwsIGJhc2VNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBtYXggb2NjdXJzIGZvciB2YWxpZGl0eQotICAgICAgICAvLyBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIFRoZSBiYXNlIG1vZGVsJ3Mge21heCBvY2N1cnN9IGlzIHVuYm91bmRlZC4KLSAgICAgICAgLy8gb3IgYm90aCB7bWF4IG9jY3Vyc30gYXJlIG51bWJlcnMsIGFuZCB0aGUgcGFydGljbGUncyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3MKLSAgICAgICAgQmlnSW50ZWdlciBVTkJPVU5ERUQgPSBudWxsOwotICAgICAgICBpZiAoYmFzZU1vZGVsLmdldE1heE9jY3VycygpICE9IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgaWYgKG1heFJhbmdlID09IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgICAgIGdyb3VwT2NjdXJyZW5jZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0R3JvdXBNYXhPY2N1cnNFcnJvcihkZXJpdmVkTW9kZWwsIGJhc2VNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlLmNvbXBhcmVUbyhiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBncm91cE9jY3VycmVuY2VPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRHcm91cE1heE9jY3Vyc0Vycm9yKGRlcml2ZWRNb2RlbCwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ3JvdXBPY2N1cnJlbmNlT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEdyb3VwTWF4T2NjdXJzRXJyb3IoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1heE9jY3VycyBmb3IgdGhlIGRlcml2ZWQgZ3JvdXAgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiIGlzIGdyZWF0IHRoYW4gdGhlIGJhc2UgbWF4T2NjdXJzIG9mICIKLSAgICAgICAgICAgICAgICArIHByaW50TWF4T2NjdXJzKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEdyb3VwTWluT2NjdXJzRXJyb3IoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1pbk9jY3VycyBmb3IgdGhlIGRlcml2ZWQgZ3JvdXAgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiIGlzIGxlc3MgdGhhbiB0aGUgYmFzZSBtaW5PY2N1cnMgb2YgIgotICAgICAgICAgICAgICAgICsgYmFzZU1vZGVsLmdldE1pbk9jY3VycygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWF4UmFuZ2VDaG9pY2UoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4UmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIEJpZ0ludGVnZXIgVU5CT1VOREVEID0gbnVsbDsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGNob2ljZSkKLSAgICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhIHBhcnRpY2xlIHdob3NlIHt0ZXJtfSBpcyBhIGdyb3VwIHdob3NlIHtjb21wb3NpdG9yfSBpcyBjaG9pY2UKLSAgICAgICAgLy8gaXMgYSBwYWlyIG9mIG1pbmltdW0gYW5kIG1heGltdW0sIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIE1BWElNVU0KLSAgICAgICAgLy8gMSkgdW5ib3VuZGVkIGlmIHRoZSB7bWF4IG9jY3Vyc30gb2YgYW55IHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gb3IKLSAgICAgICAgLy8gdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGFueSBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGlzCi0gICAgICAgIC8vIHVuYm91bmRlZCAobm90ZTogc2VlbXMgdG8gYmUgdGhlIHNhbWUgYXMgTWF4IFJhbmdlIEFsbCBvciBTZXF1ZW5jZSksCi0gICAgICAgIC8vIG9yIDIpIGlmIGFueSBvZiB0aG9zZSBpcyBub24temVybyBhbmQgdGhlIHttYXggb2NjdXJzfSBvZiB0aGUgcGFydGljbGUgaXRzZWxmIGlzIHVuYm91bmRlZCwKLSAgICAgICAgLy8gb3RoZXJ3aXNlIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlIG1heGltdW0gb2YgdGhlIHttYXggb2NjdXJzfSBvZiBldmVyeQotICAgICAgICAvLyB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGFuZCB0aGUgKm1heGltdW0qIChub3RlOiB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlCi0gICAgICAgIC8vIGJldHdlZW4gTWF4UmFuZ2UgQ2hvaWNlIGFucyBNYXhSYW5nZSBBbGwgb3IgU2VxdWVuY2UpIHBhcnQgb2YgdGhlCi0gICAgICAgIC8vIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoIG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30KLSAgICAgICAgLy8gKG9yIDAgaWYgdGhlcmUgYXJlIG5vIHtwYXJ0aWNsZXN9KS4KLQotICAgICAgICBib29sZWFuIG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnNJbldpbGRDYXJkT3JFbGVtZW50ID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc0luR3JvdXAgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydGljbGVDaGlsZHJlbiA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZUNoaWxkcmVuW2ldOwotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiB1bmJvdW5kZWQgdGhlbiBtYXhvY2N1cnMgd2lsbCBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gVU5CT1VOREVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldEludE1heE9jY3VycygpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgdGh0IGF0IGxlYXN0IG9uZSBub24temVybyBwYXJ0aWNsZSBpcyBmb3VuZCBmb3IgbGF0ZXIgdGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8obWF4T2NjdXJzSW5XaWxkQ2FyZE9yRWxlbWVudCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc0luV2lsZENhcmRPckVsZW1lbnQgPSBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UgIT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGhpZ2hlc3QgbWF4b2NjdXJzIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UuY29tcGFyZVRvKG1heE9jY3Vyc0luR3JvdXApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc0luR3JvdXAgPSBtYXhSYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UgIT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGhpZ2hlc3QgbWF4b2NjdXJzIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UuY29tcGFyZVRvKG1heE9jY3Vyc0luR3JvdXApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc0luR3JvdXAgPSBtYXhSYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIGFuIHVuYm91bmRlZCBoYXMgYmVlbiBmb3VuZCB0aGVuIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBpZiAobWF4UmFuZ2UgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAxKSB1bmJvdW5kZWQgaWYgdGhlIHttYXggb2NjdXJzfSBvZiBhbnkgd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBvcgotICAgICAgICAvLyB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYW55IG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gaXMKLSAgICAgICAgLy8gdW5ib3VuZGVkCi0gICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgIC8vIDIpIGlmIGFueSBvZiB0aG9zZSBpcyBub24temVybyBhbmQgdGhlIHttYXggb2NjdXJzfSBvZiB0aGUgcGFydGljbGUgaXRzZWxmIGlzIHVuYm91bmRlZAotICAgICAgICAgICAgaWYgKG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgJiYgZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gVU5CT1VOREVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyAzKSB0aGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWF4IG9jY3Vyc30gYW5kIHRoZSBtYXhpbXVtIG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgZXZlcnkKLSAgICAgICAgICAgICAgICAvLyB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGFuZCB0aGUgKm1heGltdW0qCi0gICAgICAgICAgICAgICAgLy8gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfQotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpLm11bHRpcGx5KG1heE9jY3Vyc0luV2lsZENhcmRPckVsZW1lbnQuYWRkKG1heE9jY3Vyc0luR3JvdXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXhSYW5nZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGdldEVmZmVjdGl2ZU1heFJhbmdlQWxsU2VxKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICBCaWdJbnRlZ2VyIG1heFJhbmdlID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBCaWdJbnRlZ2VyIFVOQk9VTkRFRCA9IG51bGw7Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChhbGwgYW5kIHNlcXVlbmNlKQotICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGEgcGFydGljbGUgd2hvc2Uge3Rlcm19IGlzIGEgZ3JvdXAgd2hvc2Uge2NvbXBvc2l0b3J9IGlzIGFsbCBvciBzZXF1ZW5jZSBpcyBhCi0gICAgICAgIC8vIHBhaXIgb2YgbWluaW11bSBhbmQgbWF4aW11bSwgYXMgZm9sbG93czoKLSAgICAgICAgLy8gTUFYSU1VTQotICAgICAgICAvLyAxKSB1bmJvdW5kZWQgaWYgdGhlIHttYXggb2NjdXJzfSBvZiBhbnkgd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBvcgotICAgICAgICAvLyB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYW55IG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gaXMKLSAgICAgICAgLy8gdW5ib3VuZGVkLCBvciAyKSBpZiBhbnkgb2YgdGhvc2UgaXMgbm9uLXplcm8gYW5kIHRoZSB7bWF4IG9jY3Vyc30gb2YgdGhlIHBhcnRpY2xlIGl0c2VsZiBpcyB1bmJvdW5kZWQsIG90aGVyd2lzZQotICAgICAgICAvLyAzKSB0aGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWF4IG9jY3Vyc30gYW5kIHRoZSAqc3VtKiBvZiB0aGUge21heCBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoIG9mCi0gICAgICAgIC8vIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gKG9yIDAgaWYgdGhlcmUgYXJlIG5vIHtwYXJ0aWNsZXN9KS4KLQotICAgICAgICBib29sZWFuIG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnNUb3RhbCA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnNJbkdyb3VwID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRpY2xlQ2hpbGRyZW4gPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdW5ib3VuZGVkIHRoZW4gbWF4b2NjdXJzIHdpbGwgYmUgbnVsbAotICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IFVOQk9VTkRFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZS5nZXRJbnRNYXhPY2N1cnMoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRodCBhdCBsZWFzdCBvbmUgbm9uLXplcm8gcGFydGljbGUgaXMgZm91bmQgZm9yIGxhdGVyIHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25aZXJvUGFydGljbGVDaGlsZEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnNUb3RhbCA9IG1heE9jY3Vyc1RvdGFsLmFkZChwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UgIT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGhpZ2hlc3QgbWF4b2NjdXJzIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UuY29tcGFyZVRvKG1heE9jY3Vyc0luR3JvdXApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc0luR3JvdXAgPSBtYXhSYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UgIT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGhpZ2hlc3QgbWF4b2NjdXJzIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UuY29tcGFyZVRvKG1heE9jY3Vyc0luR3JvdXApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc0luR3JvdXAgPSBtYXhSYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIGFuIHVuYm91bmRlZCBoYXMgYmVlbiBmb3VuZCB0aGVuIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBpZiAobWF4UmFuZ2UgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAxKSB1bmJvdW5kZWQgaWYgdGhlIHttYXggb2NjdXJzfSBvZiBhbnkgd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBvcgotICAgICAgICAvLyB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYW55IG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gaXMKLSAgICAgICAgLy8gdW5ib3VuZGVkCi0gICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgIC8vIDIpIGlmIGFueSBvZiB0aG9zZSBpcyBub24temVybyBhbmQgdGhlIHttYXggb2NjdXJzfSBvZiB0aGUgcGFydGljbGUgaXRzZWxmIGlzIHVuYm91bmRlZAotICAgICAgICAgICAgaWYgKG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgJiYgZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gVU5CT1VOREVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyAzKSB0aGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWF4IG9jY3Vyc30gYW5kIHRoZSBzdW0gb2YgdGhlIHttYXggb2NjdXJzfSBvZiBldmVyeSB3aWxkY2FyZCBvciBlbGVtZW50Ci0gICAgICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoIG9mCi0gICAgICAgICAgICAgICAgLy8gdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfQotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpLm11bHRpcGx5KG1heE9jY3Vyc1RvdGFsLmFkZChtYXhPY2N1cnNJbkdyb3VwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWF4UmFuZ2U7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGdldEVmZmVjdGl2ZU1pblJhbmdlQ2hvaWNlKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoY2hvaWNlKQotICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGEgcGFydGljbGUgd2hvc2Uge3Rlcm19IGlzIGEgZ3JvdXAgd2hvc2Uge2NvbXBvc2l0b3J9IGlzIGNob2ljZSBpcyBhIHBhaXIgb2YKLSAgICAgICAgLy8gbWluaW11bSBhbmQgbWF4aW11bSwgYXMgZm9sbG93czoKLSAgICAgICAgLy8gTUlOSU1VTQotICAgICAgICAvLyBUaGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWluIG9jY3Vyc30KLSAgICAgICAgLy8gYW5kIHRoZSAqbWluaW11bSogb2YgdGhlIHttaW4gb2NjdXJzfSBvZiBldmVyeSB3aWxkY2FyZCBvciBlbGVtZW50Ci0gICAgICAgIC8vIGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGFuZCB0aGUgbWluaW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaCBvZgotICAgICAgICAvLyB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IChvciAwIGlmIHRoZXJlIGFyZSBubyB7cGFydGljbGVzfSkuCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydGljbGVDaGlsZHJlbiA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgQmlnSW50ZWdlciBtaW5SYW5nZSA9IG51bGw7Ci0gICAgICAgIC8vIGdldCB0aGUgbWluaW11bSBvZiBldmVyeSB3aWxkY2FyZCBvciBlbGVtZW50Ci0gICAgICAgIC8vIHRvdGFsIHVwIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2UgZm9yIGVhY2ggZ3JvdXAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaW5SYW5nZSA9PSBudWxsIHx8IG1pblJhbmdlLmNvbXBhcmVUbyhwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW5SYW5nZSA9IHBhcnRpY2xlLmdldE1pbk9jY3VycygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbXJzID0gZ2V0RWZmZWN0aXZlTWluUmFuZ2VBbGxTZXEoZGVyaXZlZE1vZGVsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJhbmdlID09IG51bGwgfHwgbWluUmFuZ2UuY29tcGFyZVRvKG1ycykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW5SYW5nZSA9IG1yczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtcmMgPSBnZXRFZmZlY3RpdmVNaW5SYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWluUmFuZ2UgPT0gbnVsbCB8fCBtaW5SYW5nZS5jb21wYXJlVG8obXJjKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblJhbmdlID0gbXJjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtaW5SYW5nZSA9PSBudWxsKQotICAgICAgICAgICAgbWluUmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0KLSAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0b3RhbAotICAgICAgICBtaW5SYW5nZSA9IGRlcml2ZWRNb2RlbC5nZXRNaW5PY2N1cnMoKS5tdWx0aXBseShtaW5SYW5nZSk7Ci0gICAgICAgIHJldHVybiBtaW5SYW5nZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGdldEVmZmVjdGl2ZU1pblJhbmdlQWxsU2VxKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICBCaWdJbnRlZ2VyIG1pblJhbmdlID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoYWxsIGFuZCBzZXF1ZW5jZSkKLSAgICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhIHBhcnRpY2xlIHdob3NlIHt0ZXJtfSBpcyBhIGdyb3VwIHdob3NlIHtjb21wb3NpdG9yfSBpcyBhbGwgb3Igc2VxdWVuY2UgaXMgYQotICAgICAgICAvLyBwYWlyIG9mIG1pbmltdW0gYW5kIG1heGltdW0sIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIE1JTklNVU0KLSAgICAgICAgLy8gVGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21pbiBvY2N1cnN9Ci0gICAgICAgIC8vIGFuZCB0aGUgKnN1bSogb2YgdGhlIHttaW4gb2NjdXJzfSBvZiBldmVyeSB3aWxkY2FyZCBvciBlbGVtZW50Ci0gICAgICAgIC8vIGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9Ci0gICAgICAgIC8vIGFuZCB0aGUgbWluaW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaAotICAgICAgICAvLyBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IChvciAwIGlmIHRoZXJlIGFyZSBubyB7cGFydGljbGVzfSkuCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydGljbGVDaGlsZHJlbiA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlVG90YWxNaW5PY2N1cnMgPSBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzLmFkZChwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlVG90YWxNaW5PY2N1cnMgPSBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzLmFkZChnZXRFZmZlY3RpdmVNaW5SYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlVG90YWxNaW5PY2N1cnMgPSBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzLmFkZChnZXRFZmZlY3RpdmVNaW5SYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtaW5SYW5nZSA9IGRlcml2ZWRNb2RlbC5nZXRNaW5PY2N1cnMoKS5tdWx0aXBseShwYXJ0aWNsZVRvdGFsTWluT2NjdXJzKTsKLQotICAgICAgICByZXR1cm4gbWluUmFuZ2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuc1N1YnNldChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIG5zU3Vic2V0IGlzIGNhbGxlZCB3aGVuIGJhc2U6IEFOWSwgZGVyaXZlZDogQU5ZCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQ7Ci0gICAgICAgIGFzc2VydCBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQ7Ci0gICAgICAgIGJvb2xlYW4gbnNTdWJzZXQgPSBmYWxzZTsKLSAgICAgICAgLy8gRm9yIGEgd2lsZGNhcmQgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGFub3RoZXIgd2lsZGNhcmQgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFIncyBvY2N1cnJlbmNlIHJhbmdlIG11c3QgYmUgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIGlmIChvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgLy8gMiBSJ3Mge25hbWVzcGFjZSBjb25zdHJhaW50fSBtdXN0IGJlIGFuIGludGVuc2lvbmFsIHN1YnNldCBvZiBCJ3Mge25hbWVzcGFjZSBjb25zdHJhaW50fSBhcyBkZWZpbmVkCi0gICAgICAgICAgICAvLyBieSBXaWxkY2FyZCBTdWJzZXQgKKczLjEwLjYpLgotICAgICAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLmludmVyc2UoKS5pc0Rpc2pvaW50KGRlcml2ZWRNb2RlbC5nZXRXaWxkY2FyZFNldCgpKSkgewotICAgICAgICAgICAgICAgIG5zU3Vic2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbnNTdWJzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXROU0lzTm90U3Vic2V0RXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuc1N1YnNldCA9IGZhbHNlOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0TlNJc05vdFN1YnNldEVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gbnNTdWJzZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuc0NvbXBhdChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkRWxlbWVudCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIG5zQ29tcGF0IGlzIGNhbGxlZCB3aGVuIGJhc2U6IEFOWSwgZGVyaXZlZDogRUxFTUVOVAotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOwotICAgICAgICBib29sZWFuIG5zQ29tcGF0ID0gZmFsc2U7Ci0gICAgICAgIC8vIEZvciBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhIHdpbGRjYXJkIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gMSBUaGUgZWxlbWVudCBkZWNsYXJhdGlvbidzIHt0YXJnZXQgbmFtZXNwYWNlfSBpcyC3dmFsaWS3IHdpdGggcmVzcGVjdCB0byB0aGUgd2lsZGNhcmQncyB7bmFtZXNwYWNlIGNvbnN0cmFpbnR9Ci0gICAgICAgIC8vIGFzIGRlZmluZWQgYnkgV2lsZGNhcmQgYWxsb3dzIE5hbWVzcGFjZSBOYW1lICinMy4xMC40KS4KLSAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLmNvbnRhaW5zKGRlcml2ZWRFbGVtZW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIC8vIDIgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgICAgICBpZiAob2NjdXJyZW5jZVJhbmdlT0soYmFzZU1vZGVsLCAoU2NoZW1hUGFydGljbGUpIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgbnNDb21wYXQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yKGJhc2VNb2RlbCwgKFNjaGVtYVBhcnRpY2xlKSBkZXJpdmVkRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5zQ29tcGF0ID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXROU0lzTm90U3Vic2V0RXJyb3IoYmFzZU1vZGVsLCAoU2NoZW1hUGFydGljbGUpIGRlcml2ZWRFbGVtZW50KSwgY29udGV4dCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gbnNDb21wYXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE5TSXNOb3RTdWJzZXRFcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uIFRoZSBuYW1lc3BhY2Uocykgb2YgdGhlIGRlcml2ZWQgZmllbGQ6ICIgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRQYXJ0aWNsZSkKLSAgICAgICAgICAgICAgICArICIgYXJlIG5vdCBhIHN1YnNldCBvZiB0aGUgbmFtZXNwYWNlKHMpIG9mIHRoZSBiYXNlIGZpZWxkOiAiICsgcHJpbnRQYXJ0aWNsZShiYXNlUGFydGljbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgZGVyaXZlZCBjb250ZW50IG1vZGVsICIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZE1vZGVsKQotICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgcmVzdHJpY3QgYmFzZSBjb250ZW50IG1vZGVsICIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoYmFzZU1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5hbWVBbmRUeXBlT0soU2NoZW1hTG9jYWxFbGVtZW50IGJhc2VFbGVtZW50LCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZEVsZW1lbnQsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICAvLyBuYW1lQW5kVHlwZU9LIGNhbGxlZCB3aGVuIGJhc2U6IEVMRU1FTlQgYW5kIGRlcml2ZWQ6IEVMRU1FTlQKLSAgICAgICAgYm9vbGVhbiBuYW1lQW5kVHlwZU9LID0gZmFsc2U7Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogUGFydGljbGUgUmVzdHJpY3Rpb24gT0sgKEVsdDpFbHQgLS0gTmFtZUFuZFR5cGVPSykKLSAgICAgICAgLy8gMSBUaGUgZGVjbGFyYXRpb25zJyB7bmFtZX1zIGFuZCB7dGFyZ2V0IG5hbWVzcGFjZX1zIGFyZSB0aGUgc2FtZS4KLSAgICAgICAgaWYgKCgoU2NoZW1hUGFydGljbGUpYmFzZUVsZW1lbnQpLmNhblN0YXJ0V2l0aEVsZW1lbnQoZGVyaXZlZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgLy8gMiBFaXRoZXIgQidzIHtuaWxsYWJsZX0gaXMgdHJ1ZSBvciBSJ3Mge25pbGxhYmxlfSBpcyBmYWxzZS4KLSAgICAgICAgICAgIGlmIChiYXNlRWxlbWVudC5pc05pbGxhYmxlKCkgfHwgIWRlcml2ZWRFbGVtZW50LmlzTmlsbGFibGUoKSkgewotICAgICAgICAgICAgICAgIC8vIDMgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgICAgICAgICAgaWYgKG9jY3VycmVuY2VSYW5nZU9LKChTY2hlbWFQYXJ0aWNsZSkgYmFzZUVsZW1lbnQsIChTY2hlbWFQYXJ0aWNsZSkgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gNCBlaXRoZXIgQidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGFic2VudCwgb3IgaXMgbm90IGZpeGVkLAotICAgICAgICAgICAgICAgICAgICAvLyBvciBSJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgZml4ZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgbmFtZUFuZFR5cGVPSyA9IGNoZWNrRml4ZWQoYmFzZUVsZW1lbnQsIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUFuZFR5cGVPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gNSBSJ3MgZGVjbGFyYXRpb24ncyB7aWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uc30gaXMgYSBzdWJzZXQgb2YgQidzIGRlY2xhcmF0aW9uJ3Mge2lkZW50aXR5LWNvbnN0cmFpbnQgZGVmaW5pdGlvbnN9LCBpZiBhbnkuCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lQW5kVHlwZU9LID0gY2hlY2tJZGVudGl0eUNvbnN0cmFpbnRzKGJhc2VFbGVtZW50LCBkZXJpdmVkRWxlbWVudCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQW5kVHlwZU9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNyBSJ3Mge3R5cGUgZGVmaW5pdGlvbn0gaXMgdmFsaWRseSBkZXJpdmVkIGdpdmVuIHtleHRlbnNpb24sIGxpc3QsIHVuaW9ufSBmcm9tIEIncyB7dHlwZSBkZWZpbml0aW9ufSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgYnkgVHlwZSBEZXJpdmF0aW9uIE9LIChDb21wbGV4KSAopzMuNC42KSBvciBUeXBlIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKKczLjE0LjYpLCBhcyBhcHByb3ByaWF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lQW5kVHlwZU9LID0gdHlwZURlcml2YXRpb25PSyhiYXNlRWxlbWVudC5nZXRUeXBlKCksIGRlcml2ZWRFbGVtZW50LmdldFR5cGUoKSwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUFuZFR5cGVPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2IFIncyBkZWNsYXJhdGlvbidzIHtkaXNhbGxvd2VkIHN1YnN0aXR1dGlvbnN9IGlzIGEgc3VwZXJzZXQgb2YgQidzIGRlY2xhcmF0aW9uJ3Mge2Rpc2FsbG93ZWQgc3Vic3RpdHV0aW9uc30uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBbmRUeXBlT0sgPSBibG9ja1NldE9LKGJhc2VFbGVtZW50LCBkZXJpdmVkRWxlbWVudCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWVBbmRUeXBlT0s7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYmxvY2tTZXRPSyhTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZUVsZW1lbnQsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkRWxlbWVudCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYgKGJhc2VFbGVtZW50LmJsb2NrUmVzdHJpY3Rpb24oKSAmJiAhZGVyaXZlZEVsZW1lbnQuYmxvY2tSZXN0cmljdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiUmVzdHJpY3Rpb24gSW52YWxpZC4gIERlcml2ZWQgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWRlcml2ZWRFbGVtZW50KSArICIgZG9lcyBub3QgYmxvY2sgcmVzdHJpY3Rpb24gYXMgZG9lcyB0aGUgYmFzZSAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpYmFzZUVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VFbGVtZW50LmJsb2NrRXh0ZW5zaW9uKCkgJiYgIWRlcml2ZWRFbGVtZW50LmJsb2NrRXh0ZW5zaW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJSZXN0cmljdGlvbiBJbnZhbGlkLiAgRGVyaXZlZCAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpZGVyaXZlZEVsZW1lbnQpICsgIiBkb2VzIG5vdCBibG9jayBleHRlbnNpb24gYXMgZG9lcyB0aGUgYmFzZSAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpYmFzZUVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VFbGVtZW50LmJsb2NrU3Vic3RpdHV0aW9uKCkgJiYgIWRlcml2ZWRFbGVtZW50LmJsb2NrU3Vic3RpdHV0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJSZXN0cmljdGlvbiBJbnZhbGlkLiAgRGVyaXZlZCAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpZGVyaXZlZEVsZW1lbnQpICsgIiBkb2VzIG5vdCBibG9jayBzdWJzdGl0dXRpb24gYXMgZG9lcyB0aGUgYmFzZSAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpYmFzZUVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7ICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZURlcml2YXRpb25PSyhTY2hlbWFUeXBlIGJhc2VUeXBlLCBTY2hlbWFUeXBlIGRlcml2ZWRUeXBlLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgYm9vbGVhbiB0eXBlRGVyaXZhdGlvbk9LID0gZmFsc2U7Ci0gICAgICAgIC8vIDEgSWYgQiBhbmQgRCBhcmUgbm90IHRoZSBzYW1lIHR5cGUgZGVmaW5pdGlvbiwgdGhlbiB0aGUge2Rlcml2YXRpb24gbWV0aG9kfSBvZiBEIG11c3Qgbm90IGJlIGluIHRoZSBzdWJzZXQuCi0gICAgICAgIC8vIDIgT25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAyLjEgQiBhbmQgRCBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAgLy8gMi4yIEIgbXVzdCBiZSBEJ3Mge2Jhc2UgdHlwZSBkZWZpbml0aW9ufS4KLSAgICAgICAgLy8gMi4zIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gMi4zLjEgRCdzIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBub3QgYmUgdGhlILd1ci10eXBlIGRlZmluaXRpb263LgotICAgICAgICAvLyAyLjMuMiBUaGUgYXBwcm9wcmlhdGUgY2FzZSBhbW9uZyB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gMi4zLjIuMSBJZiBEJ3Mge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBpcyBjb21wbGV4LCB0aGVuIGl0IG11c3QgYmUgdmFsaWRseSBkZXJpdmVkIGZyb20gQiBnaXZlbiB0aGUgc3Vic2V0IGFzIGRlZmluZWQgYnkgdGhpcyBjb25zdHJhaW50LgotICAgICAgICAvLyAyLjMuMi4yIElmIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIHNpbXBsZSwgdGhlbiBpdCBtdXN0IGJlIHZhbGlkbHkgZGVyaXZlZCBmcm9tIEIgZ2l2ZW4gdGhlIHN1YnNldCBhcyBkZWZpbmVkIGluIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNikuCi0gICAgICAgIC8vICAgVGhpcyBsaW5lIHdpbGwgY2hlY2sgaWYgZGVyaXZlZFR5cGUgaXMgYSBzdWJUeXBlIG9mIGJhc2VUeXBlIChzaG91bGQgaGFuZGxlIGFsbCBvZiB0aGUgMi54eCBjaGVja3MgYWJvdmUpCi0gICAgICAgIGlmIChiYXNlVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGRlcml2ZWRUeXBlKSkgewotICAgICAgICAgICAgLy8gT2sgZGVyaXZlZCB0eXBlIGlzIHN1YnR5cGUgYnV0IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZSBkZXJpdmF0aW9ucyBiZXR3ZWVuIHRoZSB0d28gdHlwZXMgYXJlIGJ5Ci0gICAgICAgICAgICAvLyBSZXN0cmljdGlvbi4KLSAgICAgICAgICAgIHR5cGVEZXJpdmF0aW9uT0sgPSBjaGVja0FsbERlcml2YXRpb25zRm9yUmVzdHJpY3Rpb24oYmFzZVR5cGUsIGRlcml2ZWRUeXBlLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZGVyaXZlZCB0eXBlIGlzIG5vdCBhIHN1Yi10eXBlIG9mIGJhc2UgdHlwZQotICAgICAgICAgICAgdHlwZURlcml2YXRpb25PSyA9IGZhbHNlOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZFR5cGVOb3RTdWJUeXBlRXJyb3IoYmFzZVR5cGUsIGRlcml2ZWRUeXBlKSwgY29udGV4dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGVEZXJpdmF0aW9uT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdERlcml2ZWRUeXBlTm90U3ViVHlwZUVycm9yKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICJSZXN0cmljdGlvbiBJbnZhbGlkLiAgRGVyaXZlZCBUeXBlOiAiICsgcHJpbnRUeXBlKGRlcml2ZWRUeXBlKSArICIgaXMgbm90IGEgc3ViLXR5cGUgb2YgQmFzZSBUeXBlOiAiICsgcHJpbnRUeXBlKGJhc2VUeXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQWxsRGVyaXZhdGlvbnNGb3JSZXN0cmljdGlvbihTY2hlbWFUeXBlIGJhc2VUeXBlLCBTY2hlbWFUeXBlIGRlcml2ZWRUeXBlLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLQotICAgICAgICBib29sZWFuIGFsbERlcml2YXRpb25zQXJlUmVzdHJpY3Rpb25zID0gdHJ1ZTsKLSAgICAgICAgU2NoZW1hVHlwZSBjdXJyZW50VHlwZSA9IGRlcml2ZWRUeXBlOwotICAgICAgICAvLyBydW4gdXAgdGhlIHR5cGVzIGhpZXJhcmNoeSBmcm9tIGRlcml2ZWQgVHlwZSB0byBiYXNlIFR5cGUgYW5kIG1ha2Ugc3VyZSB0aGF0IGFsbCBhcmUgZGVyaXZlZCBieQotICAgICAgICAvLyAgIHJlc3RyaWN0aW9uLiAgSWYgYW55IGFyZSBub3QgdGhlbiB0aGlzIGlzIG5vdCBhIHZhbGlkIHJlc3RyaWN0aW9uLgotICAgICAgICB3aGlsZSAoIWJhc2VUeXBlLmVxdWFscyhjdXJyZW50VHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50VHlwZS5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsbERlcml2YXRpb25zQXJlUmVzdHJpY3Rpb25zID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0QWxsRGVyaXZhdGlvbnNBcmVOb3RSZXN0cmljdGlvbnNFcnJvcihiYXNlVHlwZSwgZGVyaXZlZFR5cGUsIGN1cnJlbnRUeXBlKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbGxEZXJpdmF0aW9uc0FyZVJlc3RyaWN0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0QWxsRGVyaXZhdGlvbnNBcmVOb3RSZXN0cmljdGlvbnNFcnJvcihTY2hlbWFUeXBlIGJhc2VUeXBlLCBTY2hlbWFUeXBlIGRlcml2ZWRUeXBlLCBTY2hlbWFUeXBlIGN1cnJlbnRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSB0eXBlICIgKyBwcmludFR5cGUoZGVyaXZlZFR5cGUpICsgIiBkZXJpdmVkIGZyb20gYmFzZSB0eXBlICIKLSAgICAgICAgICAgICAgICArIHByaW50VHlwZShiYXNlVHlwZSkgKyAiIGhhcyBhbiBpbnRlcm1lZGlhcnkgdHlwZSAiICsgcHJpbnRUeXBlKGN1cnJlbnRUeXBlKQotICAgICAgICAgICAgICAgICsgInRoYXQgaXMgbm90IGRlcml2ZWQgYnkgcmVzdHJpY3Rpb24uIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrSWRlbnRpdHlDb25zdHJhaW50cyhTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZUVsZW1lbnQsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkRWxlbWVudCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIDUgUidzIGRlY2xhcmF0aW9uJ3Mge2lkZW50aXR5LWNvbnN0cmFpbnQgZGVmaW5pdGlvbnN9IGlzIGEgc3Vic2V0IG9mIEIncyBkZWNsYXJhdGlvbidzIHtpZGVudGl0eS1jb25zdHJhaW50IGRlZmluaXRpb25zfSwgaWYgYW55LgotICAgICAgICBib29sZWFuIGlkZW50aXR5Q29uc3RyYWludHNPSyA9IHRydWU7Ci0KLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gYmFzZUNvbnN0cmFpbnRzID0gYmFzZUVsZW1lbnQuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpOwotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBkZXJpdmVkQ29uc3RyYWludHMgPSBkZXJpdmVkRWxlbWVudC5nZXRJZGVudGl0eUNvbnN0cmFpbnRzKCk7Ci0gICAgICAgIC8vIGN5Y2xlIHRocnUgZGVyaXZlZCdzIGlkZW50aXR5IGNvbnN0cmFpbnRzIGFuZCBjaGVjayBlYWNoIHRvIGFzc3VyZSB0aGV5IGluIHRoZSBhcnJheSBvZiBiYXNlIGNvbnN0cmFpbnRzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZENvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZGVyaXZlZENvbnN0cmFpbnQgPSBkZXJpdmVkQ29uc3RyYWludHNbaV07Ci0gICAgICAgICAgICBpZiAoY2hlY2tGb3JJZGVudGl0eUNvbnN0cmFpbnRFeGlzdGVuY2UoYmFzZUNvbnN0cmFpbnRzLCBkZXJpdmVkQ29uc3RyYWludCkpIHsKLSAgICAgICAgICAgICAgICBpZGVudGl0eUNvbnN0cmFpbnRzT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJZGVudGl0eUNvbnN0cmFpbnRzTm90U3Vic2V0RXJyb3IoYmFzZUVsZW1lbnQsIGRlcml2ZWRFbGVtZW50KSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZGVudGl0eUNvbnN0cmFpbnRzT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdElkZW50aXR5Q29uc3RyYWludHNOb3RTdWJzZXRFcnJvcihTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZUVsZW1lbnQsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkRWxlbWVudCkgewotICAgICAgICByZXR1cm4gIlJlc3RyaWN0aW9uIEludmFsaWQuICBUaGUgaWRlbnRpdHkgY29uc3RyYWludHMgZm9yICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkRWxlbWVudCkKLSAgICAgICAgICAgICAgICArICIgYXJlIG5vdCBhIHN1YnNldCBvZiB0aGUgaWRlbnRpdHkgY29uc3RyYWludHMgZm9yICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0ZvcklkZW50aXR5Q29uc3RyYWludEV4aXN0ZW5jZShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBiYXNlQ29uc3RyYWludHMsIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBkZXJpdmVkQ29uc3RyYWludCkgewotICAgICAgICAvLyBzcGluIHRocnUgdGhlIGJhc2UgaWRlbnRpdHkgY29uc3RyYWludHMgY2hlY2sgdG8gc2VlIGlmIGRlcml2ZWQgY29uc3RyYWludCBleGlzdHMKLSAgICAgICAgYm9vbGVhbiBpZGVudGl0eUNvbnN0cmFpbnRFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlQ29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBiYXNlQ29uc3RyYWludCA9IGJhc2VDb25zdHJhaW50c1tpXTsKLSAgICAgICAgICAgIGlmIChiYXNlQ29uc3RyYWludC5nZXROYW1lKCkuZXF1YWxzKGRlcml2ZWRDb25zdHJhaW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBpZGVudGl0eUNvbnN0cmFpbnRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZGVudGl0eUNvbnN0cmFpbnRFeGlzdHM7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrRml4ZWQoU2NoZW1hTG9jYWxFbGVtZW50IGJhc2VNb2RlbCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIDQgZWl0aGVyIEIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBhYnNlbnQsIG9yIGlzIG5vdCBmaXhlZCwKLSAgICAgICAgLy8gb3IgUidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGZpeGVkIHdpdGggdGhlIHNhbWUgdmFsdWUuCi0gICAgICAgIGJvb2xlYW4gY2hlY2tGaXhlZCA9IGZhbHNlOwotICAgICAgICBpZiAoYmFzZU1vZGVsLmlzRml4ZWQoKSkgewotICAgICAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXREZWZhdWx0VGV4dCgpLmVxdWFscyhkZXJpdmVkTW9kZWwuZ2V0RGVmYXVsdFRleHQoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyAgUidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGZpeGVkIHdpdGggdGhlIHNhbWUgdmFsdWUuCi0gICAgICAgICAgICAgICAgY2hlY2tGaXhlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZXJpdmVkIGVsZW1lbnQgaGFzIGEgZml4ZWQgdmFsdWUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYmFzZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZEZpeGVkRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gIEIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBhYnNlbnQsIG9yIGlzIG5vdCBmaXhlZCwKLSAgICAgICAgICAgIGNoZWNrRml4ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGVja0ZpeGVkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRJbnZhbGlkRml4ZWRFcnJvcihTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZU1vZGVsLCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiVGhlIERlcml2ZWQgQ29udGVudCBNb2RlbCBvbiBFbGVtZW50OiAnIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpZGVyaXZlZE1vZGVsKQotICAgICAgICAgICAgICAgICsgIicgaGFzIGEgZml4ZWQgdmFsdWUgb2Y6ICciCi0gICAgICAgICAgICAgICAgKyBkZXJpdmVkTW9kZWwuZ2V0RGVmYXVsdFRleHQoKQotICAgICAgICAgICAgICAgICsgIicgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIEJhc2UgQ29udGVudCBNb2RlbDogJyIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWJhc2VNb2RlbCkKLSAgICAgICAgICAgICAgICArICInIHdoYXQgaGFzIGEgZml4ZWQgdmFsdWUgb2Y6ICciCi0gICAgICAgICAgICAgICAgKyBiYXNlTW9kZWwuZ2V0RGVmYXVsdFRleHQoKSArICInIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG9jY3VycmVuY2VSYW5nZU9LKFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSwgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgYm9vbGVhbiBvY2N1cnJlbmNlUmFuZ2VPSyA9IGZhbHNlOwotICAgICAgICAvLyBOb3RlOiBpbiB0aGUgZm9sbG93aW5nIGNvbW1lbnRzIChmcm9tIHRoZSBzY2hlbWEgc3BlYykgb3RoZXIgaXMgdGhlIGJhc2VNb2RlbAotICAgICAgICAvLyAxIEl0cyB7bWluIG9jY3Vyc30gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlcidzIHttaW4gb2NjdXJzfS4KLSAgICAgICAgaWYgKGRlcml2ZWRQYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKS5jb21wYXJlVG8oYmFzZVBhcnRpY2xlLmdldE1pbk9jY3VycygpKSA+PSAwKSB7Ci0gICAgICAgICAgICAvLyAyIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgICAgIC8vIDIuMSBUaGUgb3RoZXIncyB7bWF4IG9jY3Vyc30gaXMgdW5ib3VuZGVkLgotICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2NjdXJyZW5jZVJhbmdlT0sgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyAyLjIgQm90aCB7bWF4IG9jY3Vyc30gYXJlIG51bWJlcnMsIGFuZCB0aGUgcGFydGljbGUncyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3MuCi0gICAgICAgICAgICAgICAgaWYgKGRlcml2ZWRQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSAhPSBudWxsICYmIGJhc2VQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKGJhc2VQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlUmFuZ2VPSyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZVJhbmdlT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZS5nZXROYW1lKCkgPT0gbnVsbCB8fCBkZXJpdmVkUGFydGljbGUuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3JHcm91cChiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3IoYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvY2N1cnJlbmNlUmFuZ2VPSyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZS5nZXROYW1lKCkgPT0gbnVsbCB8fCBkZXJpdmVkUGFydGljbGUuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yR3JvdXAoYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3IoYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9jY3VycmVuY2VSYW5nZU9LOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yR3JvdXAoU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1heE9jY3VycyBmb3IgdGhlICIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZFBhcnRpY2xlKQotICAgICAgICAgICAgICAgICsgIiAoIiArIHByaW50TWF4T2NjdXJzKGRlcml2ZWRQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgICAgICAgICArICIpIGlzIGdyZWF0ZXIgdGhhbiB0aGFuIHRoZSBtYXhPY2N1cnMgZm9yIHRoZSBiYXNlICIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoYmFzZVBhcnRpY2xlKQotICAgICAgICAgICAgICAgICsgIiAoIiArIHByaW50TWF4T2NjdXJzKGJhc2VQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3JHcm91cChTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWluT2NjdXJzIGZvciB0aGUgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgZGVyaXZlZFBhcnRpY2xlLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIpIGlzIGxlc3MgdGhhbiB0aGFuIHRoZSBtaW5PY2N1cnMgZm9yIHRoZSBiYXNlICIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoYmFzZVBhcnRpY2xlKQotICAgICAgICAgICAgICAgICsgIiAoIiArIGJhc2VQYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKS50b1N0cmluZygpICsgIikiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VGaWVsZCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZEZpZWxkKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtaW5PY2N1cnMgZm9yIHRoZSBlbGVtZW50OiAnIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkRmllbGQpCi0gICAgICAgICAgICAgICAgKyAiJyAoIiArIGRlcml2ZWRGaWVsZC5nZXRNaW5PY2N1cnMoKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiKSBpcyBsZXNzIHRoYW4gdGhhbiB0aGUgbWluT2NjdXJzIGZvciB0aGUgYmFzZSBlbGVtZW50OiAnIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlRmllbGQpCi0gICAgICAgICAgICAgICAgKyAiJyAoIiArIGJhc2VGaWVsZC5nZXRNaW5PY2N1cnMoKS50b1N0cmluZygpICsgIikiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VGaWVsZCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZEZpZWxkKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtYXhPY2N1cnMgZm9yIHRoZSBlbGVtZW50OiAnIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkRmllbGQpCi0gICAgICAgICAgICAgICAgKyAiJyAoIiArIHByaW50TWF4T2NjdXJzKGRlcml2ZWRGaWVsZC5nZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgICAgICAgICArICIpIGlzIGdyZWF0ZXIgdGhhbiB0aGFuIHRoZSBtYXhPY2N1cnMgZm9yIHRoZSBiYXNlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGJhc2VGaWVsZCkgKyAiJyAoIiArIHByaW50TWF4T2NjdXJzKGJhc2VGaWVsZC5nZXRNYXhPY2N1cnMoKSkgKyAiKSI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmludFBhcnRpY2xlKFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIHJldHVybiAiPGFsbD4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8Y2hvaWNlPiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8ZWxlbWVudCBuYW1lPVwiIiArIFFOYW1lSGVscGVyLnByZXR0eShwYXJ0LmdldE5hbWUoKSkgKyAiXCI+IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8c2VxdWVuY2U+IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8YW55PiI7Ci0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIj8/IjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbnRNYXhPY2N1cnMoQmlnSW50ZWdlciBiaSkKLSAgICB7Ci0gICAgICAgIGlmIChiaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICJ1bmJvdW5kZWQiOwotICAgICAgICByZXR1cm4gYmkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50VHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5wcmV0dHkodHlwZS5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gdHlwZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTdWJzdGl0dXRpb25Hcm91cHMoU2NoZW1hR2xvYmFsRWxlbWVudFtdIGVsdHMpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZWx0cy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0ID0gZWx0c1tpXTsKLSAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgaGVhZCA9IGVsdC5zdWJzdGl0dXRpb25Hcm91cCgpOwotCi0gICAgICAgICAgICBpZiAoaGVhZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgaGVhZFR5cGUgPSBoZWFkLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHRhaWxUeXBlID0gZWx0LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3QgcGFyc2VUcmVlID0gKChTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCllbHQpLl9wYXJzZU9iamVjdDsKLQotICAgICAgICAgICAgICAgIGlmICghIGhlYWRUeXBlLmlzQXNzaWduYWJsZUZyb20odGFpbFR5cGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShlbHQuZ2V0TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIG11c3QgaGF2ZSBhIHR5cGUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHR5cGUgb2YgaXRzIHN1YnN0aXR1dGlvbiBncm91cC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LklOQ09OU0lTVEVOVF9UWVBFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVhZC5maW5hbEV4dGVuc2lvbigpICYmIGhlYWQuZmluYWxSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShlbHQuZ2V0TmFtZSgpKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIGVsZW1lbnQgd2l0aCBmaW5hbD0nI2FsbCciLAotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEgaGVhZFR5cGUuZXF1YWxzKHRhaWxUeXBlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoZWFkLmZpbmFsRXh0ZW5zaW9uKCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZWx0LmdldE5hbWUoKSkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgZWxlbWVudCB3aXRoIGZpbmFsPSdleHRlbnNpb24nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWFkLmZpbmFsUmVzdHJpY3Rpb24oKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsVHlwZS5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZWx0LmdldE5hbWUoKSkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgZWxlbWVudCB3aXRoIGZpbmFsPSdyZXN0cmljdGlvbiciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ29tcGxleFR5cGVSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzMzkzOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ29tcGxleFR5cGVSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuKjsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkFueURvY3VtZW50LkFueTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb25OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0U3BlY2lmaWNhdGlvbjsKLQotcHVibGljIGNsYXNzIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBHcm91cCBnZXRDb250ZW50TW9kZWwoQ29tcGxleFR5cGUgcGFyc2VDdCkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzZUN0LmdldEFsbCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRBbGwoKTsKLQotICAgICAgICBpZiAocGFyc2VDdC5nZXRTZXF1ZW5jZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRTZXF1ZW5jZSgpOwotCi0gICAgICAgIGlmIChwYXJzZUN0LmdldENob2ljZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRDaG9pY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VDdC5nZXRHcm91cCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VDdC5nZXRHcm91cCgpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAgZ2V0Q29udGVudE1vZGVsKENvbXBsZXhSZXN0cmljdGlvblR5cGUgcGFyc2VSZXN0KQotICAgIHsKLSAgICAgICAgaWYgKHBhcnNlUmVzdC5nZXRBbGwoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVzdC5nZXRBbGwoKTsKLQotICAgICAgICBpZiAocGFyc2VSZXN0LmdldFNlcXVlbmNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZVJlc3QuZ2V0U2VxdWVuY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VSZXN0LmdldENob2ljZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VSZXN0LmdldENob2ljZSgpOwotCi0gICAgICAgIGlmIChwYXJzZVJlc3QuZ2V0R3JvdXAoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVzdC5nZXRHcm91cCgpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHcm91cCBnZXRDb250ZW50TW9kZWwoRXh0ZW5zaW9uVHlwZSBwYXJzZUV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzZUV4dC5nZXRBbGwoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0LmdldEFsbCgpOwotCi0gICAgICAgIGlmIChwYXJzZUV4dC5nZXRTZXF1ZW5jZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VFeHQuZ2V0U2VxdWVuY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VFeHQuZ2V0Q2hvaWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUV4dC5nZXRDaG9pY2UoKTsKLQotICAgICAgICBpZiAocGFyc2VFeHQuZ2V0R3JvdXAoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0LmdldEdyb3VwKCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWEgZ2V0U2NoZW1hKFhtbE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBvLm5ld0N1cnNvcigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICggYy50b1BhcmVudCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoby5zY2hlbWFUeXBlKCkuZXF1YWxzKFNjaGVtYS50eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTY2hlbWEpIG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVDb21wbGV4VHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIENvbXBsZXhUeXBlIHBhcnNlQ3QgPSAoQ29tcGxleFR5cGUpc0ltcGwuZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKHBhcnNlQ3QpOwotCi0gICAgICAgIC8vIFNldCBhYnN0cmFjdCAmIGZpbmFsIGZsYWdzCi0gICAgICAgIGJvb2xlYW4gYWJzID0gcGFyc2VDdC5pc1NldEFic3RyYWN0KCkgPyBwYXJzZUN0LmdldEFic3RyYWN0KCkgOiBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmaW5hbEV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsUmVzdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsTGlzdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsVW5pb24gPSBmYWxzZTsKLQotICAgICAgICBPYmplY3QgZHMgPSBudWxsOwotICAgICAgICBpZiAocGFyc2VDdC5pc1NldEZpbmFsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzID0gcGFyc2VDdC5nZXRGaW5hbCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEluc3BlY3QgdGhlIGZpbmFsIGRlZmF1bHQgYXR0cmlidXRlIG9uIHRoZSBzY2hlbWEKLSAgICAgICAgZWxzZSBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmlzU2V0RmluYWxEZWZhdWx0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzID0gc2NoZW1hLmdldEZpbmFsRGVmYXVsdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIFN0cmluZyAmJiBkcy5lcXVhbHMoIiNhbGwiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCi0gICAgICAgICAgICAgICAgZmluYWxFeHQgPSBmaW5hbFJlc3QgPSBmaW5hbExpc3QgPSBmaW5hbFVuaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGRzIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygiZXh0ZW5zaW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgZmluYWxSZXN0ID0gdHJ1ZTsKLQotLy8gU2luY2UgY29tcGxleCB0eXBlcyBkb24ndCBwYXJ0aWNpcGF0ZSBpbiBsaXN0IGFuZCB1bmlvbnMsIHRoZXNlIGNhbiByZW1haW4KLS8vIGZhbHNlLiAgUGVyaGFwcyB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IuCi0KLS8vICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJsaXN0IikpCi0vLyAgICAgICAgICAgICAgICAgICAgZmluYWxMaXN0ID0gdHJ1ZTsKLS8vICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoInVuaW9uIikpCi0vLyAgICAgICAgICAgICAgICAgICAgZmluYWxVbmlvbiA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5zZXRBYnN0cmFjdEZpbmFsKGFicywgZmluYWxFeHQsIGZpbmFsUmVzdCwgZmluYWxMaXN0LCBmaW5hbFVuaW9uKTsKLQotICAgICAgICAvLyBTZXQgYmxvY2sgZmxhZ3MKLSAgICAgICAgYm9vbGVhbiBibG9ja0V4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJsb2NrUmVzdCA9IGZhbHNlOwotICAgICAgICBPYmplY3QgYmxvY2sgPSBudWxsOwotCi0gICAgICAgIGlmIChwYXJzZUN0LmlzU2V0QmxvY2soKSkKLSAgICAgICAgICAgIGJsb2NrID0gcGFyc2VDdC5nZXRCbG9jaygpOwotICAgICAgICBlbHNlIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuaXNTZXRCbG9ja0RlZmF1bHQoKSkKLSAgICAgICAgICAgIGJsb2NrID0gc2NoZW1hLmdldEJsb2NrRGVmYXVsdCgpOwotCi0gICAgICAgIGlmIChibG9jayAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBTdHJpbmcgJiYgYmxvY2suZXF1YWxzKCIjYWxsIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQotICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gYmxvY2tSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygiZXh0ZW5zaW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnNldEJsb2NrKGJsb2NrRXh0LCBibG9ja1Jlc3QpOwotCi0gICAgICAgIC8vIFZlcmlmeTogaGF2ZSBzaW1wbGVDb250ZW50LCBjb21wbGV4Q29udGVudCwgb3IgZGlyZWN0IHN0dWZmCi0gICAgICAgIENvbXBsZXhDb250ZW50RG9jdW1lbnQuQ29tcGxleENvbnRlbnQgcGFyc2VDYyA9IHBhcnNlQ3QuZ2V0Q29tcGxleENvbnRlbnQoKTsKLSAgICAgICAgU2ltcGxlQ29udGVudERvY3VtZW50LlNpbXBsZUNvbnRlbnQgcGFyc2VTYyA9IHBhcnNlQ3QuZ2V0U2ltcGxlQ29udGVudCgpOwotICAgICAgICBHcm91cCBwYXJzZUdyb3VwID0gZ2V0Q29udGVudE1vZGVsKHBhcnNlQ3QpOwotICAgICAgICBpbnQgY291bnQgPQotICAgICAgICAgICAgICAgIChwYXJzZUNjICE9IG51bGwgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgIChwYXJzZVNjICE9IG51bGwgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgIChwYXJzZUdyb3VwICE9IG51bGwgPyAxIDogMCk7Ci0gICAgICAgIGlmIChjb3VudCA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIGNvbXBsZXggdHlwZSBtdXN0IGRlZmluZSBlaXRoZXIgYSBjb250ZW50IG1vZGVsLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAib3IgYSBzaW1wbGVDb250ZW50IG9yIGNvbXBsZXhDb250ZW50IGRlcml2YXRpb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25lIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfQ09OVEVOVF9NT0RFTCwgcGFyc2VDdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgdGhlIGZpcnN0IG9mIGNvbXBsZXhDb250ZW50LCBzaW1wbGVDb250ZW50LCBtb2RlbAotICAgICAgICAgICAgcGFyc2VHcm91cCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocGFyc2VDYyAhPSBudWxsICYmIHBhcnNlU2MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYXJzZVNjID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcnNlQ2MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcnNlQ2MuZ2V0RXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVzdHJpY3Rpb24gY29uZmxpY3RzIHdpdGggZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9DT05URU5UX01PREVMLCBwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNaXhlZCBjYW4gYmUgc3BlY2lmaWVkIGluIHR3byBwbGFjZXM6IHRoZSBydWxlcyBhcmUgdGhhdCBDYyB3aW5zIG92ZXIgQ3QgaWYgcHJlc2VudAotICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2MtbXZlCi0gICAgICAgICAgICBib29sZWFuIG1peGVkID0gcGFyc2VDYy5pc1NldE1peGVkKCkgPyBwYXJzZUNjLmdldE1peGVkKCkgOiBwYXJzZUN0LmdldE1peGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwYXJzZUNjLmdldEV4dGVuc2lvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZUNjRXh0ZW5zaW9uKHNJbXBsLCBwYXJzZUNjLmdldEV4dGVuc2lvbigpLCBtaXhlZCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlQ2NSZXN0cmljdGlvbihzSW1wbCwgcGFyc2VDYy5nZXRSZXN0cmljdGlvbigpLCBtaXhlZCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1pc3NpbmcgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfUkVTVFJJQ1RJT05fT1JfRVhURU5TSU9OLCBwYXJzZUNjKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJzZVNjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXJzZVNjLmdldEV4dGVuc2lvbigpICE9IG51bGwgJiYgcGFyc2VTYy5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlc3RyaWN0aW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfQ09OVEVOVF9NT0RFTCwgcGFyc2VTYy5nZXRSZXN0cmljdGlvbigpKTsKLQotICAgICAgICAgICAgaWYgKHBhcnNlU2MuZ2V0RXh0ZW5zaW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlU2NFeHRlbnNpb24oc0ltcGwsIHBhcnNlU2MuZ2V0RXh0ZW5zaW9uKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VTYy5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVNjUmVzdHJpY3Rpb24oc0ltcGwsIHBhcnNlU2MuZ2V0UmVzdHJpY3Rpb24oKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1pc3NpbmcgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfUkVTVFJJQ1RJT05fT1JfRVhURU5TSU9OLCBwYXJzZVNjKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXNvbHZlQmFzaWNDb21wbGV4VHlwZShzSW1wbCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUVycm9yVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHR5cGUgb2YgZXJyb3IgcmVjb3Zlcnkgbm90IHlldCBpbXBsZW1lbnRlZC4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlLlJlZltdIG1ha2VSZWZBcnJheShDb2xsZWN0aW9uIHR5cGVMaXN0KQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWZbdHlwZUxpc3Quc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlKWkubmV4dCgpKS5nZXRSZWYoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVCYXNpY0NvbXBsZXhUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQ29tcGxleFR5cGUgcGFyc2VUcmVlID0gKENvbXBsZXhUeXBlKXNJbXBsLmdldFBhcnNlT2JqZWN0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7Ci0gICAgICAgIEdyb3VwIHBhcnNlR3JvdXAgPSBnZXRDb250ZW50TW9kZWwocGFyc2VUcmVlKTsKLQotICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgZXh0ZW5kIG9yIHJlc3RyaWN0IHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IG9oIHdlbGwuCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlR3JvdXApOwotCi0gICAgICAgIC8vIHVzZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChkb2Vzbid0IGJlY29tZSBwYXJ0IG9mIHRoZSByZXN1bHQpCi0gICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIGJ1aWxkIGNvbnRlbnQgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSB0cmFuc2xhdGVDb250ZW50TW9kZWwoc0ltcGwsIHBhcnNlR3JvdXAsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBwYXJ0aWNsZUNvZGUsIGFub255bW91c1R5cGVzLCBlbGVtZW50TW9kZWwsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAvLyBkZXRlY3QgdGhlIG5vbmVtcHR5ICJhbGwiIGNhc2UgKGVtcHR5IDxhbGw+IGRvZXNuJ3QgY291bnQgLSBpdCBuZWVkcyB0byBiZSBlbGltaW5hdGVkIHRvIG1hdGNoIFhTRCB0ZXN0IGNhc2VzKQotICAgICAgICBib29sZWFuIGlzQWxsID0gY29udGVudE1vZGVsICE9IG51bGwgJiYgY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTDsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCi0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjRWx0ID0gc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKLQotICAgICAgICAvLyBidWlsZCBzdGF0ZSBtYWNoaW5lIGFuZCB2ZXJpZnkgdGhhdCBjb250ZW50IG1vZGVsIGlzIGRldGVybWluaXN0aWMKLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZFN0YXRlTWFjaGluZShjb250ZW50TW9kZWwpOwotICAgICAgICAgICAgaWYgKCFTdHNjU3RhdGUuZ2V0KCkubm9VcGEoKSAmJiAhKChTY2hlbWFQYXJ0aWNsZUltcGwpY29udGVudE1vZGVsKS5pc0RldGVybWluaXN0aWMoKSkKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkNvbnRlbnQgbW9kZWwgdmlvbGF0ZXMgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIiwgWG1sRXJyb3JDb250ZXh0Lk5PTkRFVEVSTUlOSVNUSUNfTU9ERUwsIHBhcnNlR3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgcHJvcGVydHkgbW9kZWwKLSAgICAgICAgLy8gZW1pdERCRygiQnVpbGRpbmcgY29udGVudCBNb2RlbCBmb3IgIiArIHNJbXBsKTsKLSAgICAgICAgTWFwIGVsZW1lbnRQcm9wZXJ0eU1vZGVsID0gYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoY29udGVudE1vZGVsLCBzSW1wbCk7Ci0KLSAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAotICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7Ci0KLSAgICAgICAgLy8gZmlndXJlIG91dCBjb250ZW50IHR5cGUKLSAgICAgICAgaW50IGNvbXBsZXhWYXJpZXR5ID0KLSAgICAgICAgICAgIHBhcnNlVHJlZS5nZXRNaXhlZCgpCi0gICAgICAgICAgICAgICAgPyBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQKLSAgICAgICAgICAgICAgICA6IGNvbnRlbnRNb2RlbCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UCi0gICAgICAgICAgICAgICAgICAgIDogU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTik7Ci0gICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShjb21wbGV4VmFyaWV0eSk7Ci0gICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgZWxlbWVudFByb3BlcnR5TW9kZWwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGlzQWxsKTsKLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub255bW91c1R5cGVzKSk7Ci0gICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeSh3Y0VsdC50eXBlZFdpbGRjYXJkcywgd2NFbHQuaGFzV2lsZGNhcmRzLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVDY1Jlc3RyaWN0aW9uKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBDb21wbGV4UmVzdHJpY3Rpb25UeXBlIHBhcnNlVHJlZSwgYm9vbGVhbiBtaXhlZCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKLQotICAgICAgICAvLyBCVUdCVUc6IE5PVCBZRVQgUkVBTExZIElNUExFTUVOVEVECi0gICAgICAgIC8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkLiIpOwotCi0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGU7Ci0gICAgICAgIGlmIChwYXJzZVRyZWUuZ2V0QmFzZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIGNvbXBsZXhDb250ZW50IG11c3QgZGVmaW5lIGEgYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfQkFTRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIGJhc2VUeXBlID0gbnVsbDsgLy8gcmVjb3Zlcnk6IG5vIGluaGVyaXRhbmNlLgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IGV4dGVuZCB0aGUgb3JpZ2luYWwgdHlwZSBkZWZpbml0aW9uIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEU7Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZmluYWxSZXN0cmljdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IHJlc3RyaWN0IGEgZmluYWwgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeToganVzdCBrZWVwIGdvaW5nCi0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkpCi0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyBjaXJjdWxhciBkZXBlbmRlbmN5OiBubyBpbmhlcml0YW5jZQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgR3JvdXAgcGFyc2VFZyA9IGdldENvbnRlbnRNb2RlbChwYXJzZVRyZWUpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgImFsbCIgY2FzZQotICAgICAgICBpbnQgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlRWcpOwotCi0gICAgICAgIC8vIHVzZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChkb2Vzbid0IGJlY29tZSBwYXJ0IG9mIHRoZSByZXN1bHQpCi0gICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIGJ1aWxkIGNvbnRlbnQgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSB0cmFuc2xhdGVDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBzSW1wbCwgcGFyc2VFZywgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHBhcnRpY2xlQ29kZSwgYW5vbnltb3VzVHlwZXMsIGVsZW1lbnRNb2RlbCwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgbm9uZW1wdHkgImFsbCIgY2FzZSAoZW1wdHkgPGFsbD4gZG9lc24ndCBjb3VudCAtIGl0IG5lZWRzIHRvIGJlIGVsaW1pbmF0ZWQgdG8gbWF0Y2ggWFNEIHRlc3QgY2FzZXMpCi0gICAgICAgIGJvb2xlYW4gaXNBbGwgPSBjb250ZW50TW9kZWwgIT0gbnVsbCAmJiBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgYXR0ciBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWw7Ci0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgYmFzZVR5cGUsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBzdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotCi0gICAgICAgIC8vIGJ1aWxkIHN0YXRlIG1hY2hpbmUgYW5kIHZlcmlmeSB0aGF0IGNvbnRlbnQgbW9kZWwgaXMgZGV0ZXJtaW5pc3RpYwotICAgICAgICBpZiAoY29udGVudE1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkU3RhdGVNYWNoaW5lKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICBpZiAoIVN0c2NTdGF0ZS5nZXQoKS5ub1VwYSgpICYmICEoKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWwpLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ29udGVudCBtb2RlbCB2aW9sYXRlcyB0aGUgdW5pcXVlIHBhcnRpY2xlIGF0dHJpYnV0aW9uIHJ1bGUiLCBYbWxFcnJvckNvbnRleHQuTk9OREVURVJNSU5JU1RJQ19NT0RFTCwgcGFyc2VFZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0eSBtb2RlbAotICAgICAgICAvLyBlbWl0REJHKCJCdWlsZGluZyBjb250ZW50IE1vZGVsIGZvciAiICsgc0ltcGwpOwotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPSBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShjb250ZW50TW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBjb21wdXRlIGVtcHR5L2VsZW1lbnQvbWl4ZWQKLSAgICAgICAgaW50IGNvbXBsZXhWYXJpZXR5ID0gKGNvbnRlbnRNb2RlbCA9PSBudWxsID8gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UIDoKLSAgICAgICAgICAgIChtaXhlZCA/IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCA6IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UKSk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCgoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KGNvbXBsZXhWYXJpZXR5KTsKLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBlbGVtZW50UHJvcGVydHlNb2RlbCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgaXNBbGwpOwotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KHdjRWx0LnR5cGVkV2lsZGNhcmRzLCB3Y0VsdC5oYXNXaWxkY2FyZHMsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIE1hcCBleHRyYWN0RWxlbWVudE1vZGVsKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBNYXAgZWxlbWVudE1vZGVsID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gc1Byb3BzID0gc1R5cGUuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzUHJvcHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNQcm9wc1tpXS5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBlbGVtZW50TW9kZWwucHV0KHNQcm9wc1tpXS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcHNbaV0uZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudE1vZGVsOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVDY0V4dGVuc2lvbihTY2hlbWFUeXBlSW1wbCBzSW1wbCwgRXh0ZW5zaW9uVHlwZSBwYXJzZVRyZWUsIGJvb2xlYW4gbWl4ZWQpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlOwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRCYXNlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgY29tcGxleENvbnRlbnQgbXVzdCBkZWZpbmUgYSBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19CQVNFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyByZWNvdmVyeTogbm8gaW5oZXJpdGFuY2UuCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLCBzSW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXROYW1lKCkuZXF1YWxzKHNJbXBsLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgZXh0ZW5kIHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkpCi0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyBjaXJjdWxhciBkZXBlbmRlbmN5OiBubyBpbmhlcml0YW5jZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgKGJhc2VUeXBlLmlzU2ltcGxlVHlwZSgpIHx8IGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgc3BlY2lmaWVkIGJhc2UgdHlwZSBpcyBub3QgYSBjb21wbGV4IHR5cGUgd2l0aCBjb21wbGV4IGNvbnRlbnQuIiwgWG1sRXJyb3JDb250ZXh0LkNPTVBMRVhfQkFTRV9OT1RfQ09NUExFWCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyByZWNvdmVyeTogbm8gaW5oZXJpdGFuY2UuCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5maW5hbEV4dGVuc2lvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGV4dGVuZCBhIGZpbmFsIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGp1c3Qga2VlcCBnb2luZwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgYmFzZSBjb250ZW50IG1vZGVsCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VDb250ZW50TW9kZWwgPSAoYmFzZVR5cGUgPT0gbnVsbCA/IG51bGwgOiBiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKSk7Ci0gICAgICAgIC8vIFRPRE86IGF0dHJpYnV0ZSBtb2RlbCBhbHNvCi0KLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIGJhc2VFbGVtZW50TW9kZWwgPSBleHRyYWN0RWxlbWVudE1vZGVsKGJhc2VUeXBlKTsKLSAgICAgICAgR3JvdXAgcGFyc2VFZyA9IGdldENvbnRlbnRNb2RlbChwYXJzZVRyZWUpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgZXh0ZW5zaW9uIG1vZGVsCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGV4dGVuc2lvbk1vZGVsID0gdHJhbnNsYXRlQ29udGVudE1vZGVsKAotICAgICAgICAgICAgICAgIHNJbXBsLCBwYXJzZUVnLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlRWcpLAotICAgICAgICAgICAgICAgIGFub255bW91c1R5cGVzLCBiYXNlRWxlbWVudE1vZGVsLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBhcHBseSBydWxlICMyIG5lYXIgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2MtbXZlOiBlbXB0eSBleHQgbW9kZWwgLT4gbWl4ZWQgdGFrZW4gZnJvbSBiYXNlCi0gICAgICAgIGlmIChleHRlbnNpb25Nb2RlbCA9PSBudWxsICYmICFtaXhlZCkKLSAgICAgICAgICAgIG1peGVkID0gKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFwcGx5IERlcml2YXRpb24gVmFsaWQgKEV4dGVuc2lvbikgcnVsZSAxLjQuMi4yCi0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCkgJiYKLSAgICAgICAgICAgICAgICAoKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKSAhPSBtaXhlZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZXh0ZW5kIGFuIGVsZW1lbnQtb25seSB0eXBlIHdpdGggYSBtaXhlZCB0eXBlIG9yIHZpY2UtdmVyc2EiLCBYbWxFcnJvckNvbnRleHQuSU5DT05TSVNURU5UX1RZUEUsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgImFsbCIgYmFzZSBjYXNlCi0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmhhc0FsbENvbnRlbnQoKSAmJiBleHRlbnNpb25Nb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGV4dGVuZCBhIHR5cGUgd2l0aCAnYWxsJyBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9FWFRFTkRfQUxMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICBleHRlbnNpb25Nb2RlbCA9IG51bGw7IC8vIHJlY292ZXJ5OiBkcm9wIGV4dGVuc2lvbgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29udGVudCBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCA9IGV4dGVuZENvbnRlbnRNb2RlbChiYXNlQ29udGVudE1vZGVsLCBleHRlbnNpb25Nb2RlbCwgcGFyc2VUcmVlKTsKLQotICAgICAgICAvLyBkZXRlY3QgdGhlIG5vbmVtcHR5ICJhbGwiIGNhc2UgKGVtcHR5IDxhbGw+IGRvZXNuJ3QgY291bnQgLSBpdCBuZWVkcyB0byBiZSBlbGltaW5hdGVkIHRvIG1hdGNoIFhTRCB0ZXN0IGNhc2VzKQotICAgICAgICBib29sZWFuIGlzQWxsID0gY29udGVudE1vZGVsICE9IG51bGwgJiYgY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTDsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOwotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpKTsKLSAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIGJhc2VUeXBlLCB0cnVlLCBudWxsKTsKLQotICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBzdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotCi0gICAgICAgIC8vIGJ1aWxkIHN0YXRlIG1hY2hpbmUgYW5kIHZlcmlmeSB0aGF0IGNvbnRlbnQgbW9kZWwgaXMgZGV0ZXJtaW5pc3RpYwotICAgICAgICBpZiAoY29udGVudE1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkU3RhdGVNYWNoaW5lKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICBpZiAoIVN0c2NTdGF0ZS5nZXQoKS5ub1VwYSgpICYmICEoKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWwpLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ29udGVudCBtb2RlbCB2aW9sYXRlcyB0aGUgdW5pcXVlIHBhcnRpY2xlIGF0dHJpYnV0aW9uIHJ1bGUiLCBYbWxFcnJvckNvbnRleHQuTk9OREVURVJNSU5JU1RJQ19NT0RFTCwgcGFyc2VFZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0eSBtb2RlbAotICAgICAgICAvLyBlbWl0REJHKCJCdWlsZGluZyBjb250ZW50IE1vZGVsIGZvciAiICsgc0ltcGwpOwotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPSBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShjb250ZW50TW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBjb21wdXRlIGVtcHR5L2VsZW1lbnQvbWl4ZWQKLSAgICAgICAgaW50IGNvbXBsZXhWYXJpZXR5ID0gICggbWl4ZWQgPyBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgOgotICAgICAgICAgICAgKGNvbnRlbnRNb2RlbCA9PSBudWxsID8gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UIDogU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYmFzZVR5cGUgPSBYbWxPYmplY3QudHlwZTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04pOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoY29tcGxleFZhcmlldHkpOwotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIGVsZW1lbnRQcm9wZXJ0eU1vZGVsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBpc0FsbCk7Ci0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOwotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkod2NFbHQudHlwZWRXaWxkY2FyZHMsIHdjRWx0Lmhhc1dpbGRjYXJkcywgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlU2NSZXN0cmljdGlvbihTY2hlbWFUeXBlSW1wbCBzSW1wbCwgU2ltcGxlUmVzdHJpY3Rpb25UeXBlIHBhcnNlVHJlZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGU7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKLSAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRTaW1wbGVUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUud2FybmluZygiTmVzdGVkIHNpbXBsZSB0eXBlcyBpbnNpZGUgc2ltcGxlIGNvbnRlbnQgcmVzdHJpY3Rpb25zIGFyZSB1bnN1cHBvcnRlZCAtIGlnbm9yaW5nIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBuZXN0ZWQgc2ltcGxlIHR5cGUgZWxlbWVudC4KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyc2VUcmVlLmdldEJhc2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBzaW1wbGVDb250ZW50IHJlc3RyaWN0aW9uIG11c3QgZGVmaW5lIGEgYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfQkFTRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjdXJzaW9uCi0gICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZSgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpOwotCi0gICAgICAgIGlmIChiYXNlVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNpbXBsZSB0eXBlICciICsgYmFzZVR5cGUuZ2V0TmFtZSgpICsgIicgY2Fubm90IGJlIHVzZWQgYXMgdGhlIGJhc2UgdHlwZSBvZiBhIHNpbXBsZSBjb250ZW50IHJlc3RyaWN0aW9uLiAoVXNlIGV4dGVuc2lvbiBpbnN0ZWFkLikiLCBYbWxFcnJvckNvbnRleHQuU0lNUExFX0JBU0VfTk9UX1NJTVBMRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0gICAgICAgIC8vIEJVR0JVRzogY2FuIHJlc3RyaWN0IG1peGVkIGNvbnRlbnQgYXMgbG9uZyBhcyBhbGwgY2hpbGQgZWxlbWVudHMgYXJlIG9wdGlvbmFsCi0gICAgICAgIGVsc2UgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBzcGVjaWZpZWQgYmFzZSB0eXBlICIgKyBiYXNlVHlwZS50b1N0cmluZygpICsgIiBkb2VzIG5vdCBoYXZlIHNpbXBsZSBjb250ZW50LiIsIFhtbEVycm9yQ29udGV4dC5TSU1QTEVfQkFTRV9OT1RfU0lNUExFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgcmVzdHJpY3QgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOwotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpKTsKLSAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIGJhc2VUeXBlLCBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCi0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VUeXBlLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOwotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSwgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpOwotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwobnVsbCwgYXR0ck1vZGVsLCBudWxsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBmYWxzZSk7Ci0gICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KGJhc2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSk7Ci0gICAgICAgIHNJbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG51bGwgPyBudWxsIDogYmFzZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihiYXNlVHlwZS5nZXRMaXN0SXRlbVR5cGUoKS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRVbmlvbk1lbWJlclR5cGVSZWZzKG1ha2VSZWZBcnJheShBcnJheXMuYXNMaXN0KGJhc2VUeXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKSkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCBmYWNldHMKLSAgICAgICAgU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5yZXNvbHZlRmFjZXRzKHNJbXBsLCBwYXJzZVRyZWUsIChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlU2NFeHRlbnNpb24oU2NoZW1hVHlwZUltcGwgc0ltcGwsIFNpbXBsZUV4dGVuc2lvblR5cGUgcGFyc2VUcmVlKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gKHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwpOwotICAgICAgICBpZiAocGFyc2VUcmVlLmdldEJhc2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBzaW1wbGVDb250ZW50IGV4dGVuc2lvbiBtdXN0IGRlZmluZSBhIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX0JBU0UsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKLSAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCksIHNJbXBsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldE5hbWUoKS5lcXVhbHMoc0ltcGwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCBleHRlbmQgdGhlIG9yaWdpbmFsIHR5cGUgZGVmaW5pdGlvbiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihwYXJzZVRyZWUuZ2V0QmFzZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgaWYgKCFiYXNlVHlwZS5pc1NpbXBsZVR5cGUoKSAmJiBiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgc3BlY2lmaWVkIGJhc2UgdHlwZSAiICsgYmFzZVR5cGUudG9TdHJpbmcoKSArICIgZG9lcyBub3QgaGF2ZSBzaW1wbGUgY29udGVudC4iLCBYbWxFcnJvckNvbnRleHQuU0lNUExFX0JBU0VfTk9UX1NJTVBMRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZmluYWxFeHRlbnNpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBleHRlbmQgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOwotICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgYmFzZVR5cGUsIHRydWUsIG51bGwpOwotCi0gICAgICAgIC8vIHN1bW1hcml6ZSB3aWxkY2FyZCBpbmZvcm1hdGlvbgotICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7Ci0KLSAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAotICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCgoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTik7Ci0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOwotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQuRU1QVFksIGZhbHNlLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCk7Ci0gICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChudWxsLCBhdHRyTW9kZWwsIG51bGwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGZhbHNlKTsKLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoYmFzZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKTsKLSAgICAgICAgc0ltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihiYXNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gbnVsbCA/IG51bGwgOiBiYXNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKGJhc2VUeXBlLmdldExpc3RJdGVtVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KEFycmF5cy5hc0xpc3QoYmFzZVR5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGZhY2V0cwotICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVGYWNldHMoc0ltcGwsIG51bGwsIChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgV2lsZGNhcmRSZXN1bHQKLSAgICB7Ci0gICAgICAgIFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0IHR5cGVkV2lsZGNhcmRzLCBib29sZWFuIGhhc1dpbGRjYXJkcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy50eXBlZFdpbGRjYXJkcyA9IHR5cGVkV2lsZGNhcmRzOwotICAgICAgICAgICAgdGhpcy5oYXNXaWxkY2FyZHMgPSBoYXNXaWxkY2FyZHM7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWVTZXQgdHlwZWRXaWxkY2FyZHM7Ci0gICAgICAgIGJvb2xlYW4gaGFzV2lsZGNhcmRzOwotICAgIH0KLQotICAgIHN0YXRpYyBXaWxkY2FyZFJlc3VsdCBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGF0dHJNb2RlbCkKLSAgICB7Ci0gICAgICAgIGlmIChhdHRyTW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQuRU1QVFksIGZhbHNlKTsKLSAgICAgICAgaWYgKGF0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5TS0lQKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChRTmFtZVNldC5FTVBUWSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoYXR0ck1vZGVsLmdldFdpbGRjYXJkU2V0KCksIHRydWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBXaWxkY2FyZFJlc3VsdCBzdW1tYXJpemVFbHRXaWxkY2FyZHMoU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHNldCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc1dpbGRjYXJkcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkUmVzdWx0IGlubmVyID0gc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZEFsbChpbm5lci50eXBlZFdpbGRjYXJkcyk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1dpbGRjYXJkcyB8PSBpbm5lci5oYXNXaWxkY2FyZHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoc2V0LnRvUU5hbWVTZXQoKSwgaGFzV2lsZGNhcmRzKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnRNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TS0lQKSA/Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0LkVNUFRZIDogY29udGVudE1vZGVsLmdldFdpbGRjYXJkU2V0KCksIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBmYWxsdGhyb3VnaAotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQuRU1QVFksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKAotICAgICAgICAgICAgWG1sT2JqZWN0IHBhcnNlVHJlZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sCi0gICAgICAgICAgICBMaXN0IGFub255bW91c1R5cGVzLCBTY2hlbWFUeXBlIG91dGVyVHlwZSwKLSAgICAgICAgICAgIFNldCBzZWVuQXR0cmlidXRlcywgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIHJlc3VsdCwgU2NoZW1hVHlwZSBiYXNlVHlwZSwgYm9vbGVhbiBleHRlbnNpb24sIFFOYW1lIHJlZGVmaW5pdGlvbkZvcikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgaWYgKHNlZW5BdHRyaWJ1dGVzID09IG51bGwpCi0gICAgICAgICAgICBzZWVuQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGJvb2xlYW4gc2VlbldpbGRjYXJkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gc2VlblJlZGVmaW5pdGlvbiA9IGZhbHNlOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBiYXNlTW9kZWwgPSBudWxsOwotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGJhc2VNb2RlbCA9IGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHBhcnNlVHJlZS5uZXdDdXJzb3IoKTsKLQotICAgICAgICBmb3IgKGJvb2xlYW4gbW9yZSA9IGN1ci50b0ZpcnN0Q2hpbGQoKTsgbW9yZTsgbW9yZSA9IGN1ci50b05leHRTaWJsaW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodHJhbnNsYXRlQXR0cmlidXRlQ29kZShjdXIuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9DT0RFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIHhzZGF0dHIgPSAoQXR0cmlidXRlKWN1ci5nZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBzQXR0ciA9IFN0c2NUcmFuc2xhdG9yLnRyYW5zbGF0ZUF0dHJpYnV0ZSh4c2RhdHRyLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIG91dGVyVHlwZSwgYmFzZU1vZGVsLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbkF0dHJpYnV0ZXMuY29udGFpbnMoc0F0dHIuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBkZWZpbmVkICIsIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfQVRUUklCVVRFX05BTUUsIHhzZGF0dHIueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSBkdXBsaWNhdGUgYXR0cgotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VlbkF0dHJpYnV0ZXMuYWRkKHNBdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIGJhc2VBdHRyID0gYmFzZU1vZGVsLmdldEF0dHJpYnV0ZShzQXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VBdHRyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLmNvbnRhaW5zKHNBdHRyLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSByZXN0cmljdGlvbiBjYW5ub3QgaW50cm9kdWNlIGEgbmV3IGF0dHJpYnV0ZSB0aGF0IHdvdWxkIG5vdCBiZSBhbGxvd2VkIGluIHRoZSBiYXNlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSwgeHNkYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBbiBleHRlbnNpb24gY2Fubm90IHByb2hpYml0IGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBiYXNlIHR5cGU7IHVzZSByZXN0cmljdGlvbiBpbnN0ZWFkLiIsIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfQVRUUklCVVRFX05BTUUsIHhzZGF0dHIueGdldFVzZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZUF0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUkVRVUlSRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgcmVzdHJpY3Rpb24gY2Fubm90IG1vZGlmeSBhbiBhdHRyaWJ1dGUgdGhhdCBpcyByZXF1aXJlZCBpbiB0aGUgYmFzZSB0eXBlIHRvIGJlIHByb2hpYml0ZWQgb3Igb3B0aW9uYWwuIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSwgeHNkYXR0ci54Z2V0VXNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVtb3ZlUHJvaGliaXRlZEF0dHJpYnV0ZShzQXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkQXR0cmlidXRlKHNBdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0RGVmYXVsdFRleHQoKSAhPSBudWxsICYmICFzQXR0ci5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXRVc2UoKSAhPSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIG11c3QgYmUgb3B0aW9uYWwgaW4gb3JkZXIgdG8gc3BlY2lmeSBhIGRlZmF1bHQiLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgeHNkYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEFOWV9BVFRSSUJVVEVfQ09ERToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkIHhzZHdjID0gKFdpbGRjYXJkKWN1ci5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5XaWxkY2FyZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk9ubHkgb25lIGF0dHJpYnV0ZSB3aWxkY2FyZCBhbGxvd2VkIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSBleHRyYSB3aWxkY2FyZAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlZW5XaWxkY2FyZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUxpc3QgbnNMaXN0ID0geHNkd2MueGdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnNUZXh0OwotICAgICAgICAgICAgICAgICAgICBpZiAobnNMaXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBuc1RleHQgPSAiIyNhbnkiOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBuc1RleHQgPSBuc0xpc3QuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgd2NzZXQgPSBRTmFtZVNldC5mb3JXaWxkY2FyZE5hbWVzcGFjZVN0cmluZyhuc1RleHQsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsICE9IG51bGwgJiYgIWV4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgcmVzdHJpY3Rpb24gY2Fubm90IGFkZCBhbnlBdHRyaWJ1dGUgd2hlbiB0aGUgYmFzZSB0eXBlIGRvZXMgbm90IGhhdmUgYW55QXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgZXh0cmEgd2lsZGNhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKS5jb250YWluc0FsbCh3Y3NldCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSciICsgbnNUZXh0ICsgIicgaXMgbm90IGEgc3Vic2V0IG9mIHRoZSBiYXNlIHR5cGUgYW55QXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgcmVzdHJpY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHdjcHJvY2VzcyA9IHRyYW5zbGF0ZVdpbGRjYXJkUHJvY2Vzcyh4c2R3Yy54Z2V0UHJvY2Vzc0NvbnRlbnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldFdpbGRjYXJkUHJvY2VzcygpID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRQcm9jZXNzKHdjcHJvY2Vzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldC51bmlvbihyZXN1bHQuZ2V0V2lsZGNhcmRTZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFByb2Nlc3Mod2Nwcm9jZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRTZXQod2NzZXQuaW50ZXJzZWN0KHJlc3VsdC5nZXRXaWxkY2FyZFNldCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvbGQgcHJvY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9HUk9VUF9DT0RFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlR3JvdXBSZWYgeHNkYWcgPSAoQXR0cmlidXRlR3JvdXBSZWYpY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZWYgPSB4c2RhZy5nZXRSZWYoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBtdXN0IGhhdmUgYSByZWYgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9HUk9VUF9NSVNTSU5HX1JFRiwgeHNkYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIGdyb3VwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVkZWZpbml0aW9uRm9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3RhdGUuZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCwgcmVkZWZpbml0aW9uRm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIHJlZGVmaW5pdGlvbkZvci5lcXVhbHMoZ3JvdXAuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlblJlZGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkFuIGF0dHJpYnV0ZSBncm91cCByZWRlZmluaXRpb24gbXVzdCBpbmNsdWRlIGF0IG1vc3Qgb25lIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgeHNkYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5SZWRlZmluaXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kQXR0cmlidXRlR3JvdXAocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfR1JPVVBfTk9UX0ZPVU5ELCB4c2RhZy54Z2V0UmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzUHJvY2Vzc2luZyhncm91cCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiByZWZlcmVuY2VzIGl0c2VsZiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ViVGFyZ2V0TmFtZXNwYWNlID0gZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFtZWxlb24gPSBncm91cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3RhcnRQcm9jZXNzaW5nKGdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmVzdGVkUmVkZWZpbml0aW9uRm9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWRlZmluaXRpb25Gb3IgPSBncm91cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKGdyb3VwLmdldFBhcnNlT2JqZWN0KCksIHN1YlRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgb3V0ZXJUeXBlLCBzZWVuQXR0cmlidXRlcywgcmVzdWx0LCBiYXNlVHlwZSwgZXh0ZW5zaW9uLCBuZXN0ZWRSZWRlZmluaXRpb25Gb3IpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maW5pc2hQcm9jZXNzaW5nKGdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aGluZ3MgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSBtb2RlbC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hUGFydGljbGUgZXh0ZW5kQ29udGVudE1vZGVsKFNjaGVtYVBhcnRpY2xlIGJhc2VDb250ZW50TW9kZWwsIFNjaGVtYVBhcnRpY2xlIGV4dGVuZGVkQ29udGVudE1vZGVsLCBYbWxPYmplY3QgcGFyc2VUcmVlKQotICAgIHsKLSAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleENvbnRlbnQ6OmV4dGVuc2lvbgotICAgICAgICAKLSAgICAgICAgLy8gMi4xIElmIHRoZSC3ZXhwbGljaXQgY29udGVudLcgaXMgZW1wdHksIHRoZW4gdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB0eXBlIGRlZmluaXRpb24gt3Jlc29sdmVktyB0byBieSB0aGUgt2FjdHVhbCB2YWx1Zbcgb2YgdGhlIGJhc2UgW2F0dHJpYnV0ZV0gCi0gICAgICAgIGlmIChleHRlbmRlZENvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGJhc2VDb250ZW50TW9kZWw7Ci0gICAgICAgIAotICAgICAgICAvLyAyLjIgSWYgdGhlIHR5cGUgZGVmaW5pdGlvbiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXSBoYXMgYSB7Y29udGVudCB0eXBlfSBvZiBlbXB0eSwgdGhlbiBhIHBhaXIgb2YgbWl4ZWQgb3IgZWxlbWVudE9ubHkgKGRldGVybWluZWQgYXMgcGVyIGNsYXVzZSAxLjIuMSBhYm92ZSkgYW5kIHRoZSC3ZXhwbGljaXQgY29udGVudLcgaXRzZWxmOwotICAgICAgICBpZiAoYmFzZUNvbnRlbnRNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGV4dGVuZGVkQ29udGVudE1vZGVsOwotICAgICAgICAKLSAgICAgICAgLy8gMi4zIG90aGVyd2lzZSBhIHBhaXIgb2YgbWl4ZWQgb3IgZWxlbWVudE9ubHkgKGRldGVybWluZWQgYXMgcGVyIGNsYXVzZSAxLjIuMSBhYm92ZSkgYW5kIGEgcGFydGljbGUgd2hvc2UgcHJvcGVydGllcyBhcmUgYXMgZm9sbG93czogIAotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgc1BhcnQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7Ci0KLSAgICAgICAgTGlzdCBhY2N1bXVsYXRlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhZGRNaW51c1BvaW50bGVzc1BhcnRpY2xlcyhhY2N1bXVsYXRlLCBiYXNlQ29udGVudE1vZGVsLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7Ci0gICAgICAgIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKGFjY3VtdWxhdGUsIGV4dGVuZGVkQ29udGVudE1vZGVsLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7Ci0gICAgICAgIHNQYXJ0LnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgIHNQYXJ0LnNldE1heE9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlQ2hpbGRyZW4oKFNjaGVtYVBhcnRpY2xlW10pCi0gICAgICAgICAgICAgICAgYWNjdW11bGF0ZS50b0FycmF5KG5ldyBTY2hlbWFQYXJ0aWNsZVthY2N1bXVsYXRlLnNpemUoKV0pKTsKLQotICAgICAgICByZXR1cm4gZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKHNQYXJ0LCBwYXJzZVRyZWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBCaWdJbnRlZ2VyIGV4dHJhY3RNaW5PY2N1cnMoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIG5uaSkKLSAgICB7Ci0gICAgICAgIGlmIChubmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLSAgICAgICAgQmlnSW50ZWdlciByZXN1bHQgPSBubmkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQmlnSW50ZWdlciBleHRyYWN0TWF4T2NjdXJzKEFsbE5OSSBhbGxOTkkpCi0gICAgewotICAgICAgICBpZiAoYWxsTk5JID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7Ci0KLSAgICAgICAgaWYgKGFsbE5OSS5pbnN0YW5jZVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKLSAgICAgICAgICAgIHJldHVybiAoKFhtbEludGVnZXIpYWxsTk5JKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZGVmaW5pdGlvbkZvckdyb3VwCi0gICAgewotICAgICAgICBwcml2YXRlIFFOYW1lIGdyb3VwTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5SZWRlZmluaXRpb24gPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgUmVkZWZpbml0aW9uRm9yR3JvdXAoUU5hbWUgZ3JvdXBOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRHcm91cE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWVuUmVkZWZpbml0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNlZW5SZWRlZmluaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWVuUmVkZWZpbml0aW9uKGJvb2xlYW4gc2VlblJlZGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zZWVuUmVkZWZpbml0aW9uID0gc2VlblJlZGVmaW5pdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZSB0cmFuc2xhdGVDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZSwKLSAgICAgICAgICAgIFhtbE9iamVjdCBwYXJzZVRyZWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLAotICAgICAgICAgICAgaW50IHBhcnRpY2xlQ29kZSwKLSAgICAgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMsIE1hcCBlbGVtZW50TW9kZWwsCi0gICAgICAgICAgICBib29sZWFuIGFsbG93RWx0LCBSZWRlZmluaXRpb25Gb3JHcm91cCByZWRlZmluaXRpb25Gb3IpCi0gICAgewotICAgICAgICBpZiAocGFyc2VUcmVlID09IG51bGwgfHwgcGFydGljbGVDb2RlID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgLy8gZW1pdERCRygiVHJhbnNsYXRpbmcgY29udGVudCBtb2RlbCBmb3IgIiArIG91dGVyVHlwZSk7Ci0gICAgICAgIC8vIGluZGVudERCRygpOwotICAgICAgICBhc3NlcnQocGFydGljbGVDb2RlICE9IDApOwotCi0gICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnM7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzOwotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBncm91cCA9IG51bGw7Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIHNQYXJ0OwotCi0gICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhbGxvd0VsdCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIHNlcXVlbmNlLCBjaG9pY2Ugb3IgYWxsIGhlcmUiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBwYXJzZVRyZWUpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBkZXRlY3Qgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQgYW5kIGNvbnN0cnVjdCBhIGNob2ljZQotCi0gICAgICAgICAgICBMb2NhbEVsZW1lbnQgcGFyc2VFbHQgPSAoTG9jYWxFbGVtZW50KXBhcnNlVHJlZTsKLSAgICAgICAgICAgIHNQYXJ0ID0gU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlRWxlbWVudChwYXJzZUVsdCwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBvdXRlclR5cGUpOwotICAgICAgICAgICAgaWYgKHNQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBtaW5PY2N1cnMgPSBleHRyYWN0TWluT2NjdXJzKHBhcnNlRWx0LnhnZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlRWx0LnhnZXRNYXhPY2N1cnMoKSk7Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGUgb2xkVHlwZSA9IChTY2hlbWFUeXBlKWVsZW1lbnRNb2RlbC5nZXQoc1BhcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChvbGRUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudE1vZGVsLnB1dChzUGFydC5nZXROYW1lKCksIHNQYXJ0LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc1BhcnQuZ2V0VHlwZSgpLmVxdWFscyhvbGRUeXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVHlwZSBvZiAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNQYXJ0LmdldE5hbWUoKSkgKyAiIGlzIGluY29uc2lzdGVudCB3aXRoIGFub3RoZXIgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhpcyBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LklOQ09OU0lTVEVOVF9UWVBFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29kZSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhbGxvd0VsdCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIHNlcXVlbmNlLCBjaG9pY2Ugb3IgYWxsIGhlcmUiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgQW55IHBhcnNlQW55ID0gKEFueSlwYXJzZVRyZWU7Ci0gICAgICAgICAgICBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCk7Ci0gICAgICAgICAgICBRTmFtZVNldCB3Y3NldDsKLSAgICAgICAgICAgIE5hbWVzcGFjZUxpc3QgbnNsaXN0ID0gcGFyc2VBbnkueGdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKG5zbGlzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHdjc2V0ID0gUU5hbWVTZXQuQUxMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdjc2V0ID0gUU5hbWVTZXQuZm9yV2lsZGNhcmROYW1lc3BhY2VTdHJpbmcobnNsaXN0LmdldFN0cmluZ1ZhbHVlKCksIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBzUGFydC5zZXRXaWxkY2FyZFNldCh3Y3NldCk7Ci0gICAgICAgICAgICBzUGFydC5zZXRXaWxkY2FyZFByb2Nlc3ModHJhbnNsYXRlV2lsZGNhcmRQcm9jZXNzKHBhcnNlQW55LnhnZXRQcm9jZXNzQ29udGVudHMoKSkpOwotICAgICAgICAgICAgbWluT2NjdXJzID0gZXh0cmFjdE1pbk9jY3VycyhwYXJzZUFueS54Z2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgbWF4T2NjdXJzID0gZXh0cmFjdE1heE9jY3VycyhwYXJzZUFueS54Z2V0TWF4T2NjdXJzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgR3JvdXAgcGFyc2VHcm91cCA9IChHcm91cClwYXJzZVRyZWU7Ci0gICAgICAgICAgICBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLQotICAgICAgICAgICAgLy8gZ3JhYiBtaW4vbWF4T2NjdXJzIGJlZm9yZSBkZXJlZmVyZW5jaWduIGdyb3VwIHJlZgotICAgICAgICAgICAgbWluT2NjdXJzID0gZXh0cmFjdE1pbk9jY3VycyhwYXJzZUdyb3VwLnhnZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlR3JvdXAueGdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSBNT0RFTF9HUk9VUF9DT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIHJlZiA9IHBhcnNlR3JvdXAuZ2V0UmVmKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdyb3VwIHJlZmVyZW5jZSBtdXN0IGhhdmUgYSByZWYgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkdST1VQX01JU1NJTkdfUkVGLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5pdGlvbkZvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kUmVkZWZpbmVkTW9kZWxHcm91cChyZWYsIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwsIHJlZGVmaW5pdGlvbkZvci5nZXRHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIGdyb3VwLmdldE5hbWUoKS5lcXVhbHMocmVkZWZpbml0aW9uRm9yLmdldEdyb3VwTmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5pdGlvbkZvci5pc1NlZW5SZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiR3JvdXAgcmVkZWZpbml0aW9uIG11c3QgcmVmZXIgdG8gdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gYXQgbW9zdCBvbmNlIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJpZ0ludGVnZXIuT05FLmVxdWFscyhtYXhPY2N1cnMpIHx8ICFCaWdJbnRlZ2VyLk9ORS5lcXVhbHMobWluT2NjdXJzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiV2hlbiByZWZlcmVuY2luZyB0aGUgb3JpZ2luYWwgZ3JvdXAgZGVmaW5pdGlvbiBpbiBhIHJlZGVmaW5pdGlvbiwgbWF4T2NjdXJzIGFuZCBtaW5PY2N1cnMgbXVzdCBiZSAxIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWRlZmluaXRpb25Gb3Iuc2V0U2VlblJlZGVmaW5pdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBncm91cCA9IHN0YXRlLmZpbmRNb2RlbEdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5NT0RFTF9HUk9VUF9OT1RfRk9VTkQsICgoR3JvdXApcGFyc2VUcmVlKS54Z2V0UmVmKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzUHJvY2Vzc2luZyhncm91cCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiByZWZlcmVuY2VzIGl0c2VsZiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBubyBnbyB0byB0aGUgY2hpbGQuCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IGdyb3VwLmdldFBhcnNlT2JqZWN0KCkubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKGN1ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGVDb2RlICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlVHJlZSA9IHBhcnNlR3JvdXAgPSAoR3JvdXApY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZ3JvdXAuZ2V0TmFtZSgpKSArICIgaXMgZW1wdHkiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBncm91cC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgIT0gU2NoZW1hUGFydGljbGUuQUxMICYmIHBhcnRpY2xlQ29kZSAhPSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBwYXJ0aWNsZUNvZGUgIT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZ3JvdXAuZ2V0TmFtZSgpKSArICIgaXMgbm90IGEgc2VxdWVuY2UsIGFsbCwgb3IgY2hvaWNlIiwgWG1sRXJyb3JDb250ZXh0LkVYUExJQ0lUX0dST1VQX05FRURFRCwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UgPSBncm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3VGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZUNvZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgc1BhcnQuc2V0UGFydGljbGVUeXBlKHBhcnRpY2xlQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgbWluT2NjdXJzLmNvbXBhcmVUbyhtYXhPY2N1cnMpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIm1heE9jY3VycyBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gbWluT2NjdXJzIiwgWG1sRXJyb3JDb250ZXh0Lk1JTl9NQVhfT0NDVVJTLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgbWF4T2NjdXJzID0gbWluT2NjdXJzOyAvLyByZW1lZHk6IHBpbiBtYXggdXAgdG8gbWluCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgbWF4T2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gbWF4T2NjdXJzID09IG1pbk9jY3VycyA9PSAwLCBzYW1lIGFzIG5vIHBhcnRpY2xlIGF0IGFsbC4KLSAgICAgICAgfQotCi0gICAgICAgIHNQYXJ0LnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgICAgICBzUGFydC5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5zdGFydFByb2Nlc3NpbmcoZ3JvdXApOwotICAgICAgICAgICAgcmVkZWZpbml0aW9uRm9yID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChncm91cC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgICAgIHJlZGVmaW5pdGlvbkZvciA9IG5ldyBSZWRlZmluaXRpb25Gb3JHcm91cChncm91cC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0NoaWxkcmVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gcGFyc2VUcmVlLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgTGlzdCBhY2N1bXVsYXRlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKGN1ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKGFjY3VtdWxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVDb250ZW50TW9kZWwob3V0ZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIuZ2V0T2JqZWN0KCksIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXNUeXBlcywgZWxlbWVudE1vZGVsLCB0cnVlLCByZWRlZmluaXRpb25Gb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuZ2V0UGFydGljbGVUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc1BhcnQuc2V0UGFydGljbGVDaGlsZHJlbigoU2NoZW1hUGFydGljbGVbXSkKLSAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZS50b0FycmF5KG5ldyBTY2hlbWFQYXJ0aWNsZVthY2N1bXVsYXRlLnNpemUoKV0pKTsKLSAgICAgICAgICAgIGN1ci5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgU2NoZW1hUGFydGljbGUgcmVzdWx0ID0gZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKHNQYXJ0LCBwYXJzZVRyZWUpOwotCi0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5maW5pc2hQcm9jZXNzaW5nKGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBvdXRkZW50REJHKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlV2lsZGNhcmRQcm9jZXNzKEFueS5Qcm9jZXNzQ29udGVudHMgcHJvY2VzcykKLSAgICB7Ci0gICAgICAgIGlmIChwcm9jZXNzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUGFydGljbGUuU1RSSUNUOwotCi0gICAgICAgIFN0cmluZyBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKCJsYXgiLmVxdWFscyhwcm9jZXNzVmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLkxBWDsKLQotICAgICAgICBpZiAoInNraXAiLmVxdWFscyhwcm9jZXNzVmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLlNLSVA7Ci0KLSAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLlNUUklDVDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hUGFydGljbGUgZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKFNjaGVtYVBhcnRpY2xlIHBhcnQsIFhtbE9iamVjdCBwYXJzZVRyZWUpCi0gICAgewotICAgICAgICBpZiAocGFydC5nZXRNYXhPY2N1cnMoKSAhPSBudWxsICYmIHBhcnQuZ2V0TWF4T2NjdXJzKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGlmIChwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNTaW5nbGV0b24oKSAmJiBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCkgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQuZ2V0UGFydGljbGVDaGlsZCgwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgIHBhcnQuZ2V0TWluT2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNTaW5nbGV0b24oKSAmJiBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCkgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQuZ2V0UGFydGljbGVDaGlsZCgwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0FsbCA9IHBhcnQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzQWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jY29zLWFsbC1saW1pdGVkCi0gICAgICAgICAgICBpZiAocGFydC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8IHBhcnQuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhbGwgZ3JvdXAgbXVzdCBoYXZlIG1heE9jY3VycyA8PSAxIiwgWG1sRXJyb3JDb250ZXh0LkFMTF9DT05URU5UUywgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0LmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY2hpbGQgPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQW4gYWxsIGdyb3VwIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9FWFRFTkRfQUxMLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaXNBbGwgJiYgKGNoaWxkLmdldFBhcnRpY2xlVHlwZSgpICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQgfHwgY2hpbGQuZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhbGwgZ3JvdXAgY2FuIGNvbnRhaW4gb25seSBlbGVtZW50IHBhcnRpY2xlcyB3aXRoIG1heE9jY3VycyA8PSAxIiwgWG1sRXJyb3JDb250ZXh0LkFMTF9DT05URU5UUywgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYWRkTWludXNQb2ludGxlc3NQYXJ0aWNsZXMoCi0gICAgICAgICAgICBMaXN0IGxpc3QsIFNjaGVtYVBhcnRpY2xlIHBhcnQsIGludCBwYXJlbnRQYXJ0aWNsZVR5cGUpCi0gICAgewotICAgICAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50UGFydGljbGVUeXBlID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFICYmIHBhcnQuaXNTaW5nbGV0b24oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVtaXREQkcoImRyb3BwaW5nIHJlZHVuZGFudCBzZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXJ0aWNsZVR5cGUgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFICYmIHBhcnQuaXNTaW5nbGV0b24oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVtaXREQkcoImRyb3BwaW5nIHJlZHVuZGFudCBjaG9pY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBsaXN0LmFkZChwYXJ0KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsLCBTY2hlbWFUeXBlIG93bmVyKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnVzZXMgPSBhdHRyTW9kZWwuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnVzZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KGF0dHJ1c2VzW2ldLmdldE5hbWUoKSwgYnVpbGRVc2VQcm9wZXJ0eShhdHRydXNlc1tpXSwgb3duZXIpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBNYXAgYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoU2NoZW1hUGFydGljbGUgcGFydCwgU2NoZW1hVHlwZSBvd25lcikKLSAgICB7Ci0gICAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCi0gICAgICAgIGJvb2xlYW4gYXNTZXF1ZW5jZSA9IGZhbHNlOwotICAgICAgICBNYXAgbW9kZWwgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGFzU2VxdWVuY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgYXNTZXF1ZW5jZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIG1vZGVsID0gYnVpbGRFbGVtZW50UHJvcGVydHlNb2RlbCgoU2NoZW1hTG9jYWxFbGVtZW50KXBhcnQsIG93bmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgbW9kZWwgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGJ1aWxkIG1vZGVsIGZvciBjaGlsZHJlbgotICAgICAgICAgICAgbW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGluZGVudERCRygpOwotICAgICAgICAgICAgICAgIE1hcCBjaGlsZE1vZGVsID0gYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoY2hpbGRyZW5baV0sIG93bmVyKTsKLSAgICAgICAgICAgICAgICAvLyBvdXRkZW50REJHKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gY2hpbGRNb2RlbC52YWx1ZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgaVByb3AgPSAoU2NoZW1hUHJvcGVydHkpai5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBvUHJvcCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpbW9kZWwuZ2V0KGlQcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvUHJvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFzU2VxdWVuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTY2hlbWFQcm9wZXJ0eUltcGwpaVByb3ApLnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLlpFUk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwucHV0KGlQcm9wLmdldE5hbWUoKSwgaVByb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgdmVyaWZpZWQgaW4gYW4gZWFybGllciBzdGVwCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydChvUHJvcC5nZXRUeXBlKCkuZXF1YWxzKGlQcm9wLmdldFR5cGUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lcmdlUHJvcGVydGllcyhvUHJvcCwgaVByb3AsIGFzU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmluYWxseSBkZWFsIHdpdGggbWluT2NjdXJzLCBtYXhPY2N1cnMgb3ZlciB3aG9sZSBncm91cAotICAgICAgICAgICAgQmlnSW50ZWdlciBtaW4gPSBwYXJ0LmdldE1pbk9jY3VycygpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXggPSBwYXJ0LmdldE1heE9jY3VycygpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtb2RlbC52YWx1ZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IG9Qcm9wID0gKFNjaGVtYVByb3BlcnR5KWoubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbWluT2NjdXJzID0gb1Byb3AuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnMgPSBvUHJvcC5nZXRNYXhPY2N1cnMoKTsKLQotICAgICAgICAgICAgICAgIG1pbk9jY3VycyA9IG1pbk9jY3Vycy5tdWx0aXBseShtaW4pOwotICAgICAgICAgICAgICAgIGlmIChtYXggIT0gbnVsbCAmJiBtYXguZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykpCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3VycyA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXhPY2N1cnMgIT0gbnVsbCAmJiAhbWF4T2NjdXJzLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnMgPSBtYXggPT0gbnVsbCA/IG51bGwgOiBtYXhPY2N1cnMubXVsdGlwbHkobWF4KTsKLQotICAgICAgICAgICAgICAgICgoU2NoZW1hUHJvcGVydHlJbXBsKW9Qcm9wKS5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICAgICAgICAgICAgICAoKFNjaGVtYVByb3BlcnR5SW1wbClvUHJvcCkuc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgc3RhdGljIE1hcCBidWlsZEVsZW1lbnRQcm9wZXJ0eU1vZGVsKFNjaGVtYUxvY2FsRWxlbWVudCBlcGFydCwgU2NoZW1hVHlwZSBvd25lcikKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgxKTsKLQotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBzUHJvcCA9IGJ1aWxkVXNlUHJvcGVydHkoZXBhcnQsIG93bmVyKTsKLSAgICAgICAgcmVzdWx0LnB1dChzUHJvcC5nZXROYW1lKCksIHNQcm9wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hUHJvcGVydHkgYnVpbGRVc2VQcm9wZXJ0eShTY2hlbWFGaWVsZCB1c2UsIFNjaGVtYVR5cGUgb3duZXIpCi0gICAgewotICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc1Byb3BJbXBsID0gbmV3IFNjaGVtYVByb3BlcnR5SW1wbCgpOwotICAgICAgICBzUHJvcEltcGwuc2V0TmFtZSh1c2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldENvbnRhaW5lclR5cGVSZWYob3duZXIuZ2V0UmVmKCkpOwotICAgICAgICBzUHJvcEltcGwuc2V0VHlwZVJlZih1c2UuZ2V0VHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldEF0dHJpYnV0ZSh1c2UuaXNBdHRyaWJ1dGUoKSk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXREZWZhdWx0KHVzZS5pc0RlZmF1bHQoKSA/IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSA6IFNjaGVtYVByb3BlcnR5Lk5FVkVSKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldEZpeGVkKHVzZS5pc0ZpeGVkKCkgPyBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkgOiBTY2hlbWFQcm9wZXJ0eS5ORVZFUik7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXROaWxsYWJsZSh1c2UuaXNOaWxsYWJsZSgpID8gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIDogU2NoZW1hUHJvcGVydHkuTkVWRVIpOwotICAgICAgICBzUHJvcEltcGwuc2V0RGVmYXVsdFRleHQodXNlLmdldERlZmF1bHRUZXh0KCkpOwotICAgICAgICBzUHJvcEltcGwuc2V0TWluT2NjdXJzKHVzZS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXRNYXhPY2N1cnModXNlLmdldE1heE9jY3VycygpKTsKLQotICAgICAgICBpZiAodXNlIGluc3RhbmNlb2YgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCBlbHQgPSAoU2NoZW1hTG9jYWxFbGVtZW50SW1wbCl1c2U7Ci0gICAgICAgICAgICBzUHJvcEltcGwuc2V0QWNjZXB0ZWROYW1lcyhlbHQuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNQcm9wSW1wbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBtZXJnZVByb3BlcnRpZXMoU2NoZW1hUHJvcGVydHlJbXBsIGludG8sIFNjaGVtYVByb3BlcnR5IGZyb20sIGJvb2xlYW4gYXNTZXF1ZW5jZSkKLSAgICB7Ci0gICAgICAgIC8vIG1pbm9jY3VyLCBtYXhvY2N1cgotICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VycyA9IGludG8uZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzID0gaW50by5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgaWYgKGFzU2VxdWVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VycyA9IG1pbk9jY3Vycy5hZGQoZnJvbS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gKGZyb20uZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycy5hZGQoZnJvbS5nZXRNYXhPY2N1cnMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXJzID0gbWluT2NjdXJzLm1pbihmcm9tLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIGlmIChtYXhPY2N1cnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnMgPSAoZnJvbS5nZXRNYXhPY2N1cnMoKSA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycy5tYXgoZnJvbS5nZXRNYXhPY2N1cnMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGludG8uc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICAgIGludG8uc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0KLSAgICAgICAgLy8gbmlsbGFibGUsIGRlZmF1bHQsIGZpeGVkCi0gICAgICAgIGlmIChmcm9tLmhhc05pbGxhYmxlKCkgIT0gaW50by5oYXNOaWxsYWJsZSgpKQotICAgICAgICAgICAgaW50by5zZXROaWxsYWJsZShTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSk7Ci0gICAgICAgIGlmIChmcm9tLmhhc0RlZmF1bHQoKSAhPSBpbnRvLmhhc0RlZmF1bHQoKSkKLSAgICAgICAgICAgIGludG8uc2V0RGVmYXVsdChTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSk7Ci0gICAgICAgIGlmIChmcm9tLmhhc0ZpeGVkKCkgIT0gaW50by5oYXNGaXhlZCgpKQotICAgICAgICAgICAgaW50by5zZXRGaXhlZChTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSk7Ci0KLSAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQotICAgICAgICBpZiAoaW50by5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmcm9tLmdldERlZmF1bHRUZXh0KCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICFpbnRvLmdldERlZmF1bHRUZXh0KCkuZXF1YWxzKGZyb20uZ2V0RGVmYXVsdFRleHQoKSkpCi0gICAgICAgICAgICAgICAgaW50by5zZXREZWZhdWx0VGV4dChudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZVtdIGVuc3VyZVN0YXRlTWFjaGluZShTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRTdGF0ZU1hY2hpbmUoY2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBidWlsZFN0YXRlTWFjaGluZShTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwpCi0gICAgewotICAgICAgICBpZiAoY29udGVudE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIHBhcnRJbXBsID0gKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWw7Ci0gICAgICAgIGlmIChwYXJ0SW1wbC5oYXNUcmFuc2l0aW9uTm90ZXMoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBRTmFtZVNldEJ1aWxkZXIgc3RhcnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgIFFOYW1lU2V0QnVpbGRlciBleGNsdWRlbmV4dCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgYm9vbGVhbiBkZXRlcm1pbmlzdGljID0gdHJ1ZTsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gY2Fuc2tpcCA9IChwYXJ0SW1wbC5nZXRNaW5PY2N1cnMoKS5zaWdudW0oKSA9PSAwKTsKLQotICAgICAgICBzd2l0Y2ggKHBhcnRJbXBsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBzdGFydCBhbmQgZXhjbHVkZU5leHQ7IGNhbnNraXAgaXMgYWxyZWFkeSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRJbXBsLmhhc1RyYW5zaXRpb25SdWxlcygpKQotICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwocGFydEltcGwuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkKHBhcnRJbXBsLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHN0YXJ0IGFuZCBleGNsdWRlTmV4dDsgY2Fuc2tpcCBpcyBhbHJlYWR5IGNvcnJlY3QKLSAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwocGFydEltcGwuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBlbnN1cmVTdGF0ZU1hY2hpbmUocGFydEltcGwuZ2V0UGFydGljbGVDaGlsZHJlbigpKTsKLQotICAgICAgICAgICAgICAgIC8vIGFkanVzdCBjYW5za2lwIGlmIGFsbCBjaGlsZHJlbiBhcmUgc2tpcHBhYmxlCi0gICAgICAgICAgICAgICAgY2Fuc2tpcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNhbnNraXAgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5za2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGJ1YmJsZSB1cCBub25kZXRlcm1pbmlzdGljIGJpdAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBkZXRlcm1pbmlzdGljICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZGV0ZXJtaW5pc3RpYyBhbmQgY29tcHV0ZSBleGNsdWRlTmV4dCBzZXQKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKCgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2kgLSAxXSkuZ2V0RXhjbHVkZU5leHRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXRlcm1pbmlzdGljICYmICFleGNsdWRlbmV4dC5pc0Rpc2pvaW50KChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkcmVuW2ldKS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5leHQsIGNvbXB1dGUgc3RhcnQgc2V0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0LmFkZEFsbCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZW5zdXJlU3RhdGVNYWNoaW5lKHBhcnRJbXBsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGp1c3QgY2Fuc2tpcCBpZiBhbnkgY2hpbGRyZW4gYXJlIHNraXBwYWJsZQotICAgICAgICAgICAgICAgIGNhbnNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIWNhbnNraXAgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZHJlbltpXSkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGJ1YmJsZSB1cCBub25kZXRlcm1pbmlzdGljIGJpdAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBkZXRlcm1pbmlzdGljICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHN0YXJ0IGFuZCBleGNsdWRlTmV4dCBzZXRzLCB2ZXJpZnkgZGV0ZXJtaW5pc3RpYwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZXJtaW5pc3RpYyAmJiAhc3RhcnQuaXNEaXNqb2ludCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkQWxsKChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmdldEV4Y2x1ZGVOZXh0U2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGVuc3VyZVN0YXRlTWFjaGluZShwYXJ0SW1wbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRqdXN0IGNhbnNraXAgaWYgYWxsIGNoaWxkcmVuIGFyZSBza2lwcGFibGUKLSAgICAgICAgICAgICAgICBjYW5za2lwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIWNhbnNraXAgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5za2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYnViYmxlIHVwIG5vbmRldGVybWluaXN0aWMgYml0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGRldGVybWluaXN0aWMgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuaXNEZXRlcm1pbmlzdGljKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgc3RhcnQgYW5kIGV4Y2x1ZGVOZXh0IHNldHMsIHZlcmlmeSBkZXRlcm1pbmlzdGljCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXRlcm1pbmlzdGljICYmICFzdGFydC5pc0Rpc2pvaW50KChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbCgoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuZ2V0RXhjbHVkZU5leHRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjYW5za2lwKQotICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoc3RhcnQpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQsIGFsbCBjYXNlcyBueWkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgc2NoZW1hIHBhcnRpY2xlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhcHBseSBsb29waW5nIGxvZ2ljCi0KLSAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnMgPSBwYXJ0SW1wbC5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnMgPSBwYXJ0SW1wbC5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgYm9vbGVhbiBjYW5sb29wID0gKG1heE9jY3VycyA9PSBudWxsIHx8IG1heE9jY3Vycy5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCk7Ci0gICAgICAgIGJvb2xlYW4gdmFybG9vcCA9IChtYXhPY2N1cnMgPT0gbnVsbCB8fCBtaW5PY2N1cnMuY29tcGFyZVRvKG1heE9jY3VycykgPCAwKTsKLQotICAgICAgICBpZiAoY2FubG9vcCAmJiBkZXRlcm1pbmlzdGljICYmICFleGNsdWRlbmV4dC5pc0Rpc2pvaW50KHN0YXJ0KSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHBvc3NpYmxlIGxvb3Bpbmcgbm9uZGV0ZXJtaW5pc20uCi0gICAgICAgICAgICAvLyBsZXQncyB0YWtlIHNvbWUgdGltZSBub3cgdG8gc2VlIGlmIGl0J3MgYWN0dWFsbHkgY2F1c2VkCi0gICAgICAgICAgICAvLyBieSBub24tdW5pcXVlLXBhcnRpY2xlLWF0dHJpYnV0ZSBvciBub3QuCi0gICAgICAgICAgICBRTmFtZVNldCBzdXNwZWN0U2V0ID0gZXhjbHVkZW5leHQuaW50ZXJzZWN0KHN0YXJ0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgc2V0IG9mIGFsbCBwYXJ0aWNsZXMgdGhhdCBjb3VsZCBzdGFydCB0aGlzIGdyb3VwCi0gICAgICAgICAgICBNYXAgc3RhcnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChwYXJ0SW1wbCwgc3VzcGVjdFNldCwgc3RhcnRNYXAsIG5ldyBRTmFtZVNldEJ1aWxkZXIoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIHNldCBvZiBhbGwgcGFydGljbGVzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHJlcGVhdGVkIHJhdGhlciB0aGFuIGVuZGluZyB0aGlzIGdyb3VwCi0gICAgICAgICAgICBNYXAgYWZ0ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihwYXJ0SW1wbCwgc3VzcGVjdFNldCwgYWZ0ZXJNYXAsIG5ldyBRTmFtZVNldEJ1aWxkZXIoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1lbWJlciBvZiBhZnRlciB0aGF0IGlzIG5vdCBhIG1lbWJlciBvZiBzdGFydAotICAgICAgICAgICAgLy8gaWYgd2UgY2FuLCB0aGVuIHBhcnRpY2xlIGF0dHJpYnV0aW9uIGlzIG5vdCB1bmlxdWUKLSAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBhZnRlck1hcFN1YnN1bWVkQnlTdGFydE1hcChzdGFydE1hcCwgYWZ0ZXJNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhcmxvb3ApCi0gICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoc3RhcnQpOwotCi0gICAgICAgIGNhbnNraXAgPSBjYW5za2lwIHx8IG1pbk9jY3Vycy5zaWdudW0oKSA9PSAwOwotCi0gICAgICAgIHBhcnRJbXBsLnNldFRyYW5zaXRpb25SdWxlcyhzdGFydC50b1FOYW1lU2V0KCksIGNhbnNraXApOwotICAgICAgICBwYXJ0SW1wbC5zZXRUcmFuc2l0aW9uTm90ZXMoZXhjbHVkZW5leHQudG9RTmFtZVNldCgpLCBkZXRlcm1pbmlzdGljKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhZnRlck1hcFN1YnN1bWVkQnlTdGFydE1hcChNYXAgc3RhcnRNYXAsIE1hcCBhZnRlck1hcCkKLSAgICB7Ci0gICAgICAgIGlmIChhZnRlck1hcC5zaXplKCkgPiBzdGFydE1hcC5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAoYWZ0ZXJNYXAuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdGFydE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0ID0gKFNjaGVtYVBhcnRpY2xlKWkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFmdGVyTWFwLmNvbnRhaW5zS2V5KHBhcnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgc3RhcnRTZXQgPSAoUU5hbWVTZXQpc3RhcnRNYXAuZ2V0KHBhcnQpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBhZnRlclNldCA9IChRTmFtZVNldClhZnRlck1hcC5nZXQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRTZXQuY29udGFpbnNBbGwoYWZ0ZXJTZXQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFmdGVyTWFwLnJlbW92ZShwYXJ0KTsKLSAgICAgICAgICAgIGlmIChhZnRlck1hcC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChhZnRlck1hcC5pc0VtcHR5KCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQoU2NoZW1hUGFydGljbGUgcGFydCwgUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHN1c3BlY3RTZXQsIE1hcCByZXN1bHQsIFFOYW1lU2V0QnVpbGRlciBlbGltaW5hdGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBpZiAoIXN1c3BlY3RTZXQuY29udGFpbnMocGFydC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChwYXJ0LCBudWxsKTsKLSAgICAgICAgICAgICAgICBlbGltaW5hdGUuYWRkKHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGlmIChzdXNwZWN0U2V0LmlzRGlzam9pbnQocGFydC5nZXRXaWxkY2FyZFNldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQocGFydCwgcGFydC5nZXRXaWxkY2FyZFNldCgpLmludGVyc2VjdChzdXNwZWN0U2V0KSk7Ci0gICAgICAgICAgICAgICAgZWxpbWluYXRlLmFkZEFsbChwYXJ0LmdldFdpbGRjYXJkU2V0KCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KGNoaWxkcmVuW2ldLCBzdXNwZWN0U2V0LCByZXN1bHQsIGVsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5bMF0uaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChjaGlsZHJlblswXSwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZW1haW5pbmdTdXNwZWN0cyA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoc3VzcGVjdFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciBzdXNwZWN0c1RvRWxpbWluYXRlID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KGNoaWxkcmVuW2ldLCByZW1haW5pbmdTdXNwZWN0cywgcmVzdWx0LCBzdXNwZWN0c1RvRWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaW1pbmF0ZS5hZGRBbGwoc3VzcGVjdHNUb0VsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuW2ldLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nU3VzcGVjdHMucmVtb3ZlQWxsKHN1c3BlY3RzVG9FbGltaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1N1c3BlY3RzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZWN0c1RvRWxpbWluYXRlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoU2NoZW1hUGFydGljbGUgcGFydCwgUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHN1c3BlY3RTZXQsIE1hcCByZXN1bHQsIFFOYW1lU2V0QnVpbGRlciBlbGltaW5hdGUsIGJvb2xlYW4gdG9wKQotICAgIHsKLSAgICAgICAgcmVjdXJzZTogc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihjaGlsZHJlbltpXSwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoY2hpbGRyZW5bMF0sIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZW1haW5pbmdTdXNwZWN0cyA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoc3VzcGVjdFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciBzdXNwZWN0c1RvRWxpbWluYXRlID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoY2hpbGRyZW5baV0sIHJlbWFpbmluZ1N1c3BlY3RzLCByZXN1bHQsIHN1c3BlY3RzVG9FbGltaW5hdGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaW1pbmF0ZS5hZGRBbGwoc3VzcGVjdHNUb0VsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuW2ldLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1N1c3BlY3RzLnJlbW92ZUFsbChzdXNwZWN0c1RvRWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTdXNwZWN0cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlY3RzVG9FbGltaW5hdGUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdG9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VycyA9IHBhcnQuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3VycyA9IHBhcnQuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgICBib29sZWFuIHZhcmxvb3AgPSAobWF4T2NjdXJzID09IG51bGwgfHwgbWluT2NjdXJzLmNvbXBhcmVUbyhtYXhPY2N1cnMpIDwgMCk7Ci0gICAgICAgICAgICBpZiAodmFybG9vcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KHBhcnQsIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvZGVGb3JOYW1lRW50cnkKLSAgICB7Ci0gICAgICAgIENvZGVGb3JOYW1lRW50cnkoUU5hbWUgbmFtZSwgaW50IGNvZGUpCi0gICAgICAgICAgICB7IHRoaXMubmFtZSA9IG5hbWU7IHRoaXMuY29kZSA9IGNvZGU7IH0KLSAgICAgICAgcHVibGljIFFOYW1lIG5hbWU7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfR1JPVVBfQ09ERSA9IDEwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIENvZGVGb3JOYW1lRW50cnlbXSBwYXJ0aWNsZUNvZGVzID0gbmV3IENvZGVGb3JOYW1lRW50cnlbXQotICAgIHsKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhbGwiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuQUxMKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJzZXF1ZW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiY2hvaWNlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVBhcnRpY2xlLkNIT0lDRSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiZWxlbWVudCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhbnkiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuV0lMRENBUkQpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImdyb3VwIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIE1PREVMX0dST1VQX0NPREUpLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgcGFydGljbGVDb2RlTWFwID0gYnVpbGRQYXJ0aWNsZUNvZGVNYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZFBhcnRpY2xlQ29kZU1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNvZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dChwYXJ0aWNsZUNvZGVzW2ldLm5hbWUsICBuZXcgSW50ZWdlcihwYXJ0aWNsZUNvZGVzW2ldLmNvZGUpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsYXRlUGFydGljbGVDb2RlKEdyb3VwIHBhcnNlRWcpCi0gICAgewotICAgICAgICBpZiAocGFyc2VFZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUocGFyc2VFZy5uZXdDdXJzb3IoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIEludGVnZXIgcmVzdWx0ID0gKEludGVnZXIpcGFydGljbGVDb2RlTWFwLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0NPREUgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUF9DT0RFID0gMTAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTllfQVRUUklCVVRFX0NPREUgPSAxMDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2RlRm9yTmFtZUVudHJ5W10gYXR0cmlidXRlQ29kZXMgPSBuZXcgQ29kZUZvck5hbWVFbnRyeVtdCi0gICAgewotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImF0dHJpYnV0ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBBVFRSSUJVVEVfQ09ERSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiYXR0cmlidXRlR3JvdXAiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgQVRUUklCVVRFX0dST1VQX0NPREUpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImFueUF0dHJpYnV0ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBBTllfQVRUUklCVVRFX0NPREUpLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYXR0cmlidXRlQ29kZU1hcCA9IGJ1aWxkQXR0cmlidXRlQ29kZU1hcCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlQ29kZU1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVDb2Rlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoYXR0cmlidXRlQ29kZXNbaV0ubmFtZSwgIG5ldyBJbnRlZ2VyKGF0dHJpYnV0ZUNvZGVzW2ldLmNvZGUpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IHRyYW5zbGF0ZUF0dHJpYnV0ZUNvZGUoUU5hbWUgY3VycmVudE5hbWUpCi0gICAgewotICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKWF0dHJpYnV0ZUNvZGVNYXAuZ2V0KGN1cnJlbnROYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0ltcG9ydGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSW1wb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4YTNlNi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSW1wb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlJlZGVmaW5lRG9jdW1lbnQuUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkltcG9ydERvY3VtZW50LkltcG9ydDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkluY2x1ZGVEb2N1bWVudC5JbmNsdWRlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBTdHNjSW1wb3J0ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVRvUHJvY2Vzc1tdIHJlc29sdmVJbXBvcnRzQW5kSW5jbHVkZXMoU2NoZW1hW10gc3RhcnRXaXRoKQotICAgIHsKLSAgICAgICAgRG93bmxvYWRUYWJsZSBlbmdpbmUgPSBuZXcgRG93bmxvYWRUYWJsZShzdGFydFdpdGgpOwotICAgICAgICByZXR1cm4gZW5naW5lLnJlc29sdmVJbXBvcnRzQW5kSW5jbHVkZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNjaGVtYVRvUHJvY2VzcwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTY2hlbWEgc2NoZW1hOwotICAgICAgICBwcml2YXRlIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2U7Ci0gICAgICAgIHByaXZhdGUgUmVkZWZpbmUgcmVkZWZpbmU7Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYVRvUHJvY2VzcyhTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlLCBSZWRlZmluZSByZWRlZmluZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgICAgICAgICB0aGlzLmNoYW1lbGVvbk5hbWVzcGFjZSA9IGNoYW1lbGVvbk5hbWVzcGFjZTsKLSAgICAgICAgICAgIHRoaXMucmVkZWZpbmUgPSByZWRlZmluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgc2NoZW1hIHRvIHBhcnNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2NoZW1hOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBiYXNlIFVSSSBmb3IgdGhpcyBzdHAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWEuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHJlZGVmaW5lIGVsZW1lbnQsIGlmIHByb2Nlc3NlZCB2aWEgcmVkZWZpbmUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBSZWRlZmluZSBnZXRSZWRlZmluZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZWRlZmluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY2hhbWVsZW9uIG5hbWVzcGFjZS4gTnVsbCBpZiB0aGlzIHNjaGVtYSBpcyBub3QgYmVpbmcgdHJlYXRlZAotICAgICAgICAgKiBhcyBhIGNoYW1lbGVvbi4gKFRoZSBvcmRpbmFyeSB0YXJnZXROYW1lc3BhY2Ugd2lsbCBqdXN0IGJlIGV4dHJhY3RlZAotICAgICAgICAgKiBmcm9tIHRoZSBzeW50YXggb2YgdGhlIHNjaGVtYS4pCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjaGFtZWxlb25OYW1lc3BhY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFNjaGVtYVRvUHJvY2VzcykpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZmluYWwgU2NoZW1hVG9Qcm9jZXNzIHNjaGVtYVRvUHJvY2VzcyA9IChTY2hlbWFUb1Byb2Nlc3MpIG87Ci0KLSAgICAgICAgICAgIGlmIChjaGFtZWxlb25OYW1lc3BhY2UgIT0gbnVsbCA/ICFjaGFtZWxlb25OYW1lc3BhY2UuZXF1YWxzKHNjaGVtYVRvUHJvY2Vzcy5jaGFtZWxlb25OYW1lc3BhY2UpIDogc2NoZW1hVG9Qcm9jZXNzLmNoYW1lbGVvbk5hbWVzcGFjZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmUgIT0gbnVsbCA/ICFyZWRlZmluZS5lcXVhbHMoc2NoZW1hVG9Qcm9jZXNzLnJlZGVmaW5lKSA6IHNjaGVtYVRvUHJvY2Vzcy5yZWRlZmluZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIXNjaGVtYS5lcXVhbHMoc2NoZW1hVG9Qcm9jZXNzLnNjaGVtYSkpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNjaGVtYS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgcmVzdWx0ID0gMjkgKiByZXN1bHQgKyAoY2hhbWVsZW9uTmFtZXNwYWNlICE9IG51bGwgPyBjaGFtZWxlb25OYW1lc3BhY2UuaGFzaENvZGUoKSA6IDApOwotICAgICAgICAgICAgcmVzdWx0ID0gMjkgKiByZXN1bHQgKyAocmVkZWZpbmUgIT0gbnVsbCA/IHJlZGVmaW5lLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9VUkxfUFJFRklYID0gInByb2plY3Q6Ly9sb2NhbCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZVVSTEZvckRvYyhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBvYmouZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpOwotCi0gICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgICAgICByZXR1cm4gUFJPSkVDVF9VUkxfUFJFRklYICsgcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0KLSAgICAgICAgLy8gbG9va3MgbGlrZSBhIFVSTD8KLSAgICAgICAgaW50IGNvbG9uID0gcGF0aC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmIChjb2xvbiA+IDEgJiYgcGF0aC5zdWJzdHJpbmcoMCwgY29sb24pLm1hdGNoZXMoIl5cXHcrJCIpKQotICAgICAgICAgICAgcmV0dXJuIHBhdGg7Ci0KLSAgICAgICAgcmV0dXJuIFBST0pFQ1RfVVJMX1BSRUZJWCArICIvIiArIHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFVSSSBwYXJzZVVSSShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkocyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBzeW50YXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL3dvcmthcm91bmQgZm9yIFN1biBidWcgIyA0NzIzNzI2Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVVJJIHJlc29sdmUoVVJJIGJhc2UsIFN0cmluZyBjaGlsZCkKLSAgICB7Ci0gICAgICAgIFVSSSBydXJpID0gYmFzZS5yZXNvbHZlKGNoaWxkKTsKLSAgICAgICAgCi0gICAgICAgIC8vZml4IHVwIG5vcm1hbGl6YXRpb24gYnVnCi0gICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHJ1cmkuZ2V0U2NoZW1lKCkpICYmICEgY2hpbGQuZXF1YWxzKHJ1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmFzZS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLy8iKSAmJiAhcnVyaS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLy8iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICIvLy8iLmNvbmNhdChydXJpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydXJpID0gbmV3IFVSSSgiZmlsZSIsIG51bGwsIHBhdGgsIHJ1cmkuZ2V0UXVlcnkoKSwgcnVyaS5nZXRGcmFnbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIHVyaXMpCi0gICAgICAgICAgICAgICAge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvd25sb2FkVGFibGUKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBOYW1lc3BhY2Uvc2NoZW1hTG9jYXRpb24gcGFpci4KLSAgICAgICAgICoKLSAgICAgICAgICogRG93bmxvYWRlZCBzY2hlbWFzIGFyZSBpbmRleGVkIGJ5IG5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24sIGFuZCBib3RoLgotICAgICAgICAgKgotICAgICAgICAgKiBBIHBlcmZlY3QgbWF0Y2ggaXMgcHJlZmVycmVkLCBidXQgYSBtYXRjaC1ieS1uYW1lc3BhY2UgaXMgYWNjZXB0ZWQuCi0gICAgICAgICAqIEEgbWF0Y2gtYnktc2NoZW1hTG9jYXRpb24gaXMgb25seSBhY2NlcHRlZCBmb3IgaW5jbHVkZXMgKG5vdCBpbXBvcnRzKS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5zTG9jUGFpcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTDsKLQotICAgICAgICAgICAgcHVibGljIE5zTG9jUGFpcihTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYXRpb25VUkwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblVSTCA9IGxvY2F0aW9uVVJMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEVtcHR5IHN0cmluZyBmb3Igbm8tbmFtZXNwYWNlLCBudWxsIGZvciBuYW1lc3BhY2Utbm90LXBhcnQtb2Yta2V5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb25VUkw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTnNMb2NQYWlyKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZmluYWwgTnNMb2NQYWlyIG5zTG9jUGFpciA9IChOc0xvY1BhaXIpIG87Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25VUkwgIT0gbnVsbCA/ICFsb2NhdGlvblVSTC5lcXVhbHMobnNMb2NQYWlyLmxvY2F0aW9uVVJMKSA6IG5zTG9jUGFpci5sb2NhdGlvblVSTCAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsID8gIW5hbWVzcGFjZVVSSS5lcXVhbHMobnNMb2NQYWlyLm5hbWVzcGFjZVVSSSkgOiBuc0xvY1BhaXIubmFtZXNwYWNlVVJJICE9IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChuYW1lc3BhY2VVUkkgIT0gbnVsbCA/IG5hbWVzcGFjZVVSSS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMjkgKiByZXN1bHQgKyAobG9jYXRpb25VUkwgIT0gbnVsbCA/IGxvY2F0aW9uVVJMLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlnZXN0S2V5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBfZGlnZXN0OwotICAgICAgICAgICAgaW50IF9oYXNoQ29kZTsKLSAgICAgICAgICAgIERpZ2VzdEtleShieXRlW10gZGlnZXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9kaWdlc3QgPSBkaWdlc3Q7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0ICYmIGkgPCBkaWdlc3QubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfaGFzaENvZGUgPSBfaGFzaENvZGUgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgX2hhc2hDb2RlID0gX2hhc2hDb2RlICsgZGlnZXN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEaWdlc3RLZXkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoX2RpZ2VzdCwgKChEaWdlc3RLZXkpbykuX2RpZ2VzdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaGFzaENvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1hcCBzY2hlbWFCeU5zTG9jUGFpciA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgTWFwIHNjaGVtYUJ5RGlnZXN0S2V5ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IHNjYW5OZWVkZWQgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICBwcml2YXRlIFNldCBlbXB0eU5hbWVzcGFjZVNjaGVtYXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBwcml2YXRlIFNldCBzY2FubmVkQWxyZWFkeSA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHByaXZhdGUgU2V0IGZhaWxlZERvd25sb2FkcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2hlbWEgZG93bmxvYWRTY2hlbWEoWG1sT2JqZWN0IHJlZmVyZW5jZWRCeSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uVVJMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBubyBsb2NhdGlvbiBVUkwgcHJvdmlkZWQ/ICBUaGVuIG5vdGhpbmcgdG8gZG8uCi0gICAgICAgICAgICBpZiAobG9jYXRpb25VUkwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRmlyc3QgcmVzb2x2ZSByZWxhdGl2ZSBVUkxzIHdpdGggcmVzcGVjdCB0byBiYXNlIFVSTCBmb3IgZG9jCi0gICAgICAgICAgICBVUkkgYmFzZVVSSSA9IHBhcnNlVVJJKGJhc2VVUkxGb3JEb2MocmVmZXJlbmNlZEJ5KSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVVUkwgPSBiYXNlVVJJID09IG51bGwgPyBsb2NhdGlvblVSTCA6IHJlc29sdmUoYmFzZVVSSSwgbG9jYXRpb25VUkwpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2JlIDE6IG5zK3VybCAtIHBlcmZlY3QgbWF0Y2gKLSAgICAgICAgICAgIGlmIChhYnNvbHV0ZVVSTCAhPSBudWxsICYmIHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYSByZXN1bHQgPSAoU2NoZW1hKXNjaGVtYUJ5TnNMb2NQYWlyLmdldChuZXcgTnNMb2NQYWlyKHRhcmdldE5hbWVzcGFjZSwgYWJzb2x1dGVVUkwpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICAgICAgLy8gcHJvYmUgMjogd2UgaGF2ZSBwcmVleGlzdGluZyBrbm93bGVkZ2Ugb2YgdGhpcyBuYW1lc3BhY2UsCi0gICAgICAgICAgICAvLyBlaXRoZXIgZnJvbSBhbm90aGVyIHNjaGVtYSBmaWxlIG9yIGZyb20gdGhlIGxpbmtlci4KLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBkb3dubG9hZGluZyB0aGUgZ2l2ZW4gVVJMLCBza2lwIGl0IHNpbGVudGx5IGlmIHRoZQotICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGlzIGFscmVhZHkgcmVwcmVzZW50ZWQgYnkgYSBmaWxlIHdlIGhhdmUuCi0gICAgICAgICAgICAvLyBBbHNvLCBzdXBwcmVzcyBkb3dubG9hZHMgb2YgVVJMcyB0byBuYW1lc3BhY2VzIHRoYXQgYXJlIGFscmVhZHkKLSAgICAgICAgICAgIC8vIGtub3duIGJ5IHRoZSBsaW5rZXIuCi0gICAgICAgICAgICAvLyAoV2UgbmV2ZXIgYXNzdW1lIHByZWV4aXN0aW5nIGtub3dsZWRnZSBvZiB0aGUgbm8tbmFtZXNwYWNlLAotICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSBoYXZlIHNvbWUgZGVmaW5pdGlvbnMsIHNpbmNlIGl0J3MgbGlrZWx5IHRoYXQKLSAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBvbmUgcGVyc29uIGlzIHBsYXlpbmcgaW4gdGhlIG5vLW5hbWVzcGFjZSBhdCBvbmNlLikKLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiAhdGFyZ2V0TmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIFVSTCBpcyBub3Qgb25lIHRvIGRvd25sb2FkOyBzaG91bGQgd2UgYXNzdW1lIHdlIGtub3cgYWJvdXQgdGhlIG5hbWVzcGFjZT8KLSAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLnNob3VsZERvd25sb2FkVVJJKGFic29sdXRlVVJMKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhIHNjaGVtYSByZXByZXNlbnRpbmcgdGhpcyBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gc2tpcCB0aGlzIFVSTCBzaWxlbnRseSB3aXRob3V0IHByb2R1Y2luZyBhbiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hIHJlc3VsdCA9IChTY2hlbWEpc2NoZW1hQnlOc0xvY1BhaXIuZ2V0KG5ldyBOc0xvY1BhaXIodGFyZ2V0TmFtZXNwYWNlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmtlciBhbHJlYWR5IGtub3dzIGFib3V0IHRoaXMgbmFtZXNwYWNlLCBza2lwCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBVUkwuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxpbmtlckRlZmluZXNOYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2JlIDM6IHVybCBvbmx5Ci0gICAgICAgICAgICBpZiAoYWJzb2x1dGVVUkwgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWEgcmVzdWx0ID0gKFNjaGVtYSlzY2hlbWFCeU5zTG9jUGFpci5nZXQobmV3IE5zTG9jUGFpcihudWxsLCBhYnNvbHV0ZVVSTCkpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm8gbWF0Y2g6IGVycm9yIGlmIHdlIGNhbid0IG9yIHdvbid0IGRvd25sb2FkLgotICAgICAgICAgICAgaWYgKGFic29sdXRlVVJMID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNvdWxkIG5vdCBmaW5kIHJlc291cmNlIC0gbm8gdmFsaWQgbG9jYXRpb24gVVJMLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXZpb3VzbHlGYWlsZWRUb0Rvd25sb2FkKGFic29sdXRlVVJMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbiBlcnJvciBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvZHVjZWQuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3RhdGUuc2hvdWxkRG93bmxvYWRVUkkoYWJzb2x1dGVVUkwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDb3VsZCBub3QgbG9hZCByZXNvdXJjZSBcIiIgKyBhYnNvbHV0ZVVSTCArICJcIiAobmV0d29yayBkb3dubG9hZHMgZGlzYWJsZWQpLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKLSAgICAgICAgICAgICAgICBhZGRGYWlsZWREb3dubG9hZChhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRyeSB0byBkb3dubG9hZAotICAgICAgICAgICAgZG93bmxvYWQ6IHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbE9iamVjdCB4ZG9jID0gZG93bmxvYWREb2N1bWVudChzdGF0ZS5nZXRTNFNMb2FkZXIoKSwgdGFyZ2V0TmFtZXNwYWNlLCBhYnNvbHV0ZVVSTCk7Ci0KLSAgICAgICAgICAgICAgICBTY2hlbWEgcmVzdWx0ID0gZmluZE1hdGNoQnlEaWdlc3QoeGRvYyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0bmFtZSA9IHN0YXRlLnJlbGF0aXZpemUoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIGV4YWN0bHktdGhlLXNhbWUgZG9jdW1lbnQgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQsIHVzZSB0aGUgb3JpZ2luYWwgYW5kIHNwZXcKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGR1cG5hbWUgPSBzdGF0ZS5yZWxhdGl2aXplKHJlc3VsdC5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5mbyhzaG9ydG5hbWUgKyAiIGlzIHRoZSBzYW1lIGFzICIgKyBkdXBuYW1lICsgIiAoaWdub3JpbmcgdGhlIGR1cGxpY2F0ZSBmaWxlKSIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbmZvKHNob3J0bmFtZSArICIgaXMgdGhlIHNhbWUgYXMgYW5vdGhlciBzY2hlbWEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCdzIGEgbmV3IGRvY3VtZW50OiB2YWxpZGF0ZSBpdCBhbmQgZ3JhYiB0aGUgY29udGVudHMKLSAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyB2b3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvcHRpb25zLnNldEVycm9yTGlzdGVuZXIoc3RhdGUuZ2V0RXJyb3JMaXN0ZW5lcigpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoeGRvYyBpbnN0YW5jZW9mIFNjaGVtYURvY3VtZW50KSB8fCAheGRvYy52YWxpZGF0ZSh2b3B0aW9ucykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZWZlcmVuY2VkIGRvY3VtZW50IGlzIG5vdCBhIHZhbGlkIHNjaGVtYSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvd25sb2FkOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgc0RvYyA9IChTY2hlbWFEb2N1bWVudCl4ZG9jOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNEb2MuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmluZm8oIkxvYWRpbmcgcmVmZXJlbmNlZCBmaWxlICIgKyBzaG9ydG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBOc0xvY1BhaXIga2V5ID0gbmV3IE5zTG9jUGFpcihlbXB0eVN0cmluZ0lmTnVsbChyZXN1bHQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpLCBhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgYWRkU3VjY2Vzc2Z1bERvd25sb2FkKGtleSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtYWxmb3JtZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlVSTCBcIiIgKyBhYnNvbHV0ZVVSTCArICJcIiBpcyBub3Qgd2VsbC1mb3JtZWQiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gY29ubmVjdGlvblByb2JsZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoY29ubmVjdGlvblByb2JsZW0udG9TdHJpbmcoKSwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJQcm9ibGVtIHBhcnNpbmcgcmVmZXJlbmNlZCBYTUwgcmVzb3VyY2UgLSAiICsgZS5nZXRNZXNzYWdlKCksIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVjb3JkIGZhaWx1cmUgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZG93bmxvYWQgdGhpcyBVUkwgYWdhaW4KLSAgICAgICAgICAgIGFkZEZhaWxlZERvd25sb2FkKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFhtbE9iamVjdCBkb3dubG9hZERvY3VtZW50KFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYWJzb2x1dGVVUkwpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gc3RhdGUuZ2V0RW50aXR5UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVFbnRpdHkobmFtZXNwYWNlLCBhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBwcmVmZXJlbmNlIGZvciBJbnB1dFNvdXJjZSBjb250cmFjdDogY2hhcmFjdGVyIHN0cmVhbQotICAgICAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBzb3VyY2UuZ2V0Q2hhcmFjdGVyU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXREb2N1bWVudFNvdXJjZU5hbWUoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLnBhcnNlKHJlYWRlciwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHNlY29uZCBwcmVmZXJlbmNlIGZvciBJbnB1dFNvdXJjZSBjb250cmFjdDogCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gYnl0ZXMgPSBzb3VyY2UuZ2V0Qnl0ZVN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlmIChieXRlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gc291cmNlLmdldEVuY29kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXREb2N1bWVudFNvdXJjZU5hbWUoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLnBhcnNlKGJ5dGVzLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdGhpcmQgcHJlZmVyZW5jZTogdXNlIHRoZSAocG9zc2libHkgcmVkaXJlY3RlZCkgdXJsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVybFRvTG9hZCA9IHNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgICAgICAgICAgIGlmICh1cmxUb0xvYWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFbnRpdHlSZXNvbHZlciB1bmFibGUgdG8gcmVzb2x2ZSAiICsgYWJzb2x1dGVVUkwgKyAiIChmb3IgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2UgKyAiKSIpOwotICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXREb2N1bWVudFNvdXJjZU5hbWUoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgICAgIFVSTCB1cmxEb3dubG9hZCA9IG5ldyBVUkwodXJsVG9Mb2FkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLnBhcnNlKHVybERvd25sb2FkLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbm8gcmVzb2x2ZXIgLSBqdXN0IHVzZSB0aGUgVVJMIGRpcmVjdGx5LCBubyBzdWJzdGl0dXRpb24KLSAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgVVJMIHVybERvd25sb2FkID0gbmV3IFVSTChhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICByZXR1cm4gbG9hZGVyLnBhcnNlKHVybERvd25sb2FkLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRTdWNjZXNzZnVsRG93bmxvYWQoTnNMb2NQYWlyIGtleSwgU2NoZW1hIHNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGRpZ2VzdCA9IHNjaGVtYS5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICAgICAgICBpZiAoZGlnZXN0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmFkZFNjaGVtYURpZ2VzdChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEaWdlc3RLZXkgZGsgPSBuZXcgRGlnZXN0S2V5KGRpZ2VzdCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFCeURpZ2VzdEtleS5jb250YWluc0tleShkaykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWFCeURpZ2VzdEtleS5wdXQobmV3IERpZ2VzdEtleShkaWdlc3QpLCBzY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuYWRkU2NoZW1hRGlnZXN0KGRpZ2VzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzY2hlbWFCeU5zTG9jUGFpci5wdXQoa2V5LCBzY2hlbWEpOwotICAgICAgICAgICAgTnNMb2NQYWlyIGtleTEgPSBuZXcgTnNMb2NQYWlyKGtleS5nZXROYW1lc3BhY2VVUkkoKSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoIXNjaGVtYUJ5TnNMb2NQYWlyLmNvbnRhaW5zS2V5KGtleTEpKQotICAgICAgICAgICAgICAgIHNjaGVtYUJ5TnNMb2NQYWlyLnB1dChrZXkxLCBzY2hlbWEpOwotICAgICAgICAgICAgTnNMb2NQYWlyIGtleTIgPSBuZXcgTnNMb2NQYWlyKG51bGwsIGtleS5nZXRMb2NhdGlvblVSTCgpKTsKLSAgICAgICAgICAgIGlmICghc2NoZW1hQnlOc0xvY1BhaXIuY29udGFpbnNLZXkoa2V5MikpCi0gICAgICAgICAgICAgICAgc2NoZW1hQnlOc0xvY1BhaXIucHV0KGtleTIsIHNjaGVtYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFNjaGVtYSBmaW5kTWF0Y2hCeURpZ2VzdChYbWxPYmplY3Qgb3JpZ2luYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBkaWdlc3QgPSBvcmlnaW5hbC5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICAgICAgICBpZiAoZGlnZXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYSlzY2hlbWFCeURpZ2VzdEtleS5nZXQobmV3IERpZ2VzdEtleShkaWdlc3QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRGYWlsZWREb3dubG9hZChTdHJpbmcgbG9jYXRpb25VUkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWxlZERvd25sb2Fkcy5hZGQobG9jYXRpb25VUkwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByZXZpb3VzbHlGYWlsZWRUb0Rvd25sb2FkKFN0cmluZyBsb2NhdGlvblVSTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhaWxlZERvd25sb2Fkcy5jb250YWlucyhsb2NhdGlvblVSTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG51bGxhYmxlU3RyaW5nc01hdGNoKFN0cmluZyBzMSwgU3RyaW5nIHMyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoczEgPT0gbnVsbCAmJiBzMiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gKHMxLmVxdWFscyhzMikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVtcHR5U3RyaW5nSWZOdWxsKFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZFNjYW5OZWVkZWQoU2NoZW1hVG9Qcm9jZXNzIHN0cCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzY2FubmVkQWxyZWFkeS5jb250YWlucyhzdHApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjYW5uZWRBbHJlYWR5LmFkZChzdHApOwotICAgICAgICAgICAgICAgIHNjYW5OZWVkZWQuYWRkKHN0cCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkRW1wdHlOYW1lc3BhY2VTY2hlbWEoU2NoZW1hIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtcHR5TmFtZXNwYWNlU2NoZW1hcy5hZGQocyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXNlZEVtcHR5TmFtZXNwYWNlU2NoZW1hKFNjaGVtYSBzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbXB0eU5hbWVzcGFjZVNjaGVtYXMucmVtb3ZlKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZldGNoUmVtYWluaW5nRW1wdHlOYW1lc3BhY2VTY2hlbWFzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVtcHR5TmFtZXNwYWNlU2NoZW1hcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbXB0eU5hbWVzcGFjZVNjaGVtYXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSAoU2NoZW1hKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhzY2hlbWEsIG51bGwsIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1wdHlOYW1lc3BhY2VTY2hlbWFzLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZXh0VG9TY2FuKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICFzY2FuTmVlZGVkLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2NoZW1hVG9Qcm9jZXNzIG5leHRUb1NjYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUb1Byb2Nlc3MgbmV4dCA9IChTY2hlbWFUb1Byb2Nlc3Mpc2Nhbk5lZWRlZC5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRG93bmxvYWRUYWJsZShTY2hlbWFbXSBzdGFydFdpdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhcnRXaXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzdGFydFdpdGhbaV0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgTnNMb2NQYWlyIGtleSA9IG5ldyBOc0xvY1BhaXIodGFyZ2V0TmFtZXNwYWNlLCBiYXNlVVJMRm9yRG9jKHN0YXJ0V2l0aFtpXSkpOwotICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NmdWxEb3dubG9hZChrZXksIHN0YXJ0V2l0aFtpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3Moc3RhcnRXaXRoW2ldLCBudWxsLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhZGRFbXB0eU5hbWVzcGFjZVNjaGVtYShzdGFydFdpdGhbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYVRvUHJvY2Vzc1tdIHJlc29sdmVJbXBvcnRzQW5kSW5jbHVkZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgLy8gYWxnb3JpdGhtIGlzIHRvIHNjYW4gdGhyb3VnaCBlYWNoIHNjaGVtYSBkb2N1bWVudCBhbmQKLSAgICAgICAgICAgIC8vIDEuIGRvd25sb2FkIGVhY2ggaW1wb3J0IGFuZCBpbmNsdWRlIChpZiBub3QgYWxyZWFkeSBkb3dubG9hZGVkKQotICAgICAgICAgICAgLy8gMi4gcXVldWUgZWFjaCBpbXBvcnRlZCBvciBpbmNsdWRlZCBzY2hlbWEgdG8gYmUgcHJvY2VzcyAoaWYgbm90IGFscmVhZHkgcXVldWVkKQotCi0gICAgICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIGlzIHJ1biB0d2ljZSB0d2ljZTogZmlyc3Qgd2UgYmVnaW4gd2l0aCBub24tZW1wdHkKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBzY2hlbWFzIG9ubHkuICBUaGVuIHdlIHJlcGVhdCBzdGFydGluZyB3aXRoIGFueQotICAgICAgICAgICAgLy8gZW1wdHkgZW1wdHktbmFtZXNwYWNlIHNjaGVtYXMgdGhhdCBoYXZlIE5PVCBiZWVuIGNoYW1lbGVvbi0KLSAgICAgICAgICAgIC8vIGluY2x1ZGVkIGJ5IG90aGVyIHNjaGVtYXMgYW5kIHByb2Nlc3MgdGhlbS4KLQotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaGFzTmV4dFRvU2NhbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVG9Qcm9jZXNzIHN0cCA9IG5leHRUb1NjYW4oKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuYWRkU291cmNlVXJpKHN0cC5nZXRTb3VyY2VOYW1lKCksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHN0cCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaW1wb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0W10gaW1wb3J0cyA9IHN0cC5nZXRTY2hlbWEoKS5nZXRJbXBvcnRBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYSBpbXBvcnRlZCA9IGRvd25sb2FkU2NoZW1hKGltcG9ydHNbaV0sIGVtcHR5U3RyaW5nSWZOdWxsKGltcG9ydHNbaV0uZ2V0TmFtZXNwYWNlKCkpLCBpbXBvcnRzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGRvd25sb2FkIGZhaWxzLCBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW51bGxhYmxlU3RyaW5nc01hdGNoKGltcG9ydGVkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBpbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW1wb3J0ZWQgc2NoZW1hIGhhcyBhIHRhcmdldCBuYW1lc3BhY2UgXCIiICsgaW1wb3J0ZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKyAiXCIgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgc3BlY2lmaWVkIFwiIiArIGltcG9ydHNbaV0uZ2V0TmFtZXNwYWNlKCkgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFLCBpbXBvcnRzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKGltcG9ydGVkLCBudWxsLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaW5jbHVkZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVbXSBpbmNsdWRlcyA9IHN0cC5nZXRTY2hlbWEoKS5nZXRJbmNsdWRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VOYW1lc3BhY2UgPSBzdHAuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlTmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZXNwYWNlID0gZW1wdHlTdHJpbmdJZk51bGwoc3RwLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hIGluY2x1ZGVkID0gZG93bmxvYWRTY2hlbWEoaW5jbHVkZXNbaV0sIG51bGwsIGluY2x1ZGVzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGRvd25sb2FkIGZhaWxzLCBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHlTdHJpbmdJZk51bGwoaW5jbHVkZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpLmVxdWFscyhzb3VyY2VOYW1lc3BhY2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWNoYW1lbGVvbiBjYXNlIC0ganVzdCBsaWtlIGFuIGltcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MoaW5jbHVkZWQsIG51bGwsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgaW5jbHVkZTogaW5jbHVkZWQgc2NoZW1hIGluIHdyb25nIG5hbWVzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbmNsdWRlZCBzY2hlbWEgaGFzIGEgdGFyZ2V0IG5hbWVzcGFjZSBcIiIgKyBpbmNsdWRlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSArICJcIiB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBzb3VyY2UgbmFtZXNwYWNlIFwiIiArIHNvdXJjZU5hbWVzcGFjZSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5NSVNNQVRDSEVEX1RBUkdFVF9OQU1FU1BBQ0UsIGluY2x1ZGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbWVsZW9uIGluY2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKGluY2x1ZGVkLCBzb3VyY2VOYW1lc3BhY2UsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEVtcHR5TmFtZXNwYWNlU2NoZW1hKGluY2x1ZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSByZWRlZmluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZGVmaW5lW10gcmVkZWZpbmVzID0gc3RwLmdldFNjaGVtYSgpLmdldFJlZGVmaW5lQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VOYW1lc3BhY2UgPSBzdHAuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlTmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZXNwYWNlID0gZW1wdHlTdHJpbmdJZk51bGwoc3RwLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVkZWZpbmVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYSByZWRlZmluZWQgPSBkb3dubG9hZFNjaGVtYShyZWRlZmluZXNbaV0sIG51bGwsIHJlZGVmaW5lc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3dubG9hZCBmYWlscywgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVkZWZpbmVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eVN0cmluZ0lmTnVsbChyZWRlZmluZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpLmVxdWFscyhzb3VyY2VOYW1lc3BhY2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWNoYW1lbGVvbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhyZWRlZmluZWQsIG51bGwsIHJlZGVmaW5lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWRlZmluZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgaW5jbHVkZTogaW5jbHVkZWQgc2NoZW1hIGluIHdyb25nIG5hbWVzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJSZWRlZmluZWQgc2NoZW1hIGhhcyBhIHRhcmdldCBuYW1lc3BhY2UgXCIiICsgcmVkZWZpbmVkLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIlwiIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNvdXJjZSBuYW1lc3BhY2UgXCIiICsgc291cmNlTmFtZXNwYWNlICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0Lk1JU01BVENIRURfVEFSR0VUX05BTUVTUEFDRSwgcmVkZWZpbmVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbWVsZW9uIHJlZGVmaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhyZWRlZmluZWQsIHNvdXJjZU5hbWVzcGFjZSwgcmVkZWZpbmVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRFbXB0eU5hbWVzcGFjZVNjaGVtYShyZWRlZmluZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZmV0Y2hSZW1haW5pbmdFbXB0eU5hbWVzcGFjZVNjaGVtYXMoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVG9Qcm9jZXNzW10pcmVzdWx0LnRvQXJyYXkobmV3IFNjaGVtYVRvUHJvY2Vzc1tyZXN1bHQuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NKYXZhaXplci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0phdmFpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTIwZDYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0phdmFpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OYW1lVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCeXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2hvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTdHNjSmF2YWl6ZXIKLXsKLSAgICAvKioKLSAgICAgKiBEb2VzIGEgdG9wbyB3YWxrIG9mIGFsbCB0aGUgdHlwZXMgdG8gcmVzb2x2ZSB0aGVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBqYXZhaXplQWxsVHlwZXMoYm9vbGVhbiBqYXZhaXplKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgLy8gRmlyc3QgZGlzdHJpYnV0ZSB0aGUgZ2xvYmFsIG5hbWVzIGFtb25nIHRoZSB0b3AgZW50aXRpZXMuCi0gICAgICAgIGlmIChqYXZhaXplKQotICAgICAgICAgICAgYXNzaWduR2xvYmFsSmF2YU5hbWVzKGFsbFNlZW5UeXBlcyk7Ci0KLSAgICAgICAgLy8gbm93IGZ1bGx5IGphdmFpemUgZXZlcnl0aGluZyBkZWVwbHkuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGdUeXBlID0gKFNjaGVtYVR5cGUpYWxsU2VlblR5cGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChqYXZhaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGphdmFpemVUeXBlKChTY2hlbWFUeXBlSW1wbClnVHlwZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdUeXBlLmdldEZ1bGxKYXZhTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuYWRkQ2xhc3NuYW1lKGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKSwgZ1R5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNraXBKYXZhaXppbmdUeXBlKChTY2hlbWFUeXBlSW1wbClnVHlwZSk7Ci0gICAgICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYXNzaWduR2xvYmFsSmF2YU5hbWVzKENvbGxlY3Rpb24gc2NoZW1hVHlwZXMpCi0gICAgewotICAgICAgICBIYXNoU2V0IHVzZWROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWFUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBzSW1wbCA9IChTY2hlbWFUeXBlSW1wbClpLm5leHQoKTsKLSAgICAgICAgICAgIFFOYW1lIHRvcE5hbWUgPSBmaW5kVG9wTmFtZShzSW1wbCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGlja2VkTmFtZSA9IHN0YXRlLmdldEphdmFuYW1lKHRvcE5hbWUpOwotICAgICAgICAgICAgaWYgKHNJbXBsLmlzVW5qYXZhaXplZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNJbXBsLnNldEZ1bGxKYXZhTmFtZShwaWNrRnVsbEphdmFDbGFzc05hbWUodXNlZE5hbWVzLCBmaW5kVG9wTmFtZShzSW1wbCksIHBpY2tlZE5hbWUsIHNJbXBsLmlzRG9jdW1lbnRUeXBlKCksIHNJbXBsLmlzQXR0cmlidXRlVHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RnVsbEphdmFJbXBsTmFtZShwaWNrRnVsbEphdmFJbXBsTmFtZSh1c2VkTmFtZXMsIHNJbXBsLmdldEZ1bGxKYXZhTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3RyaW5nVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpID09IFNjaGVtYVR5cGUuQlRDX1NUUklORyk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwaWNrQ29uc3RhbnROYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyB3b3JkcykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBiYXNlID0gTmFtZVV0aWwudXBwZXJDYXNlVW5kZXJiYXIod29yZHMpOwotCi0gICAgICAgIGlmIChiYXNlLmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UgPSAiWCI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZS5zdGFydHNXaXRoKCJJTlRfIikpIC8vIHJlc2VydmVkIGZvciBpbnQgY29kZXMKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9ICJYXyIgKyBiYXNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHVuaXFOYW1lOwotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBmb3IgKHVuaXFOYW1lID0gYmFzZTsgdXNlZE5hbWVzLmNvbnRhaW5zKHVuaXFOYW1lKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgdW5pcU5hbWUgPSBiYXNlICsgIl8iICsgaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1c2VkTmFtZXMuYWRkKHVuaXFOYW1lKTsKLQotICAgICAgICByZXR1cm4gdW5pcU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2tpcEphdmFpemluZ1R5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBpZiAoc0ltcGwuaXNKYXZhaXplZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgU2NoZW1hVHlwZUltcGwgYmFzZVR5cGUgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgICAgICBza2lwSmF2YWl6aW5nVHlwZShiYXNlVHlwZSk7Ci0gICAgICAgIAotICAgICAgICBzSW1wbC5zdGFydEphdmFpemluZygpOwotICAgICAgICBzZWNvbmRQYXNzUHJvY2Vzc1R5cGUoc0ltcGwpOwotICAgICAgICBzSW1wbC5maW5pc2hKYXZhaXppbmcoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZWNvbmRQYXNzUHJvY2Vzc1R5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBpZiAoaXNTdHJpbmdUeXBlKHNJbXBsKSkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIGVudW1WYWxzID0gc0ltcGwuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBlbnVtZXJhdGVkIHN0cmluZyB0eXBlLCB2YWx1ZXMgYXJlIHRvIGJlCi0gICAgICAgICAgICAvLyBqYXZhaXplZCBhcyBjb25zdGFudHMuCi0gICAgICAgICAgICBpZiAoZW51bVZhbHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBlbnRyeUFycmF5ID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeVtlbnVtVmFscy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgYmFzZWRPbiA9IHNJbXBsLmdldEJhc2VFbnVtVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlZE9uID09IHNJbXBsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0IHVzZWROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBlbnVtVmFsc1tpXS5nZXRTdHJpbmdWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUFycmF5W2ldID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwodmFsLCBpICsgMSwgcGlja0NvbnN0YW50TmFtZSh1c2VkTmFtZXMsIHZhbCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBlbnVtVmFsc1tpXS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlBcnJheVtpXSA9IGJhc2VkT24uZW51bUVudHJ5Rm9yU3RyaW5nKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0U3RyaW5nRW51bUVudHJpZXMoZW50cnlBcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBqYXZhaXplVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5pc0phdmFpemVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgYmFzZVR5cGUgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgICAgICBqYXZhaXplVHlwZShiYXNlVHlwZSk7Ci0KLSAgICAgICAgc0ltcGwuc3RhcnRKYXZhaXppbmcoKTsKLQotICAgICAgICBzSW1wbC5zZXRDb21waWxlZCh0cnVlKTsKLQotICAgICAgICBzZWNvbmRQYXNzUHJvY2Vzc1R5cGUoc0ltcGwpOwotCi0gICAgICAgIGlmICghc0ltcGwuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWx0UHJvcHMgPSBzSW1wbC5nZXRFbGVtZW50UHJvcGVydGllcygpOwotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBhdHRyUHJvcHMgPSBzSW1wbC5nZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgIC8vIGVsZW1lbnQgc2V0dGVycyByZXN1bHQgZnJvbSBhIGNvbXB1dGF0aW9uCi0gICAgICAgICAgICBpZiAoZWx0UHJvcHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICBhc3NpZ25KYXZhRWxlbWVudFNldHRlck1vZGVsKGVsdFByb3BzLCBzSW1wbC5nZXRDb250ZW50TW9kZWwoKSk7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRpbmcgb3V0IGphdmEgbmFtZXMgLSB0aGlzIHBlcm1pdHMgdXMgdG8gYXZvaWQgY29sbGlzaW9ucy4KLSAgICAgICAgICAgIFNldCB1c2VkUHJvcE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICAgICAgLy8gQXNzaWduIG5hbWVzIGluIHR3byBwYXNzZXM6IGZpcnN0IGluaGVyaXRlZCBuYW1lcywgdGhlbiBvdGhlcnMuCi0gICAgICAgICAgICBmb3IgKGJvb2xlYW4gZG9Jbmhlcml0ZWQgPSB0cnVlOyA7IGRvSW5oZXJpdGVkID0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsdFByb3BzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgIGFzc2lnbkphdmFQcm9wZXJ0eU5hbWVzKHVzZWRQcm9wTmFtZXMsIGVsdFByb3BzLCBiYXNlVHlwZSwgZG9Jbmhlcml0ZWQpOwotCi0gICAgICAgICAgICAgICAgYXNzaWduSmF2YVByb3BlcnR5TmFtZXModXNlZFByb3BOYW1lcywgYXR0clByb3BzLCBiYXNlVHlwZSwgZG9Jbmhlcml0ZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvSW5oZXJpdGVkID09IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBhbGxwcm9wcyA9IHNJbXBsLmdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3JkZXIgaW5zZW5zaXRpdmUKLSAgICAgICAgICAgIGJvb2xlYW4gaW5zZW5zaXRpdmUgPSBpc1Byb3BlcnR5TW9kZWxPcmRlckluc2Vuc2l0aXZlKGFsbHByb3BzKTsKLQotICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgamF2YSB0eXBlIGNvZGVzIG5vdy4KLSAgICAgICAgICAgIC8vIFRoaXMgZGVwZW5kcyBvbiByZWN1cnNpdmUgdHlwZSBpbmZvcm1hdGlvbiwgc28gaXQncyBkb25lIGluIHR5cGVjaGVja2luZwotICAgICAgICAgICAgYXNzaWduSmF2YVR5cGVDb2RlcyhhbGxwcm9wcyk7Ci0KLSAgICAgICAgICAgIHNJbXBsLnNldE9yZGVyU2Vuc2l0aXZlKCFpbnNlbnNpdGl2ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhc3NpZ24gamF2YSB0eXBlIG5hbWVzIHRvIGFub255bW91cyB0eXBlcwotICAgICAgICBhc3NpZ25KYXZhQW5vbnltb3VzVHlwZU5hbWVzKHNJbXBsKTsKLQotICAgICAgICBzSW1wbC5maW5pc2hKYXZhaXppbmcoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25KYXZhQW5vbnltb3VzVHlwZU5hbWVzKFNjaGVtYVR5cGVJbXBsIG91dGVyVHlwZSkKLSAgICB7Ci0gICAgICAgIFNldCB1c2VkVHlwZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2NoZW1hVHlwZVtdIGFub255bW91c1R5cGVzID0gb3V0ZXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICAvLyBCZWNhdXNlIHdlIGdlbmVyYXRlIG5lc3RlZCBqYXZhIGludGVyZmFjZXMsIGFuZCBuZXN0ZWQKLSAgICAgICAgLy8gaW50ZXJmYWNlIG5hbWVzIG11c3Qgbm90IGJlIHRoZSBzYW1lIGFzIGFuIGFuY2VzdG9yLCB1c2UgdXAKLSAgICAgICAgLy8gdGhlIGFuY2VzdG9ycwotCi0gICAgICAgIGZvciAoIFNjaGVtYVR5cGUgc2Nhbk91dGVyVHlwZSA9IG91dGVyVHlwZSA7Ci0gICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgIT0gbnVsbCA7Ci0gICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgPSBzY2FuT3V0ZXJUeXBlLmdldE91dGVyVHlwZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoIHNjYW5PdXRlclR5cGUuZ2V0U2hvcnRKYXZhTmFtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBTY2hlbWFUeXBlIHNjYW5PdXRlclR5cGUgPSBvdXRlclR5cGUgOwotICAgICAgICAgICAgICBzY2FuT3V0ZXJUeXBlICE9IG51bGwgOwotICAgICAgICAgICAgICBzY2FuT3V0ZXJUeXBlID0gc2Nhbk91dGVyVHlwZS5nZXRPdXRlclR5cGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzZWRUeXBlTmFtZXMuYWRkKCBzY2FuT3V0ZXJUeXBlLmdldFNob3J0SmF2YUltcGxOYW1lKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFuZCBiZWNhdXNlIHRoaW5ncyBhcmUgcHJvYmxlbWF0aWMgaWYgYW4gaW5uZXIgdHlwZSBuYW1lCi0gICAgICAgIC8vIGlzIHRoZSBzYW1lIGFzIGEgdG9wLWxldmVsIHBhY2thZ2UgbmFtZSwgYWxzbyBnZXQgcmlkIG9mIHRoYXQKLSAgICAgICAgLy8gY29sbGlzaW9uCi0gICAgICAgIHVzZWRUeXBlTmFtZXMuYWRkKGdldE91dGVybW9zdFBhY2thZ2Uob3V0ZXJUeXBlLmdldEZ1bGxKYXZhTmFtZSgpKSk7Ci0KLSAgICAgICAgLy8gYXNzaWduIG5hbWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5vbnltb3VzVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gKFNjaGVtYVR5cGVJbXBsKWFub255bW91c1R5cGVzW2ldOwotICAgICAgICAgICAgaWYgKHNJbXBsID09IG51bGwpIC8vIGFscmVhZHkgaGFuZGxlZCBpbiBmaXJzdCBwYXNzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YW5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICBTY2hlbWFGaWVsZCBjb250YWluZXJGaWVsZCA9IHNJbXBsLmdldENvbnRhaW5lckZpZWxkKCk7Ci0gICAgICAgICAgICBpZiAoY29udGFpbmVyRmllbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IHNJbXBsLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGxvY2FsbmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIGphdmFuYW1lID0gc3RhdGUuZ2V0SmF2YW5hbWUoc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vdCBkZWZpbmVkIGluc2lkZSBhbiBFbHQgb3IgQXR0cjogbXVzdCBiZSBhIG5lc3RlZCBzaW1wbGUgdHlwZQotICAgICAgICAgICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0T3V0ZXJUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgamF2YW5hbWUgPSAiTWVtYmVyIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgamF2YW5hbWUgPSAiSXRlbSI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJXZWlyZCB0eXBlICIgKyBzSW1wbC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YW5hbWUgPSAiQmFzZSI7IGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNJbXBsLnNldFNob3J0SmF2YU5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHBpY2tJbm5lckphdmFDbGFzc05hbWUodXNlZFR5cGVOYW1lcywgbG9jYWxuYW1lLCBqYXZhbmFtZSkpOwotICAgICAgICAgICAgc0ltcGwuc2V0U2hvcnRKYXZhSW1wbE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHBpY2tJbm5lckphdmFJbXBsTmFtZSh1c2VkVHlwZU5hbWVzLCBsb2NhbG5hbWUsIGphdmFuYW1lID09IG51bGwgPyBudWxsIDogamF2YW5hbWUgKyAiSW1wbCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gY29tcHV0ZSB0aGUgc2V0dGVyIG1vZGVsLgotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFsbCBRTmFtZXMgb2YgZWxlbWVudHMgdGhhdCBjb3VsZCBwb3NzaWJseSBiZQotICAgICAqIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gY29udGVudE1vZGVsLiBUaGUgc3RhdGUgdmFyaWFibGUgaXMgdXNlZAotICAgICAqIHRvIHJlY29yZCB0aGUgcmVzdWx0cywgc28gdGhhdCBpZiB0aGV5IGFyZSBuZWVkZWQgYWdhaW4gbGF0ZXIsCi0gICAgICogdGhleSBkbyBub3QgbmVlZCB0byBiZSByZWNvbXB1dGVkLgotICAgICAqLwotICAgIHN0YXRpYyBRTmFtZVNldCBjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsLCBNYXAgc3RhdGUpCi0gICAgewotICAgICAgICAvLyBSZW1lbWJlciBwcmV2aW91c2x5IGNvbXB1dGVkIHJlc3VsdHMgdG8gYXZvaWQgY29tcGxleGl0eSBleHBsb3Npb24KLSAgICAgICAgUU5hbWVTZXQgcmVzdWx0ID0gKFFOYW1lU2V0KXN0YXRlLmdldChjb250ZW50TW9kZWwpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIFFOYW1lU2V0QnVpbGRlciBidWlsZGVyOwotCi0gICAgICAgIHN3aXRjaCAoY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbChjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSksIHN0YXRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJ1aWxkZXIudG9RTmFtZVNldCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRlbnRNb2RlbC5nZXRXaWxkY2FyZFNldCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gUU5hbWVTZXQuc2luZ2xldG9uKGNvbnRlbnRNb2RlbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnB1dChjb250ZW50TW9kZWwsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBjb21wdXRlIHNldHRlciBtb2RlbC4KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIFFOYW1lU2V0IG9mIGFsbCBlbGVtZW50cyB0aGF0IGNhbiBwb3NzaWJseSBjb21lIGJlZm9yZSBhbgotICAgICAqIGVsZW1lbnQgd2hvc2UgbmFtZSBpcyBnaXZlbiBieSB0aGUgdGFyZ2V0IGluIGEgdmFsaWQgaW5zdGFuY2Ugb2YgdGhlCi0gICAgICogY29udGVudE1vZGVsLiAgV2hlbiBhcHBlbmRpbmcgYW4gZWxlbWVudCwgaXQgY29tZXMgYmVmb3JlIHRoZSBmaXJzdAotICAgICAqIG9uZSB0aGF0IGlzIG5vdCBpbiB0aGlzIHNldC4KLSAgICAgKi8KLSAgICBzdGF0aWMgUU5hbWVTZXQgY29tcHV0ZU5vbmRlbGltaXRpbmdFbGVtZW50cyhRTmFtZSB0YXJnZXQsIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCwgTWFwIHN0YXRlKQotICAgIHsKLSAgICAgICAgUU5hbWVTZXQgYWxsQ29udGVudHMgPSBjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoY29udGVudE1vZGVsLCBzdGF0ZSk7Ci0gICAgICAgIGlmICghYWxsQ29udGVudHMuY29udGFpbnModGFyZ2V0KSkKLSAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5FTVBUWTsKLQotICAgICAgICAvLyBJZiBpdGVyYXRlZCwgdGhlbiBhbGwgY29udGVudHMgYXJlIGRlbGltaXRpbmcuCi0gICAgICAgIGlmIChjb250ZW50TW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgY29udGVudE1vZGVsLmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGFsbENvbnRlbnRzOwotCi0gICAgICAgIFFOYW1lU2V0QnVpbGRlciBidWlsZGVyOwotCi0gICAgICAgIHN3aXRjaCAoY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsbENvbnRlbnRzOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5zaW5nbGV0b24odGFyZ2V0KTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBjaGlsZENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZENvbnRlbnRzLmNvbnRhaW5zKHRhcmdldCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbChjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKHRhcmdldCwgY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSksIHN0YXRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvUU5hbWVTZXQoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VlblRhcmdldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb250ZW50TW9kZWwuY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsgaSA+IDA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgY2hpbGRDb250ZW50cyA9IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VlblRhcmdldCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRBbGwoY2hpbGRDb250ZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGRDb250ZW50cy5jb250YWlucyh0YXJnZXQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbChjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSksIHN0YXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuVGFyZ2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1FOYW1lU2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25KYXZhRWxlbWVudFNldHRlck1vZGVsKFNjaGVtYVByb3BlcnR5W10gZWx0UHJvcHMsIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCkKLSAgICB7Ci0gICAgICAgIC8vIFRvIGNvbXB1dGUgdGhlIGVsZW1lbnQgc2V0dGVyIG1vZGVsLCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlCi0gICAgICAgIC8vIGRlbGltaXRpbmcgZWxlbWVudHMgZm9yIGVhY2ggZWxlbWVudC4KLQotICAgICAgICBNYXAgc3RhdGUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBRTmFtZVNldCBhbGxDb250ZW50cyA9IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwsIHN0YXRlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsdFByb3BzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc0ltcGwgPSAoU2NoZW1hUHJvcGVydHlJbXBsKWVsdFByb3BzW2ldOwotICAgICAgICAgICAgUU5hbWVTZXQgbmRlID0gY29tcHV0ZU5vbmRlbGltaXRpbmdFbGVtZW50cyhzSW1wbC5nZXROYW1lKCksIGNvbnRlbnRNb2RlbCwgc3RhdGUpOwotICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGFsbENvbnRlbnRzKTsKLSAgICAgICAgICAgIGJ1aWxkZXIucmVtb3ZlQWxsKG5kZSk7Ci0gICAgICAgICAgICBzSW1wbC5zZXRKYXZhU2V0dGVyRGVsaW1pdGVyKGJ1aWxkZXIudG9RTmFtZVNldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFQcm9wZXJ0eU5hbWVzKFNldCB1c2VkTmFtZXMsIFNjaGVtYVByb3BlcnR5W10gcHJvcHMsIFNjaGVtYVR5cGUgYmFzZVR5cGUsIGJvb2xlYW4gZG9Jbmhlcml0ZWQpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgLy8gdHdvIHBhc3NlczogZmlyc3QgZGVhbCB3aXRoIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCB0aGVuIHdpdGggbmV3IG9uZXMuCi0gICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHdlIG1hdGNoIHVwIHdpdGggYmFzZSBjbGFzcyBkZWZpbml0aW9ucyBjbGVhbmx5Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNJbXBsID0gKFNjaGVtYVByb3BlcnR5SW1wbClwcm9wc1tpXTsKLQotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgYmFzZVByb3AgPQotICAgICAgICAgICAgICAgKHNJbXBsLmlzQXR0cmlidXRlKCkgPwotICAgICAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShzSW1wbC5nZXROYW1lKCkpIDoKLSAgICAgICAgICAgICAgICAgICAgYmFzZVR5cGUuZ2V0RWxlbWVudFByb3BlcnR5KHNJbXBsLmdldE5hbWUoKSkpOwotCi0gICAgICAgICAgICBpZiAoKGJhc2VQcm9wICE9IG51bGwpICE9IGRvSW5oZXJpdGVkKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBRTmFtZSBwcm9wUU5hbWUgPSBzSW1wbC5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0aGVOYW1lOwotCi0gICAgICAgICAgICBpZiAoYmFzZVByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGVOYW1lID0gcGlja0phdmFQcm9wZXJ0eU5hbWUodXNlZE5hbWVzLCBwcm9wUU5hbWUuZ2V0TG9jYWxQYXJ0KCksIHN0YXRlLmdldEphdmFuYW1lKHByb3BRTmFtZSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoZU5hbWUgPSBiYXNlUHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KCF1c2VkTmFtZXMuY29udGFpbnModGhlTmFtZSkpOwotICAgICAgICAgICAgICAgIHVzZWROYW1lcy5hZGQodGhlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNJbXBsLnNldEphdmFQcm9wZXJ0eU5hbWUodGhlTmFtZSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSA9IChzSW1wbC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgc0ltcGwuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApOwotICAgICAgICAgICAgYm9vbGVhbiBpc1NpbmdsZXRvbiA9ICFpc0FycmF5ICYmIChzSW1wbC5nZXRNYXhPY2N1cnMoKS5zaWdudW0oKSA+IDApOwotICAgICAgICAgICAgYm9vbGVhbiBpc09wdGlvbiA9IGlzU2luZ2xldG9uICYmIChzSW1wbC5nZXRNaW5PY2N1cnMoKS5zaWdudW0oKSA9PSAwKTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgamF2YUJhc2VkT25UeXBlID0gc0ltcGwuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoYmFzZVByb3AgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVByb3AuZXh0ZW5kc0phdmFBcnJheSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNTaW5nbGV0b24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaXNPcHRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNTaW5nbGV0b24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYmFzZVByb3AuZXh0ZW5kc0phdmFPcHRpb24oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzT3B0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YUJhc2VkT25UeXBlID0gYmFzZVByb3AuamF2YUJhc2VkT25UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNJbXBsLnNldEV4dGVuZHNKYXZhKGphdmFCYXNlZE9uVHlwZS5nZXRSZWYoKSwgaXNTaW5nbGV0b24sIGlzT3B0aW9uLCBpc0FycmF5KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYXNzaWduSmF2YVR5cGVDb2RlcyhTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzSW1wbCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpcHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBzSW1wbC5qYXZhQmFzZWRPblR5cGUoKTsKLSAgICAgICAgICAgIHNJbXBsLnNldEphdmFUeXBlQ29kZShqYXZhVHlwZUNvZGVGb3JUeXBlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGphdmFUeXBlQ29kZUluQ29tbW9uKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlcyA9PSBudWxsIHx8IHR5cGVzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q7Ci0KLSAgICAgICAgaW50IGNvZGUgPSBqYXZhVHlwZUNvZGVGb3JUeXBlKHR5cGVzWzBdKTsKLSAgICAgICAgaWYgKGNvZGUgPT0gU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1QpCi0gICAgICAgICAgICByZXR1cm4gY29kZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgYW55IHR3byBhcmUgZGlmZmVyZW50LCB0aGUgYW5zd2VyIGlzIGphdmEubGFuZy5PYmplY3QKLSAgICAgICAgICAgIGlmIChjb2RlICE9IGphdmFUeXBlQ29kZUZvclR5cGUodHlwZXNbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29kZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGphdmFUeXBlQ29kZUZvclR5cGUoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICghc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhbiBpbnRlcmVzdGluZyBjb21tb24gYmFzZSB0eXBlLCBlLmcuLCBmb3Igc3RyaW5nIGVudW1zCi0gICAgICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlID0gc1R5cGUuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOwotICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgIWJhc2VUeXBlLmlzVVJUeXBlKCkpCi0gICAgICAgICAgICAgICAgc1R5cGUgPSBiYXNlVHlwZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YVR5cGVDb2RlSW5Db21tb24oc1R5cGUuZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOwotCi0gICAgICAgIGlmIChzVHlwZS5pc1VSVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q7Ci0KLSAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldERlY2ltYWxTaXplKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CWVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZ1R5cGUoc1R5cGUuZ2V0QmFzZUVudW1UeXBlKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOwotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT047Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU7IC8vIGNvbnZlcnRlZCB0byBjYWxlbmRhcgotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU7IC8vIGNvbnZlcnRlZCB0byBjYWxlbmRhciAoSkFYLUIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJ1bnJlY29nbml6ZWQgY29kZSAiICsgc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVucmVjb2duaXplZCBjb2RlICIgKyBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgKyAiIG9mICIgKyBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzUHJvcGVydHlNb2RlbE9yZGVySW5zZW5zaXRpdmUoU2NoZW1hUHJvcGVydHlbXSBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgIGlmIChwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKHByb3AuaGFzRGVmYXVsdCgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSICYmCi0gICAgICAgICAgICAgICAgcHJvcC5nZXREZWZhdWx0VGV4dCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHByb3RlY3RSZXNlcnZlZEdsb2JhbENsYXNzTmFtZXMoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gbmFtZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICBpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoIkRvY3VtZW50IikgJiYgIWxhc3RTZWdtZW50LmVxdWFscygiRG9jdW1lbnQiKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gcHJvdGVjdFJlc2VydmVkSW5uZXJDbGFzc05hbWVzKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuYW1lLmVxdWFscygiRW51bSIpIHx8IG5hbWUuZXF1YWxzKCJGYWN0b3J5IikpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBQUk9URUNURURfUFJPUEVSVElFUyA9IHsKLSAgICAgICAgIlN0cmluZ1ZhbHVlIiwKLSAgICAgICAgIkJvb2xlYW5WYWx1ZSIsCi0gICAgICAgICJCeXRlVmFsdWUiLAotICAgICAgICAiU2hvcnRWYWx1ZSIsCi0gICAgICAgICJJbnRWYWx1ZSIsCi0gICAgICAgICJMb25nVmFsdWUiLAotICAgICAgICAiQmlnSW50ZWdlclZhbHVlIiwKLSAgICAgICAgIkJpZ0RlY2ltYWxWYWx1ZSIsCi0gICAgICAgICJGbG9hdFZhbHVlIiwKLSAgICAgICAgIkRvdWJsZVZhbHVlIiwKLSAgICAgICAgIkJ5dGVBcnJheVZhbHVlIiwKLSAgICAgICAgIkVudW1WYWx1ZSIsCi0gICAgICAgICJDYWxlbmRhclZhbHVlIiwKLSAgICAgICAgIkRhdGVWYWx1ZSIsCi0gICAgICAgICJHRGF0ZVZhbHVlIiwKLSAgICAgICAgIkdEdXJhdGlvblZhbHVlIiwKLSAgICAgICAgIlFOYW1lVmFsdWUiLAotICAgICAgICAiTGlzdFZhbHVlIiwKLSAgICAgICAgIk9iamVjdFZhbHVlIiwKLSAgICAgICAgIkNsYXNzIiwKLSAgICB9OwotICAgIHN0YXRpYyBTZXQgUFJPVEVDVEVEX1BST1BFUlRJRVNfU0VUID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChQUk9URUNURURfUFJPUEVSVElFUykpOwotCi0gICAgc3RhdGljIGJvb2xlYW4gcHJvdGVjdFJlc2VydmVkUHJvcGVydHlOYW1lcyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQUk9URUNURURfUFJPUEVSVElFU19TRVQuY29udGFpbnMobmFtZSkgfHwKLSAgICAgICAgICAgIChuYW1lLmVuZHNXaXRoKCJBcnJheSIpICYmICFuYW1lLmVxdWFscygiQXJyYXkiKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwaWNrRnVsbEphdmFDbGFzc05hbWUoU2V0IHVzZWROYW1lcywgUU5hbWUgcU5hbWUsIFN0cmluZyBjb25maWduYW1lLCBib29sZWFuIGlzRG9jdW1lbnQsIGJvb2xlYW4gaXNBdHRyVHlwZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBiYXNlOwotICAgICAgICBib29sZWFuIHByb3RlY3Q7Ci0KLSAgICAgICAgaWYgKGNvbmZpZ25hbWUgIT0gbnVsbCAmJiBjb25maWduYW1lLmluZGV4T2YoJy4nKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhIGNvbmZpZ25hbWUgd2l0aCBkb3RzIGRlZmluZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBqYXZhIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIGJhc2UgPSBjb25maWduYW1lOwotICAgICAgICAgICAgcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZEdsb2JhbENsYXNzTmFtZXMoYmFzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgIGJhc2UgPSBOYW1lVXRpbC5nZXRDbGFzc05hbWVGcm9tUU5hbWUocU5hbWUpOwotCi0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIG1hcHBpbmcgZnJvbSBuYW1lc3BhY2UgVVJJIHRvIEphdmEgcGFja2FnZQotICAgICAgICAgICAgLy8gbmFtZS4gSWYgc28sIGFwcGx5IHRoZSBtYXBwZWQgcGFja2FnZSBwcmVmaXggYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICAgICAgICAgLy8gdGhlIGJhc2UgbmFtZQotCi0gICAgICAgICAgICBTdHJpbmcgcGtnUHJlZml4ID0gc3RhdGUuZ2V0UGFja2FnZU92ZXJyaWRlKHVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChwa2dQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBGb3JtIHRoZSBuZXcgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZnJvbSB0aGUgbmV3IHBhY2thZ2UgbmFtZQotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgb2xkIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICBiYXNlID0gcGtnUHJlZml4ICsgIi4iICsgYmFzZS5zdWJzdHJpbmcoYmFzZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHByZWZpeC4uLgotICAgICAgICAgICAgU3RyaW5nIGphdmFQcmVmaXggPSBzdGF0ZS5nZXRKYXZhUHJlZml4KHVyaSk7Ci0gICAgICAgICAgICBpZiAoamF2YVByZWZpeCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKSArIGphdmFQcmVmaXggKyBiYXNlLnN1YnN0cmluZyhiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQotICAgICAgICAgICAgLy8gYSBjb25maWduYW1lIHdpdGhvdXQgZG90cyBtYXkgb3ZlcnJpZGUgdGhlIHNob3J0bmFtZSBwYXJ0LgotICAgICAgICAgICAgaWYgKGNvbmZpZ25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlID0gYmFzZS5zdWJzdHJpbmcoMCwgYmFzZS5sYXN0SW5kZXhPZignLicpICsgMSkgKyBjb25maWduYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ID0gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhiYXNlKTsKLSAgICAgICAgICAgIGlmIChjb25maWduYW1lID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIHNwZWNpYWwgc3VmZml4Ci0gICAgICAgICAgICAgICAgaWYgKGlzRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlICsgIkRvY3VtZW50IjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0F0dHJUeXBlKQotICAgICAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArICJBdHRyaWJ1dGUiOwotCi0gICAgICAgICAgICAgICAgLy8gYWRkIGNvbmZpZ3VyZWQgc3VmZml4Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGphdmFTdWZmaXggPSBzdGF0ZS5nZXRKYXZhU3VmZml4KHVyaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFTdWZmaXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgKyBqYXZhU3VmZml4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG91dGVybW9zdFBrZyA9IGdldE91dGVybW9zdFBhY2thZ2UoYmFzZSk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgU3RyaW5nIHVuaXFOYW1lOwotICAgICAgICBpZiAocHJvdGVjdCkKLSAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZSArIGluZGV4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2U7Ci0gICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUudG9Mb3dlckNhc2UoKSkgfHwgdW5pcU5hbWUuZXF1YWxzKG91dGVybW9zdFBrZykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHVuaXFOYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3V0ZXJtb3N0UGFja2FnZShTdHJpbmcgZnFjbikKLSAgICB7Ci0gICAgICAgIGlmIChmcWNuID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIGNsYXNzIG5hbWUKLSAgICAgICAgaW50IGxhc3Rkb3QgPSBmcWNuLmluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKGxhc3Rkb3QgPCAwKQotICAgICAgICAgICAgcmV0dXJuICIiOwotCi0gICAgICAgIC8vIHJlbW92ZSBvdXRlciBwYWNrYWdlIG5hbWVzCi0gICAgICAgIHJldHVybiBmcWNuLnN1YnN0cmluZygwLCBsYXN0ZG90KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tGdWxsSmF2YUltcGxOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBpbnRmTmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgcGFja2FnZSBmcm9tIHRoZSBjbGFzcyBuYW1lIHNvIHdlIGNhbiByZXBsYWNlIGl0Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBpbnRmTmFtZTsKLSAgICAgICAgU3RyaW5nIHBrZ05hbWUgPSBudWxsOwotICAgICAgICBpbnQgaW5kZXggPSBpbnRmTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gaW50Zk5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICBwa2dOYW1lID0gaW50Zk5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZvcm0gdGhlIG5ldyBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmcm9tIHRoZSBuZXcgcGFja2FnZSBuYW1lCi0gICAgICAgIC8vIGFuZCB0aGUgb2xkIGNsYXNzIG5hbWUKLSAgICAgICAgU3RyaW5nIGJhc2UgPSBwa2dOYW1lICsgIi5pbXBsLiIgKyBjbGFzc05hbWUgKyAiSW1wbCI7Ci0KLSAgICAgICAgaW5kZXggPSAxOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWUgPSBiYXNlOwotICAgICAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHVuaXFOYW1lLnRvTG93ZXJDYXNlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgdW5pcU5hbWUgPSBiYXNlICsgaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1c2VkTmFtZXMuYWRkKHVuaXFOYW1lLnRvTG93ZXJDYXNlKCkpOwotCi0gICAgICAgIHJldHVybiB1bmlxTmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tKYXZhUHJvcGVydHlOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBqYXZhTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChqYXZhTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgamF2YU5hbWUgPSBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShsb2NhbE5hbWUpOwotICAgICAgICBib29sZWFuIHByb3RlY3QgPSBwcm90ZWN0UmVzZXJ2ZWRQcm9wZXJ0eU5hbWVzKGphdmFOYW1lKTsKLSAgICAgICAgU3RyaW5nIHVuaXFOYW1lOwotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBpZiAocHJvdGVjdCkKLSAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWUgKyBpbmRleDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZTsKLSAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1c2VkTmFtZXMuYWRkKHVuaXFOYW1lKTsKLQotICAgICAgICByZXR1cm4gdW5pcU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwaWNrSW5uZXJKYXZhQ2xhc3NOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBqYXZhTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChqYXZhTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgamF2YU5hbWUgPSBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShsb2NhbE5hbWUpOwotICAgICAgICBib29sZWFuIHByb3RlY3QgPSBwcm90ZWN0UmVzZXJ2ZWRJbm5lckNsYXNzTmFtZXMoamF2YU5hbWUpOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGlmIChwcm90ZWN0KQotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lOwotICAgICAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHVuaXFOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWUgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOwotCi0gICAgICAgIHJldHVybiB1bmlxTmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tJbm5lckphdmFJbXBsTmFtZShTZXQgdXNlZE5hbWVzLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgamF2YU5hbWUpCi0gICAgewotICAgICAgICBpZiAoamF2YU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGphdmFOYW1lID0gTmFtZVV0aWwudXBwZXJDYW1lbENhc2UobG9jYWxOYW1lKSArICJJbXBsIjsKLSAgICAgICAgU3RyaW5nIHVuaXFOYW1lID0gamF2YU5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHVuaXFOYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBRTmFtZSBmaW5kVG9wTmFtZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHNUeXBlLmdldE5hbWUoKTsKLQotICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQSBkb2N1bWVudCB0eXBlIG11c3QgaGF2ZSBhIGNvbnRlbnQgbW9kZWwgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBlbHQKLSAgICAgICAgICAgIGlmIChzVHlwZS5nZXRDb250ZW50TW9kZWwoKSA9PSBudWxsIHx8IHNUeXBlLmdldENvbnRlbnRNb2RlbCgpLmdldFBhcnRpY2xlVHlwZSgpICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIChzVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1R5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKSA9PSBudWxsIHx8IHNUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkuZ2V0QXR0cmlidXRlcygpLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBzVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hRmllbGQgc0VsdCA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCk7Ci0gICAgICAgIGFzc2VydChzRWx0ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoc1R5cGUuZ2V0T3V0ZXJUeXBlKCkgPT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiBzRWx0LmdldE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjMxYjAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsRWxlbWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsQXR0cmlidXRlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5LZXlyZWZEb2N1bWVudC5LZXlyZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFN0c2NSZXNvbHZlcgotewotICAgIC8qKgotICAgICAqIERvZXMgYSB0b3BvIHdhbGsgb2YgYWxsIHRoZSB0eXBlcyB0byByZXNvbHZlIHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVBbGwoKQotICAgIHsKLSAgICAgICAgLy8gcmVzb2x2ZSB0cmVlIG9mIHR5cGVzCi0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcyA9IHN0YXRlLmRvY3VtZW50VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZG9jdW1lbnRUeXBlcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICByZXNvbHZlU3Vic3RpdHV0aW9uR3JvdXAoKFNjaGVtYVR5cGVJbXBsKWRvY3VtZW50VHlwZXNbaV0pOwotCi0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5yZWRlZmluZWRHbG9iYWxUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgcmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNvbHZlIGFsbCBrZXlyZWYgcmVmcwotICAgICAgICByZXNvbHZlSWRlbnRpdHlDb25zdHJhaW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXNvbHZlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5pc1Jlc29sdmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKHNJbXBsLmlzUmVzb2x2aW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZXJyb3IiLCBYbWxFcnJvckNvbnRleHQuQ1lDTElDX0RFUEVOREVOQ1ksIHNJbXBsLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjeWNsaWMgZGVwZW5kZW5jeSBlcnJvcgotICAgICAgICB9Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2aW5nICIgKyBzSW1wbCk7Ci0KLSAgICAgICAgc0ltcGwuc3RhcnRSZXNvbHZpbmcoKTsKLQotICAgICAgICBpZiAoc0ltcGwuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgIHJlc29sdmVEb2N1bWVudFR5cGUoc0ltcGwpOwotICAgICAgICBlbHNlIGlmIChzSW1wbC5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIHJlc29sdmVBdHRyaWJ1dGVUeXBlKHNJbXBsKTsKLSAgICAgICAgZWxzZSBpZiAoc0ltcGwuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIucmVzb2x2ZUNvbXBsZXhUeXBlKHNJbXBsKTsKLQotICAgICAgICBzSW1wbC5maW5pc2hSZXNvbHZpbmcoKTsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCByZXNvbHZpbmcgIiArIHNJbXBsKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzSW1wbC5pc0RvY3VtZW50VHlwZSgpOwotCi0gICAgICAgIGlmIChzSW1wbC5pc1NHUmVzb2x2ZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoc0ltcGwuaXNTR1Jlc29sdmluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkN5Y2xpYyBkZXBlbmRlbmN5IGVycm9yIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBzSW1wbC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY3ljbGljIGRlcGVuZGVuY3kgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnN0YXJ0UmVzb2x2aW5nU0dzKCk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSBzdWJzdGl0dXRpb24gZ3JvdXAKLQotICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWx0ID0gKFRvcExldmVsRWxlbWVudClzSW1wbC5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzdWJzdGl0dXRpb25Hcm91cCA9IG51bGw7Ci0gICAgICAgIFFOYW1lIGVsdE5hbWUgPSBuZXcgUU5hbWUoc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGVsdC5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIEJVRzogSG93IGRvIEkgdGVsbCBpZiB0aGUgdHlwZSBpcyBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQ/Ci0gICAgICAgIGlmIChlbHQuaXNTZXRTdWJzdGl0dXRpb25Hcm91cCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IFN0c2NTdGF0ZS5nZXQoKS5maW5kRG9jdW1lbnRUeXBlKGVsdC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCAKLSAgICAgICAgICAgICAgICBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5ub3RGb3VuZEVycm9yKGVsdC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5ELCBlbHQueGdldFN1YnN0aXR1dGlvbkdyb3VwKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IC0gaWdub3JlIHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAgICAgZWxzZSBpZiAoISByZXNvbHZlU3Vic3RpdHV0aW9uR3JvdXAoc3Vic3RpdHV0aW9uR3JvdXApICkKLSAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc0ltcGwuc2V0U3Vic3RpdHV0aW9uR3JvdXAoZWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FsayB1cCB0aGUgY2hhaW4gb2Ygc3VidGl0dXRpb24gZ3JvdXBzIGFkZGluZyB0aGlzIHNjaGVtYXR5cGUgdG8gZWFjaCBoZWFkJ3MKLSAgICAgICAgLy8gbWVtYmVyIGxpc3QKLSAgICAgICAgd2hpbGUgKHN1YnN0aXR1dGlvbkdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoZWx0TmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gU3RzY1N0YXRlLmdldCgpLmZpbmREb2N1bWVudFR5cGUoCi0gICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotCi0gICAgICAgICAgICBhc3NlcnQgc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCA6ICJDb3VsZCBub3QgZmluZCBkb2N1bWVudCB0eXBlIGZvcjogIiArIHN1YnN0aXR1dGlvbkdyb3VwLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0KLSAgICAgICAgICAgIGlmICghIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCkgKQotICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbnVsbDsgLy8gY3ljbGljIGRlcGVuZGVuY3kgLSBubyBzdWJzdCBncm91cAotCi0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5maW5pc2hSZXNvbHZpbmdTR3MoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZURvY3VtZW50VHlwZSAoIFNjaGVtYVR5cGVJbXBsIHNJbXBsICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzSW1wbC5pc1Jlc29sdmluZygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzRG9jdW1lbnRUeXBlKCk7Ci0gICAgICAgIAotCi0gICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgZ2xvYmFsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQgdHlwZQotICAgICAgICAvLyBhbmQgY29uc3RydWN0IGEgY29udGVudCBtb2RlbCB3aGljaCBhbGxvd3MganVzdCB0aGF0IGVsZW1lbnQKLSAgICAgICAgCi0gICAgICAgIExpc3QgYW5vblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGVsZW1lbnQgPQotICAgICAgICAgICAgKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKQotICAgICAgICAgICAgICAgIFN0c2NUcmFuc2xhdG9yLnRyYW5zbGF0ZUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBzSW1wbC5nZXRQYXJzZU9iamVjdCgpLAotICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuaXNDaGFtZWxlb24oKSwKLSAgICAgICAgICAgICAgICAgICAgYW5vblR5cGVzLCBzSW1wbCApOwotCi0gICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgY29udGVudE1vZGVsID0gbnVsbDsKLQotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuYWRkR2xvYmFsRWxlbWVudCggZWxlbWVudCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFBhcnRpY2xlVHlwZSggU2NoZW1hUGFydGljbGUuRUxFTUVOVCApOwotICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuY29weUdsb2JhbEVsZW1lbnRUb0xvY2FsRWxlbWVudCggZWxlbWVudCwgY29udGVudE1vZGVsICk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0TWluT2NjdXJzKCBCaWdJbnRlZ2VyLk9ORSApOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1heE9jY3VycyggQmlnSW50ZWdlci5PTkUgKTsKLQotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFRyYW5zaXRpb25Ob3RlcyhRTmFtZVNldC5FTVBUWSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPQotICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoCi0gICAgICAgICAgICAgICAgY29udGVudE1vZGVsLCBzSW1wbCApOwotCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VUeXBlID0gc0ltcGwuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSA9PSBudWxsID8KLSAgICAgICAgICAgIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFIDoKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5maW5kRG9jdW1lbnRUeXBlKHNJbXBsLmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIAotICAgICAgICAgICAgICAgICBzSW1wbC5pc0NoYW1lbGVvbigpID8gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgOiBudWxsKQotICAgICAgICAgICAgOwotCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKCBiYXNlVHlwZS5nZXRSZWYoKSApOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoIGJhc2VUeXBlLmdldEJhc2VEZXB0aCgpICsgMSApOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZSggU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiApOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UICk7Ci0KLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKAotICAgICAgICAgICAgY29udGVudE1vZGVsLCBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCksCi0gICAgICAgICAgICBlbGVtZW50UHJvcGVydHlNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KAotICAgICAgICAgICAgUU5hbWVTZXQuRU1QVFksIGZhbHNlLCBRTmFtZVNldC5FTVBUWSwgZmFsc2UgKTsKLQotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyggbWFrZVJlZkFycmF5KCBhbm9uVHlwZXMgKSApOwotCi0KLQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUF0dHJpYnV0ZVR5cGUgKCBTY2hlbWFUeXBlSW1wbCBzSW1wbCApCi0gICAgewotICAgICAgICBhc3NlcnQgc0ltcGwuaXNSZXNvbHZpbmcoKTsKLQotICAgICAgICBhc3NlcnQgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGFub25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCkgU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIChBdHRyaWJ1dGUpIHNJbXBsLmdldFBhcnNlT2JqZWN0KCksIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgIHNJbXBsLmlzQ2hhbWVsZW9uKCksIGFub25UeXBlcywgc0ltcGwsIG51bGwsIGZhbHNlICk7Ci0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJpYnV0ZU1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmFkZEdsb2JhbEF0dHJpYnV0ZSggYXR0cmlidXRlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCBhdHRyaWJ1dGVDb3B5ID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOwotICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuY29weUdsb2JhbEF0dHJpYnV0ZVRvTG9jYWxBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgYXR0cmlidXRlQ29weSApOwotICAgICAgICAgICAgYXR0cmlidXRlTW9kZWwuYWRkQXR0cmlidXRlKCBhdHRyaWJ1dGVDb3B5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZiggQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUuZ2V0UmVmKCkgKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCBzSW1wbC5nZXRCYXNlRGVwdGgoKSArIDEgKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoIFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04gKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KCBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgKTsKLSAgICAgICAgCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0KLSAgICAgICAgICAgIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLmJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlTW9kZWwsIHNJbXBsICk7Ci0KLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKAotICAgICAgICAgICAgbnVsbCwgYXR0cmlidXRlTW9kZWwsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgZmFsc2UgKTsKLQotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoCi0gICAgICAgICAgICBRTmFtZVNldC5FTVBUWSwgZmFsc2UsIFFOYW1lU2V0LkVNUFRZLCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMoIG1ha2VSZWZBcnJheSggYW5vblR5cGVzICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZS5SZWZbXSBtYWtlUmVmQXJyYXkoQ29sbGVjdGlvbiB0eXBlTGlzdCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3R5cGVMaXN0LnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZSlpLm5leHQoKSkuZ2V0UmVmKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUlkZW50aXR5Q29uc3RyYWludHMoKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW10gaWRjcyA9IHN0YXRlLmlkQ29uc3RyYWludHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpZGNzW2ldLmlzUmVzb2x2ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBLZXlyZWYgeHNka3IgPSAoS2V5cmVmKWlkY3NbaV0uZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBrZXlOYW1lID0geHNka3IuZ2V0UmVmZXIoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGtleSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBrZXkgPSBzdGF0ZS5maW5kSWRDb25zdHJhaW50KGtleU5hbWUsIGlkY3NbaV0uZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3Ioa2V5TmFtZSwgWG1sRXJyb3JDb250ZXh0LklEQ19OT1RfRk9VTkQsIHhzZGtyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5DQ19LRVlSRUYpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiS2V5cmVmIGNhbm5vdCByZWZlciB0byBhbm90aGVyIGtleXJlZi4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmdldEZpZWxkcygpLmxlbmd0aCAhPSBpZGNzW2ldLmdldEZpZWxkcygpLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJLZXlyZWYgZG9lcyBub3QgaGF2ZSBzYW1lIG51bWJlciBvZiBmaWVsZHMgYXMga2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZGNzW2ldLnNldFJlZmVyZW5jZWRLZXkoa2V5LmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMWMxOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU2ltcGxlVHlwZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNob3J0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRCeXRlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuKjsKLQotcHVibGljIGNsYXNzIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIKLXsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqIFNJTVBMRSBUWVBFIFJFU09MVVRJT04gSEVSRQotICAgICAqCi0gICAgICogU2ltcGxlIHR5cGVzIGNhbiBiZSBkZWNsYXJlZCBhcyBsaXN0cywgdW5pb25zLCBvciByZXN0cmljdGlvbnMuCi0gICAgICogVGhlc2UgdGhyZWUgY2FzZXMgYXJlIHRyZWF0ZWQgc2VwYXJhdGVseSBpbiByZXNvbHZlTGlzdFR5cGUsCi0gICAgICogcmVzb2x2ZVVuaW9uVHlwZSwgYW5kIHJlc29sdmVTaW1wbGVSZXN0cmljdGlvblR5cGUuCi0gICAgICoKLSAgICAgKiBUaGUgaW50cmljYXRlIHdvcmsgd2l0aCBmYWNldHMgaXMgZG9uZSBpbiB0aGUgcmVzdHJpY3Rpb24gY2FzZSwKLSAgICAgKiB1c2luZyBtZXRob2QgY2FsbGVkIHJlc29sdmVGYWNldHMgKHRoZSB1bmlvbiBhbmQgbGlzdCBjYXNlcyBoYXZlCi0gICAgICogdHJpdmlhbCBmYWNldCBydWxlcykuIFRoZW4gYWxsIHNpbXBsZSB0eXBlcyBjYWxsIHJlc29sdmVQcm9wZXJ0aWVzCi0gICAgICogaW4gdGhlIGVuZCB0byBoYXZlIHRoZWlyICJmdW5kYW1lbnRhbCBmYWNldHMiIHJlc29sdmVkLgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVTaW1wbGVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgU2ltcGxlVHlwZSBwYXJzZVN0ID0gKFNpbXBsZVR5cGUpc0ltcGwuZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzSW1wbC5pc1NpbXBsZVR5cGUoKTsKLQotICAgICAgICAvLyBWZXJpZnk6IGhhdmUgbGlzdCwgdW5pb24sIG9yIHJlc3RyaWN0aW9uLCBidXQgbm90IG1vcmUgdGhhbiBvbmUKLSAgICAgICAgaW50IGNvdW50ID0KLSAgICAgICAgICAgICAgICAocGFyc2VTdC5pc1NldExpc3QoKSA/IDEgOiAwKSArCi0gICAgICAgICAgICAgICAgKHBhcnNlU3QuaXNTZXRVbmlvbigpID8gMSA6IDApICsKLSAgICAgICAgICAgICAgICAocGFyc2VTdC5pc1NldFJlc3RyaWN0aW9uKCkgPyAxIDogMCk7Ci0gICAgICAgIGlmIChjb3VudCA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgIkEgc2ltcGxlIHR5cGUgbXVzdCBkZWZpbmUgZWl0aGVyIGEgbGlzdCwgYSB1bmlvbiwgb3IgYSByZXN0cmljdGlvbjogbW9yZSB0aGFuIG9uZSBmb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX1NJTVBMRV9UWVBFX0RFRk4sCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlU3QpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIHRoZSBmaXJzdCBvZiBsaXN0LCB1bmlvbiwgcmVzdHIKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb3VudCA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSBzaW1wbGUgdHlwZSBtdXN0IGRlZmluZSBlaXRoZXIgYSBsaXN0LCBhIHVuaW9uLCBvciBhIHJlc3RyaWN0aW9uOiBub25lIHdhcyBmb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX1NJTVBMRV9UWVBFX0RFRk4sCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlU3QpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIHJlc3RyaWN0aW9uIG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IGZpbmFsIGZsYWdzCi0gICAgICAgIGJvb2xlYW4gZmluYWxSZXN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZmluYWxMaXN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZmluYWxVbmlvbiA9IGZhbHNlOwotCi0gICAgICAgIGlmIChwYXJzZVN0LmlzU2V0RmluYWwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyc2VTdC5nZXRGaW5hbCgpOwotICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscygiI2FsbCIpKQotICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IGZpbmFsTGlzdCA9IGZpbmFsVW5pb24gPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJyZXN0cmljdGlvbiIpKQotICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoImxpc3QiKSkKLSAgICAgICAgICAgICAgICBmaW5hbExpc3QgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJ1bmlvbiIpKQotICAgICAgICAgICAgICAgIGZpbmFsVW5pb24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHNJbXBsLnNldFNpbXBsZUZpbmFsKGZpbmFsUmVzdCwgZmluYWxMaXN0LCBmaW5hbFVuaW9uKTsKLQotICAgICAgICBMaXN0IGFub25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAocGFyc2VTdC5nZXRMaXN0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc29sdmVMaXN0VHlwZShzSW1wbCwgcGFyc2VTdC5nZXRMaXN0KCksIGFub25UeXBlcyk7Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU3QuZ2V0VW5pb24oKSAhPSBudWxsKQotICAgICAgICAgICAgcmVzb2x2ZVVuaW9uVHlwZShzSW1wbCwgcGFyc2VTdC5nZXRVbmlvbigpLCBhbm9uVHlwZXMpOwotICAgICAgICBlbHNlIGlmIChwYXJzZVN0LmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc29sdmVTaW1wbGVSZXN0cmljdGlvblR5cGUoc0ltcGwsIHBhcnNlU3QuZ2V0UmVzdHJpY3Rpb24oKSwgYW5vblR5cGVzKTsKLQotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vblR5cGVzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZS5SZWZbXSBtYWtlUmVmQXJyYXkoQ29sbGVjdGlvbiB0eXBlTGlzdCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3R5cGVMaXN0LnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZSlpLm5leHQoKSkuZ2V0UmVmKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuQVRPTUlDKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUxpc3RUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkxpc3REb2N1bWVudC5MaXN0IHBhcnNlTGlzdCwgTGlzdCBhbm9uVHlwZXMpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoU2NoZW1hVHlwZS5MSVNUKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOwotCi0gICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VMaXN0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBRTmFtZSBpdGVtTmFtZSA9IHBhcnNlTGlzdC5nZXRJdGVtVHlwZSgpOwotICAgICAgICBMb2NhbFNpbXBsZVR5cGUgcGFyc2VJbm5lciA9IHBhcnNlTGlzdC5nZXRTaW1wbGVUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGl0ZW1OYW1lICE9IG51bGwgJiYgcGFyc2VJbm5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiTGlzdCB0eXBlIGRlZmluaXRpb25zIHByb3ZpZGUgZWl0aGVyIGFuIGl0ZW1UeXBlIGF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlVHlwZTogYm90aCB3ZXJlIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfTkVTVEVEX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlTGlzdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBpbm5lciBzaW1wbGUgdHlwZS4KLSAgICAgICAgICAgIHBhcnNlSW5uZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgaXRlbUltcGw7Ci0gICAgICAgIFhtbE9iamVjdCBlcnJvckxvYzsKLQotICAgICAgICBpZiAoaXRlbU5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaXRlbUltcGwgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShpdGVtTmFtZSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgZXJyb3JMb2MgPSBwYXJzZUxpc3QueGdldEl0ZW1UeXBlKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbUltcGwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKGl0ZW1OYW1lLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlTGlzdC54Z2V0SXRlbVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGEgbGlzdCBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICAgICAgaXRlbUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlSW5uZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaXRlbUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgZXJyb3JMb2MgPSBwYXJzZUlubmVyOwotICAgICAgICAgICAgaXRlbUltcGwuc2V0U2ltcGxlVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIGl0ZW1JbXBsLnNldFBhcnNlQ29udGV4dChwYXJzZUlubmVyLCBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgaXRlbUltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKHNJbXBsLmdldFJlZigpKTsKLSAgICAgICAgICAgIGFub25UeXBlcy5hZGQoaXRlbUltcGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxpc3QgdHlwZSBkZWZpbml0aW9ucyBwcm92aWRlIGVpdGhlciBhbiBpdGVtVHlwZSBhdHRyaWJ1dGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJvciBjb250YWluIGEgbmVzdGVkIHNpbXBsZVR5cGU6IG5laXRoZXIgd2FzIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5MSVNUX01JU1NJTkdfSVRFTSwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VMaXN0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBWZXJpZnkgZmluYWwgcmVzdHJpY3Rpb25zCi0gICAgICAgIGlmIChpdGVtSW1wbC5maW5hbExpc3QoKSkKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZGVyaXZlIGJ5IGxpc3QgYSBmaW5hbCB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZUxpc3QpOwotCi0gICAgICAgIC8vIFJlY3Vyc2lvbi4uLgotICAgICAgICBTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoaXRlbUltcGwpOwotCi0gICAgICAgIGlmICghaXRlbUltcGwuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJdGVtIHR5cGUgZm9yIHRoaXMgbGlzdCB0eXBlIGlzIG5vdCBzaW1wbGUiLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTElTVF9JVEVNX05PVF9TSU1QTEUsIGVycm9yTG9jKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCB0aGUgaXRlbSB0eXBlIGFzIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgIHNJbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoaXRlbUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBpdGVtIHR5cGUgaXMgYW5vdGhlciBsaXN0IHR5cGU7IGxpc3RzIG9mIGxpc3RzIGFyZSBub3QgYWxsb3dlZC4iLCBYbWxFcnJvckNvbnRleHQuTElTVF9PRl9MSVNULCBlcnJvckxvYyk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IHRoZSBsaXN0IGFzIGFuIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1JbXBsLmlzVW5pb25PZkxpc3RzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBpdGVtIHR5cGUgaXMgYSB1bmlvbiBjb250YWluaW5nIGEgbGlzdDsgbGlzdHMgb2YgbGlzdHMgYXJlIG5vdCBhbGxvd2VkLiIsIFhtbEVycm9yQ29udGV4dC5MSVNUX09GX0xJU1QsIGVycm9yTG9jKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2g6IG5vbmxpc3QgdW5pb25zIGFyZSBqdXN0IGxpa2UgYXRvbWljIGl0ZW1zCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihpdGVtSW1wbC5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGRlYWwgd2l0aCBmYWNldHMKLSAgICAgICAgc0ltcGwuc2V0QmFzaWNGYWNldHMoU3RzY1N0YXRlLkZBQ0VUU19MSVNULCBTdHNjU3RhdGUuRklYRURfRkFDRVRTX0xJU1QpOwotICAgICAgICBzSW1wbC5zZXRXaGl0ZVNwYWNlUnVsZSggU2NoZW1hVHlwZS5XU19DT0xMQVBTRSApOwotCi0gICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcwotICAgICAgICByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOwotICAgIH0KLQotCi0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVVbmlvblR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwsIFVuaW9uRG9jdW1lbnQuVW5pb24gcGFyc2VVbmlvbiwgTGlzdCBhbm9uVHlwZXMpCi0gICAgewotICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShTY2hlbWFUeXBlLlVOSU9OKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOwotCi0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VVbmlvbik7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbC4KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTGlzdCBtZW1iZXJUeXBlcyA9IHBhcnNlVW5pb24uZ2V0TWVtYmVyVHlwZXMoKTsKLSAgICAgICAgU2ltcGxlVHlwZVtdIHNpbXBsZVR5cGVzID0gcGFyc2VVbmlvbi5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKLQotICAgICAgICBMaXN0IG1lbWJlckltcGxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNpbXBsZVR5cGVzLmxlbmd0aCA9PSAwICYmIChtZW1iZXJUeXBlcyA9PSBudWxsIHx8IG1lbWJlclR5cGVzLnNpemUoKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdW5pb24gdHlwZSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG1lbWJlciB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LlVOSU9OX01FTUJFUl9OT1RfU0lNUExFLCBwYXJzZVVuaW9uKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLCB6ZXJvIG1lbWJlciB0eXBlcyBpcyBmaW5lLgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbU5hbWVzID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsgbU5hbWVzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG1OYW1lID0gKFFOYW1lKW1OYW1lcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbWVtYmVySW1wbCA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKG1OYW1lLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlckltcGwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHNraXAgbWVtYmVyCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IobU5hbWUsIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VVbmlvbi54Z2V0TWVtYmVyVHlwZXMoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtZW1iZXJJbXBsTGlzdC5hZGQobWVtYmVySW1wbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpbXBsZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBCVUdCVUc6IHNlZSBpZiBub248c2ltcGxlVHlwZT4gY2hpbGRyZW4gY2FuIGxlYWsgdGhyb3VnaAotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgbUltcGwuc2V0U2ltcGxlVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIG1JbXBsLnNldFBhcnNlQ29udGV4dChzaW1wbGVUeXBlc1tpXSwgc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgIG1lbWJlckltcGxMaXN0LmFkZChtSW1wbCk7Ci0gICAgICAgICAgICBtSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYoc0ltcGwuZ2V0UmVmKCkpOwotICAgICAgICAgICAgbUltcGwuc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKGkgKyAxKTsKLSAgICAgICAgICAgIGFub25UeXBlcy5hZGQobUltcGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjdXJzZSBhbmQgcmVzb2x2ZSBhbGwgbWVtYmVyIHR5cGVzCi0gICAgICAgIGZvciAoSXRlcmF0b3IgbUltcGxzID0gbWVtYmVySW1wbExpc3QuaXRlcmF0b3IoKTsgbUltcGxzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbCltSW1wbHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUobUltcGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtSW1wbC5nZXRPdXRlclR5cGUoKS5lcXVhbHMoc0ltcGwpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyIGhhcyBhIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIHRoZSBjb250YWluaW5nIHVuaW9uIiwgIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgbUltcGwuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobUltcGwuZ2V0TmFtZSgpKSArICIgaGFzIGEgY3ljbGljIGRlcGVuZGVuY3kgb24gdGhlIHVuaW9uIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBwYXJzZVVuaW9uLnhnZXRNZW1iZXJUeXBlcygpKTsKLQotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhlIGVycmFudCB1bmlvbiBtZW1iZXIKLSAgICAgICAgICAgICAgICBtSW1wbHMucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgdmVyaWZ5IG1lbWJlcnMKLSAgICAgICAgYm9vbGVhbiBpc1VuaW9uT2ZMaXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgbUltcGxzID0gbWVtYmVySW1wbExpc3QuaXRlcmF0b3IoKTsgbUltcGxzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbCltSW1wbHMubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoIW1JbXBsLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtSW1wbC5nZXRPdXRlclR5cGUoKSAhPSBudWxsICYmIG1JbXBsLmdldE91dGVyVHlwZSgpLmVxdWFscyhzSW1wbCkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNZW1iZXIgaXMgbm90IHNpbXBsZSIsIFhtbEVycm9yQ29udGV4dC5VTklPTl9NRU1CRVJfTk9UX1NJTVBMRSwgbUltcGwuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobUltcGwuZ2V0TmFtZSgpKSArICIgaXMgbm90IHNpbXBsZSIsIFhtbEVycm9yQ29udGV4dC5VTklPTl9NRU1CRVJfTk9UX1NJTVBMRSwgcGFyc2VVbmlvbi54Z2V0TWVtYmVyVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBlcnJhbnQgdW5pb24gbWVtYmVyCi0gICAgICAgICAgICAgICAgbUltcGxzLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCB8fAotICAgICAgICAgICAgICAgIG1JbXBsLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OICYmIG1JbXBsLmlzVW5pb25PZkxpc3RzKCkpCi0gICAgICAgICAgICAgICAgaXNVbmlvbk9mTGlzdHMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVmVyaWZ5IGFueSBmaW5hbCByZXN0cmljdGlvbnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWVtYmVySW1wbExpc3Quc2l6ZSgpIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbCltZW1iZXJJbXBsTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAobUltcGwuZmluYWxVbmlvbigpKQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZGVyaXZlIGJ5IHVuaW9uIGEgZmluYWwgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VVbmlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5zZXRVbmlvbk9mTGlzdHMoaXNVbmlvbk9mTGlzdHMpOwotCi0gICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KG1lbWJlckltcGxMaXN0KSk7Ci0KLSAgICAgICAgLy8gbm93IGRlYWwgd2l0aCBmYWNldHMKLSAgICAgICAgc0ltcGwuc2V0QmFzaWNGYWNldHMoU3RzY1N0YXRlLkZBQ0VUU19VTklPTiwgU3RzY1N0YXRlLkZJWEVEX0ZBQ0VUU19VTklPTik7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIHJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhzSW1wbCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZVNpbXBsZVJlc3RyaWN0aW9uVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCwgUmVzdHJpY3Rpb25Eb2N1bWVudC5SZXN0cmljdGlvbiBwYXJzZVJlc3RyLCBMaXN0IGFub25UeXBlcykKLSAgICB7Ci0gICAgICAgIFFOYW1lIGJhc2VOYW1lID0gcGFyc2VSZXN0ci5nZXRCYXNlKCk7Ci0gICAgICAgIFNpbXBsZVR5cGUgcGFyc2VJbm5lciA9IHBhcnNlUmVzdHIuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgaWYgKGJhc2VOYW1lICE9IG51bGwgJiYgcGFyc2VJbm5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2ltcGxlIHR5cGUgcmVzdHJpY3Rpb25zIG11c3QgbmFtZSBhIGJhc2UgdHlwZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlIHR5cGU6IGJvdGggd2VyZSBmb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuUkVTVFJJQ1RJT05fUkVEVU5EQU5UX0JBU0UsCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdHIpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGUgaW5uZXIgc2ltcGxlIHR5cGUuCi0gICAgICAgICAgICBwYXJzZUlubmVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsOwotCi0gICAgICAgIGlmIChiYXNlTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlSW1wbCA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlUmVzdHIuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZUltcGwgIT0gbnVsbCAmJiAhYmFzZUltcGwuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VSZXN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZUltcGwgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShiYXNlTmFtZSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhc2VJbXBsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihiYXNlTmFtZSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVJlc3RyLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgICAgIGJhc2VJbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJzZUlubmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZUlubmVyKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYmFzZUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgYmFzZUltcGwuc2V0U2ltcGxlVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIGJhc2VJbXBsLnNldFBhcnNlQ29udGV4dChwYXJzZUlubmVyLCBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgLy8gYmFzZUltcGwuc2V0U2tpcHBlZEFub255bW91c1R5cGUodHJ1ZSk7Ci0gICAgICAgICAgICBiYXNlSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYoc0ltcGwuZ2V0UmVmKCkpOwotICAgICAgICAgICAgYW5vblR5cGVzLmFkZChiYXNlSW1wbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2ltcGxlIHR5cGUgcmVzdHJpY3Rpb25zIG11c3QgbmFtZSBhIGJhc2UgdHlwZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlIHR5cGU6IG5laXRoZXIgd2VyZSBmb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuUkVTVFJJQ1RJT05fTUlTU0lOR19CQVNFLAotICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3RyKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgYmFzZUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjdXJzaW9uIQotICAgICAgICBpZiAoIVN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZShiYXNlSW1wbCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGN5Y2xpYyBkZXBlbmRlbmN5IHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgYmFzZUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2VJbXBsLmZpbmFsUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgcmVzdHJpY3QgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlUmVzdHIpOwotCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VJbXBsLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKGJhc2VJbXBsLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOwotCi0gICAgICAgIGlmICghYmFzZUltcGwuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJCYXNlIHR5cGUgZm9yIHRoaXMgc2ltcGxlIHR5cGUgcmVzdHJpY3Rpb24gaXMgbm90IHNpbXBsZSIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5TSU1QTEVfUkVTVFJJQ1RJT05fTk9UX1NJTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN0ci54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhIHJlc3RyaWN0aW9uIG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoYmFzZUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKTsKLQotICAgICAgICAvLyBjb3B5IHZhcmlldHktc3BlY2lmaWMgcHJvcGVydGllcwotICAgICAgICBzd2l0Y2ggKGJhc2VJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKGJhc2VJbXBsLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0VW5pb25PZkxpc3RzKGJhc2VJbXBsLmlzVW5pb25PZkxpc3RzKCkpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KEFycmF5cy5hc0xpc3QoYmFzZUltcGwuZ2V0VW5pb25NZW1iZXJUeXBlcygpKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKGJhc2VJbXBsLmdldExpc3RJdGVtVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCBmYWNldHMKLSAgICAgICAgcmVzb2x2ZUZhY2V0cyhzSW1wbCwgcGFyc2VSZXN0ciwgYmFzZUltcGwpOwotCi0gICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcwotICAgICAgICByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlV2hpdGVzcGFjZUNvZGUoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIC8vIEJVR0JVRzogYWRkIHdoaXRlc3BhY2UgcnVsZSB0byB0ZXh0dmFsdWUuCi0gICAgICAgIFN0cmluZyB0ZXh0dmFsID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgICAgICBpZiAodGV4dHZhbC5lcXVhbHMoImNvbGxhcHNlIikpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKLQotICAgICAgICBpZiAodGV4dHZhbC5lcXVhbHMoInByZXNlcnZlIikpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKLQotICAgICAgICBpZiAodGV4dHZhbC5lcXVhbHMoInJlcGxhY2UiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1JFUExBQ0U7Ci0KLSAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJVbnJlY29nbml6ZWQgd2hpdGVzcGFjZSB2YWx1ZSBcIiIgKyB0ZXh0dmFsICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgdmFsdWUpOwotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc011bHRpcGxlRmFjZXQoaW50IGZhY2V0Y29kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoZmFjZXRjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT04gfHwKLSAgICAgICAgICAgICAgICBmYWNldGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBmYWNldEFwcGxpZXNUb1R5cGUoaW50IGZhY2V0Q29kZSwgU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGJhc2VJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGF0b21pYyBjYXNlCi0KLSAgICAgICAgc3dpdGNoIChiYXNlSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBvdGhlcl9zaW1pbGFyX2xpbWl0KGludCBmYWNldGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGZhY2V0Y29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlRmFjZXRzKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBYbWxPYmplY3QgcmVzdHJpY3Rpb24sIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIGJvb2xlYW5bXSBzZWVuRmFjZXQgPSBuZXcgYm9vbGVhbltTY2hlbWFUeXBlLkxBU1RfRkFDRVQgKyAxXTsKLSAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIG15RmFjZXRzID0gYmFzZUltcGwuZ2V0QmFzaWNGYWNldHMoKTsgLy8gbWFrZXMgYSBjb3B5Ci0gICAgICAgIGJvb2xlYW5bXSBmaXhlZEZhY2V0cyA9IGJhc2VJbXBsLmdldEZpeGVkRmFjZXRzKCk7Ci0gICAgICAgIGludCB3c3IgPSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOwotICAgICAgICBMaXN0IGVudW1lcmF0ZWRWYWx1ZXMgPSBudWxsOwotICAgICAgICBMaXN0IHBhdHRlcm5zID0gbnVsbDsKLQotICAgICAgICBpZiAocmVzdHJpY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHJlc3RyaWN0aW9uLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjb2RlID0gdHJhbnNsYXRlRmFjZXRDb2RlKGN1ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IC0xKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIEZhY2V0IGZhY2V0ID0gKEZhY2V0KWN1ci5nZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgIGlmICghZmFjZXRBcHBsaWVzVG9UeXBlKGNvZGUsIGJhc2VJbXBsKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgZmFjZXQgIiArIGZhY2V0Lm5ld0N1cnNvcigpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGJhc2UgdHlwZSAiICsgYmFzZUltcGwsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9ET0VTX05PVF9BUFBMWSwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNlZW5GYWNldFtjb2RlXSAmJiAhaXNNdWx0aXBsZUZhY2V0KGNvZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkZhY2V0IHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcyIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9EVVBMSUNBVEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZWVuRmFjZXRbY29kZV0gPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEhdICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEhdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IGxlbmd0aCBpbiBhZGRpdGlvbiB0byBtaW5MZW5ndGggb3IgbWF4TGVuZ3RoIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RVUExJQ0FURUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEludGVnZXIgbGVuID0gU3RzY1RyYW5zbGF0b3IuYnVpbGRObkludGVnZXIoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGZhY2V0IGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9GSVhFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEhdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IG1pbkxlbmd0aCBvciBtYXhMZW5ndGggaW4gYWRkaXRpb24gdG8gbGVuZ3RoIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RVUExJQ0FURUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEludGVnZXIgbWxlbiA9IFN0c2NUcmFuc2xhdG9yLmJ1aWxkTm5JbnRlZ2VyKGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1sZW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRGYWNldHNbY29kZV0gJiYgIW15RmFjZXRzW2NvZGVdLnZhbHVlRXF1YWxzKG1sZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGZhY2V0IGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9GSVhFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSF0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWxlbi5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIXSkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxhcmdlciB0aGFuIHByaW9yIG1heExlbmd0aCIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSF0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWxlbi5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIXSkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNtYWxsZXIgdGhhbiBwcmlvciBtaW5MZW5ndGgiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gbWxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzdG90YWxkaWcgPSAoY29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxJbnRlZ2VyIGRpZyA9IFN0c2NUcmFuc2xhdG9yLmJ1aWxkTm5JbnRlZ2VyKGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZEZhY2V0c1tjb2RlXSAmJiAhbXlGYWNldHNbY29kZV0udmFsdWVFcXVhbHMoZGlnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBmYWNldCBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRklYRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUU10gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlnLmNvbXBhcmVWYWx1ZShteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUU10pID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxhcmdlciB0aGFuIHByaW9yIHRvdGFsRGlnaXRzIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3RvdGFsZGlnICYmIG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWcuY29tcGFyZVZhbHVlKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTXSkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTGFyZ2VyIHRoYW4gcHJpb3IgZnJhY3Rpb25EaWdpdHMiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tjb2RlXSA9IGRpZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOgotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbkZhY2V0W290aGVyX3NpbWlsYXJfbGltaXQoY29kZSldKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZGVmaW5lIGJvdGggaW5jbHVzaXZlIGFuZCBleGNsdXNpdmUgbGltaXQgaW4gdGhlIHNhbWUgcmVzdHJpY2l0b24iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRFVQTElDQVRFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc21pbiA9IChjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSB8fCBjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzZXhjbHVzaXZlID0gKGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFIHx8IGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBsaW1pdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gYmFzZUltcGwubmV3VmFsdWUoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIGxpbWl0IGlzIGEgdmFsaWQgbnVtYmVyIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgZGF0YSB0eXBlISEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSB2YWxpZCB2YWx1ZSBpbiBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCVUdCVUc6IGlmIHRoZXJlIGFyZSBhY3R1YWwgc2NoZW1hcyB0aGF0IHJlZGVmaW5lIG1pbi9tYXhFeGNsdXNpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSB3aWxsIG5lZWQgdGhpcyBydWxlIHJlbGF4ZWQgZm9yIHRoZW0hIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhsaW1pdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgZmFjZXQgaXMgZml4ZWQgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0ZJWEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbY29kZV0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGxpbWl0LmNvbXBhcmVWYWx1ZShteUZhY2V0c1tjb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMiB8fCBjb21wYXJpc29uID09IChpc21pbiA/IC0xIDogMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcihpc21pbiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzZXhjbHVzaXZlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzIG1pbkV4Y2x1c2l2ZSIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcHJldmlvdXMgbWluSW5jbHVzaXZlIikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc2V4Y2x1c2l2ZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmV2aW91cyBtYXhFeGNsdXNpdmUiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzIG1heEluY2x1c2l2ZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBsaW1pdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW290aGVyX3NpbWlsYXJfbGltaXQoY29kZSldID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzciA9IHRyYW5zbGF0ZVdoaXRlc3BhY2VDb2RlKGZhY2V0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VJbXBsLmdldFdoaXRlU3BhY2VSdWxlKCkgPiB3c3IpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGFwcGx5IHRoaXMgd2hpdGVzcGFjZSBmYWNldCBvdmVyIHRoZSBwcmV2aW91cyBvbmUiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tjb2RlXSA9IFN0c2NTdGF0ZS5idWlsZF93c3N0cmluZyh3c3IpLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IGVudW12YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtdmFsID0gYmFzZUltcGwubmV3VmFsdWUoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW51bXZhbC5zZXQoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKChYbWxPYmplY3RCYXNlKWVudW12YWwpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbnVtZXJhdGVkIHZhbHVlIGludmFsaWQgaW4gYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1lcmF0ZWRWYWx1ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVkVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlZFZhbHVlcy5hZGQoZW51bXZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbiBwOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24oZmFjZXQuZ2V0VmFsdWUoKS5nZXRTdHJpbmdWYWx1ZSgpLCAiWCIpOyB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAob3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlBhcnNlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zLmFkZChwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmYWNldC5nZXRGaXhlZCgpKQotICAgICAgICAgICAgICAgICAgICBmaXhlZEZhY2V0c1tjb2RlXSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdG9yZSB0aGUgYXJyYXkgb2YgYmFzaWMgZmFjZXRzCi0KLSAgICAgICAgc0ltcGwuc2V0QmFzaWNGYWNldHMobWFrZVZhbHVlUmVmQXJyYXkobXlGYWNldHMpLCBmaXhlZEZhY2V0cyk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBudW1lcmljIHdoaXRlc3BhY2UgcnVsZQotICAgICAgICBpZiAod3NyID09IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICB3c3IgPSBiYXNlSW1wbC5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgICAgICBzSW1wbC5zZXRXaGl0ZVNwYWNlUnVsZSh3c3IpOwotCi0gICAgICAgIC8vIHN0b3JlIGF3YXkgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCi0gICAgICAgIGlmIChlbnVtZXJhdGVkVmFsdWVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNJbXBsLnNldEVudW1lcmF0aW9uVmFsdWVzKG1ha2VWYWx1ZVJlZkFycmF5KChYbWxBbnlTaW1wbGVUeXBlW10pCi0gICAgICAgICAgICAgICAgZW51bWVyYXRlZFZhbHVlcy50b0FycmF5KG5ldyBYbWxBbnlTaW1wbGVUeXBlW2VudW1lcmF0ZWRWYWx1ZXMuc2l6ZSgpXSkpKTsKLQotICAgICAgICAgICAgU2NoZW1hVHlwZSBiZVR5cGUgPSBzSW1wbDsKLSAgICAgICAgICAgIGlmIChzSW1wbC5nZXRCYXNlVHlwZSgpLmdldEJhc2VFbnVtVHlwZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYmVUeXBlID0gc0ltcGwuZ2V0QmFzZVR5cGUoKS5nZXRCYXNlRW51bVR5cGUoKTsKLSAgICAgICAgICAgIHNJbXBsLnNldEJhc2VFbnVtVHlwZVJlZihiZVR5cGUuZ2V0UmVmKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc0ltcGwuY29weUVudW1lcmF0aW9uVmFsdWVzKGJhc2VJbXBsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0b3JlIHRoZSBwYXR0ZXJuIGxpc3QKLSAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gcGF0dGVybkFycmF5OwotICAgICAgICBpZiAocGF0dGVybnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHBhdHRlcm5BcnJheSA9IChvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSlwYXR0ZXJucy50b0FycmF5KEVNUFRZX1JFR0VYX0FSUkFZKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGF0dGVybkFycmF5ID0gRU1QVFlfUkVHRVhfQVJSQVk7Ci0gICAgICAgIHNJbXBsLnNldFBhdHRlcm5GYWNldCgocGF0dGVybkFycmF5Lmxlbmd0aCA+IDAgfHwgYmFzZUltcGwuaGFzUGF0dGVybkZhY2V0KCkpKTsKLSAgICAgICAgc0ltcGwuc2V0UGF0dGVybnMocGF0dGVybkFycmF5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxWYWx1ZVJlZltdIG1ha2VWYWx1ZVJlZkFycmF5KFhtbEFueVNpbXBsZVR5cGVbXSBzb3VyY2UpCi0gICAgewotICAgICAgICBYbWxWYWx1ZVJlZltdIHJlc3VsdCA9IG5ldyBYbWxWYWx1ZVJlZltzb3VyY2UubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSAoc291cmNlW2ldID09IG51bGwgPyBudWxsIDogbmV3IFhtbFZhbHVlUmVmKHNvdXJjZVtpXSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIEVNUFRZX1JFR0VYX0FSUkFZID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvblswXTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaXNjcmV0ZVR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gQlVHQlVHOiBzcGVjIGlzIHNpbGVudCBvbiBlbnVtZXJhdGlvbnM7IHRoZXkncmUgZmluaXRlIHRvby4KLSAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc051bWVyaWNQcmltaXRpdmUoU2NoZW1hVHlwZSBzSW1wbCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlY2ltYWxTaXplT2ZUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSBtYXRoZW1hdGljYWxTaXplT2ZUeXBlKHNJbXBsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ5dGUgYW5kIHNob3J0IGFyZSBpbmNvbnZlbmllbnQsIGJlY2F1c2Ugc2V0Qnl0ZSgoYnl0ZSk0KSByZXF1aXJlcyBhIGNhc3QuCi0gICAgICAgIC8vIFNvIHVzZSAiaW50IiB1bmxlc3MgeW91J3JlIHJlYWxseSBhIHhzOmJ5dGUsIHhzOnNob3J0LCBvciBhbiB4czp1bnNpZ25lZEJ5dGUKLSAgICAgICAgLy8gKHRoZSBsYXN0IGNhc2UgaXMgaW5jbHVkZWQgZm9yIGFsaWdubWVudCB3aXRoIEpBWEIpCi0gICAgICAgIAotICAgICAgICBpZiAoc2l6ZSA9PSBTY2hlbWFUeXBlLlNJWkVfQllURSAmJiAhWG1sQnl0ZS50eXBlLmlzQXNzaWduYWJsZUZyb20oc0ltcGwpKQotICAgICAgICAgICAgc2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9TSE9SVDsKLSAgICAgICAgaWYgKHNpemUgPT0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUICYmICFYbWxTaG9ydC50eXBlLmlzQXNzaWduYWJsZUZyb20oc0ltcGwpICYmICFYbWxVbnNpZ25lZEJ5dGUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHNJbXBsKSkKLSAgICAgICAgICAgIHNpemUgPSBTY2hlbWFUeXBlLlNJWkVfSU5UOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBtYXRoZW1hdGljYWxTaXplT2ZUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgaWYgKHNJbXBsLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuTk9UX0RFQ0lNQUw7Ci0KLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuc2lnbnVtKCkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw7Ci0KLSAgICAgICAgQmlnSW50ZWdlciBtaW4gPSBudWxsOwotICAgICAgICBCaWdJbnRlZ2VyIG1heCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSkgIT0gbnVsbCkKLSAgICAgICAgICAgIG1pbiA9ICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7IC8vIC5hZGQoQmlnSW50ZWdlci5PTkUpOwotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSAhPSBudWxsKQotICAgICAgICAgICAgbWluID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkgIT0gbnVsbCkKLSAgICAgICAgICAgIG1heCA9ICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpICE9IG51bGwpCi0gICAgICAgICAgICBtYXggPSAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOyAvLyAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpOwotCi0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUykgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnSW50ZWdlciBwZWcgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmlnSW50ZWdlciB0b3RhbERpZ2l0cyA9ICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodG90YWxEaWdpdHMuaW50VmFsdWUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcGVnID0gQmlnSW50ZWdlci52YWx1ZU9mKDk5TCk7IC8vIEJZVEUgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoOTk5OUwpOyAvLyBTSE9SVCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6IGNhc2UgODogY2FzZSA5OgotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyA9IEJpZ0ludGVnZXIudmFsdWVPZig5OTk5OTk5OTlMKTsgLy8gSU5UIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogY2FzZSAxMTogY2FzZSAxMjogY2FzZSAxMzogY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogY2FzZSAxNjogY2FzZSAxNzogY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoOTk5OTk5OTk5OTk5OTk5OTk5TCk7IC8vIExPTkcgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIGlmIChwZWcgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW4gPSAobWluID09IG51bGwgPyBwZWcubmVnYXRlKCkgOiBtaW4ubWF4KHBlZy5uZWdhdGUoKSkpOwotICAgICAgICAgICAgICAgIG1heCA9IChtYXggPT0gbnVsbCA/IHBlZyA6IG1heC5taW4ocGVnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWluICE9IG51bGwgJiYgbWF4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZpbmQgdGhlIGxhcmdlc3QgImFic29sdXRlIHZhbHVlIiBudW1iZXIgdGhhdCBtdXN0IGJlIGRlYWx0IHdpdGgKLSAgICAgICAgICAgIGlmIChtaW4uc2lnbnVtKCkgPCAwKQotICAgICAgICAgICAgICAgIG1pbiA9IG1pbi5uZWdhdGUoKS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgICAgICBpZiAobWF4LnNpZ251bSgpIDwgMCkKLSAgICAgICAgICAgICAgICBtYXggPSBtYXgubmVnYXRlKCkuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpOwotCi0gICAgICAgICAgICBtYXggPSBtYXgubWF4KG1pbik7Ci0gICAgICAgICAgICBpZiAobWF4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLnZhbHVlT2YoQnl0ZS5NQVhfVkFMVUUpKSA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfQllURTsKLSAgICAgICAgICAgIGlmIChtYXguY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihTaG9ydC5NQVhfVkFMVUUpKSA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ7Ci0gICAgICAgICAgICBpZiAobWF4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpKSA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfSU5UOwotICAgICAgICAgICAgaWYgKG1heC5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKSkgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5TSVpFX0xPTkc7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOwotICAgIH0KLQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgLy8gZGVhbCB3aXRoLCBpc09yZGVyZWQsIGlzQm91bmRlZCwgaXNGaW5pdGUsIGlzTnVtZXJpYwotICAgICAgICAvLyBhbHNvIGRlYWwgd2l0aAotICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBiYXNlSW1wbCA9IChTY2hlbWFUeXBlSW1wbClzSW1wbC5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldE9yZGVyZWQoYmFzZUltcGwub3JkZXJlZCgpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRCb3VuZGVkKAotICAgICAgICAgICAgICAgICAgICAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgIHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkgIT0gbnVsbCkpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldEZpbml0ZShiYXNlSW1wbC5pc0Zpbml0ZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNJbXBsLmlzQm91bmRlZCgpICYmIGlzRGlzY3JldGVUeXBlKHNJbXBsKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TnVtZXJpYyhiYXNlSW1wbC5pc051bWVyaWMoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bWVyaWNQcmltaXRpdmUoc0ltcGwuZ2V0UHJpbWl0aXZlVHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RGVjaW1hbFNpemUoZGVjaW1hbFNpemVPZlR5cGUoc0ltcGwpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gbVR5cGVzID0gc0ltcGwuZ2V0VW5pb25NZW1iZXJUeXBlcygpOwotICAgICAgICAgICAgICAgIGludCBvcmRlcmVkID0gU2NoZW1hVHlwZS5VTk9SREVSRUQ7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0JvdW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaW5pdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNOdW1lcmljID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBvcmRlcmVkIGlmIGFueSBpcyBvcmRlcmVkLCBib3VuZGVkIGlmIGFsbCBhcmUgYm91bmRlZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZXNbaV0ub3JkZXJlZCgpICE9IFNjaGVtYVR5cGUuVU5PUkRFUkVEKQotICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFNjaGVtYVR5cGUuUEFSVElBTF9PUkRFUjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtVHlwZXNbaV0uaXNCb3VuZGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0JvdW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtVHlwZXNbaV0uaXNGaW5pdGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRmluaXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVR5cGVzW2ldLmlzTnVtZXJpYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1lcmljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNJbXBsLnNldE9yZGVyZWQob3JkZXJlZCk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0Qm91bmRlZChpc0JvdW5kZWQpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldEZpbml0ZShpc0Zpbml0ZSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TnVtZXJpYyhpc051bWVyaWMpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldERlY2ltYWxTaXplKFNjaGVtYVR5cGUuTk9UX0RFQ0lNQUwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJlZChTY2hlbWFUeXBlLlVOT1JERVJFRCk7Ci0gICAgICAgICAgICAgICAgLy8gQlVHQlVHOiB0aGUgc2NoZW1hIHNwZWMgaXMgd3JvbmcgaGVyZTogTUlOX0xFTkdUSCBpcyBub3QgbmVlZGVkLCBiZWF1c2UgbGVuID49MAotICAgICAgICAgICAgICAgIHNJbXBsLnNldEJvdW5kZWQoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICAvLyBCVUdCVUc6IHRoZSBzY2hlbWEgc3BlYyBpcyB3cm9uZyBoZXJlOiBmaW5pdGUgY2FyZGluYWxpdHkgcmVxdWlyZXMgaXRlbSB0eXBlIGlzIGZpbml0ZQotICAgICAgICAgICAgICAgIHNJbXBsLnNldEZpbml0ZShzSW1wbC5nZXRMaXN0SXRlbVR5cGUoKS5pc0Zpbml0ZSgpICYmIHNJbXBsLmlzQm91bmRlZCgpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXROdW1lcmljKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXREZWNpbWFsU2l6ZShTY2hlbWFUeXBlLk5PVF9ERUNJTUFMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvZGVGb3JOYW1lRW50cnkKLSAgICB7Ci0gICAgICAgIENvZGVGb3JOYW1lRW50cnkoUU5hbWUgbmFtZSwgaW50IGNvZGUpCi0gICAgICAgICAgICB7IHRoaXMubmFtZSA9IG5hbWU7IHRoaXMuY29kZSA9IGNvZGU7IH0KLSAgICAgICAgcHVibGljIFFOYW1lIG5hbWU7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2RlRm9yTmFtZUVudHJ5W10gZmFjZXRDb2RlcyA9IG5ldyBDb2RlRm9yTmFtZUVudHJ5W10KLSAgICB7Ci0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygibGVuZ3RoIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJtaW5MZW5ndGgiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJtYXhMZW5ndGgiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJwYXR0ZXJuIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTiksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiZW51bWVyYXRpb24iLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTiksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygid2hpdGVTcGFjZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJtYXhJbmNsdXNpdmUiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJtYXhFeGNsdXNpdmUiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJtaW5JbmNsdXNpdmUiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJtaW5FeGNsdXNpdmUiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJ0b3RhbERpZ2l0cyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUyksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiZnJhY3Rpb25EaWdpdHMiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgZmFjZXRDb2RlTWFwID0gYnVpbGRGYWNldENvZGVNYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEZhY2V0Q29kZU1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYWNldENvZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dChmYWNldENvZGVzW2ldLm5hbWUsICBuZXcgSW50ZWdlcihmYWNldENvZGVzW2ldLmNvZGUpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsYXRlRmFjZXRDb2RlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9ICgoSW50ZWdlcilmYWNldENvZGVNYXAuZ2V0KG5hbWUpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1N0YXRlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0ODMwNi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnLlNjaGVtYUNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sU3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5IZXhCaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGUgU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyIGFzIGl0J3MKLSAqIGdvaW5nLgotICovCi1wdWJsaWMgY2xhc3MgU3RzY1N0YXRlCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2dpdmVuU3RzTmFtZTsKLSAgICBwcml2YXRlIENvbGxlY3Rpb24gX2Vycm9yTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtSW1wbCBfdGFyZ2V0OwotICAgIHByaXZhdGUgU2NoZW1hQ29uZmlnIF9jb25maWc7Ci0gICAgcHJpdmF0ZSBNYXAgX2NvbXBhdE1hcDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2RvaW5nRG93bmxvYWRzOwotICAgIHByaXZhdGUgYnl0ZVtdIF9kaWdlc3QgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBfbm9EaWdlc3QgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlciBfaW1wb3J0aW5nTG9hZGVyOwotCi0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcyAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxUeXBlcyAgICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxFbGVtZW50cyAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxBdHRyaWJ1dGVzICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9tb2RlbEdyb3VwcyAgICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVHcm91cHMgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9kb2N1bWVudFR5cGVzICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVUeXBlcyAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF90eXBlc0J5Q2xhc3NuYW1lICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9taXNzcGVsbGVkTmFtZXMgICAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU2V0IF9wcm9jZXNzaW5nR3JvdXBzICAgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgTWFwIF9pZENvbnN0cmFpbnRzICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU2V0IF9uYW1lc3BhY2VzICAgICAgICAgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBfbm9VcGE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub1B2cjsKLSAgICBwcml2YXRlIFNldCBfbWRlZk5hbWVzcGFjZXMgICAgID0gYnVpbGREZWZhdWx0TWRlZk5hbWVzcGFjZXMoKTsKLSAgICBwcml2YXRlIEVudGl0eVJlc29sdmVyIF9lbnRpdHlSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgc3RhdGljIFNldCBidWlsZERlZmF1bHRNZGVmTmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICAvLyBuYW1lc3BhY2VzIHdoaWNoIGFyZSBrbm93biB0byBhcHBlYXIgaW4gV1NETHMgcmVkdW5kYW50bHkKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KAotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9wZW51cmkub3JnLzIwMDIvMDQvc29hcC9jb252ZXJzYXRpb24vIiwKLSAgICAgICAgICAgICAgICB9KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBzdG9yZSB0aGUgbmV3IHRhcmdldCBuYW1lc3BhY2UgZm9yIGEgY2hhbWVsZW9uCi0gICAgICogaW5jbHVkZWQgc2NoZW1hLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IENIQU1FTEVPTl9JTkNMVURFX1VSSSA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgY29uc3RydWN0ZWQgdmlhIFN0c2NTdGF0ZS5zdGFydCgpLgotICAgICAqLwotICAgIHByaXZhdGUgU3RzY1N0YXRlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXIgZm9yIHNjaGVtYXR5cGVwYXRoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1wb3J0aW5nVHlwZUxvYWRlcihTY2hlbWFUeXBlTG9hZGVyIGxvYWRlcikKLSAgICB7Ci0gICAgICAgIF9pbXBvcnRpbmdMb2FkZXIgPSBsb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXIgZm9yIGVycm9yIGhhbmRsaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTGlzdGVuZXIoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyKQotICAgICAgICB7IF9lcnJvckxpc3RlbmVyID0gZXJyb3JMaXN0ZW5lcjsgfQotCi0gICAgLyoqCi0gICAgICogUGFzc2VzIGFuIGVycm9yIG9uIHRvIHRoZSBjdXJyZW50IFhtbEVycm9yQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2MpCi0gICAgICAgIHsgYWRkRXJyb3IoX2Vycm9yTGlzdGVuZXIsIG1lc3NhZ2UsIGNvZGUsIGxvYyk7IH0KLQotICAgIC8qKgotICAgICAqIFBhc3NlcyBhIHdhcm5pbmcgb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBjb2RlLCBYbWxPYmplY3QgbG9jKQotICAgIHsKLSAgICAgICAgLy8gaXQncyBPSyBmb3IgWE1MU2NoZW1hLnhzZCBpdHNlbGYgdG8gaGF2ZSByZXNlcnZlZCB0eXBlIG5hbWVzCi0gICAgICAgIGlmIChjb2RlID09IFhtbEVycm9yQ29udGV4dC5SRVNFUlZFRF9UWVBFX05BTUUgJiYKLSAgICAgICAgICAgICAgICBsb2MuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBsb2MuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpLmluZGV4T2YoIlhNTFNjaGVtYS54c2QiKSA+IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgYWRkV2FybmluZyhfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSwgY29kZSwgbG9jKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZXMgYSB3YXJuaW5nIG9uIHRvIHRoZSBjdXJyZW50IFhtbEVycm9yQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmZvKFN0cmluZyBtZXNzYWdlKQotICAgICAgICB7IGFkZEluZm8oX2Vycm9yTGlzdGVuZXIsIG1lc3NhZ2UpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXJyb3IoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICBYbWxFcnJvci5mb3JPYmplY3QoCi0gICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEVycm9yKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciwgU3RyaW5nIG1lc3NhZ2UsIGludCBjb2RlLCBGaWxlIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgIFhtbEVycm9yLmZvckxvY2F0aW9uKAotICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiwKLSAgICAgICAgICAgICAgbG9jYXRpb24udG9VUkkoKS50b1N0cmluZygpLCAwLCAwLCAwKTsKLSAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZXJyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkV2FybmluZyhDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIsIFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgIFhtbEVycm9yLmZvck9iamVjdCgKLSAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfV0FSTklORywKLSAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlcnIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbmZvKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICBYbWxFcnJvciBlcnIgPSBYbWxFcnJvci5mb3JNZXNzYWdlKG1lc3NhZ2UsIFhtbEVycm9yLlNFVkVSSVRZX0lORk8pOwotICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlcnIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRHaXZlblR5cGVTeXN0ZW1OYW1lKFN0cmluZyBuYW1lKQotICAgICAgICB7IF9naXZlblN0c05hbWUgPSBuYW1lOyB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3IgcmVmZXJlbmNlcyB0byB0aGUgU2NoZW1hVHlwZUxvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFNjaGVtYVR5cGVTeXN0ZW0oU2NoZW1hVHlwZVN5c3RlbUltcGwgdGFyZ2V0KQotICAgICAgICB7IF90YXJnZXQgPSB0YXJnZXQ7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBY2N1bXVsYXRlcyBhIHNjaGVtYSBkaWdlc3QuLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFEaWdlc3QoYnl0ZVtdIGRpZ2VzdCkKLSAgICB7Ci0gICAgICAgIGlmIChfbm9EaWdlc3QpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBpZiAoZGlnZXN0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ub0RpZ2VzdCA9IHRydWU7Ci0gICAgICAgICAgICBfZGlnZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKF9kaWdlc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIF9kaWdlc3QgPSBuZXcgYnl0ZVsxMjgvOF07IC8vIDEyOCBiaXRzLgotICAgICAgICBpbnQgbGVuID0gX2RpZ2VzdC5sZW5ndGg7Ci0gICAgICAgIGlmIChkaWdlc3QubGVuZ3RoIDwgbGVuKQotICAgICAgICAgICAgbGVuID0gZGlnZXN0Lmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIF9kaWdlc3RbaV0gXj0gZGlnZXN0W2ldOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgU2NoZW1hVHlwZVN5c3RlbSB3aGljaCB3ZSdyZSBidWlsZGluZyB0eXBlcyBvbiBiZWhhbGYgb2YuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHN0cygpCi0gICAgewotICAgICAgICBpZiAoX3RhcmdldCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF90YXJnZXQ7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9IF9naXZlblN0c05hbWU7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgX2RpZ2VzdCAhPSBudWxsKQotICAgICAgICAgICAgbmFtZSA9ICJzIiArIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShfZGlnZXN0KSk7Ci0gICAgICAgIAotICAgICAgICBfdGFyZ2V0ID0gbmV3IFNjaGVtYVR5cGVTeXN0ZW1JbXBsKG5hbWUpOwotICAgICAgICByZXR1cm4gX3RhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBsb2NhbCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRG93bmxvYWRVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgICB7Ci0gICAgICAgIGlmIChfZG9pbmdEb3dubG9hZHMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAodXJpU3RyaW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKHVyaVN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdXJpLmdldFNjaGVtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVyIGZvciBjb21wYXRNYXAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47IC8vIGRlZmF1bHRzIGFyZSBhbGwgZmFsc2UuIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBfY29tcGF0TWFwID0gKE1hcClvcHRpb25zLmdldChYbWxPcHRpb25zLkNPTVBJTEVfU1VCU1RJVFVURV9OQU1FUyk7Ci0gICAgICAgIF9ub1VwYSA9IG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ09NUElMRV9OT19VUEFfUlVMRSkgPyB0cnVlIDoKLSAgICAgICAgICAgICAgICAhInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW4udW5pcXVlcGFydGljbGVhdHRyaWJ1dGlvbiIsICJ0cnVlIikpOwotICAgICAgICBfbm9QdnIgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNPTVBJTEVfTk9fUFZSX1JVTEUpID8gdHJ1ZSA6Ci0gICAgICAgICAgICAgICAgISJ0cnVlIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJ4bWxiZWFuLnBhcnRpY2xlcmVzdHJpY3Rpb24iLCAidHJ1ZSIpKTsKLSAgICAgICAgX2RvaW5nRG93bmxvYWRzID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX0RPV05MT0FEX1VSTFMpID8gdHJ1ZSA6Ci0gICAgICAgICAgICAgICAgInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW4uZG93bmxvYWR1cmxzIiwgImZhbHNlIikpOwotICAgICAgICBfZW50aXR5UmVzb2x2ZXIgPSAoRW50aXR5UmVzb2x2ZXIpb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5FTlRJVFlfUkVTT0xWRVIpOwotICAgICAgICBpZiAoX2VudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICAgICAgICBfZG9pbmdEb3dubG9hZHMgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ09NUElMRV9NREVGX05BTUVTUEFDRVMpKQotICAgICAgICAgICAgX21kZWZOYW1lc3BhY2VzLmFkZEFsbCgoQ29sbGVjdGlvbilvcHRpb25zLmdldChYbWxPcHRpb25zLkNPTVBJTEVfTURFRl9OQU1FU1BBQ0VTKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBjdXN0b20gZW50aXR5IHJlc29sdmVyLgotICAgICAqLyAKLSAgICBwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBubyB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gb3B0aW9uIGlzIHNldAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5vVXBhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbm9VcGE7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgbm8gcGFydGljbGUgdmFsaWQgKHJlc3RyaWNpdG9uKSBvcHRpb24gaXMgc2V0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbm9QdnIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ub1B2cjsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmNlcHRzIFhNTCBuYW1lcyBhbmQgdHJhbnNsYXRlcyB0aGVtCi0gICAgICogdGhyb3VnaCB0aGUgY29tcGF0IG1hcCwgaWYgYW55LgotICAgICAqCi0gICAgICogQWxzbyBsb29rcyBmb3IgYSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgZ2xvYmFsIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgUU5hbWUgY29tcGF0TmFtZShRTmFtZSBuYW1lLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGEgY2hhbWVsZW9uTmFtZXNwYWNlIG5hbWVzcGFjZQotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICYmIGNoYW1lbGVvbk5hbWVzcGFjZSAhPSBudWxsICYmIGNoYW1lbGVvbk5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBuYW1lID0gbmV3IFFOYW1lKGNoYW1lbGVvbk5hbWVzcGFjZSwgbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgaWYgKF9jb21wYXRNYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotCi0gICAgICAgIFFOYW1lIHN1YnN0ID0gKFFOYW1lKV9jb21wYXRNYXAuZ2V0KG5hbWUpOwotICAgICAgICBpZiAoc3Vic3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICByZXR1cm4gc3Vic3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBzY2hlbWEgY29uZmlnIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFDb25maWcoU2NoZW1hQ29uZmlnIGNvbmZpZykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX2NvbmZpZyA9IGNvbmZpZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBwYWNrYWdlIG92ZXJyaWRlIGZvciBhIG5hbWVzcGFjZSBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VPdmVycmlkZShTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb25maWcubG9va3VwUGFja2FnZUZvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIHBhY2thZ2Ugb3ZlcnJpZGUgZm9yIGEgbmFtZXNwYWNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVByZWZpeChTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb25maWcubG9va3VwUHJlZml4Rm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9va3MgdXAgcGFja2FnZSBvdmVycmlkZSBmb3IgYSBuYW1lc3BhY2UgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhU3VmZml4KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBTdWZmaXhGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBjb25maWd1cmVkIGphdmEgbmFtZSBmb3IgdGhlIGdpdmVuIHFuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YW5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBKYXZhbmFtZUZvclFOYW1lKHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiBTUEVMTElOR1MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcnVuY2hOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICAvLyBsb3dlcmNhc2UsIGFuZCBkcm9wIG5hbWVzcGFjZS4KLSAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCkudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFNwZWxsaW5nKFFOYW1lIG5hbWUsIFNjaGVtYUNvbXBvbmVudCBjb21wKQotICAgIHsKLSAgICAgICAgX21pc3NwZWxsZWROYW1lcy5wdXQoY3J1bmNoTmFtZShuYW1lKSwgY29tcCk7Ci0gICAgfQotCi0gICAgU2NoZW1hQ29tcG9uZW50IGZpbmRTcGVsbGluZyhRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFDb21wb25lbnQpX21pc3NwZWxsZWROYW1lcy5nZXQoY3J1bmNoTmFtZShuYW1lKSk7Ci0gICAgfQotCi0gICAgLyogTkFNRVNQQUNFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIF9uYW1lc3BhY2VzLmFkZCh0YXJnZXROYW1lc3BhY2UpOwotICAgIH0KLQotICAgIFN0cmluZ1tdIGdldE5hbWVzcGFjZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlfbmFtZXNwYWNlcy50b0FycmF5KG5ldyBTdHJpbmdbX25hbWVzcGFjZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBsaW5rZXJEZWZpbmVzTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX2ltcG9ydGluZ0xvYWRlci5pc05hbWVzcGFjZURlZmluZWQobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKiBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYVR5cGVJbXBsIGZpbmRHbG9iYWxUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2dsb2JhbFR5cGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVR5cGVJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZFR5cGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIFNjaGVtYVR5cGVJbXBsIGZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UsIFFOYW1lIHJlZGVmaW5lZE5hbWUpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBpZiAobmFtZS5lcXVhbHMocmVkZWZpbmVkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUltcGwpX3JlZGVmaW5lZEdsb2JhbFR5cGVzLmdldChuYW1lKTsKLSAgICAgICAgICAgIC8vIEJVR0JVRzogc2hvdWxkIGFsc28gbGluayBhZ2FpbnN0IF9pbXBvcnRpbmdMb2FkZXIuZmluZFJlZGVmaW5lZFR5cGUKLSAgICAgICAgfQotICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2dsb2JhbFR5cGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVR5cGVJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZFR5cGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRHbG9iYWxUeXBlKFNjaGVtYVR5cGVJbXBsIHR5cGUsIGJvb2xlYW4gcmVkZWZpbmVkKQotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocmVkZWZpbmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcmVkZWZpbmVkR2xvYmFsVHlwZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCB0eXBlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfcmVkZWZpbmVkR2xvYmFsVHlwZXMucHV0KG5hbWUsIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZ2xvYmFsVHlwZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCB0eXBlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2dsb2JhbFR5cGVzLnB1dChuYW1lLCB0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkU3BlbGxpbmcobmFtZSwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZU1kZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbWRlZk5hbWVzcGFjZXMuY29udGFpbnMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVtdIGdsb2JhbFR5cGVzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYVR5cGVbXSlfZ2xvYmFsVHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfZ2xvYmFsVHlwZXMuc2l6ZSgpXSk7IH0KLQotICAgIFNjaGVtYVR5cGVbXSByZWRlZmluZWRHbG9iYWxUeXBlcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFUeXBlW10pX3JlZGVmaW5lZEdsb2JhbFR5cGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVR5cGVbX3JlZGVmaW5lZEdsb2JhbFR5cGVzLnNpemUoKV0pOyB9Ci0gICAgCi0gICAgLyogRE9DVU1FTlQgVFlQRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICBTY2hlbWFUeXBlSW1wbCBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2RvY3VtZW50VHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kRG9jdW1lbnRUeXBlKG5hbWUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZvaWQgYWRkRG9jdW1lbnRUeXBlKFNjaGVtYVR5cGVJbXBsIHR5cGUsIFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2RvY3VtZW50VHlwZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCBlbGVtZW50OiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9FTEVNRU5ULCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfZG9jdW1lbnRUeXBlcy5wdXQobmFtZSwgdHlwZSk7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZVtdKV9kb2N1bWVudFR5cGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVR5cGVbX2RvY3VtZW50VHlwZXMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIEFUVFJJQlVURSBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYVR5cGVJbXBsIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2F0dHJpYnV0ZVR5cGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVR5cGVJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZEF0dHJpYnV0ZVR5cGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRBdHRyaWJ1dGVUeXBlKFNjaGVtYVR5cGVJbXBsIHR5cGUsIFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2F0dHJpYnV0ZVR5cGVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBnbG9iYWwgYXR0cmlidXRlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9BVFRSSUJVVEUsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVUeXBlcy5wdXQobmFtZSwgdHlwZSk7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYVR5cGVbXSlfYXR0cmlidXRlVHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfYXR0cmlidXRlVHlwZXMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIEFUVFJJQlVURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCBmaW5kR2xvYmFsQXR0cmlidXRlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKV9nbG9iYWxBdHRyaWJ1dGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kQXR0cmlidXRlKG5hbWUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZvaWQgYWRkR2xvYmFsQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgYXR0cmlidXRlKQotICAgIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIF9nbG9iYWxBdHRyaWJ1dGVzLnB1dChuYW1lLCBhdHRyaWJ1dGUpOwotICAgICAgICAgICAgYWRkU3BlbGxpbmcobmFtZSwgYXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGdsb2JhbEF0dHJpYnV0ZXMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hR2xvYmFsQXR0cmlidXRlW10pX2dsb2JhbEF0dHJpYnV0ZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlW19nbG9iYWxBdHRyaWJ1dGVzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBFTEVNRU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGZpbmRHbG9iYWxFbGVtZW50KFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCByZXN1bHQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpX2dsb2JhbEVsZW1lbnRzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRHbG9iYWxFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGVsZW1lbnQpCi0gICAgewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBfZ2xvYmFsRWxlbWVudHMucHV0KG5hbWUsIGVsZW1lbnQpOwotICAgICAgICAgICAgYWRkU3BlbGxpbmcobmFtZSwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTY2hlbWFHbG9iYWxFbGVtZW50W10gZ2xvYmFsRWxlbWVudHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hR2xvYmFsRWxlbWVudFtdKV9nbG9iYWxFbGVtZW50cy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50W19nbG9iYWxFbGVtZW50cy5zaXplKCldKTsgfQotCi0gICAgLyogQVRUUklCVVRFIEdST1VQUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgZmluZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfYXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmRBdHRyaWJ1dGVHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UsIFFOYW1lIHJlZGVmaW5pdGlvbkZvcikKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWRlZmluaXRpb25Gb3IpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgICAgIC8vIEJVR0JVRzogc2hvdWxkIGFsc28gbGluayBhZ2FpbnN0IF9pbXBvcnRpbmdMb2FkZXIuZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwCi0gICAgICAgIH0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIHJlc3VsdCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwpX2F0dHJpYnV0ZUdyb3Vwcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kQXR0cmlidXRlR3JvdXAobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRBdHRyaWJ1dGVHcm91cChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgYXR0cmlidXRlR3JvdXAsIGJvb2xlYW4gcmVkZWZpbmVkKQotICAgIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBhdHRyaWJ1dGVHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBhdHRyaWJ1dGUgZ3JvdXA6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMucHV0KG5hbWUsIGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZUdyb3Vwcy5jb250YWluc0tleSggbmFtZSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBhdHRyaWJ1dGUgZ3JvdXA6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlR3JvdXBzLnB1dChhdHRyaWJ1dGVHcm91cC5nZXROYW1lKCksIGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkU3BlbGxpbmcoYXR0cmlidXRlR3JvdXAuZ2V0TmFtZSgpLCBhdHRyaWJ1dGVHcm91cCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBhdHRyaWJ1dGVHcm91cHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXBbXSlfYXR0cmlidXRlR3JvdXBzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwW19hdHRyaWJ1dGVHcm91cHMuc2l6ZSgpXSk7IH0KLQotICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10pX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBNT0RFTCBHUk9VUFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGZpbmRNb2RlbEdyb3VwKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX21vZGVsR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYU1vZGVsR3JvdXBJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZE1vZGVsR3JvdXAobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgU2NoZW1hTW9kZWxHcm91cEltcGwgZmluZFJlZGVmaW5lZE1vZGVsR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUU5hbWUgcmVkZWZpbml0aW9uRm9yKQotICAgIHsKLSAgICAgICAgbmFtZSA9IGNvbXBhdE5hbWUobmFtZSwgY2hhbWVsZW9uTmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHJlZGVmaW5pdGlvbkZvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hTW9kZWxHcm91cEltcGwpX3JlZGVmaW5lZE1vZGVsR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgICAgIC8vIEJVR0JVRzogc2hvdWxkIGFsc28gbGluayBhZ2FpbnN0IF9pbXBvcnRpbmdMb2FkZXIuZmluZFJlZGVmaW5lZE1vZGVsR3JvdXAKLSAgICAgICAgfQotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX21vZGVsR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYU1vZGVsR3JvdXBJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZE1vZGVsR3JvdXAobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRNb2RlbEdyb3VwKFNjaGVtYU1vZGVsR3JvdXBJbXBsIG1vZGVsR3JvdXAsIGJvb2xlYW4gcmVkZWZpbmVkKQotICAgIHsKLSAgICAgICAgaWYgKG1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG1vZGVsR3JvdXAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKHJlZGVmaW5lZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3JlZGVmaW5lZE1vZGVsR3JvdXBzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBtb2RlbCBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnB1dChuYW1lLCBtb2RlbEdyb3VwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX21vZGVsR3JvdXBzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBtb2RlbCBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9tb2RlbEdyb3Vwcy5wdXQobW9kZWxHcm91cC5nZXROYW1lKCksIG1vZGVsR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBhZGRTcGVsbGluZyhtb2RlbEdyb3VwLmdldE5hbWUoKSwgbW9kZWxHcm91cCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYU1vZGVsR3JvdXBbXSlfbW9kZWxHcm91cHMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hTW9kZWxHcm91cFtfbW9kZWxHcm91cHMuc2l6ZSgpXSk7IH0KLSAgICAKLSAgICBTY2hlbWFNb2RlbEdyb3VwW10gcmVkZWZpbmVkTW9kZWxHcm91cHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hTW9kZWxHcm91cFtdKV9yZWRlZmluZWRNb2RlbEdyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFNb2RlbEdyb3VwW19yZWRlZmluZWRNb2RlbEdyb3Vwcy5zaXplKCldKTsgfQotCi0gICAgLyogSURFTlRJVFkgQ09OU1RSQUlOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGZpbmRJZENvbnN0cmFpbnQoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbClfaWRDb25zdHJhaW50cy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRJZENvbnN0cmFpbnQoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpZGMpCi0gICAgewotICAgICAgICBpZiAoaWRjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pZENvbnN0cmFpbnRzLnB1dChpZGMuZ2V0TmFtZSgpLCBpZGMpOwotICAgICAgICAgICAgYWRkU3BlbGxpbmcoaWRjLmdldE5hbWUoKSwgaWRjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSBpZENvbnN0cmFpbnRzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSlfaWRDb25zdHJhaW50cy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW19pZENvbnN0cmFpbnRzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBSRUNVUlNJT04gQVZPSURBTkNFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSAgICBib29sZWFuIGlzUHJvY2Vzc2luZyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9jZXNzaW5nR3JvdXBzLmNvbnRhaW5zKG9iaik7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydFByb2Nlc3NpbmcoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGFzc2VydCghX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKSk7Ci0gICAgICAgIF9wcm9jZXNzaW5nR3JvdXBzLmFkZChvYmopOwotICAgIH0KLQotICAgIHZvaWQgZmluaXNoUHJvY2Vzc2luZyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KF9wcm9jZXNzaW5nR3JvdXBzLmNvbnRhaW5zKG9iaikpOwotICAgICAgICBfcHJvY2Vzc2luZ0dyb3Vwcy5yZW1vdmUob2JqKTsKLSAgICB9Ci0KLSAgICAvKiBKQVZBSVpBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIE1hcCB0eXBlc0J5Q2xhc3NuYW1lKCkKLSAgICAgICAgeyByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF90eXBlc0J5Q2xhc3NuYW1lKTsgfQotCi0gICAgdm9pZCBhZGRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSwgU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7IF90eXBlc0J5Q2xhc3NuYW1lLnB1dChjbGFzc25hbWUsIHR5cGUpOyB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogU3RhY2sgbWFuYWdlbWVudCBpZiAoaGVhdmVuIGhlbHAgdXMpIHdlIGV2ZXIgbmVlZCB0byBkbwotICAgICAqIG5lc3RlZCBjb21waWxhdGlvbiBvZiBzY2hlbWEgdHlwZSBzeXN0ZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3RzY1N0YWNrCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgY3VycmVudDsKLSAgICAgICAgQXJyYXlMaXN0IHN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBTdHNjU3RhdGUgcHVzaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YWNrLmFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgU3RzY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCB2b2lkIHBvcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnQgPSAoU3RzY1N0YXRlKXN0YWNrLmdldChzdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIHN0YWNrLnJlbW92ZShzdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsIHN0c2NTdGFjayA9IG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpIHsgcmV0dXJuIG5ldyBTdHNjU3RhY2soKTsgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0c2NTdGF0ZSBzdGFydCgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTdHNjU3RhY2spc3RzY1N0YWNrLmdldCgpKS5wdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHNjU3RhdGUgZ2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFN0c2NTdGFjaylzdHNjU3RhY2suZ2V0KCkpLmN1cnJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuZCgpCi0gICAgewotICAgICAgICAoKFN0c2NTdGFjaylzdHNjU3RhY2suZ2V0KCkpLnBvcCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9QUkVTRVJWRSA9IGJ1aWxkU3RyaW5nKCJwcmVzZXJ2ZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9SRVBMQUNFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX0NPTExBUFNFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0KLSAgICBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZVtdIEVNUFRZX1NUX0FSUkFZID0gbmV3IFNjaGVtYVR5cGVbMF07Ci0gICAgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUuUmVmW10gRU1QVFlfU1RSRUZfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZS5SZWZbMF07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19OT05FID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIG51bGwsIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTk9ORSA9IG5ldyBib29sZWFuW10KLSAgICAgICAgeyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1dTX0NPTExBUFNFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX1dTID0gbmV3IGJvb2xlYW5bXQotICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlIH07Ci0KLSAgICBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5JT04gPSBGQUNFVFNfTk9ORTsKLSAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19VTklPTiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotICAgIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19MSVNUID0gRkFDRVRTX1dTX0NPTExBUFNFOwotICAgIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX0xJU1QgPSBGSVhFRF9GQUNFVFNfV1M7Ci0KLSAgICBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRfd3NzdHJpbmcoaW50IHdzcikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAod3NyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9QUkVTRVJWRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19SRVBMQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfUkVQTEFDRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19DT0xMQVBTRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX0NPTExBUFNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZFN0cmluZyhTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgaWYgKHN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFN0cmluZ0ltcGwgaSA9IG5ldyBYbWxTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBpLnNldChzdHIpOwotICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdEZvdW5kRXJyb3IoUU5hbWUgaXRlbU5hbWUsIGludCBjb2RlLCBYbWxPYmplY3QgbG9jKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGJhc2ljTWVzc2FnZTsKLQotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJUeXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfUkVGX05PVF9GT1VORDoKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGl0ZW1OYW1lKSArICIgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfUkVGX05PVF9GT1VORDoKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiQXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0Lk1PREVMX0dST1VQX05PVF9GT1VORDoKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX0dST1VQX05PVF9GT1VORDoKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiQXR0cmlidXRlIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LklEQ19OT1RfRk9VTkQ6Ci0gICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIklkZW50aXR5IGNvbnN0cmFpbnQgJyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIicgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIkRlZmluaXRpb24gIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhlbHBmdWxNZXNzYWdlID0gIiI7Ci0gICAgICAgIFNjaGVtYUNvbXBvbmVudCBmb3VuZENvbXBvbmVudCA9IGZpbmRTcGVsbGluZyhpdGVtTmFtZSk7Ci0gICAgICAgIFFOYW1lIG5hbWU7Ci0gICAgICAgIGlmIChmb3VuZENvbXBvbmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gZm91bmRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmb3VuZENvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZSA9ICgoU2NoZW1hVHlwZSlmb3VuZENvbXBvbmVudCkuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lID0gKChTY2hlbWFHbG9iYWxFbGVtZW50KWZvdW5kQ29tcG9uZW50KS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZSA9ICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWZvdW5kQ29tcG9uZW50KS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICIiOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSAiIChpbiAiICsgIHNvdXJjZU5hbWUuc3Vic3RyaW5nKHNvdXJjZU5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEpICsgIikiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoaXRlbU5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmb3VuZENvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgdHlwZSB3aXRoIHRoYXQgbmFtZSIgKyBzb3VyY2UgKyAiPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGVsZW1lbnQgd2l0aCB0aGF0IG5hbWUiICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZSB3aXRoIHRoYXQgbmFtZSIgKyBzb3VyY2UgKyAiPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgYXR0cmlidXRlIGdyb3VwIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIG1vZGVsIGdyb3VwIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG5hbWVkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyBzb3VyY2UgKyAiPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGVsZW1lbnQgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIG1vZGVsIGdyb3VwIG5hbWVkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyBzb3VyY2UgKyAiPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJvcihiYXNpY01lc3NhZ2UgKyBoZWxwZnVsTWVzc2FnZSwgY29kZSwgbG9jKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyB0aGUgInNvdXJjZU5hbWUiICh0byBiZSB1c2VkIHdpdGhpbiB0aGUgc2NoZW1hIHByb2plY3QKLSAgICAgKiBzb3VyY2UgZmlsZSBjb3BpZXMpIGZyb20gdGhlIFVSSSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLgotICAgICAqCi0gICAgICogUmV0dXJucyBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzb3VyY2VOYW1lRm9yVXJpKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylfc291cmNlRm9yVXJpLmdldCh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdob2xlIHNvdXJjZUNvcHlNYXAsIG1hcHBpbmcgVVJJJ3MgdGhhdCBoYXZlCi0gICAgICogYmVlbiByZWFkIHRvICJzb3VyY2VOYW1lIiBsb2NhbCBuYW1lcyB0aGF0IGhhdmUgYmVlbiB1c2VkCi0gICAgICogdG8gdGFnIHRoZSB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIHNvdXJjZUNvcHlNYXAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChfc291cmNlRm9yVXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYmFzZSBVUkkgdG8gdXNlIGZvciBuaWNlIGZpbGVuYW1lcyB3aGVuIHNhdmluZyBzb3VyY2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoVVJJIHVyaSkKLSAgICB7Ci0gICAgICAgIF9iYXNlVVJJID0gdXJpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9KRUNUX1VSTF9QUkVGSVggPSAicHJvamVjdDovL2xvY2FsIjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWxhdGl2aXplKHVyaSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVTYXZlZEZpbGVuYW1lKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gcmVsYXRpdml6ZSh1cmksIHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyB1cmksIGJvb2xlYW4gZm9yU2F2ZWRGaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vIGRlYWwgd2l0aCB0aGluZ3MgdGhhdCBkbyBub3QgbG9vayBsaWtlIGFic29sdXRlIHVyaXMKLSAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9IFBST0pFQ1RfVVJMX1BSRUZJWCArIHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBsb29rcyBsaWtlIGEgVVJMPwotICAgICAgICAgICAgaW50IGNvbG9uID0gdXJpLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChjb2xvbiA8PSAxIHx8ICF1cmkuc3Vic3RyaW5nKDAsIGNvbG9uKS5tYXRjaGVzKCJeXFx3KyQiKSkKLSAgICAgICAgICAgICAgICB1cmkgPSBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyIgKyB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHJlbGF0aXZpemUgYWdhaW5zdCB0aGF0Li4uCi0gICAgICAgIGlmIChfYmFzZVVSSSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVUkkgcmVsYXRpdmUgPSBfYmFzZVVSSS5yZWxhdGl2aXplKG5ldyBVUkkodXJpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGl2ZS5pc0Fic29sdXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gcmVsYXRpdmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFmb3JTYXZlZEZpbGVuYW1lKQotICAgICAgICAgICAgcmV0dXJuIHVyaTsKLQotICAgICAgICBpbnQgbGFzdHNsYXNoID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIFN0cmluZyBkaXIgPSBRTmFtZUhlbHBlci5oZXhzYWZlKGxhc3RzbGFzaCA9PSAtMSA/ICIiIDogdXJpLnN1YnN0cmluZygwLCBsYXN0c2xhc2gpKTsKLSAgICAgICAgcmV0dXJuIGRpciArICIvIiArIHVyaS5zdWJzdHJpbmcobGFzdHNsYXNoICsgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZXMgYW5vdGhlciBVUkkgdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBkdXJpbmcgY29tcGlsYXRpb24KLSAgICAgKiAodGhpcyBpcyB0aGUgVVJJIHRoYXQgaXMgaW4gdGhlIGRvY3VtZW50IC5OQU1FIHByb3BlcnR5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZVVyaShTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZVRvVXNlKQotICAgIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChuYW1lVG9Vc2UgPT0gbnVsbCkKLSAgICAgICAgICAgIG5hbWVUb1VzZSA9IGNvbXB1dGVTYXZlZEZpbGVuYW1lKHVyaSk7Ci0KLSAgICAgICAgX3NvdXJjZUZvclVyaS5wdXQodXJpLCBuYW1lVG9Vc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yIGxpc3RlbmVyIGJlaW5nIGZpbGxlZCBpbiBkdXJpbmcgdGhpcyBjb21waWxhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9yTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lcnJvckxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjaGVtYSB0eXBlIGxvYWRlciB0byB1c2UgZm9yIHByb2Nlc3NpbmcgczRzCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgZ2V0UzRTTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfczRzbG9hZGVyOwotICAgIH0KLQotICAgIE1hcCBfc291cmNlRm9yVXJpID0gbmV3IEhhc2hNYXAoKTsKLSAgICBVUkkgX2Jhc2VVUkkgPSBVUkkuY3JlYXRlKFBST0pFQ1RfVVJMX1BSRUZJWCArICIvIik7Ci0gICAgU2NoZW1hVHlwZUxvYWRlciBfczRzbG9hZGVyID0gWG1sQmVhbnMudHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKFNjaGVtYURvY3VtZW50LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmEyNTcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5SZWRlZmluZURvY3VtZW50LlJlZGVmaW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEludGVnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU3RzY1RyYW5zbGF0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0RMX0FSUkFZVFlQRV9OQU1FID0KLSAgICAgICAgUU5hbWVIZWxwZXIuZm9yTE5TKCJhcnJheVR5cGUiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGxEZWZpbml0aW9ucyhTdHNjSW1wb3J0ZXIuU2NoZW1hVG9Qcm9jZXNzW10gc2NoZW1hc0FuZENoYW1lbGVvbnMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXNBbmRDaGFtZWxlb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRBbGxEZWZpbml0aW9ucygKLSAgICAgICAgICAgICAgICBzY2hlbWFzQW5kQ2hhbWVsZW9uc1tpXS5nZXRTY2hlbWEoKSwKLSAgICAgICAgICAgICAgICBzY2hlbWFzQW5kQ2hhbWVsZW9uc1tpXS5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICBzY2hlbWFzQW5kQ2hhbWVsZW9uc1tpXS5nZXRSZWRlZmluZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGxEZWZpbml0aW9ucyhTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZ2l2ZW5UYXJnZXROYW1lc3BhY2UsIFJlZGVmaW5lIHJlZGVmaW5lKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIC8vIHF1aWNrIGNoZWNrIGZvciBhIGZldyB1bnN1cHBvcnRlZCBmZWF0dXJlcwotCi0gICAgICAgIGlmIChzY2hlbWEuc2l6ZU9mTm90YXRpb25BcnJheSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUud2FybmluZygiU2NoZW1hIDxub3RhdGlvbj4gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHRoaXMgcmVsZWFzZS4iLCBYbWxFcnJvckNvbnRleHQuVU5TVVBQT1JURURfRkVBVFVSRSwgc2NoZW1hLmdldE5vdGF0aW9uQXJyYXkoMCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBmaWd1cmUgbmFtZXNwYWNlICh0YWtpbmcgaW50byBhY2NvdW50IGNoYW1lbGVvbnMpCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gZmFsc2U7Ci0gICAgICAgIGlmIChnaXZlblRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnaXZlblRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgIGNoYW1lbGVvbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIAotICAgICAgICBzdGF0ZS5hZGROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICAvLyBtYWtlIGEgbm90ZSBvZiBhbGwgcmVkZWZpbml0aW9ucwotICAgICAgICBSZWRlZmluaXRpb25Ib2xkZXIgcmVkZWZpbml0aW9ucyA9IG5ldyBSZWRlZmluaXRpb25Ib2xkZXIocmVkZWZpbmUpOwotCi0gICAgICAgIFRvcExldmVsQ29tcGxleFR5cGVbXSBjb21wbGV4VHlwZXMgPSBzY2hlbWEuZ2V0Q29tcGxleFR5cGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBsZXhUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZSByZWRlZiA9IHJlZGVmaW5pdGlvbnMucmVkZWZpbmVDb21wbGV4VHlwZShjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEdsb2JhbFR5cGUodHJhbnNsYXRlR2xvYmFsQ29tcGxleFR5cGUoY29tcGxleFR5cGVzW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgZmFsc2UpLCByZWRlZiAhPSBudWxsKTsKLSAgICAgICAgICAgIGlmIChyZWRlZiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLmFkZEdsb2JhbFR5cGUodHJhbnNsYXRlR2xvYmFsQ29tcGxleFR5cGUocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlW10gc2ltcGxlVHlwZXMgPSBzY2hlbWEuZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2ltcGxlVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcExldmVsU2ltcGxlVHlwZSByZWRlZiA9IHJlZGVmaW5pdGlvbnMucmVkZWZpbmVTaW1wbGVUeXBlKHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5hZGRHbG9iYWxUeXBlKHRyYW5zbGF0ZUdsb2JhbFNpbXBsZVR5cGUoc2ltcGxlVHlwZXNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkR2xvYmFsVHlwZSh0cmFuc2xhdGVHbG9iYWxTaW1wbGVUeXBlKHJlZGVmLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgdHJ1ZSksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRvcExldmVsRWxlbWVudFtdIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgc3RhdGUuYWRkRG9jdW1lbnRUeXBlKHRyYW5zbGF0ZURvY3VtZW50VHlwZShlbGVtZW50LCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiksIFFOYW1lSGVscGVyLmZvckxOUyhlbGVtZW50LmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBzY2hlbWEuZ2V0QXR0cmlidXRlQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVG9wTGV2ZWxBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEF0dHJpYnV0ZVR5cGUodHJhbnNsYXRlQXR0cmlidXRlVHlwZShhdHRyaWJ1dGUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKSwgUU5hbWVIZWxwZXIuZm9yTE5TKGF0dHJpYnV0ZS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTmFtZWRHcm91cFtdIG1vZGVsZ3JvdXBzID0gc2NoZW1hLmdldEdyb3VwQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbGdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZWRHcm91cCByZWRlZiA9IHJlZGVmaW5pdGlvbnMucmVkZWZpbmVNb2RlbEdyb3VwKG1vZGVsZ3JvdXBzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5hZGRNb2RlbEdyb3VwKHRyYW5zbGF0ZU1vZGVsR3JvdXAobW9kZWxncm91cHNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkTW9kZWxHcm91cCh0cmFuc2xhdGVNb2RlbEdyb3VwKHJlZGVmLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgdHJ1ZSksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXBbXSBhdHRyZ3JvdXBzID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyZ3JvdXBzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lZEF0dHJpYnV0ZUdyb3VwIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZUF0dHJpYnV0ZUdyb3VwKGF0dHJncm91cHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEF0dHJpYnV0ZUdyb3VwKHRyYW5zbGF0ZUF0dHJpYnV0ZUdyb3VwKGF0dHJncm91cHNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkQXR0cmlidXRlR3JvdXAodHJhbnNsYXRlQXR0cmlidXRlR3JvdXAocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZWRlZmluaXRpb25zLmNvbXBsYWluQWJvdXRNaXNzaW5nRGVmaW5pdGlvbnMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVkZWZpbml0aW9uSG9sZGVyCi0gICAgewotICAgICAgICAvLyByZWNvcmQgcmVkZWZpbml0aW9ucwotICAgICAgICBwcml2YXRlIE1hcCBzdFJlZGVmaW5pdGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIHByaXZhdGUgTWFwIGN0UmVkZWZpbml0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgcHJpdmF0ZSBNYXAgYWdSZWRlZmluaXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgICAgICBwcml2YXRlIE1hcCBtZ1JlZGVmaW5pdGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gIiI7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCBidWlsZCBzZXQgb2YgcmVkZWZpbmVkIGNvbXBvbmVudHMKLSAgICAgICAgUmVkZWZpbml0aW9uSG9sZGVyKFJlZGVmaW5lIHJlZGVmaW5lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdFJlZGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGN0UmVkZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgYWdSZWRlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICBtZ1JlZGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGlmIChyZWRlZmluZS5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uID0gcmVkZWZpbmUuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUb3BMZXZlbENvbXBsZXhUeXBlW10gY29tcGxleFR5cGVzID0gcmVkZWZpbmUuZ2V0Q29tcGxleFR5cGVBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxleFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0UmVkZWZpbml0aW9ucy5jb250YWluc0tleShjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRHVwbGljYXRlIHR5cGUgcmVkZWZpbml0aW9uOiAiICsgY29tcGxleFR5cGVzW2ldLmdldE5hbWUoKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RSZWRlZmluaXRpb25zLnB1dChjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpLCBjb21wbGV4VHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIFRvcExldmVsU2ltcGxlVHlwZVtdIHNpbXBsZVR5cGVzID0gcmVkZWZpbmUuZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaW1wbGVUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0UmVkZWZpbml0aW9ucy5jb250YWluc0tleShzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UmVkZWZpbml0aW9ucy5wdXQoc2ltcGxlVHlwZXNbaV0uZ2V0TmFtZSgpLCBzaW1wbGVUeXBlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTmFtZWRHcm91cFtdIG1vZGVsZ3JvdXBzID0gcmVkZWZpbmUuZ2V0R3JvdXBBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxncm91cHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZ1JlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRHVwbGljYXRlIHR5cGUgcmVkZWZpbml0aW9uOiAiICsgbW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ1JlZGVmaW5pdGlvbnMucHV0KG1vZGVsZ3JvdXBzW2ldLmdldE5hbWUoKSwgbW9kZWxncm91cHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXBbXSBhdHRyZ3JvdXBzID0gcmVkZWZpbmUuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyZ3JvdXBzW2ldLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWdSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGF0dHJncm91cHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRHVwbGljYXRlIHR5cGUgcmVkZWZpbml0aW9uOiAiICsgYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnUmVkZWZpbml0aW9ucy5wdXQoYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCksIGF0dHJncm91cHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgVG9wTGV2ZWxTaW1wbGVUeXBlIHJlZGVmaW5lU2ltcGxlVHlwZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhc3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChUb3BMZXZlbFNpbXBsZVR5cGUpc3RSZWRlZmluaXRpb25zLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFRvcExldmVsQ29tcGxleFR5cGUgcmVkZWZpbmVDb21wbGV4VHlwZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhY3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChUb3BMZXZlbENvbXBsZXhUeXBlKWN0UmVkZWZpbml0aW9ucy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBOYW1lZEdyb3VwIHJlZGVmaW5lTW9kZWxHcm91cChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhbWdSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChOYW1lZEdyb3VwKW1nUmVkZWZpbml0aW9ucy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBOYW1lZEF0dHJpYnV0ZUdyb3VwIHJlZGVmaW5lQXR0cmlidXRlR3JvdXAoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgIWFnUmVkZWZpbml0aW9ucy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoTmFtZWRBdHRyaWJ1dGVHcm91cClhZ1JlZGVmaW5pdGlvbnMucmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGFpbkFib3V0TWlzc2luZ0RlZmluaXRpb25zKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0UmVkZWZpbml0aW9ucy5pc0VtcHR5KCkgJiYgY3RSZWRlZmluaXRpb25zLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgICAgICAgICBhZ1JlZGVmaW5pdGlvbnMuaXNFbXB0eSgpICYmIG1nUmVkZWZpbml0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0UmVkZWZpbml0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlZGVmaW5lZCBzaW1wbGUgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBub3QgZm91bmQgaW4gIiArIHNjaGVtYUxvY2F0aW9uLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgKFhtbE9iamVjdClzdFJlZGVmaW5pdGlvbnMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY3RSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIGNvbXBsZXggdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBub3QgZm91bmQgaW4gIiArIHNjaGVtYUxvY2F0aW9uLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgKFhtbE9iamVjdCljdFJlZGVmaW5pdGlvbnMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWdSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIGF0dHJpYnV0ZSBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBub3QgZm91bmQgaW4gIiArIHNjaGVtYUxvY2F0aW9uLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgKFhtbE9iamVjdClhZ1JlZGVmaW5pdGlvbnMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWdSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIG1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KW1nUmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRGaWxlbmFtZShYbWxPYmplY3QgeG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHNjU3RhdGUuZ2V0KCkuc291cmNlTmFtZUZvclVyaSh4b2JqLmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZUltcGwgdHJhbnNsYXRlRG9jdW1lbnRUeXBlICggVG9wTGV2ZWxFbGVtZW50IHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uICkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNUeXBlID0gbmV3IFNjaGVtYVR5cGVJbXBsKCBTdHNjU3RhdGUuZ2V0KCkuc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHNUeXBlLnNldERvY3VtZW50VHlwZSh0cnVlKTsKLSAgICAgICAgc1R5cGUuc2V0UGFyc2VDb250ZXh0KCB4c2RUeXBlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgZmFsc2UpOwotICAgICAgICBzVHlwZS5zZXRGaWxlbmFtZSggZmluZEZpbGVuYW1lKCB4c2RUeXBlICkgKTsKLQotICAgICAgICByZXR1cm4gc1R5cGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIHRyYW5zbGF0ZUF0dHJpYnV0ZVR5cGUgKCBUb3BMZXZlbEF0dHJpYnV0ZSB4c2RUeXBlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiApCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZSA9IG5ldyBTY2hlbWFUeXBlSW1wbCggU3RzY1N0YXRlLmdldCgpLnN0cygpICk7Ci0gICAgICAgIAotICAgICAgICBzVHlwZS5zZXRBdHRyaWJ1dGVUeXBlKHRydWUpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoIHhzZFR5cGUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSk7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKCBmaW5kRmlsZW5hbWUoIHhzZFR5cGUgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNUeXBlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlSW1wbCB0cmFuc2xhdGVHbG9iYWxDb21wbGV4VHlwZShUb3BMZXZlbENvbXBsZXhUeXBlIHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0geHNkVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChsb2NhbG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdsb2JhbCB0eXBlIG1pc3NpbmcgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSwgeHNkVHlwZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHVubmFtZWQgdHlwZXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZShsb2NhbG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCB0eXBlIG5hbWUgXCIiICsgbG9jYWxuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkVHlwZS54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCi0gICAgICAgIH0KLQotICAgICAgICBRTmFtZSBuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpc1Jlc2VydmVkVHlwZU5hbWUobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIlNraXBwaW5nIGRlZmluaXRpb24gb2YgYnVpbHQtaW4gdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuUkVTRVJWRURfVFlQRV9OQU1FLCB4c2RUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiUmVjb3JkaW5nIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGUgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoeHNkVHlwZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbik7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKGZpbmRGaWxlbmFtZSh4c2RUeXBlKSk7Ci0gICAgICAgIHNUeXBlLnNldE5hbWUoUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlSW1wbCB0cmFuc2xhdGVHbG9iYWxTaW1wbGVUeXBlKFRvcExldmVsU2ltcGxlVHlwZSB4c2RUeXBlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgYm9vbGVhbiByZWRlZmluaXRpb24pCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IHhzZFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobG9jYWxuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJHbG9iYWwgdHlwZSBtaXNzaW5nIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5HTE9CQUxfVFlQRV9NSVNTSU5HX05BTUUsIHhzZFR5cGUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB1bm5hbWVkIHR5cGVzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUobG9jYWxuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkludmFsaWQgdHlwZSBuYW1lIFwiIiArIGxvY2FsbmFtZSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZFR5cGUueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBRTmFtZSBuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKGxvY2FsbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpc1Jlc2VydmVkVHlwZU5hbWUobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIlNraXBwaW5nIGRlZmluaXRpb24gb2YgYnVpbHQtaW4gdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuUkVTRVJWRURfVFlQRV9OQU1FLCB4c2RUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiUmVjb3JkaW5nIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGUgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICBzVHlwZS5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoeHNkVHlwZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbik7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKGZpbmRGaWxlbmFtZSh4c2RUeXBlKSk7Ci0gICAgICAgIHNUeXBlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRm9ybUNob2ljZSBmaW5kRWxlbWVudEZvcm1EZWZhdWx0KFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gb2JqLm5ld0N1cnNvcigpOwotICAgICAgICB3aGlsZSAoY3VyLmdldE9iamVjdCgpLnNjaGVtYVR5cGUoKSAhPSBTY2hlbWEudHlwZSkKLSAgICAgICAgICAgIGlmICghY3VyLnRvUGFyZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoKFNjaGVtYSljdXIuZ2V0T2JqZWN0KCkpLnhnZXRFbGVtZW50Rm9ybURlZmF1bHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXJpTWF0Y2goU3RyaW5nIHMxLCBTdHJpbmcgczIpCi0gICAgewotICAgICAgICBpZiAoczEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzMiA9PSBudWxsIHx8IHMyLmVxdWFscygiIik7Ci0gICAgICAgIGlmIChzMiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHMxLmVxdWFscygiIik7Ci0gICAgICAgIHJldHVybiBzMS5lcXVhbHMoczIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5R2xvYmFsRWxlbWVudFRvTG9jYWxFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnQgcmVmZXJlbmNlZCwgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCB0YXJnZXQgKQotICAgIHsKLQotICAgICAgICB0YXJnZXQuc2V0TmFtZUFuZFR5cGVSZWYocmVmZXJlbmNlZC5nZXROYW1lKCksIHJlZmVyZW5jZWQuZ2V0VHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgdGFyZ2V0LnNldE5pbGxhYmxlKHJlZmVyZW5jZWQuaXNOaWxsYWJsZSgpKTsKLSAgICAgICAgdGFyZ2V0LnNldERlZmF1bHQocmVmZXJlbmNlZC5nZXREZWZhdWx0VGV4dCgpLCByZWZlcmVuY2VkLmlzRml4ZWQoKSwgKChTY2hlbWFHbG9iYWxFbGVtZW50SW1wbClyZWZlcmVuY2VkKS5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgdGFyZ2V0LnNldElkZW50aXR5Q29uc3RyYWludHMoKChTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKXJlZmVyZW5jZWQpLmdldElkZW50aXR5Q29uc3RyYWludFJlZnMoKSk7Ci0gICAgICAgIHRhcmdldC5zZXRCbG9jayhyZWZlcmVuY2VkLmJsb2NrRXh0ZW5zaW9uKCksICByZWZlcmVuY2VkLmJsb2NrUmVzdHJpY3Rpb24oKSwgIHJlZmVyZW5jZWQuYmxvY2tTdWJzdGl0dXRpb24oKSk7Ci0gICAgICAgIHRhcmdldC5zZXRBYnN0cmFjdChyZWZlcmVuY2VkLmlzQWJzdHJhY3QoKSk7Ci0gICAgICAgIHRhcmdldC5zZXRUcmFuc2l0aW9uUnVsZXMoKChTY2hlbWFQYXJ0aWNsZSlyZWZlcmVuY2VkKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSwKLSAgICAgICAgICAgICgoU2NoZW1hUGFydGljbGUpcmVmZXJlbmNlZCkuaXNTa2lwcGFibGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlHbG9iYWxBdHRyaWJ1dGVUb0xvY2FsQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgcmVmZXJlbmNlZCwgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHRhcmdldCApCi0gICAgewotICAgICAgICB0YXJnZXQuaW5pdCgKLSAgICAgICAgICAgIHJlZmVyZW5jZWQuZ2V0TmFtZSgpLCByZWZlcmVuY2VkLmdldFR5cGVSZWYoKSwgcmVmZXJlbmNlZC5nZXRVc2UoKSwKLSAgICAgICAgICAgIHJlZmVyZW5jZWQuZ2V0RGVmYXVsdFRleHQoKSwKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VkLmdldFBhcnNlT2JqZWN0KCksIHJlZmVyZW5jZWQuX2RlZmF1bHRWYWx1ZSwKLSAgICAgICAgICAgIHJlZmVyZW5jZWQuaXNGaXhlZCgpLAotICAgICAgICAgICAgcmVmZXJlbmNlZC5nZXRXU0RMQXJyYXlUeXBlKCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIGEgbG9jYWwgb3IgZ2xvYmFsIHNjaGVtYSBlbGVtZW50LgotICAgICAqLwotICAgIC8vIGNoZWNrIHJ1bGUgMy4zLjMKLSAgICAvLyBodHRwOi8vd3d3LnczYy5vcmcvVFIvI3NlY3Rpb24tQ29uc3RyYWludHMtb24tWE1MLVJlcHJlc2VudGF0aW9ucy1vZi1FbGVtZW50LURlY2xhcmF0aW9ucwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCB0cmFuc2xhdGVFbGVtZW50KAotICAgICAgICBFbGVtZW50IHhzZEVsdCwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sCi0gICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMsIFNjaGVtYVR5cGUgb3V0ZXJUeXBlKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNnSGVhZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gdHJhbnNsYXRlIHNnIGhlYWQKLSAgICAgICAgaWYgKHhzZEVsdC5pc1NldFN1YnN0aXR1dGlvbkdyb3VwKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNnSGVhZCA9IHN0YXRlLmZpbmREb2N1bWVudFR5cGUoeHNkRWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksCi0gICAgICAgICAgICAgICAgKChTY2hlbWFUeXBlSW1wbClvdXRlclR5cGUpLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNnSGVhZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZShzZ0hlYWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB4c2RFbHQuZ2V0TmFtZSgpOwotICAgICAgICBRTmFtZSByZWYgPSB4c2RFbHQuZ2V0UmVmKCk7Ci0KLQotICAgICAgICBpZiAocmVmICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiAobmFtZS5lcXVhbHMocmVmLmdldExvY2FsUGFydCgpKSAmJiB1cmlNYXRjaCh0YXJnZXROYW1lc3BhY2UsIHJlZi5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgICAvLyAgICAgc3RhdGUud2FybmluZygiRWxlbWVudCAiICsgbmFtZSArICIgc3BlY2lmaWVzIGJvdGggYSByZWYgYW5kIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX0VYVFJBX1JFRiwgeHNkRWx0LnhnZXRSZWYoKSk7Ci0gICAgICAgICAgICAvLyBlbHNlCi0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEVsdC54Z2V0UmVmKCkpOwotICAgICAgICAgICAgLy8gaWdub3JlIG5hbWUKLSAgICAgICAgICAgIG5hbWUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50IGhhcyBubyBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfTUlTU0lOR19OQU1FLCB4c2RFbHQpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkludmFsaWQgZWxlbWVudCBuYW1lIFwiIiArIG5hbWUgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RFbHQueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkRWx0LmdldFR5cGUoKSAhPSBudWxsIHx8IHhzZEVsdC5nZXRTaW1wbGVUeXBlKCkgIT0gbnVsbCB8fCB4c2RFbHQuZ2V0Q29tcGxleFR5cGUoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50IHJlZmVyZW5jZSBjYW5ub3QgYWxzbyBzcGVjaWZ5IGEgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHhzZEVsdC5nZXRGb3JtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCByZWZlcmVuY2UgY2Fubm90IGFsc28gc3BlY2lmeSBmb3JtIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LnNpemVPZktleUFycmF5KCkgPiAwIHx8IHhzZEVsdC5zaXplT2ZLZXlyZWZBcnJheSgpID4gMCB8fCB4c2RFbHQuc2l6ZU9mVW5pcXVlQXJyYXkoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUud2FybmluZygiRWxlbWVudCByZWZlcmVuY2UgY2Fubm90IGFsc28gY29udGFpbiBrZXksIGtleXJlZiwgb3IgdW5pcXVlIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4c2RFbHQuaXNTZXREZWZhdWx0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUud2FybmluZygiRWxlbWVudCB3aXRoIHJlZmVyZW5jZSB0byAnIiArIHJlZi5nZXRMb2NhbFBhcnQoKSArICInIGNhbm5vdCBhbHNvIHNwZWNpZnkgZGVmYXVsdCIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LmlzU2V0Rml4ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBmaXhlZCIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LmlzU2V0QmxvY2soKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBibG9jayIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkRWx0LmlzU2V0TmlsbGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBuaWxsYWJsZSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQoeHNkRWx0IGluc3RhbmNlb2YgTG9jYWxFbGVtZW50KTsKLSAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgcmVmZXJlbmNlZCA9IHN0YXRlLmZpbmRHbG9iYWxFbGVtZW50KHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocmVmLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5ELCB4c2RFbHQueGdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCB0YXJnZXQgPSBuZXcgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCgpOwotICAgICAgICAgICAgdGFyZ2V0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICAgICAgICAgIGNvcHlHbG9iYWxFbGVtZW50VG9Mb2NhbEVsZW1lbnQoIHJlZmVyZW5jZWQsIHRhcmdldCApOwotICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIHFuYW1lOwotICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGltcGw7Ci0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBudWxsOwotCi0gICAgICAgIGlmICh4c2RFbHQgaW5zdGFuY2VvZiBMb2NhbEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGltcGwgPSBuZXcgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCgpOwotICAgICAgICAgICAgRm9ybUNob2ljZSBmb3JtID0geHNkRWx0LnhnZXRGb3JtKCk7Ci0gICAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGZvcm0gPSBmaW5kRWxlbWVudEZvcm1EZWZhdWx0KHhzZEVsdCk7Ci0gICAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsIHx8IGZvcm0uZ2V0U3RyaW5nVmFsdWUoKS5lcXVhbHMoInVucXVhbGlmaWVkIikpCi0gICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTihuYW1lKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZ2VsdCA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgICAgICBpbXBsID0gZ2VsdDsKLQotICAgICAgICAgICAgLy8gU2V0IHN1YnN0IGdyb3VwIGhlYWQKLSAgICAgICAgICAgIGlmIChzZ0hlYWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBoZWFkID0gc3RhdGUuZmluZEdsb2JhbEVsZW1lbnQoeHNkRWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGdlbHQuc2V0U3Vic3RpdHV0aW9uR3JvdXAoaGVhZC5nZXRSZWYoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCBzdWJzdCBncm91cCBtZW1iZXJzCi0gICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgZG9jVHlwZSA9IChTY2hlbWFUeXBlSW1wbClvdXRlclR5cGU7Ci0KLSAgICAgICAgICAgIFFOYW1lW10gc2dNZW1iZXJzID0gZG9jVHlwZS5nZXRTdWJzdGl0dXRpb25Hcm91cE1lbWJlcnMoKTsKLSAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciB0cmFuc2l0aW9uUnVsZXMgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICB0cmFuc2l0aW9uUnVsZXMuYWRkKHFuYW1lKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2dNZW1iZXJzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZWx0LmFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKHNnTWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgdHJhbnNpdGlvblJ1bGVzLmFkZChzZ01lbWJlcnNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbXBsLnNldFRyYW5zaXRpb25SdWxlcyhRTmFtZVNldC5mb3JTcGVjaWZpY2F0aW9uKHRyYW5zaXRpb25SdWxlcyksIGZhbHNlKTsKLSAgICAgICAgICAgIGltcGwuc2V0VHJhbnNpdGlvbk5vdGVzKFFOYW1lU2V0LkVNUFRZLCB0cnVlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmaW5hbEV4dCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmaW5hbFJlc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIE9iamVjdCBkcyA9IHhzZEVsdC5nZXRGaW5hbCgpOwotICAgICAgICAgICAgaWYgKGRzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzIGluc3RhbmNlb2YgU3RyaW5nICYmIGRzLmVxdWFscygiI2FsbCIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBmaW5hbEV4dCA9IGZpbmFsUmVzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJleHRlbnNpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoInJlc3RyaWN0aW9uIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFJlc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2VsdC5zZXRGaW5hbChmaW5hbEV4dCwgZmluYWxSZXN0KTsKLSAgICAgICAgICAgIGdlbHQuc2V0QWJzdHJhY3QoeHNkRWx0LmdldEFic3RyYWN0KCkpOwotICAgICAgICAgICAgZ2VsdC5zZXRGaWxlbmFtZShmaW5kRmlsZW5hbWUoeHNkRWx0KSk7Ci0gICAgICAgICAgICBnZWx0LnNldFBhcnNlQ29udGV4dCh4c2RFbHQsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4c2RFbHQuZ2V0VHlwZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUoeHNkRWx0LmdldFR5cGUoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCApOwotICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcih4c2RFbHQuZ2V0VHlwZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHhzZEVsdC54Z2V0VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2ltcGxlVHlwZWRlZiA9IGZhbHNlOwotICAgICAgICBYbWxPYmplY3QgdHlwZWRlZiA9IHhzZEVsdC5nZXRDb21wbGV4VHlwZSgpOwotICAgICAgICBpZiAodHlwZWRlZiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlZGVmID0geHNkRWx0LmdldFNpbXBsZVR5cGUoKTsKLSAgICAgICAgICAgIHNpbXBsZVR5cGVkZWYgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChzVHlwZSAhPSBudWxsKSAmJiB0eXBlZGVmICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIHRvIGRlZmluZSBhIG5lc3RlZCB0eXBlIHdoZW4gYSB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX05FU1RFRF9UWVBFLCB0eXBlZGVmKTsKLSAgICAgICAgICAgIHR5cGVkZWYgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVkZWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGVJbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgIHNUeXBlID0gc1R5cGVJbXBsOwotICAgICAgICAgICAgc1R5cGVJbXBsLnNldENvbnRhaW5lckZpZWxkKGltcGwpOwotICAgICAgICAgICAgc1R5cGVJbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihvdXRlclR5cGUgPT0gbnVsbCA/IG51bGwgOiBvdXRlclR5cGUuZ2V0UmVmKCkpOwotICAgICAgICAgICAgLy8gbGVhdmUgdGhlIGFub255bW91cyB0eXBlIHVucmVzb2x2ZWQ6IGl0IHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgICAgICAgICBhbm9ueW1vdXNUeXBlcy5hZGQoc1R5cGUpOwotICAgICAgICAgICAgc1R5cGVJbXBsLnNldFNpbXBsZVR5cGUoc2ltcGxlVHlwZWRlZik7Ci0gICAgICAgICAgICBzVHlwZUltcGwuc2V0UGFyc2VDb250ZXh0KHR5cGVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdHlwZSBtYXkgaW5oZXJpdCBmcm9tIHN1YnN0aXR1dGlvbiBncm91cCBoZWFkCi0gICAgICAgICAgICBpZiAoc2dIZWFkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBoZWFkID0gc3RhdGUuZmluZEdsb2JhbEVsZW1lbnQoeHNkRWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gQnVnIC0gRG8gSSBuZWVkIHRvIGNvcHkgdGhlIHR5cGUgaWYgaXQncyBhbm9ueW1vdXM/Ci0gICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBkb2VzIG5vdCBleGlzdCwgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZAotICAgICAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNUeXBlID0gaGVhZC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEU7Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSB3YXQgPSBudWxsOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHhzZEVsdC5uZXdDdXJzb3IoKTsKLSAgICAgICAgU3RyaW5nIGFycmF5VHlwZSA9IGMuZ2V0QXR0cmlidXRlVGV4dChXU0RMX0FSUkFZVFlQRV9OQU1FKTsKLSAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd2F0ID0gbmV3IFNPQVBBcnJheVR5cGUoYXJyYXlUeXBlLCBuZXcgTmFtZXNwYWNlQ29udGV4dCh4c2RFbHQpKTsKLSAgICAgICAgfQotICAgICAgICBpbXBsLnNldFdzZGxBcnJheVR5cGUod2F0KTsKLQotICAgICAgICBib29sZWFuIGlzRml4ZWQgPSB4c2RFbHQuaXNTZXRGaXhlZCgpOwotICAgICAgICBpZiAoeHNkRWx0LmlzU2V0RGVmYXVsdCgpICYmIGlzRml4ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJTaG91bGQgbm90IHNldCBib3RoIGRlZmF1bHQgYW5kIGZpeGVkIG9uIHRoZSBzYW1lIGVsZW1lbnQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQsIHhzZEVsdC54Z2V0Rml4ZWQoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIGZpeGVkCi0gICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW1wbC5zZXRQYXJ0aWNsZVR5cGUoU2NoZW1hUGFydGljbGUuRUxFTUVOVCk7Ci0gICAgICAgIGltcGwuc2V0TmFtZUFuZFR5cGVSZWYocW5hbWUsIHNUeXBlLmdldFJlZigpKTsKLSAgICAgICAgaW1wbC5zZXROaWxsYWJsZSh4c2RFbHQuZ2V0TmlsbGFibGUoKSk7Ci0gICAgICAgIGltcGwuc2V0RGVmYXVsdChpc0ZpeGVkID8geHNkRWx0LmdldEZpeGVkKCkgOiB4c2RFbHQuZ2V0RGVmYXVsdCgpLCBpc0ZpeGVkLCB4c2RFbHQpOwotCi0gICAgICAgIE9iamVjdCBibG9jayA9IHhzZEVsdC5nZXRCbG9jaygpOwotICAgICAgICBib29sZWFuIGJsb2NrRXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYmxvY2tSZXN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYmxvY2tTdWJzdCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChibG9jayAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBTdHJpbmcgJiYgYmxvY2suZXF1YWxzKCIjYWxsIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQotICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gYmxvY2tSZXN0ID0gYmxvY2tTdWJzdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChibG9jayBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoImV4dGVuc2lvbiIpKQotICAgICAgICAgICAgICAgICAgICBibG9ja0V4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoInJlc3RyaWN0aW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrUmVzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoInN1YnN0aXR1dGlvbiIpKQotICAgICAgICAgICAgICAgICAgICBibG9ja1N1YnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW1wbC5zZXRCbG9jayhibG9ja0V4dCwgYmxvY2tSZXN0LCBibG9ja1N1YnN0KTsKLQotICAgICAgICBib29sZWFuIGNvbnN0cmFpbnRGYWlsZWQgPSBmYWxzZTsKLQotICAgICAgICAvLyBUcmFuc2xhdGUgSWRlbnRpdHkgY29uc3RyYWludHMKLQotICAgICAgICBpbnQgbGVuZ3RoID0geHNkRWx0LnNpemVPZktleUFycmF5KCkgKyB4c2RFbHQuc2l6ZU9mS2V5cmVmQXJyYXkoKSArIHhzZEVsdC5zaXplT2ZVbmlxdWVBcnJheSgpOwotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW10gY29uc3RyYWludHMgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbFtsZW5ndGhdOwotICAgICAgICBpbnQgY3VyID0gMDsKLQotICAgICAgICAvLyBIYW5kbGUga2V5IGNvbnN0cmFpbnRzCi0gICAgICAgIEtleWJhc2VbXSBrZXlzID0geHNkRWx0LmdldEtleUFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGtleXMubGVuZ3RoIDsgaSsrLCBjdXIrKykgewotICAgICAgICAgICAgY29uc3RyYWludHNbY3VyXSA9IHRyYW5zbGF0ZUlkZW50aXR5Q29uc3RyYWludChrZXlzW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludHNbY3VyXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0uc2V0Q29uc3RyYWludENhdGVnb3J5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRGYWlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIHVuaXF1ZSBjb25zdHJhaW50cwotICAgICAgICBLZXliYXNlW10gdWMgPSB4c2RFbHQuZ2V0VW5pcXVlQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdWMubGVuZ3RoIDsgaSsrLCBjdXIrKykgewotICAgICAgICAgICAgY29uc3RyYWludHNbY3VyXSA9IHRyYW5zbGF0ZUlkZW50aXR5Q29uc3RyYWludCh1Y1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzW2N1cl0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdLnNldENvbnN0cmFpbnRDYXRlZ29yeShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfVU5JUVVFKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50RmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBrZXlyZWYgY29uc3RyYWludHMKLSAgICAgICAgS2V5cmVmRG9jdW1lbnQuS2V5cmVmW10ga3JzID0geHNkRWx0LmdldEtleXJlZkFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGtycy5sZW5ndGggOyBpKyssIGN1cisrKSB7Ci0gICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdID0gdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KGtyc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzW2N1cl0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdLnNldENvbnN0cmFpbnRDYXRlZ29yeShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50RmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29uc3RyYWludEZhaWxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIHJlZnMgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltsZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVmcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgcmVmc1tpXSA9IGNvbnN0cmFpbnRzW2ldLmdldFJlZigpOwotCi0gICAgICAgICAgICBpbXBsLnNldElkZW50aXR5Q29uc3RyYWludHMocmVmcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW1wbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlc3BhY2UoU3RyaW5nIHhwYXRoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhwYXRoLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB4cGF0aC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoWE1MQ2hhci5pc1NwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uIFhQQVRIX1JFR0VYUCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24oIihcXC4vLyk/KCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pLykqKCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pfCgoYXR0cmlidXRlOjp8QCkoKFxcaVxcYyo6KT8oXFxpXFxjKnxcXCopKSkpKFxcfChcXC4vLyk/KCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pLykqKCgoKGNoaWxkOjopPygoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKXxcXC4pfCgoYXR0cmlidXRlOjp8QCkoKFxcaVxcYyo6KT8oXFxpXFxjKnxcXCopKSkpKSoiLCAiWCIpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tYUGF0aFN5bnRheChTdHJpbmcgeHBhdGgpCi0gICAgewotICAgICAgICBpZiAoeHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN0cmlwIHdoaXRlc3BhY2UgZnJvbSB4cGF0aAotICAgICAgICB4cGF0aCA9IHJlbW92ZVdoaXRlc3BhY2UoeHBhdGgpOwotICAgICAgICAKLSAgICAgICAgLy8gYXBwbHkgcmVnZXhwCi0gICAgICAgIHN5bmNocm9uaXplZCAoWFBBVEhfUkVHRVhQKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFhQQVRIX1JFR0VYUC5tYXRjaGVzKHhwYXRoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIHRyYW5zbGF0ZUlkZW50aXR5Q29uc3RyYWludChLZXliYXNlIHBhcnNlSUMsIAotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0IGRvIHNvbWUgY2hlY2tpbmcKLSAgICAgICAgU3RyaW5nIHNlbGVjdG9yID0gcGFyc2VJQy5nZXRTZWxlY3RvcigpID09IG51bGwgPyBudWxsIDogcGFyc2VJQy5nZXRTZWxlY3RvcigpLmdldFhwYXRoKCk7Ci0gICAgICAgIGlmICghY2hlY2tYUGF0aFN5bnRheChzZWxlY3RvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW52YWxpZCB4cGF0aCBpbiBzZWxlY3Rvci4iLAotICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5YUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFLCBwYXJzZUlDLmdldFNlbGVjdG9yKCkueGdldFhwYXRoKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpZWxkRG9jdW1lbnQuRmllbGRbXSBmaWVsZEVsdHMgPSBwYXJzZUlDLmdldEZpZWxkQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWVsZEVsdHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hlY2tYUGF0aFN5bnRheChmaWVsZEVsdHNbal0uZ2V0WHBhdGgoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbnZhbGlkIHhwYXRoIGluIGZpZWxkLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5YUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFLCBmaWVsZEVsdHNbal0ueGdldFhwYXRoKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB0aGVuIHRyYW5zbGF0ZS4KLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpYyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgaWMuc2V0TmFtZShRTmFtZUhlbHBlci5mb3JMTlMocGFyc2VJQy5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSkpOwotICAgICAgICBpYy5zZXRTZWxlY3RvcihwYXJzZUlDLmdldFNlbGVjdG9yKCkuZ2V0WHBhdGgoKSk7Ci0gICAgICAgIGljLnNldFBhcnNlQ29udGV4dChwYXJzZUlDLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBucyBtYXAKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBwYXJzZUlDLm5ld0N1cnNvcigpOwotICAgICAgICBNYXAgbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGMuZ2V0QWxsTmFtZXNwYWNlcyhuc01hcCk7Ci0gICAgICAgIG5zTWFwLnJlbW92ZSgiIik7IC8vIFJlbW92ZSB0aGUgZGVmYXVsdCBtYXBwaW5nLiBUaGlzIGNhbm5vdCBiZSB1c2VkIGJ5IHRoZSB4cGF0aCBleHByZXNzaW9ucy4KLSAgICAgICAgaWMuc2V0TlNNYXAobnNNYXApOwotICAgICAgICBjLmRpc3Bvc2UoKTsKLQotICAgICAgICBTdHJpbmdbXSBmaWVsZHMgPSBuZXcgU3RyaW5nW2ZpZWxkRWx0cy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBmaWVsZHMubGVuZ3RoIDsgaisrKQotICAgICAgICAgICAgZmllbGRzW2pdID0gZmllbGRFbHRzW2pdLmdldFhwYXRoKCk7Ci0gICAgICAgIGljLnNldEZpZWxkcyhmaWVsZHMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpYy5idWlsZFBhdGhzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkludmFsaWQgeHBhdGggaW4gaWRlbnRpdHkgY29uc3RyYWludDogIiArIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5YUEFUSF9DT01QSUxBVElPTl9GQUlMVVJFLCBwYXJzZUlDKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5hZGRJZENvbnN0cmFpbnQoaWMpOwotCi0gICAgICAgIHJldHVybiBpYzsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hTW9kZWxHcm91cEltcGwgdHJhbnNsYXRlTW9kZWxHcm91cChOYW1lZEdyb3VwIG5hbWVkR3JvdXAsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiTW9kZWwgZ3JvdXBzIG11c3QgYmUgbmFtZWQiLCBYbWxFcnJvckNvbnRleHQuTU9ERUxfR1JPVVBfTUlTU0lOR19OQU1FLCBuYW1lZEdyb3VwKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwSW1wbChTdHNjU3RhdGUuZ2V0KCkuc3RzKCkpOwotICAgICAgICByZXN1bHQuaW5pdChRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbiwgbmFtZWRHcm91cCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgdHJhbnNsYXRlQXR0cmlidXRlR3JvdXAoQXR0cmlidXRlR3JvdXAgYXR0ckdyb3VwLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgYm9vbGVhbiByZWRlZmluaXRpb24pCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQXR0cmlidXRlIGdyb3VwcyBtdXN0IGJlIG5hbWVkIiwgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9HUk9VUF9NSVNTSU5HX05BTUUsIGF0dHJHcm91cCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbChTdHNjU3RhdGUuZ2V0KCkuc3RzKCkpOwotICAgICAgICByZXN1bHQuaW5pdChRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHJlZGVmaW5pdGlvbiwgYXR0ckdyb3VwKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRm9ybUNob2ljZSBmaW5kQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXIgPSBvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHdoaWxlIChjdXIuZ2V0T2JqZWN0KCkuc2NoZW1hVHlwZSgpICE9IFNjaGVtYS50eXBlKQotICAgICAgICAgICAgaWYgKCFjdXIudG9QYXJlbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuICgoU2NoZW1hKWN1ci5nZXRPYmplY3QoKSkueGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCB0cmFuc2xhdGVBdHRyaWJ1dGUoCi0gICAgICAgIEF0dHJpYnV0ZSB4c2RBdHRyLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgTGlzdCBhbm9ueW1vdXNUeXBlcywKLSAgICAgICAgU2NoZW1hVHlwZSBvdXRlclR5cGUsIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGJhc2VNb2RlbCwgYm9vbGVhbiBsb2NhbCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHhzZEF0dHIuZ2V0TmFtZSgpOwotICAgICAgICBRTmFtZSByZWYgPSB4c2RBdHRyLmdldFJlZigpOwotCi0gICAgICAgIGlmIChyZWYgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWYuZ2V0TG9jYWxQYXJ0KCkpICYmIHVyaU1hdGNoKHRhcmdldE5hbWVzcGFjZSwgcmVmLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJBdHRyaWJ1dGUgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEF0dHIueGdldFJlZigpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlICIgKyBuYW1lICsgIiBzcGVjaWZpZXMgYm90aCBhIHJlZiBhbmQgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfRVhUUkFfUkVGLCB4c2RBdHRyLnhnZXRSZWYoKSk7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbmFtZQotICAgICAgICAgICAgbmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlZiA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSBoYXMgbm8gbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX01JU1NJTkdfTkFNRSwgeHNkQXR0cik7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCBhdHRyaWJ1dGUgbmFtZSBcIiIgKyBuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkQXR0ci54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCi0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGRlZnRleHQgPSBudWxsOwotICAgICAgICBRTmFtZSBxbmFtZTsKLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHNBdHRyOwotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gbnVsbDsKLSAgICAgICAgaW50IHVzZSA9IFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMOwotCi0gICAgICAgIGlmIChsb2NhbCkKLSAgICAgICAgICAgIHNBdHRyID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNBdHRyID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKXNBdHRyKS5zZXRQYXJzZUNvbnRleHQoeHNkQXR0ciwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkQXR0ci5nZXRUeXBlKCkgIT0gbnVsbCB8fCB4c2RBdHRyLmdldFNpbXBsZVR5cGUoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgcmVmZXJlbmNlIGNhbm5vdCBhbHNvIHNwZWNpZnkgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEF0dHIpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdHlwZSwgc2ltcGxlVHlwZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHNkQXR0ci5nZXRGb3JtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIHJlZmVyZW5jZSBjYW5ub3QgYWxzbyBzcGVjaWZ5IGZvcm0iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIGZvcm0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlIHJlZmVyZW5jZWQgPSBzdGF0ZS5maW5kR2xvYmFsQXR0cmlidXRlKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocmVmLCBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX1JFRl9OT1RfRk9VTkQsIHhzZEF0dHIueGdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxbmFtZSA9IHJlZjsKLSAgICAgICAgICAgIHVzZSA9IHJlZmVyZW5jZWQuZ2V0VXNlKCk7Ci0gICAgICAgICAgICBzVHlwZSA9IHJlZmVyZW5jZWQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgZGVmdGV4dCA9IHJlZmVyZW5jZWQuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAgICAgICAgIGlmIChkZWZ0ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNGaXhlZCA9IHJlZmVyZW5jZWQuaXNGaXhlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvY2FsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZvcm1DaG9pY2UgZm9ybSA9IHhzZEF0dHIueGdldEZvcm0oKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBmb3JtID0gZmluZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KHhzZEF0dHIpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwgfHwgZm9ybS5nZXRTdHJpbmdWYWx1ZSgpLmVxdWFscygidW5xdWFsaWZpZWQiKSkKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTihuYW1lKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKG5hbWUsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHhzZEF0dHIuZ2V0VHlwZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc1R5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZSh4c2RBdHRyLmdldFR5cGUoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCApOwotICAgICAgICAgICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHhzZEF0dHIuZ2V0VHlwZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHhzZEF0dHIueGdldFR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgbmFtZXNwYWNlIGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkQXR0ci54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgJiYgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJ4bWxucyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIG5hbWUgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyLnhnZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBYbWxPYmplY3QgdHlwZWRlZiA9IHhzZEF0dHIuZ2V0U2ltcGxlVHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoKHNUeXBlICE9IG51bGwpICYmIHR5cGVkZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSWxsZWdhbCB0byBkZWZpbmUgYSBuZXN0ZWQgdHlwZSB3aGVuIGEgdHlwZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9ORVNURURfVFlQRSwgdHlwZWRlZik7Ci0gICAgICAgICAgICAgICAgdHlwZWRlZiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlZGVmICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGVJbXBsID0gbmV3IFNjaGVtYVR5cGVJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgICAgICBzVHlwZSA9IHNUeXBlSW1wbDsKLSAgICAgICAgICAgICAgICBzVHlwZUltcGwuc2V0Q29udGFpbmVyRmllbGQoc0F0dHIpOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYob3V0ZXJUeXBlID09IG51bGwgPyBudWxsIDogb3V0ZXJUeXBlLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAvLyBsZWF2ZSB0aGUgYW5vbnltb3VzIHR5cGUgdW5yZXNvbHZlZDogaXQgd2lsbCBiZSByZXNvbHZlZCBsYXRlci4KLSAgICAgICAgICAgICAgICBhbm9ueW1vdXNUeXBlcy5hZGQoc1R5cGUpOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRQYXJzZUNvbnRleHQodHlwZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwgJiYgYmFzZU1vZGVsICE9IG51bGwgJiYgYmFzZU1vZGVsLmdldEF0dHJpYnV0ZShxbmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzVHlwZSA9IGJhc2VNb2RlbC5nZXRBdHRyaWJ1dGUocW5hbWUpLmdldFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgc1R5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotCi0gICAgICAgIGlmICghc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIHNpbXBsZSB0eXBlIChub3QgY29tcGxleCkuIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfU0NIRU1BLCB4c2RBdHRyKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBzd2l0Y2ggdG8gdGhlIGFueS10eXBlCi0gICAgICAgICAgICBzVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh4c2RBdHRyLmlzU2V0VXNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzZSA9IHRyYW5zbGF0ZVVzZUNvZGUoeHNkQXR0ci54Z2V0VXNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZ25vcmUgcmVmZXJlbmNlZCBkZWZhdWx0IGlmIG5vIGxvbmdlciBvcHRpb25hbAotICAgICAgICAgICAgaWYgKHVzZSAhPSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTCAmJiAhaXNGaXhlZCkKLSAgICAgICAgICAgICAgICBkZWZ0ZXh0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHhzZEF0dHIuaXNTZXREZWZhdWx0KCkgfHwgeHNkQXR0ci5pc1NldEZpeGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0ZpeGVkICYmICF4c2RBdHRyLmlzU2V0Rml4ZWQoKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB1c2Ugb2YgYSBmaXhlZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBtdXN0IGFsc28gYmUgZml4ZWQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQsIHhzZEF0dHIueGdldEZpeGVkKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpc0ZpeGVkID0geHNkQXR0ci5pc1NldEZpeGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4c2RBdHRyLmlzU2V0RGVmYXVsdCgpICYmIGlzRml4ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNob3VsZCBub3Qgc2V0IGJvdGggZGVmYXVsdCBhbmQgZml4ZWQgb24gdGhlIHNhbWUgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9ERUZBVUxUX0ZJWEVELCB4c2RBdHRyLnhnZXRGaXhlZCgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIGZpeGVkCi0gICAgICAgICAgICAgICAgaXNGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmdGV4dCA9IGlzRml4ZWQgPyB4c2RBdHRyLmdldEZpeGVkKCkgOiB4c2RBdHRyLmdldERlZmF1bHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbG9jYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbClzQXR0cikuc2V0RmlsZW5hbWUoZmluZEZpbGVuYW1lKHhzZEF0dHIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBBcnJheVR5cGUgd2F0ID0gbnVsbDsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4c2RBdHRyLm5ld0N1cnNvcigpOwotICAgICAgICBTdHJpbmcgYXJyYXlUeXBlID0gYy5nZXRBdHRyaWJ1dGVUZXh0KFdTRExfQVJSQVlUWVBFX05BTUUpOwotICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXQgPSBuZXcgU09BUEFycmF5VHlwZShhcnJheVR5cGUsIG5ldyBOYW1lc3BhY2VDb250ZXh0KHhzZEF0dHIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNBdHRyLmluaXQoCi0gICAgICAgICAgICBxbmFtZSwKLSAgICAgICAgICAgIHNUeXBlLmdldFJlZigpLAotICAgICAgICAgICAgdXNlLAotICAgICAgICAgICAgZGVmdGV4dCwgeHNkQXR0ciwgbnVsbCwgaXNGaXhlZCwKLSAgICAgICAgICAgIHdhdCk7Ci0KLSAgICAgICAgcmV0dXJuIHNBdHRyOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlVXNlQ29kZShBdHRyaWJ1dGUuVXNlIGF0dHJ1c2UpCi0gICAgewotICAgICAgICBpZiAoYXR0cnVzZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMOwotCi0gICAgICAgIFN0cmluZyB2YWwgPSBhdHRydXNlLmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWwuZXF1YWxzKCJvcHRpb25hbCIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMOwotICAgICAgICBpZiAodmFsLmVxdWFscygicmVxdWlyZWQiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRDsKLSAgICAgICAgaWYgKHZhbC5lcXVhbHMoInByb2hpYml0ZWQiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5QUk9ISUJJVEVEOwotICAgICAgICByZXR1cm4gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEludGVnZXIgYnVpbGRObkludGVnZXIoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgQmlnSW50ZWdlciBiaWdJbnQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBiaWdJbnQgPSBuZXcgQmlnSW50ZWdlcih0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiTXVzdCBiZSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9OVU1CRVIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJpZ0ludC5zaWdudW0oKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiTXVzdCBiZSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9OVU1CRVIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxJbnRlZ2VySW1wbCBpID0gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBpLnNldChiaWdJbnQpOwotICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nIG51bWJlciIsIFhtbEVycm9yQ29udGV4dC5NQUxGT1JNRURfTlVNQkVSLCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZXNlcnZlZFR5cGVOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpLmZpbmRUeXBlKG5hbWUpICE9IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1htbFZhbHVlUmVmLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9YbWxWYWx1ZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzlmZGU2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1htbFZhbHVlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVSZWYKLXsKLSAgICBYbWxBbnlTaW1wbGVUeXBlIF9vYmo7Ci0gICAgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7Ci0gICAgT2JqZWN0IF9pbml0VmFsOwotCi0gICAgWG1sVmFsdWVSZWYoWG1sQW55U2ltcGxlVHlwZSB4b2JqKQotICAgIHsKLSAgICAgICAgaWYgKHhvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgX29iaiA9IHhvYmo7Ci0gICAgfQotCi0gICAgWG1sVmFsdWVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZiwgT2JqZWN0IGluaXRWYWwpCi0gICAgewotICAgICAgICBpZiAodHlwZXJlZiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfdHlwZXJlZiA9IHR5cGVyZWY7Ci0gICAgICAgIF9pbml0VmFsID0gaW5pdFZhbDsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgWG1sQW55U2ltcGxlVHlwZSBnZXQoKQotICAgIHsKLSAgICAgICAgaWYgKF9vYmogPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gX3R5cGVyZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgICAgIF9vYmogPSB0eXBlLm5ld1ZhbHVlKF9pbml0VmFsKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IGFjdHVhbFZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChMaXN0KV9pbml0VmFsKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sVmFsdWVSZWYgcmVmID0gKFhtbFZhbHVlUmVmKWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhY3R1YWxWYWxzLmFkZChyZWYuZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfb2JqID0gdHlwZS5uZXdWYWx1ZShhY3R1YWxWYWxzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX29iajsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDQ1YWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC91dGlsL0Jhc2U2NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZW5jb2RlL2RlY29kZSBmb3IgUkZDIDIwNDUgQmFzZTY0IGFzCi0gKiBkZWZpbmVkIGJ5IFJGQyAyMDQ1LCBOLiBGcmVlZCBhbmQgTi4gQm9yZW5zdGVpbi4KLSAqIFJGQyAyMDQ1OiBNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zIChNSU1FKQotICogUGFydCBPbmU6IEZvcm1hdCBvZiBJbnRlcm5ldCBNZXNzYWdlIEJvZGllcy4gUmVmZXJlbmNlCi0gKiAxOTk2IEF2YWlsYWJsZSBhdDogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0NS50eHQKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBYTUwgU2NoZW1hIGJpbmFyeSBmb3JtYXQgdmFsaWRhdGlvbgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgZW5jb2RlL2RlY29kZSBzdHJlYW1pbmcKLSAqIGRhdGEuIFlvdSBuZWVkIHRoZSBkYXRhIHRoYXQgeW91IHdpbGwgZW5jb2RlL2RlY29kZQotICogYWxyZWFkeSBvbiBhIGJ5dGUgYXJycmF5LgotICoKLSAqIEBhdXRob3IgSmVmZnJleSBSb2RyaWd1ZXoKLSAqIEBhdXRob3IgU2FuZHkgR2FvCi0gKiBAdmVyc2lvbiAkSWQ6IEJhc2U2NC5qYXZhLHYgMS4yIDIwMDMvMDkvMjQgMjM6MzE6MDggZXJpY3ZhcyBFeHAgJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgIEJhc2U2NCB7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEJBU0VMRU5HVEggICAgICAgICA9IDI1NTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIExPT0tVUExFTkdUSCAgICAgICA9IDY0OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgVFdFTlRZRk9VUkJJVEdST1VQID0gMjQ7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBFSUdIVEJJVCAgICAgICAgICAgPSA4OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgU0lYVEVFTkJJVCAgICAgICAgID0gMTY7Ci0gICAgLy9zdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFNJWEJJVCAgICAgICAgICAgICA9IDY7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBGT1VSQllURSAgICAgICAgICAgPSA0OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgU0lHTiAgICAgICAgICAgICAgID0gLTEyODsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIFBBRCAgICAgICAgICAgICAgICA9ICggYnl0ZSApICc9JzsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZEZWJ1ZyAgICAgICAgICA9IGZhbHNlOwotICAgIHN0YXRpYyBwcml2YXRlIGJ5dGUgW10gYmFzZTY0QWxwaGFiZXQgICAgICAgID0gbmV3IGJ5dGVbQkFTRUxFTkdUSF07Ci0gICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBsb29rVXBCYXNlNjRBbHBoYWJldCAgPSBuZXcgYnl0ZVtMT09LVVBMRU5HVEhdOwotCi0gICAgc3RhdGljIHsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaTxCQVNFTEVOR1RIOyBpKyspIHsKLSAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9ICdaJzsgaSA+PSAnQSc7IGktLSkgewotICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKGktJ0EnKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gJ3onOyBpPj0gJ2EnOyBpLS0pIHsKLSAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICggaS0nYScgKyAyNik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gJzknOyBpID49ICcwJzsgaS0tKSB7Ci0gICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaS0nMCcgKyA1Mik7Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNlNjRBbHBoYWJldFsnKyddICA9IDYyOwotICAgICAgICBiYXNlNjRBbHBoYWJldFsnLyddICA9IDYzOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpPD0yNTsgaSsrKQotICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCdBJytpICk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDI2LCAgaiA9IDA7IGk8PTUxOyBpKyssIGorKykKLSAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICgnYScrIGogKTsKLQotICAgICAgICBmb3IgKGludCBpID0gNTIsICBqID0gMDsgaTw9NjE7IGkrKywgaisrKQotICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCcwJyArIGogKTsKLSAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbNjJdID0gKGJ5dGUpICcrJzsKLSAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbNjNdID0gKGJ5dGUpICcvJzsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoYnl0ZSBvY3RlY3QpIHsKLSAgICAgICAgcmV0dXJuIChvY3RlY3QgPT0gMHgyMCB8fCBvY3RlY3QgPT0gMHhkIHx8IG9jdGVjdCA9PSAweGEgfHwgb2N0ZWN0ID09IDB4OSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUGFkKGJ5dGUgb2N0ZWN0KSB7Ci0gICAgICAgIHJldHVybiAob2N0ZWN0ID09IFBBRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRGF0YShieXRlIG9jdGVjdCkgewotICAgICAgICByZXR1cm4gKGJhc2U2NEFscGhhYmV0W29jdGVjdF0gIT0gLTEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0Jhc2U2NChieXRlIG9jdGVjdCkgewotICAgICAgICByZXR1cm4gKGlzV2hpdGVTcGFjZShvY3RlY3QpIHx8IGlzUGFkKG9jdGVjdCkgfHwgaXNEYXRhKG9jdGVjdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuY29kZXMgaGV4IG9jdGVjdHMgaW50byBCYXNlNjQKLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhIEFycmF5IGNvbnRhaW5pbmcgYmluYXJ5RGF0YQotICAgICAqIEByZXR1cm4gRW5jb2RlZCBCYXNlNjQgYXJyYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoYnl0ZVtdIGJpbmFyeURhdGEpIHsKLQotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaW50ICAgICAgbGVuZ3RoRGF0YUJpdHMgICAgPSBiaW5hcnlEYXRhLmxlbmd0aCpFSUdIVEJJVDsKLSAgICAgICAgaW50ICAgICAgZmV3ZXJUaGFuMjRiaXRzICAgPSBsZW5ndGhEYXRhQml0cyVUV0VOVFlGT1VSQklUR1JPVVA7Ci0gICAgICAgIGludCAgICAgIG51bWJlclRyaXBsZXRzICAgID0gbGVuZ3RoRGF0YUJpdHMvVFdFTlRZRk9VUkJJVEdST1VQOwotICAgICAgICBieXRlICAgICBlbmNvZGVkRGF0YVtdICAgICA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGZld2VyVGhhbjI0Yml0cyAhPSAwKSAvL2RhdGEgbm90IGRpdmlzaWJsZSBieSAyNCBiaXQKLSAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbIChudW1iZXJUcmlwbGV0cyArIDEgKSo0ICBdOwotICAgICAgICBlbHNlIC8vIDE2IG9yIDggYml0Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YSA9IG5ldyBieXRlWyBudW1iZXJUcmlwbGV0cyo0IF07Ci0KLSAgICAgICAgYnl0ZSBrPTAsIGw9MCwgYjE9MCxiMj0wLGIzPTA7Ci0KLSAgICAgICAgaW50IGVuY29kZWRJbmRleCA9IDA7Ci0gICAgICAgIGludCBkYXRhSW5kZXggICA9IDA7Ci0gICAgICAgIGludCBpICAgICAgICAgICA9IDA7Ci0gICAgICAgIGlmIChmRGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibnVtYmVyIG9mIHRyaXBsZXRzID0gIiArIG51bWJlclRyaXBsZXRzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaTxudW1iZXJUcmlwbGV0czsgaSsrKSB7Ci0KLSAgICAgICAgICAgIGRhdGFJbmRleCA9IGkqMzsKLSAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOwotICAgICAgICAgICAgYjIgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArIDFdOwotICAgICAgICAgICAgYjMgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArIDJdOwotCi0gICAgICAgICAgICBpZiAoZkRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYjE9ICIgKyBiMSArIiwgYjI9ICIgKyBiMiArICIsIGIzPSAiICsgYjMgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbCAgPSAoYnl0ZSkoYjIgJiAweDBmKTsKLSAgICAgICAgICAgIGsgID0gKGJ5dGUpKGIxICYgMHgwMyk7Ci0KLSAgICAgICAgICAgIGVuY29kZWRJbmRleCA9IGkqNDsKLSAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKT09MCk/KGJ5dGUpKGIxPj4yKTooYnl0ZSkoKGIxKT4+Ml4weGMwKTsKLQotICAgICAgICAgICAgYnl0ZSB2YWwyID0gKChiMiAmIFNJR04pPT0wKT8oYnl0ZSkoYjI+PjQpOihieXRlKSgoYjIpPj40XjB4ZjApOwotICAgICAgICAgICAgYnl0ZSB2YWwzID0gKChiMyAmIFNJR04pPT0wKT8oYnl0ZSkoYjM+PjYpOihieXRlKSgoYjMpPj42XjB4ZmMpOwotCi0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXhdICAgPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMSBdOwotICAgICAgICAgICAgaWYgKGZEZWJ1ZykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInZhbDIgPSAiICsgdmFsMiApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIms0ICAgPSAiICsgKGs8PDQpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJ2YWsgID0gIiArICh2YWwyIHwgKGs8PDQpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsxXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwyIHwgKCBrPDw0ICldOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KzJdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIChsIDw8MiApIHwgdmFsMyBdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KzNdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIGIzICYgMHgzZiBdOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9ybSBpbnRlZ3JhbCBudW1iZXIgb2YgNi1iaXQgZ3JvdXBzCi0gICAgICAgIGRhdGFJbmRleCAgICA9IGkqMzsKLSAgICAgICAgZW5jb2RlZEluZGV4ID0gaSo0OwotICAgICAgICBpZiAoZmV3ZXJUaGFuMjRiaXRzID09IEVJR0hUQklUKSB7Ci0gICAgICAgICAgICBiMSA9IGJpbmFyeURhdGFbZGF0YUluZGV4XTsKLSAgICAgICAgICAgIGsgPSAoYnl0ZSkgKCBiMSAmMHgwMyApOwotICAgICAgICAgICAgaWYgKGZEZWJ1ZykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYjE9IiArIGIxKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImIxPDwyID0gIiArIChiMT4+MikgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKT09MCk/KGJ5dGUpKGIxPj4yKTooYnl0ZSkoKGIxKT4+Ml4weGMwKTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIGs8PDQgXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDJdID0gUEFEOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgM10gPSBQQUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmV3ZXJUaGFuMjRiaXRzID09IFNJWFRFRU5CSVQpIHsKLQotICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07Ci0gICAgICAgICAgICBiMiA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsxIF07Ci0gICAgICAgICAgICBsID0gKCBieXRlICkgKCBiMiAmMHgwZiApOwotICAgICAgICAgICAgayA9ICggYnl0ZSApICggYjEgJjB4MDMgKTsKLQotICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pPT0wKT8oYnl0ZSkoYjE+PjIpOihieXRlKSgoYjEpPj4yXjB4YzApOwotICAgICAgICAgICAgYnl0ZSB2YWwyID0gKChiMiAmIFNJR04pPT0wKT8oYnl0ZSkoYjI+PjQpOihieXRlKSgoYjIpPj40XjB4ZjApOwotCi0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXhdICAgICA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwxIF07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAxXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwyIHwgKCBrPDw0ICldOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMl0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgbDw8MiBdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgM10gPSBQQUQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW5jb2RlZERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjb2RlcyBCYXNlNjQgZGF0YSBpbnRvIG9jdGVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlNjREYXRhIEJ5dGUgYXJyYXkgY29udGFpbmluZyBCYXNlNjQgZGF0YQotICAgICAqIEByZXR1cm4gQXJyYXkgY29udGFpbmluZCBkZWNvZGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKGJ5dGVbXSBiYXNlNjREYXRhKSB7Ci0KLSAgICAgICAgaWYgKGJhc2U2NERhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vIHJlbW92ZSB3aGl0ZSBzcGFjZXMKLSAgICAgICAgYmFzZTY0RGF0YSA9IHJlbW92ZVdoaXRlU3BhY2UoYmFzZTY0RGF0YSk7Ci0KLSAgICAgICAgaWYgKGJhc2U2NERhdGEubGVuZ3RoJUZPVVJCWVRFICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOy8vc2hvdWxkIGJlIGRpdmlzaWJsZSBieSBmb3VyCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgICAgICBudW1iZXJRdWFkcnVwbGUgICAgPSAoYmFzZTY0RGF0YS5sZW5ndGgvRk9VUkJZVEUgKTsKLQotICAgICAgICBpZiAobnVtYmVyUXVhZHJ1cGxlID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07Ci0KLSAgICAgICAgYnl0ZSAgICAgZGVjb2RlZERhdGFbXSAgICAgID0gbnVsbDsKLSAgICAgICAgYnl0ZSAgICAgYjE9MCxiMj0wLGIzPTAsIGI0PTA7Ly8sIG1hcmtlcjA9MCwgbWFya2VyMT0wOwotICAgICAgICBieXRlICAgICBkMT0wLGQyPTAsZDM9MCxkND0wOwotCi0gICAgICAgIC8vIFRocm93IGF3YXkgYW55dGhpbmcgbm90IGluIG5vcm1hbGl6ZWRCYXNlNjREYXRhCi0gICAgICAgIC8vIEFkanVzdCBzaXplCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IGVuY29kZWRJbmRleCA9IDA7Ci0gICAgICAgIGludCBkYXRhSW5kZXggICAgPSAwOwotICAgICAgICBkZWNvZGVkRGF0YSAgICAgID0gbmV3IGJ5dGVbIChudW1iZXJRdWFkcnVwbGUpKjNdOwotCi0gICAgICAgIGZvciAoOyBpPG51bWJlclF1YWRydXBsZS0xOyBpKyspIHsKLQotICAgICAgICAgICAgaWYgKCFpc0RhdGEoIChkMSA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApfHwKLSAgICAgICAgICAgICAgICAhaXNEYXRhKCAoZDIgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKXx8Ci0gICAgICAgICAgICAgICAgIWlzRGF0YSggKGQzID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICl8fAotICAgICAgICAgICAgICAgICFpc0RhdGEoIChkNCA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOy8vaWYgZm91bmQgIm5vIGRhdGEiIGp1c3QgcmV0dXJuIG51bGwKLQotICAgICAgICAgICAgYjEgPSBiYXNlNjRBbHBoYWJldFtkMV07Ci0gICAgICAgICAgICBiMiA9IGJhc2U2NEFscGhhYmV0W2QyXTsKLSAgICAgICAgICAgIGIzID0gYmFzZTY0QWxwaGFiZXRbZDNdOwotICAgICAgICAgICAgYjQgPSBiYXNlNjRBbHBoYWJldFtkNF07Ci0KLSAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggIGIxIDw8MiB8IGIyPj40ICkgOwotICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCgoYjIgJiAweGYpPDw0ICkgfCggKGIzPj4yKSAmIDB4ZikgKTsKLSAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggYjM8PDYgfCBiNCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0RhdGEoIChkMSA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApIHx8Ci0gICAgICAgICAgICAhaXNEYXRhKCAoZDIgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9pZiBmb3VuZCAibm8gZGF0YSIganVzdCByZXR1cm4gbnVsbAotICAgICAgICB9Ci0KLSAgICAgICAgYjEgPSBiYXNlNjRBbHBoYWJldFtkMV07Ci0gICAgICAgIGIyID0gYmFzZTY0QWxwaGFiZXRbZDJdOwotCi0gICAgICAgIGQzID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK107Ci0gICAgICAgIGQ0ID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK107Ci0gICAgICAgIGlmICghaXNEYXRhKCAoZDMgKSApIHx8Ci0gICAgICAgICAgICAhaXNEYXRhKCAoZDQgKSApKSB7Ly9DaGVjayBpZiB0aGV5IGFyZSBQQUQgY2hhcmFjdGVycwotICAgICAgICAgICAgaWYgKGlzUGFkKCBkMyApICYmIGlzUGFkKCBkNCkpIHsgICAgICAgICAgICAgICAvL1R3byBQQUQgZS5nLiAzY1tQYWRdW1BhZF0KLSAgICAgICAgICAgICAgICBpZiAoKGIyICYgMHhmKSAhPSAwKS8vbGFzdCA0IGJpdHMgc2hvdWxkIGJlIHplcm8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlWyBpKjMgKyAxIF07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggZGVjb2RlZERhdGEsIDAsIHRtcCwgMCwgaSozICk7Ci0gICAgICAgICAgICAgICAgdG1wW2VuY29kZWRJbmRleF0gICA9IChieXRlKSggIGIxIDw8MiB8IGIyPj40ICkgOwotICAgICAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BhZCggZDMpICYmIGlzUGFkKGQ0KSkgeyAgICAgICAgICAgICAgIC8vT25lIFBBRCAgZS5nLiAzY1FbUGFkXQotICAgICAgICAgICAgICAgIGIzID0gYmFzZTY0QWxwaGFiZXRbIGQzIF07Ci0gICAgICAgICAgICAgICAgaWYgKChiMyAmIDB4MyApICE9IDApLy9sYXN0IDIgYml0cyBzaG91bGQgYmUgemVybwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbIGkqMyArIDIgXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBkZWNvZGVkRGF0YSwgMCwgdG1wLCAwLCBpKjMgKTsKLSAgICAgICAgICAgICAgICB0bXBbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCAgYjEgPDwyIHwgYjI+PjQgKTsKLSAgICAgICAgICAgICAgICB0bXBbZW5jb2RlZEluZGV4XSAgID0gKGJ5dGUpKCgoYjIgJiAweGYpPDw0ICkgfCggKGIzPj4yKSAmIDB4ZikgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsvL2FuIGVycm9yICBsaWtlICIzY1tQYWRdciIsICIzY2RYIiwgIjNjWGQiLCAiM2NYWCIgd2hlcmUgWCBpcyBub24gZGF0YQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvL05vIFBBRCBlLmcgM2NRbAotICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFsgZDMgXTsKLSAgICAgICAgICAgIGI0ID0gYmFzZTY0QWxwaGFiZXRbIGQ0IF07Ci0gICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoICBiMSA8PDIgfCBiMj4+NCApIDsKLSAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSgoKGIyICYgMHhmKTw8NCApIHwoIChiMz4+MikgJiAweGYpICk7Ci0gICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoIGIzPDw2IHwgYjQgKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlY29kZWREYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY29kZXMgQmFzZTY0IGRhdGEgaW50byBvY3RlY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZTY0RGF0YSBTdHJpbmcgY29udGFpbmluZyBCYXNlNjQgZGF0YQotICAgICAqIEByZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgYmFzZTY0RGF0YSkgewotICAgICAgICBpZiAoYmFzZTY0RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIGRlY29kZWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVjb2RlZCA9IGRlY29kZShiYXNlNjREYXRhLmdldEJ5dGVzKCJ1dGYtOCIpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVkID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhkZWNvZGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuY29kZXMgb2N0ZWN0cyAodXNpbmcgdXRmLTgpIGludG8gQmFzZTY0IGRhdGEKLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhIFN0cmluZyBjb250YWluaW5nIEhleCBkYXRhCi0gICAgICogQHJldHVybiBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBiaW5hcnlEYXRhKSB7Ci0gICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBieXRlW10gZW5jb2RlZCA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGUoYmluYXJ5RGF0YS5nZXRCeXRlcygidXRmLTgiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJldHVybiBlbmNvZGVkID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhlbmNvZGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlbW92ZSBXaGl0ZVNwYWNlIGZyb20gTUlNRSBjb250YWluaW5nIGVuY29kZWQgQmFzZTY0IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSAgdGhlIGJ5dGUgYXJyYXkgb2YgYmFzZTY0IGRhdGEgKHdpdGggV1MpCi0gICAgICogQHJldHVybiAgICAgIHRoZSBieXRlIGFycmF5IG9mIGJhc2U2NCBkYXRhICh3aXRob3V0IFdTKQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIHJlbW92ZVdoaXRlU3BhY2UoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vIGNvdW50IGNoYXJhY3RlcnMgdGhhdCdzIG5vdCB3aGl0ZXNwYWNlCi0gICAgICAgIGludCBuZXdTaXplID0gMDsKLSAgICAgICAgaW50IGxlbiA9IGRhdGEubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZShkYXRhW2ldKSkKLSAgICAgICAgICAgICAgICBuZXdTaXplKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBubyB3aGl0ZXNwYWNlLCBqdXN0IHJldHVybiB0aGUgaW5wdXQgYXJyYXkKLSAgICAgICAgaWYgKG5ld1NpemUgPT0gbGVuKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBhcnJheSB0byByZXR1cm4KLSAgICAgICAgYnl0ZVtdIG5ld0FycmF5ID0gbmV3IGJ5dGVbbmV3U2l6ZV07Ci0KLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZShkYXRhW2ldKSkKLSAgICAgICAgICAgICAgICBuZXdBcnJheVtqKytdID0gZGF0YVtpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3QXJyYXk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC91dGlsL0hleEJpbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC91dGlsL0hleEJpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmM3NjMyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9IZXhCaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotLyoqCi0gKiBmb3JtYXQgdmFsaWRhdGlvbgotICoKLSAqIFRoaXMgY2xhc3MgZW5jb2Rlcy9kZWNvZGVzIGhleGFkZWNpbWFsIGRhdGEKLSAqIEBhdXRob3IgSmVmZnJleSBSb2RyaWd1ZXoKLSAqIEB2ZXJzaW9uICRJZDogSGV4QmluLmphdmEsdiAxLjIgMjAwMy8wOS8yNCAyMzozMTowOCBlcmljdmFzIEV4cCAkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyAgSGV4QmluIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEJBU0VMRU5HVEggICA9IDI1NTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIExPT0tVUExFTkdUSCA9IDE2OwotICAgIHN0YXRpYyBwcml2YXRlIGJ5dGUgW10gaGV4TnVtYmVyVGFibGUgICAgPSBuZXcgYnl0ZVtCQVNFTEVOR1RIXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBieXRlIFtdIGxvb2tVcEhleEFscGhhYmV0ID0gbmV3IGJ5dGVbTE9PS1VQTEVOR1RIXTsKLQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8QkFTRUxFTkdUSDsgaSsrICkgewotICAgICAgICAgICAgaGV4TnVtYmVyVGFibGVbaV0gPSAtMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpbnQgaSA9ICc5JzsgaSA+PSAnMCc7IGktLSkgewotICAgICAgICAgICAgaGV4TnVtYmVyVGFibGVbaV0gPSAoYnl0ZSkgKGktJzAnKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpbnQgaSA9ICdGJzsgaT49ICdBJzsgaS0tKSB7Ci0gICAgICAgICAgICBoZXhOdW1iZXJUYWJsZVtpXSA9IChieXRlKSAoIGktJ0EnICsgMTAgKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpbnQgaSA9ICdmJzsgaT49ICdhJzsgaS0tKSB7Ci0gICAgICAgICAgIGhleE51bWJlclRhYmxlW2ldID0gKGJ5dGUpICggaS0nYScgKyAxMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaTwxMDsgaSsrICkKLSAgICAgICAgICAgIGxvb2tVcEhleEFscGhhYmV0W2ldID0gKGJ5dGUpICgnMCcraSApOwotICAgICAgICBmb3IoaW50IGkgPSAxMDsgaTw9MTU7IGkrKyApCi0gICAgICAgICAgICBsb29rVXBIZXhBbHBoYWJldFtpXSA9IChieXRlKSAoJ0EnK2kgLTEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBieXRlIHRvIGJlIHRlc3RlZCBpZiBpdCBpcyBCYXNlNjQgYWxwaGFiZXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvY3RlY3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNIZXgoYnl0ZSBvY3RlY3QpIHsKLSAgICAgICAgcmV0dXJuIChoZXhOdW1iZXJUYWJsZVtvY3RlY3RdICE9IC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBieXRlcyB0byBhIGhleCBzdHJpbmcKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBieXRlc1RvU3RyaW5nKGJ5dGVbXSBiaW5hcnlEYXRhKQotICAgIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhlbmNvZGUoYmluYXJ5RGF0YSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgaGV4IHN0cmluZyB0byBhIGJ5dGUgYXJyYXkuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBieXRlW10gc3RyaW5nVG9CeXRlcyhTdHJpbmcgaGV4RW5jb2RlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvZGUoaGV4RW5jb2RlZC5nZXRCeXRlcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhcnJheSBvZiBieXRlIHRvIGVuY29kZQotICAgICAqCi0gICAgICogQHBhcmFtIGJpbmFyeURhdGEKLSAgICAgKiBAcmV0dXJuIHJldHVybiBlbmNvZGUgYmluYXJ5IGFycmF5Ci0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBieXRlW10gZW5jb2RlKGJ5dGVbXSBiaW5hcnlEYXRhKSB7Ci0gICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaW50IGxlbmd0aERhdGEgICA9IGJpbmFyeURhdGEubGVuZ3RoOwotICAgICAgICBpbnQgbGVuZ3RoRW5jb2RlID0gbGVuZ3RoRGF0YSAqIDI7Ci0gICAgICAgIGJ5dGVbXSBlbmNvZGVkRGF0YSA9IG5ldyBieXRlW2xlbmd0aEVuY29kZV07Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPGxlbmd0aERhdGE7IGkrKyApewotICAgICAgICAgICAgZW5jb2RlZERhdGFbaSoyXSA9IGxvb2tVcEhleEFscGhhYmV0WyhiaW5hcnlEYXRhW2ldID4+IDQpICYgMHhmXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2kqMisxXSA9IGxvb2tVcEhleEFscGhhYmV0WyBiaW5hcnlEYXRhW2ldICYgMHhmXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2RlZERhdGE7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBieXRlW10gZGVjb2RlKGJ5dGVbXSBiaW5hcnlEYXRhKSB7Ci0gICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaW50IGxlbmd0aERhdGEgICA9IGJpbmFyeURhdGEubGVuZ3RoOwotICAgICAgICBpZiAobGVuZ3RoRGF0YSAlIDIgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGludCBsZW5ndGhEZWNvZGUgPSBsZW5ndGhEYXRhIC8gMjsKLSAgICAgICAgYnl0ZVtdIGRlY29kZWREYXRhID0gbmV3IGJ5dGVbbGVuZ3RoRGVjb2RlXTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8bGVuZ3RoRGVjb2RlOyBpKysgKXsKLSAgICAgICAgICAgIGlmICghaXNIZXgoYmluYXJ5RGF0YVtpKjJdKSB8fCAhaXNIZXgoYmluYXJ5RGF0YVtpKjIrMV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWNvZGVkRGF0YVtpXSA9IChieXRlKSgoaGV4TnVtYmVyVGFibGVbYmluYXJ5RGF0YVtpKjJdXSA8PCA0KSB8IGhleE51bWJlclRhYmxlW2JpbmFyeURhdGFbaSoyKzFdXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlY29kZWREYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY29kZXMgSGV4IGRhdGEgaW50byBvY3RlY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBTdHJpbmcgY29udGFpbmluZyBIZXggZGF0YQotICAgICAqIEByZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgYmluYXJ5RGF0YSkgewotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIGRlY29kZWQgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBkZWNvZGVkID0gZGVjb2RlKGJpbmFyeURhdGEuZ2V0Qnl0ZXMoInV0Zi04IikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgcmV0dXJuIGRlY29kZWQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGRlY29kZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyBvY3RlY3RzICh1c2luZyB1dGYtOCkgaW50byBIZXggZGF0YQotICAgICAqCi0gICAgICogQHBhcmFtIGJpbmFyeURhdGEgU3RyaW5nIGNvbnRhaW5pbmcgSGV4IGRhdGEKLSAgICAgKiBAcmV0dXJuIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIGJpbmFyeURhdGEpIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gbnVsbDsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgZW5jb2RlZCA9IGVuY29kZShiaW5hcnlEYXRhLmdldEJ5dGVzKCJ1dGYtOCIpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgcmV0dXJuIGVuY29kZWQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGVuY29kZWQpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDkxZDEzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uQ2hhcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2VuZXJpY1htbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQXR0cmlidXRlOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQXR0cmlidXRlSXRlcmF0b3I7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbQotICAgIGV4dGVuZHMgR2VuZXJpY1htbElucHV0U3RyZWFtIGltcGxlbWVudHMgRXZlbnQKLXsKLSAgICBwdWJsaWMgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtICgKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzLAotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHR5cGVMb2FkZXIsIFNjaGVtYVR5cGUgc1R5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfc291cmNlID0geGlzOwotCi0gICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHJvb3QgdHlwZQotCi0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0gICAgICAgIAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSAoU2NoZW1hVHlwZSkgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfVFlQRSApOwotCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0eXBlID0gc1R5cGU7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFOwotCi0gICAgICAgICAgICB4aXMgPSB4aXMuZ2V0U3ViU3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIGlmICh4aXMuc2tpcCggWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgZG9jVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVMb2FkZXIuZmluZERvY3VtZW50VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTE5hbWVIZWxwZXIuZ2V0UU5hbWUoIHhpcy5uZXh0KCkuZ2V0TmFtZSgpICkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChkb2NUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBkb2NUeXBlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4aXMuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgdmFsaWRhdG9yCi0KLSAgICAgICAgX3ZhbGlkYXRvciA9Ci0gICAgICAgICAgICBuZXcgVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgIHR5cGUsIG51bGwsIHR5cGVMb2FkZXIsIG9wdGlvbnMsIG5ldyBFeGNlcHRpb25YbWxFcnJvckxpc3RlbmVyKCkgKTsKLQotICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkJFR0lOICk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyAtIHRoaXMgaXMgdGhlIHF1aWNrIGFuZCBkaXJ0eSBpbXBsIG9mIHN0cmVhbWluZyB2YWxpZGF0aW9uLAotICAgIC8vIG1heSBvYmplY3RzIGFyZSBjcmVhdGVkIChsaWtlIHN0cmluZ3MpIHdoaWNoIGNhbiBiZSBvcHRpbWl6ZWQKLSAgICAKLSAgICBwcm90ZWN0ZWQgWE1MRXZlbnQgbmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYTUxFdmVudCBlID0gX3NvdXJjZS5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfZmluaXNoZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmx1c2hUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQgKTsKLSAgICAgICAgICAgICAgICBfZmluaXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggZS5nZXRUeXBlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5DSEFSQUNURVJfREFUQSA6Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNQQUNFIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkID0gKENoYXJhY3RlckRhdGEpIGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2QuaGFzQ29udGVudCgpKQotICAgICAgICAgICAgICAgICAgICBfdGV4dC5hcHBlbmQoIGNkLmdldENvbnRlbnQoKSApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXJ0RWxlbWVudCBzZSA9IChTdGFydEVsZW1lbnQpIGU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmx1c2hUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBVc2VkIGZvciBwcmVmaXggdG8gbmFtZXNwYWNlIG1hcHBpbmcKLSAgICAgICAgICAgICAgICBfc3RhcnRFbGVtZW50ID0gc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSB4c2k6KiB2YWx1ZXMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJdGVyYXRvciBhdHRycyA9IHNlLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggYXR0cnMuaGFzTmV4dCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cnMubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhNTE5hbWUgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIi5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gYXR0ck5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbC5lcXVhbHMoICJ0eXBlIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94c2lUeXBlID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibmlsIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94c2lOaWwgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJzY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeHNpTG9jID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeHNpTm9Mb2MgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBFbWl0IHRoZSBTVEFSVAotCi0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBkZWxheSB0aGUgYXF1aXNpdGlvbiBvZiB0aGUgbmFtZQotICAgICAgICAgICAgICAgIF9uYW1lID0gZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkJFR0lOICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgYXR0cnMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBhdHRycyA9IHNlLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggYXR0cnMuaGFzTmV4dCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cnMubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhNTE5hbWUgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIi5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gYXR0ck5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbC5lcXVhbHMoICJ0eXBlIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibmlsIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAic2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIEdvZCwgdGhpcyBpcyBsYW1lIDotKQotCi0gICAgICAgICAgICAgICAgICAgIF90ZXh0LmFwcGVuZCggYXR0ci5nZXRWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIF9uYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkFUVFIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjbGVhclRleHQoKTsKLQotICAgICAgICAgICAgICAgIF9zdGFydEVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRU5EX0VMRU1FTlQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsdXNoVGV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5EICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGVhclRleHQgKCApCi0gICAgewotICAgICAgICBfdGV4dC5kZWxldGUoIDAsIF90ZXh0Lmxlbmd0aCgpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBmbHVzaFRleHQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCApOwotICAgICAgICAgICAgY2xlYXJUZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhcnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBNYXAgbWFwID0gX3N0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VNYXAoKTsKLQotICAgICAgICBpZiAobWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gKFN0cmluZykgbWFwLmdldCggcHJlZml4ICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEN1cnNvciBnZXRMb2NhdGlvbkFzQ3Vyc29yICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldFhzaVR5cGUgKCBDaGFycyBjaGFycyApCi0gICAgewotICAgICAgICBpZiAoX3hzaVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjaGFycy5zdHJpbmcgPSBfeHNpVHlwZTsKLSAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTmlsICggQ2hhcnMgY2hhcnMgKQotICAgIHsKLSAgICAgICAgaWYgKF94c2lOaWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjaGFycy5zdHJpbmcgPSBfeHNpTmlsOwotICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFhzaUxvYyAoIENoYXJzIGNoYXJzICkKLSAgICB7Ci0gICAgICAgIGlmIChfeHNpTG9jID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgY2hhcnMuc3RyaW5nID0gX3hzaUxvYzsKLSAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lOb0xvYyAoIENoYXJzIGNoYXJzICkKLSAgICB7Ci0gICAgICAgIGlmIChfeHNpTm9Mb2MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjaGFycy5zdHJpbmcgPSBfeHNpTm9Mb2M7Ci0gICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gWE1MTmFtZUhlbHBlci5nZXRRTmFtZSggX25hbWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMgKQotICAgIHsKLSAgICAgICAgY2hhcnMuc3RyaW5nID0gX3RleHQudG9TdHJpbmcoKTsKLSAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMsIGludCB3c3IgKQotICAgIHsKLSAgICAgICAgY2hhcnMuc3RyaW5nID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSggX3RleHQudG9TdHJpbmcoKSwgd3NyICk7Ci0gICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gVE9ETyAtIHZlcnkgZXhwZW5zaXZlIHRvIGdldCBhIHN0cmluZyBoZXJlCi0gICAgcHVibGljIGJvb2xlYW4gdGV4dElzV2hpdGVzcGFjZSAoICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfdGV4dC5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIF90ZXh0LmNoYXJBdCggaSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBFeGNlcHRpb25YbWxFcnJvckxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0udGhpcy5fZXhjZXB0aW9uID09IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS50aGlzLl9leGNlcHRpb24gPSAKLSAgICAgICAgICAgICAgICBuZXcgWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbiggKFhtbEVycm9yKW8gKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5leHRFdmVudCAoIGludCBraW5kICkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9leGNlcHRpb24gPT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIF92YWxpZGF0b3IubmV4dEV2ZW50KCBraW5kLCB0aGlzICk7Ci0KLSAgICAgICAgaWYgKF9leGNlcHRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IF9leGNlcHRpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbiBfZXhjZXB0aW9uOwotCi0gICAgcHJpdmF0ZSBYTUxJbnB1dFN0cmVhbSBfc291cmNlOwotICAgIHByaXZhdGUgVmFsaWRhdG9yICAgICAgX3ZhbGlkYXRvcjsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciAgIF90ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgX2ZpbmlzaGVkOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgX3hzaVR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBfeHNpTmlsOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgX3hzaUxvYzsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgIF94c2lOb0xvYzsKLSAgICBwcml2YXRlIFhNTE5hbWUgICAgICAgIF9uYW1lOwotICAgIHByaXZhdGUgU3RhcnRFbGVtZW50ICAgX3N0YXJ0RWxlbWVudDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0b3IuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODViMjYwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkNoYXJzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyLkV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxXaGl0ZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVZpc2l0b3JJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVVyaUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJhc2U2NEhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXJFeDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbERhdGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURlY2ltYWxIb2xkZXJFeDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEb3VibGVIb2xkZXJFeDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbER1cmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFGbG9hdEhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUhleEJpbmFyeUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxRTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhUU5hbWVIb2xkZXJFeDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRvcgotICAgIGltcGxlbWVudHMgVmFsaWRhdG9yTGlzdGVuZXIKLXsKLSAgICBwdWJsaWMgVmFsaWRhdG9yICgKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBTY2hlbWFGaWVsZCBmaWVsZCwgU2NoZW1hVHlwZUxvYWRlciBnbG9iYWxMb2FkZXIsCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucywgQ29sbGVjdGlvbiBkZWZhdWx0RXJyb3JMaXN0ZW5lciApCi0gICAgewotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbChvcHRpb25zKTsKLSAgICAgICAgX2Vycm9yTGlzdGVuZXIgPSAoQ29sbGVjdGlvbikgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5FUlJPUl9MSVNURU5FUik7Ci0KLSAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyID09IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JMaXN0ZW5lciA9IGRlZmF1bHRFcnJvckxpc3RlbmVyOwotCi0gICAgICAgIF9jb25zdHJhaW50RW5naW5lID0gbmV3IElkZW50aXR5Q29uc3RyYWludChfZXJyb3JMaXN0ZW5lciwgdHlwZS5pc0RvY3VtZW50VHlwZSgpKTsKLQotICAgICAgICBfZ2xvYmFsVHlwZXMgPSBnbG9iYWxMb2FkZXI7Ci0gICAgICAgIF9jaGFycyA9IG5ldyBDaGFycygpOwotICAgICAgICBfcm9vdFR5cGUgPSB0eXBlOwotICAgICAgICBfcm9vdEZpZWxkID0gZmllbGQ7Ci0KLSAgICAgICAgX3ZjID0gbmV3IFZhbGlkYXRvclZDKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWxpZGF0b3JWQyBpbXBsZW1lbnRzIFZhbGlkYXRpb25Db250ZXh0Ci0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkICggU3RyaW5nIG1lc3NhZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0b3IudGhpcy5lbWl0RXJyb3IoIF9ldmVudCwgbWVzc2FnZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgRXZlbnQgX2V2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gIV9pbnZhbGlkICYmIF9jb25zdHJhaW50RW5naW5lLmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgZW1pdEVycm9yKGV2ZW50LCBtc2csIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2csIGludCBzZXZlcml0eSApCi0gICAgewotICAgICAgICBfZXJyb3JTdGF0ZSsrOwotCi0gICAgICAgIGlmIChfc3VzcGVuZEVycm9ycyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpCi0gICAgICAgICAgICAgICAgX2ludmFsaWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZXZlbnQgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yQ3Vyc29yKCBtc2csIHNldmVyaXR5LCBldmVudC5nZXRMb2NhdGlvbkFzQ3Vyc29yKCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRGaWVsZEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2csIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgZW1pdEZpZWxkRXJyb3IoIGV2ZW50LCBtc2cgKyAiICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoIG5hbWUgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0RmllbGRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCBtc2csIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEZpZWxkRXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZywgaW50IHNldmVyaXR5ICkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhdGVTdGFjayAhPSBudWxsICYmIF9zdGF0ZVN0YWNrLl9maWVsZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtc2cgKz0KLSAgICAgICAgICAgICAgICAiIGluIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eSggX3N0YXRlU3RhY2suX2ZpZWxkLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdG9yLnRoaXMuZW1pdEVycm9yKCBldmVudCwgbXNnLCBzZXZlcml0eSApOwotICAgIH0KLQotICAgIC8vIEZvciBYbWxFdmVudExpc3RlbmVyLmVycm9yCi0KLSAgICBwdWJsaWMgdm9pZCBlcnJvciAoIFhtbEVycm9yIGVycm9yICkKLSAgICB7Ci0gICAgICAgIF9lcnJvclN0YXRlKys7Ci0KLSAgICAgICAgaWYgKF9zdXNwZW5kRXJyb3JzID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnZhbGlkID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuYWRkKCBlcnJvciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbmV4dEV2ZW50ICggaW50IGtpbmQsIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGlmIChfZWF0Q29udGVudCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBFTkQgICA6IF9lYXRDb250ZW50LS07IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCRUdJTiA6IF9lYXRDb250ZW50Kys7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAga2luZCA9PSBCRUdJTiB8fCBraW5kID09IEFUVFIgfHwKLSAgICAgICAgICAgICAgICAgICAga2luZCA9PSBFTkQgfHwga2luZCA9PSBURVhUIHx8IGtpbmQgPT0gRU5EQVRUUlM7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBCRUdJTiAgICA6IGJlZ2luRXZlbnQoICAgIGV2ZW50ICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVFRSICAgICA6IGF0dHJFdmVudCggICAgIGV2ZW50ICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFTkRBVFRSUyA6IGVuZEF0dHJzRXZlbnQoIGV2ZW50ICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBURVhUICAgICA6IHRleHRFdmVudCggICAgIGV2ZW50ICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFTkQgICAgICA6IGVuZEV2ZW50KCAgICAgIGV2ZW50ICk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJlZ2luRXZlbnQgKCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSAgZWxlbWVudFR5cGUgID0gbnVsbDsKLSAgICAgICAgU2NoZW1hRmllbGQgZWxlbWVudEZpZWxkID0gbnVsbDsKLQotICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudFR5cGUgPSBfcm9vdFR5cGU7Ci0gICAgICAgICAgICBlbGVtZW50RmllbGQgPSBfcm9vdEZpZWxkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgICAgICBRTmFtZSBuYW1lID0gZXZlbnQuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgICAgICBzdGF0ZS5faXNFbXB0eSA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoc3RhdGUuX2lzTmlsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAgIk5pbCBlbGVtZW50IGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCIpOwotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3RhdGUudmlzaXQoIG5hbWUgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvciggZXZlbnQsICJFbGVtZW50IG5vdCBhbGxvd2VkOiIsIG5hbWUgKTsKLSAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjdXJyZW50UGFydGljbGUgPSBzdGF0ZS5jdXJyZW50UGFydGljbGUoKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZVNldCBlbGVtV2lsZGNhcmRTZXQgPSBjdXJyZW50UGFydGljbGUuZ2V0V2lsZGNhcmRTZXQoKTsKLQotICAgICAgICAgICAgICAgIGlmICghZWxlbVdpbGRjYXJkU2V0LmNvbnRhaW5zKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvciggZXZlbnQsICJFbGVtZW50IG5vdCBhbGxvd2VkOiIsIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IHdpbGRjYXJkUHJvY2VzcyA9IGN1cnJlbnRQYXJ0aWNsZS5nZXRXaWxkY2FyZFByb2Nlc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hUGFydGljbGUuU0tJUCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCA9IF9nbG9iYWxUeXBlcy5maW5kRWxlbWVudCggbmFtZSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRGaWVsZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFQYXJ0aWNsZS5TVFJJQ1QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAiRWxlbWVudCBub3QgYWxsb3dlZCAoc3RyaWN0IHdpbGRjYXJkLCBhbmQgbm8gZGVmaW5pdGlvbiBmb3VuZCk6IiwgbmFtZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBwYXJ0aWNsZSBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgLy8gb2YgdGhlIGV2ZW50LCB0aGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSBzdWJzdGl0dXRlIGZvcgotICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHBhcnRpY2xlLiBSZXBsYWNlIHRoZSBmaWVsZCB3aXRoIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGZvciB0aGUgcmVwbGFjZW1lbnQKLQotICAgICAgICAgICAgICAgIGlmICghIGN1cnJlbnRQYXJ0aWNsZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoU2NoZW1hTG9jYWxFbGVtZW50KWN1cnJlbnRQYXJ0aWNsZSkuYmxvY2tTdWJzdGl0dXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IHN1YnN0aXR1dGlvbiBub3QgYWxsb3dlZCB3aGVuIGdyb3VwIGhlYWQgaGFzIGJsb2NrPSdzdWJzdGl0dXRpb24nIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IG5ld0ZpZWxkID0gX2dsb2JhbFR5cGVzLmZpbmRFbGVtZW50KG5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBuZXdGaWVsZCAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdGaWVsZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gbmV3RmllbGQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gKFNjaGVtYUZpZWxkKSBjdXJyZW50UGFydGljbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbGVtZW50VHlwZSA9IGVsZW1lbnRGaWVsZC5nZXRUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgZWxlbWVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICAvLwotICAgICAgICAvLyB0aGUgbm8tdHlwZSBpcyBhbHdheXMgaW52YWxpZCAoZXZlbiBpZiB0aGVyZSBpcyBhbiB4c2k6dHlwZSkKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoZWxlbWVudFR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsICJJbnZhbGlkIHR5cGUuIik7Ci0gICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBTZWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIHhzaTp0eXBlIG9uIGl0Ci0gICAgICAgIC8vCi0KLSAgICAgICAgU2NoZW1hVHlwZSB4c2lUeXBlID0gbnVsbDsKLQotICAgICAgICBpZiAoZXZlbnQuZ2V0WHNpVHlwZSggX2NoYXJzICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IF9jaGFycy5hc1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBUdXJuIG9mZiB0aGUgbGlzdGVuZXIgc28gYSBwdWJsaWMgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgLy8gZG9lcyBub3QgZ2V0IGdlbmVyYXRlZCwgYnV0IEkgY2FuIHNlZSBpZiB0aGVyZSB3YXMKLSAgICAgICAgICAgIC8vIGFuIGVycm9yIHRocm91Z2ggdGhlIGVycm9yIHN0YXRlCi0KLSAgICAgICAgICAgIGludCBvcmlnaW5hbEVycm9yU3RhdGUgPSBfZXJyb3JTdGF0ZTsKLQotICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMrKzsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ZjLl9ldmVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB4c2lUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgX2dsb2JhbFR5cGVzLmZpbmRUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgWG1sUU5hbWVJbXBsLnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIF92YywgZXZlbnQgKSApOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZXJyb3JTdGF0ZSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zdXNwZW5kRXJyb3JzLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvcmlnaW5hbEVycm9yU3RhdGUgIT0gX2Vycm9yU3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LCAiSW52YWxpZCB4c2k6dHlwZSBxbmFtZTogJyIgKyB2YWx1ZSArICInIiApOwotCi0gICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoeHNpVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcihldmVudCwgICJDb3VsZCBub3QgZmluZCB4c2k6dHlwZTogJyIgKyB2YWx1ZSArICInIik7Ci0KLSAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeHNpVHlwZSAhPSBudWxsICYmICF4c2lUeXBlLmVxdWFscyhlbGVtZW50VHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZWxlbWVudFR5cGUuaXNBc3NpZ25hYmxlRnJvbSh4c2lUeXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJUeXBlICciICsgeHNpVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgZGVyaXZlZCBmcm9tICciICsgZWxlbWVudFR5cGUgKyAiJyIgKTsKLQotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlLmJsb2NrRXh0ZW5zaW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggU2NoZW1hVHlwZSB0ID0geHNpVHlwZSA7ICEgdC5lcXVhbHMoIGVsZW1lbnRUeXBlICkgOwotICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldEJhc2VUeXBlKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiB0eXBlOiAnIiArIHhzaVR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtYXkgbm90IGJlIHN1YnN0aXR1dGVkIGZvcjogJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgKyAiJyIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZS5ibG9ja1Jlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggU2NoZW1hVHlwZSB0ID0geHNpVHlwZSA7ICEgdC5lcXVhbHMoIGVsZW1lbnRUeXBlICkgOwotICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldEJhc2VUeXBlKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzdHJpY3Rpb24gdHlwZTogJyIgKyB4c2lUeXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbWF5IG5vdCBiZSBzdWJzdGl0dXRlZCBmb3I6ICciICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlICsgIiciICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZWxlbWVudEZpZWxkIGluc3RhbmNlb2YgU2NoZW1hTG9jYWxFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBzbGUgID0gKFNjaGVtYUxvY2FsRWxlbWVudCllbGVtZW50RmllbGQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2xlLmJsb2NrRXh0ZW5zaW9uKCkgfHwgc2xlLmJsb2NrUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIFNjaGVtYVR5cGUgdCA9IHhzaVR5cGUgOyAhIHQuZXF1YWxzKCBlbGVtZW50VHlwZSApIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0QmFzZVR5cGUoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodC5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04gJiYgc2xlLmJsb2NrUmVzdHJpY3Rpb24oKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OICYmIHNsZS5ibG9ja0V4dGVuc2lvbigpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVyaXZlZCB0eXBlOiAnIiArIHhzaVR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbWF5IG5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgZWxlbWVudCAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZUhlbHBlci5wcmV0dHkoc2xlLmdldE5hbWUoKSkgKyAiJyIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbGVtZW50VHlwZSA9IHhzaVR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudEZpZWxkIGluc3RhbmNlb2YgU2NoZW1hTG9jYWxFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnQgc2xlID0gKFNjaGVtYUxvY2FsRWxlbWVudCllbGVtZW50RmllbGQ7Ci0KLSAgICAgICAgICAgIGlmIChzbGUuaXNBYnN0cmFjdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcihldmVudCwgICJFbGVtZW50ICciICsgUU5hbWVIZWxwZXIucHJldHR5KHNsZS5nZXROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgIicgaXMgYWJzdHJhY3QgYW5kIGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCAmJiBlbGVtZW50VHlwZS5pc0Fic3RyYWN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBYnN0cmFjdCB0eXBlOiAiICsgZWxlbWVudFR5cGUgKwotICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIiApOwotCi0gICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNOaWwgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBoYXNOaWwgPSBmYWxzZTsKLQotICAgICAgICBpZiAoZXZlbnQuZ2V0WHNpTmlsKF9jaGFycykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92Yy5fZXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgIGlzTmlsID0gSmF2YUJvb2xlYW5Ib2xkZXIudmFsaWRhdGVMZXhpY2FsKF9jaGFycy5hc1N0cmluZygpLCBfdmMpOwotICAgICAgICAgICAgaGFzTmlsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm90ZSBpbiBzY2hlbWEgc3BlYyAzLjMuNCwgeW91J3JlIG5vdCBldmVuIGFsbG93ZWQgdG8gc2F5IHhzaTpuaWw9ImZhbHNlIiBpZiB5b3UncmUgbm90IG5pbGxhYmxlIQotICAgICAgICBpZiAoaGFzTmlsICYmICFlbGVtZW50RmllbGQuaXNOaWxsYWJsZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgICJFbGVtZW50IGhhcyB4c2k6bmlsIGF0dHJpYnV0ZSBidXQgaXMgbm90IG5pbGxhYmxlIik7Ci0KLSAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG5ld1N0YXRlKCBlbGVtZW50VHlwZSwgZWxlbWVudEZpZWxkLCBpc05pbCApOwotCi0gICAgICAgIC8vIERpc3BhdGNoIHRoaXMgZWxlbWVudCBldmVudCB0byBhbnkgaWRlbnRpdHkgY29uc3RyYWludHMKLSAgICAgICAgLy8gQXMgd2VsbCBhcyBhZGRpbmcgYW55IG5ldyBpZGVudGl0eSBjb25zdHJhaW50cyB0aGF0IGV4aXN0Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuZWxlbWVudCgKLSAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgZWxlbWVudFR5cGUsCi0gICAgICAgICAgICBlbGVtZW50RmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQKLSAgICAgICAgICAgICAgICA/ICgoU2NoZW1hTG9jYWxFbGVtZW50KSBlbGVtZW50RmllbGQpLmdldElkZW50aXR5Q29uc3RyYWludHMoKQotICAgICAgICAgICAgICAgIDogbnVsbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhdHRyRXZlbnQgKCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBRTmFtZSBhdHRyTmFtZSA9IGV2ZW50LmdldE5hbWUoKTsKLQotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKHN0YXRlLl9hdHRycyA9PSBudWxsKQotICAgICAgICAgICAgc3RhdGUuX2F0dHJzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBpZiAoc3RhdGUuX2F0dHJzLmNvbnRhaW5zKCBhdHRyTmFtZSApKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiRHVwbGljYXRlIGF0dHJpYnV0ZTogIiArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5fYXR0cnMuYWRkKCBhdHRyTmFtZSApOwotCi0gICAgICAgIGlmICghc3RhdGUuX2NhbkhhdmVBdHRycykKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoIGV2ZW50LCAiQ2FuJ3QgaGF2ZSBhdHRyaWJ1dGVzIiApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0clNjaGVtYSA9Ci0gICAgICAgICAgICBzdGF0ZS5fYXR0ck1vZGVsID09IG51bGwKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHN0YXRlLl9hdHRyTW9kZWwuZ2V0QXR0cmlidXRlKCBhdHRyTmFtZSApOwotCi0gICAgICAgIGlmIChhdHRyU2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhdHRyU2NoZW1hLmdldFVzZSgpID09IFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIGlzIHByb2hpYml0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgICAgICBhdHRyU2NoZW1hLmdldFR5cGUoKSwgYXR0clNjaGVtYSwgZXZlbnQsIGZhbHNlLCBmYWxzZSApOwotCi0gICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS5hdHRyKCBldmVudCwgYXR0ck5hbWUsIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCB2YWx1ZSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lsZGNhcmRQcm9jZXNzID0gc3RhdGUuX2F0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKTsKLQotICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFsbG93ZWQgKG5vIHdpbGRjYXJkcyBhbGxvd2VkKTogIgotICAgICAgICAgICAgICAgICAgICArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBRTmFtZVNldCBhdHRyV2lsZGNhcmRTZXQgPSBzdGF0ZS5fYXR0ck1vZGVsLmdldFdpbGRjYXJkU2V0KCk7Ci0KLSAgICAgICAgaWYgKCFhdHRyV2lsZGNhcmRTZXQuY29udGFpbnMoIGF0dHJOYW1lICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFsbG93ZWQ6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5TS0lQKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGF0dHJTY2hlbWEgPSBfZ2xvYmFsVHlwZXMuZmluZEF0dHJpYnV0ZSggYXR0ck5hbWUgKTsKLQotICAgICAgICBpZiAoYXR0clNjaGVtYSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLkxBWCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGFzc2VydCB3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuU1RSSUNUOwotCi0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiQXR0cmlidXRlIG5vdCBhbGxvd2VkIChzdHJpY3Qgd2lsZGNhcmQsIGFuZCBubyBkZWZpbml0aW9uIGZvdW5kKTogIiArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdmFsdWUgPQotICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCBhdHRyU2NoZW1hLCBldmVudCwgZmFsc2UsIGZhbHNlICk7Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuYXR0ciggZXZlbnQsIGF0dHJOYW1lLCBhdHRyU2NoZW1hLmdldFR5cGUoKSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5kQXR0cnNFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKLQotICAgICAgICBpZiAoc3RhdGUuX2F0dHJNb2RlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gc3RhdGUuX2F0dHJNb2RlbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBhdHRycy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNsYSA9IGF0dHJzWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2F0dHJzID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFzdGF0ZS5fYXR0cnMuY29udGFpbnMoIHNsYS5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzbGEuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUkVRVUlSRUQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAiRXhwZWN0ZWQgYXR0cmlidXRlOiAiLCBzbGEuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xhLmlzRGVmYXVsdCgpIHx8IHNsYS5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLmF0dHIoZXZlbnQsIHNsYS5nZXROYW1lKCksIHNsYS5nZXRUeXBlKCksIHNsYS5nZXREZWZhdWx0VGV4dCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBhdHRyaWJ1dGUgZGVmYXVsdHMgYmVjYXVzZSB0aGlzIGlzIGRvbmUgYXQgY29tcGlsZXRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2xhLmdldERlZmF1bHRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBzbGEuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sUU5hbWUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IFFOYW1lIHZhbHVlcyBhcmUgdW5zdXBwb3J0ZWQgZm9yIGF0dHJpYnV0ZTogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWVIZWxwZXIucHJldHR5KHNsYS5nZXROYW1lKCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzbGEuZ2V0RGVmYXVsdFRleHQoKSwgZXZlbnQgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLmF0dHIoIGV2ZW50LCB0eXBlLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmRFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKLQotICAgICAgICBpZiAoIXN0YXRlLl9pc05pbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdGF0ZS5lbmQoKSkKLSAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvciggZXZlbnQsICJFeHBlY3RlZCBlbGVtZW50KHMpIiApOwotCi0gICAgICAgICAgICAvLyBUaGlzIGVuZCBldmVudCBoYXMgbm8gdGV4dCwgdXNlIHRoaXMgZmFjdCB0byBwYXNzIG5vIHRleHQgdG8KLSAgICAgICAgICAgIC8vIGhhbmRsZVRleHQKLQotICAgICAgICAgICAgaWYgKHN0YXRlLl9pc0VtcHR5KQotICAgICAgICAgICAgICAgIGhhbmRsZVRleHQoIGV2ZW50LCB0cnVlLCBzdGF0ZS5fZmllbGQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBvcFN0YXRlKCBldmVudCApOwotCi0gICAgICAgIF9jb25zdHJhaW50RW5naW5lLmVuZEVsZW1lbnQoIGV2ZW50ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRleHRFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKLQotICAgICAgICBpZiAoc3RhdGUuX2lzTmlsKQotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsICJOaWwgZWxlbWVudCBjYW5ub3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBoYW5kbGVUZXh0KCBldmVudCwgZmFsc2UsIHN0YXRlLl9maWVsZCApOwotCi0gICAgICAgIHN0YXRlLl9pc0VtcHR5ID0gZmFsc2U7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGV4dCAoCi0gICAgICAgIEV2ZW50IGV2ZW50LCBib29sZWFuIGVtcHR5Q29udGVudCwgU2NoZW1hRmllbGQgZmllbGQgKQotICAgIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOwotCi0gICAgICAgIGlmICghc3RhdGUuX3Nhd1RleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5faGFzU2ltcGxlQ29udGVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fdHlwZSwgZmllbGQsIGV2ZW50LCBlbXB0eUNvbnRlbnQsIHRydWUgKTsKLQotICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLnRleHQoIGV2ZW50LCBzdGF0ZS5fdHlwZSwgdmFsdWUsIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChlbXB0eUNvbnRlbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUudGV4dCggZXZlbnQsIHN0YXRlLl90eXBlLCBudWxsLCB0cnVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUudGV4dCggZXZlbnQsIHN0YXRlLl90eXBlLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFlbXB0eUNvbnRlbnQgJiYgIXN0YXRlLl9jYW5IYXZlTWl4ZWRDb250ZW50ICYmIAotICAgICAgICAgICAgIWV2ZW50LnRleHRJc1doaXRlc3BhY2UoKSAmICFzdGF0ZS5faGFzU2ltcGxlQ29udGVudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgU2NoZW1hTG9jYWxFbGVtZW50KSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnQgZSA9IChTY2hlbWFMb2NhbEVsZW1lbnQpZmllbGQ7Ci0gICAgICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAiRWxlbWVudDogJyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZS5nZXROYW1lKCkpICsgIicgY2Fubm90IGhhdmUgbWl4ZWQgY29udGVudC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoIGV2ZW50LCAiQ2FuJ3QgaGF2ZSBtaXhlZCBjb250ZW50IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFlbXB0eUNvbnRlbnQpCi0gICAgICAgICAgICBzdGF0ZS5fc2F3VGV4dCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBTdGF0ZQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB2aXNpdCAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NhbkhhdmVFbGVtZW50cyAmJiBfdmlzaXRvci52aXNpdCggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBlbmQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhX2NhbkhhdmVFbGVtZW50cyB8fCBfdmlzaXRvci52aXNpdCggbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGUgY3VycmVudFBhcnRpY2xlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3Zpc2l0b3IgIT0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBfdmlzaXRvci5jdXJyZW50UGFydGljbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUgIF90eXBlOwotICAgICAgICBTY2hlbWFGaWVsZCBfZmllbGQ7Ci0KLSAgICAgICAgYm9vbGVhbiBfY2FuSGF2ZUF0dHJzOwotICAgICAgICBib29sZWFuIF9jYW5IYXZlTWl4ZWRDb250ZW50OwotICAgICAgICBib29sZWFuIF9oYXNTaW1wbGVDb250ZW50OwotCi0gICAgICAgIGJvb2xlYW4gX3Nhd1RleHQ7Ci0gICAgICAgIGJvb2xlYW4gX2lzRW1wdHk7Ci0gICAgICAgIGJvb2xlYW4gX2lzTmlsOwotCi0gICAgICAgIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCBfdmlzaXRvcjsKLSAgICAgICAgYm9vbGVhbiBfY2FuSGF2ZUVsZW1lbnRzOwotCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIF9hdHRyTW9kZWw7Ci0KLSAgICAgICAgSGFzaFNldCBfYXR0cnM7Ci0KLSAgICAgICAgU3RhdGUgX25leHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5ld1N0YXRlICggU2NoZW1hVHlwZSB0eXBlLCBTY2hlbWFGaWVsZCBmaWVsZCwgYm9vbGVhbiBpc05pbCApCi0gICAgewotICAgICAgICBTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgpOwotCi0gICAgICAgIHN0YXRlLl90eXBlID0gdHlwZTsKLSAgICAgICAgc3RhdGUuX2ZpZWxkID0gZmllbGQ7Ci0gICAgICAgIHN0YXRlLl9pc0VtcHR5ID0gdHJ1ZTsKLSAgICAgICAgc3RhdGUuX2lzTmlsID0gaXNOaWw7Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLl9oYXNTaW1wbGVDb250ZW50ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLl9jYW5IYXZlQXR0cnMgPSB0cnVlOwotICAgICAgICAgICAgc3RhdGUuX2F0dHJNb2RlbCA9IHR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKTsKLQotICAgICAgICAgICAgc3dpdGNoICggdHlwZS5nZXRDb250ZW50VHlwZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UIDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UIDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5faGFzU2ltcGxlQ29udGVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UIDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5fY2FuSGF2ZU1peGVkQ29udGVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgOgotCi0gICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSB0eXBlLmdldENvbnRlbnRNb2RlbCgpOwotCi0gICAgICAgICAgICAgICAgc3RhdGUuX2NhbkhhdmVFbGVtZW50cyA9IHBhcnRpY2xlICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2NhbkhhdmVFbGVtZW50cykKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuX3Zpc2l0b3IgPSBpbml0VmlzaXRvciggcGFydGljbGUgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgY29udGVudCB0eXBlIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVzaFN0YXRlKCBzdGF0ZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3BTdGF0ZSAoIEV2ZW50IGUgKQotICAgIHsKLSAgICAgICAgaWYgKF9zdGF0ZVN0YWNrLl92aXNpdG9yICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvb2xWaXNpdG9yKCBfc3RhdGVTdGFjay5fdmlzaXRvciApOwotICAgICAgICAgICAgX3N0YXRlU3RhY2suX3Zpc2l0b3IgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgX3N0YXRlU3RhY2sgPSBfc3RhdGVTdGFjay5fbmV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHVzaFN0YXRlICggU3RhdGUgc3RhdGUgKQotICAgIHsKLSAgICAgICAgc3RhdGUuX25leHQgPSBfc3RhdGVTdGFjazsKLSAgICAgICAgX3N0YXRlU3RhY2sgPSBzdGF0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpbmtlZExpc3QgX3Zpc2l0b3JQb29sID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgIHByaXZhdGUgdm9pZCBwb29sVmlzaXRvciggU2NoZW1hVHlwZVZpc2l0b3JJbXBsIHZpc2l0b3IgKQotICAgIHsKLSAgICAgICAgX3Zpc2l0b3JQb29sLmFkZCggdmlzaXRvciApOwotICAgIH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIGluaXRWaXNpdG9yKCBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSApCi0gICAgewotICAgICAgICBpZiAoX3Zpc2l0b3JQb29sLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKCBwYXJ0aWNsZSApOwotCi0gICAgICAgIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCByZXN1bHQgPQotICAgICAgICAgICAgKFNjaGVtYVR5cGVWaXNpdG9ySW1wbCkgX3Zpc2l0b3JQb29sLnJlbW92ZUxhc3QoKTsKLQotICAgICAgICByZXN1bHQuaW5pdCggcGFydGljbGUgKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RhdGUgdG9wU3RhdGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3N0YXRlU3RhY2s7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBTaW1wbGUgVHlwZSBWYWxpZGF0aW9uCi0gICAgLy8KLSAgICAvLyBlbXB0eUNvbnRlbnQgbWVhbnMgdGhhdCB5b3UgY2FuJ3QgdXNlIHRoZSBldmVudCB0byBnZXQgdGV4dDogdGhlcmUgaXMKLSAgICAvLyBub3QgdGV4dCwgYnV0IHlvdSBjYW4gdXNlIHRoZSBldmVudCB0byBkbyBwcmVmaXggcmVzb2x1dGlvbiAoaW4gdGhlIGNhc2UKLSAgICAvLyB3aGVyZSB0aGUgZGVmYXVsdCBpcyBhIHFuYW1lKQotICAgIC8vCi0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZVNpbXBsZVR5cGUgKAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFNjaGVtYUZpZWxkIGZpZWxkLCBFdmVudCBldmVudCwKLSAgICAgICAgYm9vbGVhbiBlbXB0eUNvbnRlbnQsIGJvb2xlYW4gY2FuQXBwbHlEZWZhdWx0ICkKLSAgICB7Ci0gICAgICAgIGlmICghdHlwZS5pc1NpbXBsZVR5cGUoKSAmJgotICAgICAgICAgICAgICAgIHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAvLyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBhIHNpbXBsZSB0eXBlIiApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIHRoZSBuby10eXBlIGlzIGFsd2F5cyBpbnZhbGlkCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAiSW52YWxpZCB0eXBlLiIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBhcyBhIHN0cmluZyAoYXMgbm9ybWFsaXplZCBieSB0aGUgd2hpdGUgc3BhY2UgcnVsZQotICAgICAgICAvLyBUT0RPIC0gd2lsbCB3YW50IHRvIG9wdGltaXplIHRoaXMgbGF0ZXIKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIjsKLQotICAgICAgICBpZiAoIWVtcHR5Q29udGVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZXZlbnQuZ2V0VGV4dCggX2NoYXJzLCB0eXBlLmdldFdoaXRlU3BhY2VSdWxlKCkgKTsKLSAgICAgICAgICAgIHZhbHVlID0gX2NoYXJzLmFzU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgSSBjYW4gYXBwbHkgYSBkZWZhdWx0L2ZpeGVkIHZhbHVlCi0KLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDAgJiYgY2FuQXBwbHlEZWZhdWx0ICYmIGZpZWxkICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoZmllbGQuaXNEZWZhdWx0KCkgfHwgZmllbGQuaXNGaXhlZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFhtbFFOYW1lLnR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdCBRTmFtZSB2YWx1ZXMgYXJlIHVuc3VwcG9ydGVkIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICsgIiAtIGlnbm9yaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0lORk8pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VmFsdWUgPQotICAgICAgICAgICAgICAgIFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldERlZmF1bHRUZXh0KCksIHR5cGUuZ2V0V2hpdGVTcGFjZVJ1bGUoKSApOwotCi0vLyBCVUdCVUcgLSBzaG91bGQgdmFsaWRhdGUgZGVmYXVsdFZhbHVlIGF0IGNvbXBpbGUgdGltZQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKCB0eXBlLCBkZWZhdWx0VmFsdWUsIGV2ZW50ICkKLSAgICAgICAgICAgICAgICAgICAgPyBkZWZhdWx0VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGUsIHZhbHVlLCBldmVudCApKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuaXNGaXhlZCgpKQotICAgICAgICB7Ci0vLyBUT0RPIC0gZml4ZWQgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiBjb29rZWQgYXQgY29tcGlsZSB0aW1lCi0gICAgICAgICAgICBTdHJpbmcgZml4ZWRWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSgKLSAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVmYXVsdFRleHQoKSwgdHlwZS5nZXRXaGl0ZVNwYWNlUnVsZSgpICk7Ci0KLSAgICAgICAgICAgIGlmICghdmFsaWRhdGVTaW1wbGVUeXBlKCB0eXBlLCBmaXhlZFZhbHVlLCBldmVudCApKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBYbWxPYmplY3QgdmFsID0gdHlwZS5uZXdWYWx1ZSggdmFsdWUgKTsKLSAgICAgICAgICAgIFhtbE9iamVjdCBkZWYgPSB0eXBlLm5ld1ZhbHVlKCBmaXhlZFZhbHVlICk7Ci0KLSAgICAgICAgICAgIGlmICghdmFsLnZhbHVlRXF1YWxzKCBkZWYgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBCVUdCVUcgLSBtYWtlIHRoaXMgbW9yZSB2ZXJib3NlCi0KLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiVmFsdWUgbm90IGVxdWFsIHRvIGZpeGVkIHZhbHVlLiAiICsgdmFsdWUgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVNpbXBsZVR5cGUgKAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgaWYgKCF0eXBlLmlzU2ltcGxlVHlwZSgpICYmCi0gICAgICAgICAgICAgICAgdHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm90IGEgc2ltcGxlIHR5cGUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmV0U3RhdGUgPSBfZXJyb3JTdGF0ZTsKLQotICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldFNpbXBsZVZhcmlldHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQyA6IHZhbGlkYXRlQXRvbWljVHlwZSggdHlwZSwgdmFsdWUsIGV2ZW50ICk7YnJlYWs7Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTiAgOiB2YWxpZGF0ZVVuaW9uVHlwZSggIHR5cGUsIHZhbHVlLCBldmVudCApO2JyZWFrOwotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVCAgIDogdmFsaWRhdGVMaXN0VHlwZSggICB0eXBlLCB2YWx1ZSwgZXZlbnQgKTticmVhazsKLQotICAgICAgICBkZWZhdWx0IDogdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmV4cGVjdGVkIHNpbXBsZSB2YXJpZXR5IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldFN0YXRlID09IF9lcnJvclN0YXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUF0b21pY1R5cGUgKAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgLy8gTm93IHdlIHNob3VsZCBoYXZlIG9ubHkgYW4gYXRvbWljIHR5cGUgdG8gdmFsaWRhdGUKLQotICAgICAgICBhc3NlcnQgdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUM7Ci0KLSAgICAgICAgLy8gUmVjb3JkIHRoZSBjdXJyZW50IGVycm9yIHN0YXRlIHRvIHNlZSBpZiBhbnkgbmV3IGVycm9ycyBhcmUgbWFkZQotICAgICAgICBpbnQgZXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOwotICAgICAgICBfdmMuX2V2ZW50ID0gZXZlbnQ7Ci0KLSAgICAgICAgc3dpdGNoICggdHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFsd2F5cyB2YWxpZCEKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HIDoKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwgOgotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhRGVjaW1hbEhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKYXZhRGVjaW1hbEhvbGRlckV4LnZhbGlkYXRlVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKCB2YWx1ZSApLCB0eXBlLCBfdmMgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOIDoKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YUJvb2xlYW5Ib2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBmbG9hdCBmID0KLSAgICAgICAgICAgICAgICBKYXZhRmxvYXRIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCi0gICAgICAgICAgICAgICAgSmF2YUZsb2F0SG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggZiwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFIDoKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGQgPQotICAgICAgICAgICAgICAgIEphdmFEb3VibGVIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCi0gICAgICAgICAgICAgICAgSmF2YURvdWJsZUhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIGQsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FIDoKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbiA9Ci0gICAgICAgICAgICAgICAgSmF2YVFOYW1lSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKAotICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgdHlwZSwgX3ZjLCBldmVudCApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBKYXZhUU5hbWVIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCBuLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJIDoKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YVVyaUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVIgOgotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWSA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEdEYXRlIGQgPSBYbWxEYXRlSW1wbC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBYbWxEYXRlSW1wbC52YWxpZGF0ZVZhbHVlKCBkLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEdEdXJhdGlvbiBkID0gWG1sRHVyYXRpb25JbXBsLnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIFhtbER1cmF0aW9uSW1wbC52YWxpZGF0ZVZhbHVlKCBkLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSB2ID0KLSAgICAgICAgICAgICAgICBKYXZhQmFzZTY0SG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgSmF2YUJhc2U2NEhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIHYsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlkgOgotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gdiA9Ci0gICAgICAgICAgICAgICAgSmF2YUhleEJpbmFyeUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAodiAhPSBudWxsKQotICAgICAgICAgICAgICAgIEphdmFIZXhCaW5hcnlIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCB2LCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTiA6Ci0gICAgICAgICAgICAvLyBVbmltcGxlbWVudGVkLiAKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmV4cGVjdGVkIHByaW1pdGl2ZSB0eXBlIGNvZGUiICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVMaXN0VHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBpbnQgZXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgIGlmICghdHlwZS5tYXRjaFBhdHRlcm5GYWNldCggdmFsdWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJMaXN0ICciICsgdmFsdWUgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gWG1sTGlzdEltcGwuc3BsaXRfbGlzdCh2YWx1ZSk7Ci0KLSAgICAgICAgCi0gICAgICAgIGludCBpOwotICAgICAgICBYbWxPYmplY3QgbzsKLQotICAgICAgICBpZiAoKG8gPSB0eXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpICE9IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIHZhbHVlICsgIikgZG9lcyBub3QgaGF2ZSAiICsgaSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zIHBlciBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG8gPSB0eXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSA+IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIHZhbHVlICsgIikgaGFzIG9ubHkgIiArIGl0ZW1zLmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zLCBmZXdlciB0aGFuIG1pbiBsZW5ndGggZmFjZXQgKCIgKyBpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKG8gPSB0eXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSA8IGl0ZW1zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIHZhbHVlICsgIikgaGFzICIgKyBpdGVtcy5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgbW9yZSB0aGFuIG1heCBsZW5ndGggZmFjZXQgKCIgKyBpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBpdGVtVHlwZSA9IHR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0KLSAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAotICAgICAgICAgICAgICAgIGl0ZW1UeXBlLCBpdGVtc1tpXSwgZXZlbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIG5vIGVycm9ycyB1cCB0byB0aGlzIHBvaW50LCB0aGVuIEkgY2FuIGNyZWF0ZSBhbgotICAgICAgICAvLyBYbWxMaXN0IGZyb20gdGhpcyB2YWx1ZSBhbmQgY2FtcGFyZSBpdCBhZ2FpbiBlbnVtcy4KLQotICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIExpc3RzIHdoaWNoIGNvbnRhaW4gUU5hbWVzIHdpbGwgbmVlZCBhIHJlc29sdmVyCi0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2goCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOYW1lc3BhY2VDb250ZXh0KCBldmVudCApICk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBsaXN0VmFsdWUgPSAoIChTY2hlbWFUeXBlSW1wbCkgdHlwZSkubmV3VmFsaWRhdGluZ1ZhbHVlKCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJMaXN0IHZhbHVlICgiICsgdmFsdWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVVuaW9uVHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICAvLyBUT0RPIC0gaWYgeHNpOnR5cGUgaXMgc3BlY2lmaWVkIG9uIGEgdW5pb24sIGl0IHNlbGVjdHMKLSAgICAgICAgLy8gdGhhdCB1bmlvbiBtZW1iZXIgdHlwZQotCi0gICAgICAgIGlmICghdHlwZS5tYXRjaFBhdHRlcm5GYWNldCggdmFsdWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJVbmlvbiAnIiArIHZhbHVlICsgIicgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjdXJyZW50V3NyID0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHZhbHVlOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSB0eXBlcyA9IHR5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpOwotCi0gICAgICAgIGludCBvcmlnaW5hbFN0YXRlID0gX2Vycm9yU3RhdGU7Ci0KLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHR5cGVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtZW1iZXJXc3IgPSB0eXBlc1sgaSBdLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJXc3IgPT0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICBtZW1iZXJXc3IgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotCi0gICAgICAgICAgICBpZiAobWVtYmVyV3NyICE9IGN1cnJlbnRXc3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFdzciA9IG1lbWJlcldzcjsKLSAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKCB2YWx1ZSwgY3VycmVudFdzciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgb3JpZ2luYWxFcnJvclN0YXRlID0gX2Vycm9yU3RhdGU7Ci0KLSAgICAgICAgICAgIF9zdXNwZW5kRXJyb3JzKys7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlU2ltcGxlVHlwZSggdHlwZXNbIGkgXSwgY3VycmVudFZhbHVlLCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zdXNwZW5kRXJyb3JzLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvcmlnaW5hbEVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBfZXJyb3JTdGF0ZSA9IG9yaWdpbmFsU3RhdGU7Ci0KLSAgICAgICAgaWYgKGkgPj0gdHlwZXMubGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgIlVuaW9uICciICsgdmFsdWUgKyAiJyBkb2VzIG5vdCBtYXRjaCBhbnkgbWVtYmVycyBvZiAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdFtdIHVuaW9uRW51bXZhbHMgPSB0eXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgIGlmICh1bmlvbkVudW12YWxzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVW5pb25zIHdoaWNoIGNvbnRhaW4gUU5hbWVzIHdpbGwgbmVlZCBhIHJlc29sdmVyCi0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2goIG5ldyBOYW1lc3BhY2VDb250ZXh0KCBldmVudCApICk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCB1bmlvblZhbHVlID0gdHlwZS5uZXdWYWx1ZSggdmFsdWUgKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCB1bmlvbkVudW12YWxzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlvblZhbHVlLnZhbHVlRXF1YWxzKCB1bmlvbkVudW12YWxzWyBpIF0gKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpID49IHVuaW9uRW51bXZhbHMubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaW9uICciICsgdmFsdWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHksIHRoZSBjdXJyZW50IHVuaW9uIGNvZGUgYWx3YXlzIGVuZHMgdXAgaGVyZSB3aGVuIGludmFsaWQKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8KLSAgICAvLyBNZW1iZXJzIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MKLSAgICAvLwotCi0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgX2ludmFsaWQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlICAgICAgICAgX3Jvb3RUeXBlOwotICAgIHByaXZhdGUgU2NoZW1hRmllbGQgICAgICAgIF9yb290RmllbGQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyICAgX2dsb2JhbFR5cGVzOwotICAgIHByaXZhdGUgQ2hhcnMgICAgICAgICAgICAgIF9jaGFyczsKLSAgICBwcml2YXRlIFN0YXRlICAgICAgICAgICAgICBfc3RhdGVTdGFjazsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICBfZXJyb3JTdGF0ZTsKLSAgICBwcml2YXRlIENvbGxlY3Rpb24gICAgICAgICBfZXJyb3JMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZhbGlkYXRvclZDICAgICAgICBfdmM7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnM7Ci0gICAgcHJpdmF0ZSBJZGVudGl0eUNvbnN0cmFpbnQgX2NvbnN0cmFpbnRFbmdpbmU7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQ7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWU5NjIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFCYXNlNjRIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0JBU0VfNjRfQklOQVJZOyB9Ci0KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZShfdmFsdWUpKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIF92YWx1ZSA9IHZhbGlkYXRlTGV4aWNhbChzLCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfdmFsdWUgPSBsZXgocywgX3Zvb3JWYyk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBsZXgoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGMpCi0gICAgewotICAgICAgICBieXRlW10gdkJ5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZCeXRlcyA9IHYuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgIH0KLSAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gQmFzZTY0LmRlY29kZSh2Qnl0ZXMpOwotCi0gICAgICAgIGlmIChieXRlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gZ2V0IGEgZGVjZW50IGVycm9yIHdpdGggbGluZSBudW1iZXJzIGFuZCBzdWNoIGhlcmUKLSAgICAgICAgICAgIGMuaW52YWxpZCgiQmFzZSA2NCBlbmNvZGVkIGRhdGEgbm90IGVuY29kZWQgcHJvcGVybHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBsZXgodiwgY29udGV4dCk7Ci0gICAgICAgIGlmIChieXRlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCggIkJhc2UgNjQgZW5jb2RlZCBkYXRhIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBieXRlQXJyYXlWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbX3ZhbHVlLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3ZhbHVlLCAwLCByZXN1bHQsIDAsIF92YWx1ZS5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQnl0ZUFycmF5KGJ5dGVbXSBiYSkKLSAgICB7Ci0gICAgICAgIF9oYXNoY2FjaGVkID0gZmFsc2U7Ci0gICAgICAgIF92YWx1ZSA9IG5ldyBieXRlW2JhLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYmEsIDAsIF92YWx1ZSwgMCwgYmEubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgYnl0ZVtdIGl2YWwgPSAoKFhtbEJhc2U2NEJpbmFyeSkgaSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoX3ZhbHVlLCBpdmFsKTsKLSAgICB9Ci0KLSAgICAvL2JlY2F1c2UgY29tcHV0aW5nIGhhc2hjb2RlIGlzIGV4cGVuc2l2ZSB3ZSdsbCBjYWNoZSBpdAotICAgIHByb3RlY3RlZCBib29sZWFuIF9oYXNoY2FjaGVkID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGludCBoYXNoY29kZSA9IDA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNTsKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBNRDUgaGFzaCBBbGdvcml0aG0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmKCBfaGFzaGNhY2hlZCApCi0gICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7Ci0KLSAgICAgICAgX2hhc2hjYWNoZWQgPSB0cnVlOwotCi0gICAgICAgIGlmKCBfdmFsdWUgPT0gbnVsbCApCi0gICAgICAgICAgICByZXR1cm4gaGFzaGNvZGUgPSAwOwotCi0gICAgICAgIGJ5dGVbXSByZXMgPSBtZDUuZGlnZXN0KF92YWx1ZSk7Ci0gICAgICAgIHJldHVybiBoYXNoY29kZSA9IHJlc1swXTw8MjQgKyByZXNbMV08PDE2ICsgcmVzWzJdPDw4ICsgcmVzWzNdOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCYXNlNjRIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzA3MTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQmFzZTY0SG9sZGVyRXggZXh0ZW5kcyBKYXZhQmFzZTY0SG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgSmF2YUJhc2U2NEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSB2OwotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdiA9IHZhbGlkYXRlTGV4aWNhbChzLCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gbGV4KHMsIF92b29yVmMpOwotCi0gICAgICAgIGlmICh2ICE9IG51bGwgJiYgX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgc2NoZW1hVHlwZSgpLCBYbWxPYmplY3RCYXNlLl92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X0J5dGVBcnJheSh2KTsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X0J5dGVBcnJheSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShieXRlW10gdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBYbWxPYmplY3QgbzsKLQotICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBoYXZlICIgKyBpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcGVyIGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpID4gdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgaGFzIG9ubHkgIiArIHYubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsIGZld2VyIHRoYW4gbWluIGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpIDwgdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgaGFzICIgKyB2Lmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCBtb3JlIHRoYW4gbWF4IGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW51bUxvb3A6IGZvciAoIGkgPSAwIDsgaSA8IHZhbHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gZW51bUJ5dGVzID0gKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmJ5dGVBcnJheVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW51bUJ5dGVzLmxlbmd0aCAhPSB2Lmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZW51bUJ5dGVzLmxlbmd0aCA7IGorKyApCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbnVtQnl0ZXNbal0gIT0gdltqXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGVudW1Mb29wOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSB2YWxzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkJhc2UgNjQgZW5jb2RlZCBkYXRhIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgZW51bWVyYXRpb24gdmFsdWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGJ5dGVBcnJheVZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E3MWI5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQm9vbGVhbkhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQk9PTEVBTjsgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBfdmFsdWUgPSB2YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYyk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAodi5lcXVhbHMoInRydWUiKSB8fCB2LmVxdWFscygiMSIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiAodi5lcXVhbHMoImZhbHNlIikgfHwgdi5lcXVhbHMoIjAiKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjb250ZXh0LmludmFsaWQoIkludmFsaWQgdmFsdWUgZm9yIGJvb2xlYW46ICIgKyB2KTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gZmFsc2U7Ci0gICAgfQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2Jvb2xlYW4oYm9vbGVhbiBmKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gZjsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIC8vIG5vIG9yZGVyaW5nIGRlZmluZWQgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZQotICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sQm9vbGVhbilpKS5nZXRCb29sZWFuVmFsdWUoKSA/IDAgOiAyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbEJvb2xlYW4paSkuZ2V0Qm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZSA/IDk1NzM3OTU1NCA6IDY3NjMzNTk3NTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZjZjZGIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQm9vbGVhbkhvbGRlckV4IGV4dGVuZHMgSmF2YUJvb2xlYW5Ib2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBKYXZhQm9vbGVhbkhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0gICAgICAgIHZhbGlkYXRlUGF0dGVybih2LCBzVHlwZSwgY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVBhdHRlcm4oU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyB0aGUgb25seSBuZXcgZmFjZXQgdGhhdCBjYW4gYXBwbHkgdG8gYm9vbGVhbnMgaXMgcGF0dGVybiEKLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiQm9vbGVhbiAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEphdmFCb29sZWFuSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVQYXR0ZXJuKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgc3VwZXIuc2V0X3RleHQocyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmMyMTdkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1wdWJsaWMgY2xhc3MgSmF2YURlY2ltYWxIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0RFQ0lNQUw7IH0KLQotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHNldHMvZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUudG9TdHJpbmcoKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldF9CaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKHMpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92b29yVmMuaW52YWxpZCgiSW52YWxpZCBEZWNpbWFsIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGxleGljYWwgdmFsaWRhdGlvbiBvbmx5LgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gLSB3aWxsIHdhbnQgdG8gdmFsaWRhdGUgQ2hhcnMgd2l0aCBidWlsdCBpbiB3aGl0ZSBzcGFjZSBoYW5kbGluZwotICAgICAgICAvLyAgICAgICAgSG93ZXZlciwgdGhpcyBmY24gc29tZXRpbWVzIHRha2VzIGEgdmFsdWUgd2l0aCB3c3IgYXBwbGllZAotICAgICAgICAvLyAgICAgICAgYWxyZWFkeQotICAgICAgICBpbnQgbCA9IHYubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgCi0gICAgICAgIGlmIChpIDwgbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNoID0gdi5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjaCA9PSAnKycgfHwgY2ggPT0gJy0nKQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBzYXdEb3QgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBzYXdEaWdpdCA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoIDsgaSA8IGwgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2ggPSB2LmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGNoID09ICcuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2F3RG90KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbGxlZ2FsIGRlY2ltYWwsIHNhdyAnLicgbW9yZSB0aGFuIG9uY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNhd0RvdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNhd0RpZ2l0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gbWF5IG5lZWQgdG8gZXNjYXBlIGVycm9yIGNoYXIKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIklsbGVnYWwgZGVjaW1hbCwgdW5leHBlY3RlZCBjaGFyOiAiICsgY2gpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2F3RGlnaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSWxsZWdhbCBkZWNpbWFsLCBleHBlY3RlZCBhdCBsZWFzdCBvbmUgZGlnaXQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IF92YWx1ZSA9IHY7IH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBkZWNpbWFsKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5jb21wYXJlVG8oKChYbWxPYmplY3RCYXNlKWRlY2ltYWwpLmJpZ0RlY2ltYWxWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGRlY2ltYWwpCi0gICAgewotICAgICAgICByZXR1cm4gKF92YWx1ZS5jb21wYXJlVG8oKChYbWxPYmplY3RCYXNlKWRlY2ltYWwpLmJpZ0RlY2ltYWxWYWx1ZSgpKSkgPT0gMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhsb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5sb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKTsKLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsdWUuc2NhbGUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdmFsdWUuc2V0U2NhbGUoMCwgQmlnRGVjaW1hbC5ST1VORF9ET1dOKS5jb21wYXJlVG8oX3ZhbHVlKSAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBkZWNpbWFsSGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJpZ0ludGVnZXIgaW50dmFsID0gX3ZhbHVlLnRvQmlnSW50ZWdlcigpOwotCi0gICAgICAgIGlmIChpbnR2YWwuY29tcGFyZVRvKF9tYXhsb25nKSA+IDAgfHwKLSAgICAgICAgICAgIGludHZhbC5jb21wYXJlVG8oX21pbmxvbmcpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBpbnR2YWwuaGFzaENvZGUoKTsKLQotICAgICAgICBsb25nIGxvbmd2YWwgPSBpbnR2YWwubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIChpbnQpKChsb25ndmFsID4+IDMyKSAqIDE5ICsgbG9uZ3ZhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBoYXMgQmlnRGVjaW1hbHMgd2l0aCB0aGUgc2FtZSBhcml0aG1ldGljIHZhbHVlIHRvCi0gICAgICogdGhlIHNhbWUgaGFzaCBjb2RlIChlZywgMi4zICYgMi4zMCB3aWxsIGhhdmUgdGhlIHNhbWUgaGFzaC4pCi0gICAgICogVGhpcyBkaWZmZXJzIGZyb20gQmlnRGVjaW1hbC5oYXNoQ29kZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBkZWNpbWFsSGFzaENvZGUoKSB7Ci0gICAgICAgIGFzc2VydCBfdmFsdWUuc2NhbGUoKSA+IDA7Ci0KLSAgICAgICAgLy8gR2V0IGRlY2ltYWwgdmFsdWUgYXMgc3RyaW5nLCBhbmQgc3RyaXAgb2ZmIHplcm9lcyBvbiB0aGUgcmlnaHQKLSAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gX3ZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSBzdHJWYWx1ZS5sZW5ndGgoKSAtIDEgOyBpID49IDAgOyBpIC0tKQotICAgICAgICAgICAgaWYgKHN0clZhbHVlLmNoYXJBdChpKSAhPSAnMCcpIGJyZWFrOwotCi0gICAgICAgIGFzc2VydCBzdHJWYWx1ZS5pbmRleE9mKCcuJykgPCBpOwotCi0gICAgICAgIC8vIFJldHVybiB0aGUgY2Fub25pY2FsaXplZCBzdHJpbmcgaGFzaGNvZGUKLSAgICAgICAgcmV0dXJuIHN0clZhbHVlLnN1YnN0cmluZygwLCBpICsgMSkuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTRlNGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YURlY2ltYWxIb2xkZXJFeCBleHRlbmRzIEphdmFEZWNpbWFsSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgSmF2YURlY2ltYWxIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIEJpZ0RlY2ltYWwgdiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2ID0gbmV3IEJpZ0RlY2ltYWwocyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdm9vclZjLmludmFsaWQoIkludmFsaWQgRGVjaW1hbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBzdXBlci5zZXRfQmlnRGVjaW1hbCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgc3VwZXIuc2V0X0JpZ0RlY2ltYWwodik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBKYXZhRGVjaW1hbEhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBwYXR0ZXJuCi0gICAgICAgIGlmIChzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gZGVzY3JpYmUgc3RyaW5nIGFuZCBwYXR0ZXJuIGhlcmUgaW4gZXJyb3IKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRlY2ltYWwgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgZmFjZXQgdmFsaWRhdGlvbiBvbmx5LgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoQmlnRGVjaW1hbCB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gZnJhY3Rpb25hbCBkaWdpdHMKLSAgICAgICAgWG1sT2JqZWN0IGZkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpOwotICAgICAgICBpZiAoZmQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNjYWxlID0gKChYbWxPYmplY3RCYXNlKWZkKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYuc2NhbGUoKSA+IHNjYWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgZnJhY3Rpb25hbCBkaWdpdHMgKCIgKyB2LnNjYWxlKCkgKyAiKSBkb2VzIG5vdCBtYXRjaCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJmcmFjdGlvbmFsIGRpZ2l0cyBmYWNldCAoIiArIHNjYWxlICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRvdGFsIGRpZ2l0cwotICAgICAgICBYbWxPYmplY3QgdGQgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUyk7Ci0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcCA9IHYudW5zY2FsZWRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpbnQgdGRmID0gKChYbWxPYmplY3RCYXNlKXRkKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCi0gICAgICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgICAgICBpZiAobGVuID4gdGRmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgdG90YWwgZGlnaXRzICgiICsgdGVtcCArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBkaWdpdHMgZmFjZXQgKCIgKyB0ZGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGV4Ci0gICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBtID0gKChYbWxPYmplY3RCYXNlKW1pbmUpLmJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKG0pIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGluCi0gICAgICAgIFhtbE9iamVjdCBtaW5pID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBtID0gKChYbWxPYmplY3RCYXNlKW1pbmkpLmJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKG0pIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEZWNpbWFsICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggaW4KLSAgICAgICAgWG1sT2JqZWN0IG1heGkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWF4aSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIG0gPSAoKFhtbE9iamVjdEJhc2UpbWF4aSkuYmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG8obSkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBleAotICAgICAgICBYbWxPYmplY3QgbWF4ZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXhlKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUbyhtKSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVudW1lcmF0aW9uCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSl2YWxzW2ldKS5iaWdEZWNpbWFsVmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGVjaW1hbCAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoYmlnRGVjaW1hbFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEb3VibGVIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEb3VibGVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlZTc3ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YURvdWJsZUhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfRE9VQkxFOyB9Ci0KLSAgICBkb3VibGUgX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzL3NldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gc2VyaWFsaXplKF92YWx1ZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShkb3VibGUgZCkKLSAgICB7Ci0gICAgICAgIGlmIChkID09IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkKLSAgICAgICAgICAgIHJldHVybiAiSU5GIjsKLSAgICAgICAgZWxzZSBpZiAoZCA9PSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpCi0gICAgICAgICAgICByZXR1cm4gIi1JTkYiOwotICAgICAgICBlbHNlIGlmIChkID09IERvdWJsZS5OYU4pCi0gICAgICAgICAgICByZXR1cm4gIk5hTiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUudG9TdHJpbmcoZCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgc2V0X2RvdWJsZSh2YWxpZGF0ZUxleGljYWwocyxfdm9vclZjKSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHYpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodi5lcXVhbHMoIklORiIpKSAgcmV0dXJuIERvdWJsZS5QT1NJVElWRV9JTkZJTklUWTsKLSAgICAgICAgICAgIGlmICh2LmVxdWFscygiLUlORiIpKSByZXR1cm4gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCJOYU4iKSkgIHJldHVybiBEb3VibGUuTmFOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludmFsaWQgZG91YmxlIHZhbHVlIik7Ci0KLSAgICAgICAgICAgIHJldHVybiBEb3VibGUuTmFOOwotICAgICAgICB9Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gMC4wOwotICAgIH0KLQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gbmV3IEJpZ0RlY2ltYWwoX3ZhbHVlKTsgfQotICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIChmbG9hdClfdmFsdWU7IH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KSB7IF92YWx1ZSA9IHY7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikgeyBzZXRfZG91YmxlKChkb3VibGUpdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIHYpIHsgc2V0X2RvdWJsZSgoZG91YmxlKXYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IHNldF9kb3VibGUodi5kb3VibGVWYWx1ZSgpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikgeyBzZXRfZG91YmxlKHYuZG91YmxlVmFsdWUoKSk7IH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmUoX3ZhbHVlLCgoWG1sT2JqZWN0QmFzZSlkKS5kb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgc3RhdGljIGludCBjb21wYXJlKGRvdWJsZSB0aGlzVmFsdWUsIGRvdWJsZSB0aGF0VmFsdWUpCi0gICAgewotICAgICAgICBpZiAodGhpc1ZhbHVlIDwgdGhhdFZhbHVlKSByZXR1cm4gLTE7Ci0gICAgICAgIGlmICh0aGlzVmFsdWUgPiB0aGF0VmFsdWUpIHJldHVybiAgMTsKLQotICAgICAgICBsb25nIHRoaXNCaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhpc1ZhbHVlKTsKLSAgICAgICAgbG9uZyB0aGF0Qml0cyA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoYXRWYWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXNCaXRzID09IHRoYXRCaXRzID8gMCA6IHRoaXNCaXRzIDwgdGhhdEJpdHMgPyAtMSA6IDE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGQpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZShfdmFsdWUsICgoWG1sT2JqZWN0QmFzZSlkKS5kb3VibGVWYWx1ZSgpKSA9PSAwOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgdiA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKF92YWx1ZSk7Ci0gICAgICAgIHJldHVybiAoaW50KSgodiA+PiAzMikgKiAxOSArIHYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEb3VibGVIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYmIzZTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRG91YmxlSG9sZGVyRXggZXh0ZW5kcyBKYXZhRG91YmxlSG9sZGVyCi17Ci0gICAgcHVibGljIEphdmFEb3VibGVIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBzdXBlci5zZXRfZG91YmxlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGRvdWJsZSBkID0gSmF2YURvdWJsZUhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRG91YmxlICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGRvdWJsZSB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIGRvdWJsZSBkOwotCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlKHYsIGQgPSAoKFhtbE9iamVjdEJhc2UpeCkuZG91YmxlVmFsdWUoKSkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEb3VibGUgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBkICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRG91YmxlICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZCArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRG91YmxlICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgZCArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRvdWJsZSAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIGQgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmRvdWJsZVZhbHVlKCkpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRG91YmxlICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGRvdWJsZVZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJmNjhlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFGbG9hdEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfRkxPQVQ7IH0KLQotICAgIHByaXZhdGUgZmxvYXQgX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzK3NldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgewotICAgICAgICByZXR1cm4gc2VyaWFsaXplKF92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKGZsb2F0IGYpCi0gICAgewotICAgICAgICBpZiAoZiA9PSBGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkKLSAgICAgICAgICAgIHJldHVybiAiSU5GIjsKLSAgICAgICAgZWxzZSBpZiAoZiA9PSBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSkKLSAgICAgICAgICAgIHJldHVybiAiLUlORiI7Ci0gICAgICAgIGVsc2UgaWYgKGYgPT0gRmxvYXQuTmFOKQotICAgICAgICAgICAgcmV0dXJuICJOYU4iOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gRmxvYXQudG9TdHJpbmcoZik7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgc2V0X2Zsb2F0KHZhbGlkYXRlTGV4aWNhbChzLF92b29yVmMpKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBmbG9hdCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQodik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2LmVxdWFscygiSU5GIikpICByZXR1cm4gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgICAgICBpZiAodi5lcXVhbHMoIi1JTkYiKSkgcmV0dXJuIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCJOYU4iKSkgIHJldHVybiBGbG9hdC5OYU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW52YWxpZCBmbG9hdCB2YWx1ZSIpOwotCi0gICAgICAgICAgICByZXR1cm4gRmxvYXQuTmFOOwotICAgICAgICB9Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gMC4wZjsKLSAgICB9Ci0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9Ci0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdikgeyBzZXRfZmxvYXQoKGZsb2F0KXYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2Zsb2F0KGZsb2F0IHYpIHsgX3ZhbHVlID0gdjsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikgeyBzZXRfZmxvYXQoKGZsb2F0KXYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IHNldF9mbG9hdCh2LmZsb2F0VmFsdWUoKSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpIHsgc2V0X2Zsb2F0KHYuZmxvYXRWYWx1ZSgpKTsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGYpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZShfdmFsdWUsKChYbWxPYmplY3RCYXNlKWYpLmZsb2F0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBjb21wYXJlKGZsb2F0IHRoaXNWYWx1ZSwgZmxvYXQgdGhhdFZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXNWYWx1ZSA8IHRoYXRWYWx1ZSkgcmV0dXJuIC0xOwotICAgICAgICBpZiAodGhpc1ZhbHVlID4gdGhhdFZhbHVlKSByZXR1cm4gIDE7Ci0KLSAgICAgICAgaW50IHRoaXNCaXRzID0gRmxvYXQuZmxvYXRUb0ludEJpdHModGhpc1ZhbHVlKTsKLSAgICAgICAgaW50IHRoYXRCaXRzID0gRmxvYXQuZmxvYXRUb0ludEJpdHModGhhdFZhbHVlKTsKLQotICAgICAgICByZXR1cm4gdGhpc0JpdHMgPT0gdGhhdEJpdHMgPyAwIDogdGhpc0JpdHMgPCB0aGF0Qml0cyA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKF92YWx1ZSwgKChYbWxPYmplY3RCYXNlKWYpLmZsb2F0VmFsdWUoKSkgPT0gMDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRmxvYXQuZmxvYXRUb0ludEJpdHMoX3ZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUZsb2F0SG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0ZTE4Yy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUZsb2F0SG9sZGVyRXggZXh0ZW5kcyBKYXZhRmxvYXRIb2xkZXIKLXsKLSAgICBwdWJsaWMgSmF2YUZsb2F0SG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIHN1cGVyLnNldF9mbG9hdCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBmbG9hdCBmID0gSmF2YUZsb2F0SG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJGbG9hdCAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShmbG9hdCB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIGZsb2F0IGY7Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZiA9ICgoWG1sT2JqZWN0QmFzZSl4KS5mbG9hdFZhbHVlKCkpIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRmxvYXQgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBmICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZiA9ICgoWG1sT2JqZWN0QmFzZSl4KS5mbG9hdFZhbHVlKCkpIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGluY2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlKHYsIGYgPSAoKFhtbE9iamVjdEJhc2UpeCkuZmxvYXRWYWx1ZSgpKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRmxvYXQgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBmICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmZsb2F0VmFsdWUoKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJGbG9hdCAoIiArIHYgKyAiKSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoZmxvYXRWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEYXRlSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmZThkMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFHRGF0ZUhvbGRlckV4IGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhR0RhdGVIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICB7Ci0gICAgICAgIF9zY2hlbWFUeXBlID0gdHlwZTsKLSAgICAgICAgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLSAgICBwcml2YXRlIEdEYXRlIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gc2V0cy9nZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgICAgIHsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gIiIgOiBfdmFsdWUudG9TdHJpbmcoKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBHRGF0ZSBuZXdWYWw7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgbmV3VmFsID0gdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3VmFsID0gbGV4KHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSAmJiBuZXdWYWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUobmV3VmFsLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gbmV3VmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgR0RhdGUgbGV4KFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgR0RhdGUgZGF0ZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGF0ZSA9IG5ldyBHRGF0ZSh2KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSB2YWx1ZSBpcyBtYWxmb3JtZWQ6ICIrdik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGF0ZS5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlIHZhbHVlIGlzIG9mIHdyb25nIHR5cGU6ICIgKyB2KTsKLSAgICAgICAgICAgICAgICBkYXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRlLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgdmFsdWUgaXMgaW52YWxpZDogIiArIHYpOwotICAgICAgICAgICAgICAgIGRhdGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHRGF0ZSB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotCi0gICAgICAgIEdEYXRlIGRhdGUgPSBsZXgodiwgc1R5cGUsIGNvbnRleHQpOwotCi0gICAgICAgIGlmIChkYXRlICE9IG51bGwgJiYgc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoJyArIHYgKyAnKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKEdEYXRlU3BlY2lmaWNhdGlvbiB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIEdEYXRlIGc7Ci0gICAgICAgIAotICAgICAgICBpZiAodi5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgZG9lcyBub3QgaGF2ZSB0aGUgc2V0IG9mIGZpZWxkcyByZXF1aXJlZCBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEYXRlKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0RhdGVWYWx1ZSgpKSA8PSAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEYXRlKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0RhdGVWYWx1ZSgpKSA8IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpID49IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpID4gMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmdEYXRlVmFsdWUoKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBudW1lcmljczogZ1llYXIsIGdNb250aCwgZ0RheSBhY2NlcHQgYW4gaW50ZWdlcgotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIGlmIChjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfREFZICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX1lFQVIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLQotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXREYXkoKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmdldE1vbnRoKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmdldFllYXIoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotCi0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXRDYWxlbmRhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlIGRhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotCi0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUuZ2V0RGF0ZSgpOwotICAgIH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCB2KQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIGlmIChjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfREFZICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIICYmCi0gICAgICAgICAgICAgICAgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19HX1lFQVIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIHZhbHVlID0gbmV3IEdEYXRlQnVpbGRlcigpOwotCi0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICB2YWx1ZS5zZXREYXkodik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHZhbHVlLnNldE1vbnRoKHYpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIHZhbHVlLnNldFllYXIodik7IGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHZhbHVlLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gdmFsdWUudG9HRGF0ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gdikKLSAgICB7Ci0gICAgICAgIGludCBjb2RlID0gc2NoZW1hVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLQotICAgICAgICBHRGF0ZSBjYW5kaWRhdGU7Ci0KLSAgICAgICAgaWYgKHYuaXNJbW11dGFibGUoKSAmJiAodiBpbnN0YW5jZW9mIEdEYXRlKSAmJiB2LmdldEJ1aWx0aW5UeXBlQ29kZSgpID09IGNvZGUpCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSAoR0RhdGUpdjsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0cnVuY2F0ZSBleHRyYSBmaWVsZHMgZnJvbSB0aGUgZGF0ZSBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICBpZiAodi5nZXRCdWlsdGluVHlwZUNvZGUoKSAhPSBjb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdEYXRlQnVpbGRlciBnRGF0ZUJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKHYpOwotICAgICAgICAgICAgICAgIGdEYXRlQnVpbGRlci5zZXRCdWlsdGluVHlwZUNvZGUoY29kZSk7Ci0gICAgICAgICAgICAgICAgdiA9IGdEYXRlQnVpbGRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG5ldyBHRGF0ZSh2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShjYW5kaWRhdGUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBfdmFsdWUgPSBjYW5kaWRhdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9DYWxlbmRhcihDYWxlbmRhciBjKQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIEdEYXRlQnVpbGRlciBnRGF0ZUJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKGMpOwotICAgICAgICBnRGF0ZUJ1aWxkZXIuc2V0QnVpbHRpblR5cGVDb2RlKGNvZGUpOwotICAgICAgICBHRGF0ZSB2YWx1ZSA9IGdEYXRlQnVpbGRlci50b0dEYXRlKCk7Ci0gCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2YWx1ZSwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9EYXRlKERhdGUgdikKLSAgICB7Ci0gICAgICAgIGludCBjb2RlID0gc2NoZW1hVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKLQotICAgICAgICBpZiAoY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19EQVRFICYmIGNvZGUgIT0gU2NoZW1hVHlwZS5CVENfREFURV9USU1FIHx8Ci0gICAgICAgICAgICB2ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGdEYXRlQnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIodik7Ci0gICAgICAgIGdEYXRlQnVpbGRlci5zZXRCdWlsdGluVHlwZUNvZGUoY29kZSk7Ci0gICAgICAgIEdEYXRlIHZhbHVlID0gZ0RhdGVCdWlsZGVyLnRvR0RhdGUoKTsKLSAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHZhbHVlLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5jb21wYXJlVG9HRGF0ZSgoKFhtbE9iamVjdEJhc2Upb2JqKS5nRGF0ZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbE9iamVjdEJhc2Upb2JqKS5nRGF0ZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGdEYXRlVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRHVyYXRpb25Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmExNTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhR0R1cmF0aW9uSG9sZGVyRXggZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIEphdmFHRHVyYXRpb25Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIEdEdXJhdGlvbiBfdmFsdWU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIEdEdXJhdGlvbiBuZXdWYWw7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgbmV3VmFsID0gdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3VmFsID0gbGV4KHMsIF92b29yVmMpOwotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpICYmIG5ld1ZhbCAhPSBudWxsKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShuZXdWYWwsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBfdmFsdWUgPSBuZXdWYWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgaWYgKHYuaXNJbW11dGFibGUoKSAmJiAodiBpbnN0YW5jZW9mIEdEdXJhdGlvbikpCi0gICAgICAgICAgICBfdmFsdWUgPSAoR0R1cmF0aW9uKXY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF92YWx1ZSA9IG5ldyBHRHVyYXRpb24odik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgICAgIHsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gIiIgOiBfdmFsdWUudG9TdHJpbmcoKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBHRHVyYXRpb24gZ0R1cmF0aW9uVmFsdWUoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLQotICAgICAgICByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogX3ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgR0R1cmF0aW9uIGxleChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEdEdXJhdGlvbiBkdXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZHVyYXRpb24gPSBuZXcgR0R1cmF0aW9uKHYpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiB2YWx1ZSBpcyBtYWxmb3JtZWQ6ICIrdik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZHVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHRHVyYXRpb24gdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgR0R1cmF0aW9uIGR1cmF0aW9uID0gbGV4KHYsIGNvbnRleHQpOwotCi0gICAgICAgIGlmIChkdXJhdGlvbiAhPSBudWxsICYmIHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGR1cmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKEdEdXJhdGlvblNwZWNpZmljYXRpb24gdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICBHRHVyYXRpb24gZzsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRHVyYXRpb24oZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRHVyYXRpb25WYWx1ZSgpKSA8PSAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRHVyYXRpb24oZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRHVyYXRpb25WYWx1ZSgpKSA8IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gbWluIGluY2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbihnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEdXJhdGlvblZhbHVlKCkpID49IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbihnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEdXJhdGlvblZhbHVlKCkpID4gMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbigoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZ0R1cmF0aW9uVmFsdWUoKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5jb21wYXJlVG9HRHVyYXRpb24oKChYbWxPYmplY3RCYXNlKSBkKS5nRHVyYXRpb25WYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSkgZCkuZ0R1cmF0aW9uVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoZ0R1cmF0aW9uVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkYmZmNy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSGV4QmluYXJ5SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEhleEJpbmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUhleEJpbmFyeUhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfSEVYX0JJTkFSWTsgfQotCi0gICAgcHJvdGVjdGVkIGJ5dGVbXSBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEhleEJpbi5lbmNvZGUoX3ZhbHVlKSk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICBfdmFsdWUgPSB2YWxpZGF0ZUxleGljYWwocywgc2NoZW1hVHlwZSgpLCBfdm9vclZjKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3ZhbHVlID0gbGV4KHMsIF92b29yVmMpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF9oYXNoY2FjaGVkID0gZmFsc2U7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gbGV4KFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgYnl0ZVtdIHZCeXRlcyA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2Qnl0ZXMgPSB2LmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gVVRGLTggaXMgYWx3YXlzIHN1cHBvcnRlZAotICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IEhleEJpbi5kZWNvZGUodkJ5dGVzKTsKLQotICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyAtIGdldCBhIGRlY2VudCBlcnJvciB3aXRoIGxpbmUgbnVtYmVycyBhbmQgc3VjaCBoZXJlCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkhleCBlbmNvZGVkIGRhdGEgbm90IGVuY29kZWQgcHJvcGVybHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBieXRlW10gYnl0ZXMgPSBsZXgodiwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCggIkhleCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtfdmFsdWUubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfdmFsdWUsIDAsIHJlc3VsdCwgMCwgX3ZhbHVlLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIGJhKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgX3ZhbHVlID0gbmV3IGJ5dGVbYmEubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShiYSwgMCwgX3ZhbHVlLCAwLCBiYS5sZW5ndGgpOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBieXRlW10gaXZhbCA9ICgoWG1sSGV4QmluYXJ5KSBpKS5nZXRCeXRlQXJyYXlWYWx1ZSgpOwotICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhfdmFsdWUsIGl2YWwpOwotICAgIH0KLQotICAgIC8vYmVjYXVzZSBjb21wdXRpbmcgaGFzaGNvZGUgaXMgZXhwZW5zaXZlIHdlJ2xsIGNhY2hlIGl0Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgaW50IGhhc2hjb2RlID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1OwotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIE1ENSBoYXNoIEFsZ29yaXRobSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgaWYoIF9oYXNoY2FjaGVkICkKLSAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKLQotICAgICAgICBfaGFzaGNhY2hlZCA9IHRydWU7Ci0KLSAgICAgICAgaWYoIF92YWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBoYXNoY29kZSA9IDA7Ci0KLSAgICAgICAgYnl0ZVtdIHJlcyA9IG1kNS5kaWdlc3QoX3ZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gcmVzWzBdPDwyNCArIHJlc1sxXTw8MTYgKyByZXNbMl08PDggKyByZXNbM107Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSGV4QmluYXJ5SG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTBjYTliLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSGV4QmluYXJ5SG9sZGVyRXggZXh0ZW5kcyBKYXZhSGV4QmluYXJ5SG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhSGV4QmluYXJ5SG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgYnl0ZVtdIHY7Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2ID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYgPSBsZXgocywgX3Zvb3JWYyk7Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkgJiYgdiAhPSBudWxsKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIFhtbE9iamVjdEJhc2UuX3Zvb3JWYyk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXRfQnl0ZUFycmF5KHYpOwotCi0gICAgICAgIF92YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgc2NoZW1hVHlwZSgpLCBfdm9vclZjKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnNldF9CeXRlQXJyYXkodik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoYnl0ZVtdIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgWG1sT2JqZWN0IG87Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgIT0gdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSGV4IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBoYXZlICIgKyBpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcGVyIGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpID4gdi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSGV4IGVuY29kZWQgZGF0YSBoYXMgb25seSAiICsgdi5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPCB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJIZXggZW5jb2RlZCBkYXRhIGhhcyAiICsgdi5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgbW9yZSB0aGFuIG1heCBsZW5ndGggZmFjZXQiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotCi0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudW1Mb29wOiBmb3IgKCBpID0gMCA7IGkgPCB2YWxzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGVudW1CeXRlcyA9ICgoWG1sT2JqZWN0QmFzZSl2YWxzW2ldKS5ieXRlQXJyYXlWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVudW1CeXRlcy5sZW5ndGggIT0gdi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IGVudW1CeXRlcy5sZW5ndGggOyBqKysgKQotICAgICAgICAgICAgICAgICAgICBpZiAoZW51bUJ5dGVzW2pdICE9IHZbal0pCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBlbnVtTG9vcDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gdmFscy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJIZXggZW5jb2RlZCBkYXRhIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgZW51bWVyYXRpb24gdmFsdWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoYnl0ZUFycmF5VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5MGI0ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSW50SG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9JTlQ7IH0KLQotICAgIHByaXZhdGUgaW50IF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBMb25nLnRvU3RyaW5nKF92YWx1ZSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHNldF9pbnQoSW50ZWdlci5wYXJzZUludChQYXJzZVV0aWwudHJpbUluaXRpYWxQbHVzKHMpKSk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IDA7Ci0gICAgfQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gbmV3IEJpZ0RlY2ltYWwoX3ZhbHVlKTsgfQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihfdmFsdWUpOyB9Ci0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0gICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotCi0gICAgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21heCA9IEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21pbiA9IEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IHNldF9CaWdJbnRlZ2VyKHYudG9CaWdJbnRlZ2VyKCkpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQotICAgIHsKLSAgICAgICAgaWYgKHYuY29tcGFyZVRvKF9tYXgpID4gMCB8fCB2LmNvbXBhcmVUbyhfbWluKSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHNldF9pbnQodi5pbnRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyBsKQotICAgIHsKLSAgICAgICAgaWYgKGwgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCBsIDwgSW50ZWdlci5NSU5fVkFMVUUpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHNldF9pbnQoKGludClsKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgaSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IGk7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBpZiAoKChTaW1wbGVWYWx1ZSlpKS5pbnN0YW5jZVR5cGUoKS5nZXREZWNpbWFsU2l6ZSgpID4gU2NoZW1hVHlwZS5TSVpFX0lOVCkKLSAgICAgICAgICAgIHJldHVybiAtaS5jb21wYXJlVG8odGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpaSkuaW50VmFsdWUoKSA/IDAgOgotICAgICAgICAgICAgICAgX3ZhbHVlIDwgKChYbWxPYmplY3RCYXNlKWkpLmludFZhbHVlKCkgPyAtMSA6IDE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBpZiAoKChTaW1wbGVWYWx1ZSlpKS5pbnN0YW5jZVR5cGUoKS5nZXREZWNpbWFsU2l6ZSgpID4gU2NoZW1hVHlwZS5TSVpFX0lOVCkKLSAgICAgICAgICAgIHJldHVybiBpLnZhbHVlRXF1YWxzKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxPYmplY3RCYXNlKWkpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSwgdGhpcyBpcyBjYXJlZnVsbHkgYWxpZ25lZCB3aXRoIGhhc2ggY29kZXMgZm9yIGFsbCB4c2Q6ZGVjaW1hbAotICAgICAqIHByaW1pdGl2ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50SG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzk2ZTMxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSW50SG9sZGVyRXggZXh0ZW5kcyBKYXZhSW50SG9sZGVyCi17Ci0gICAgcHVibGljIEphdmFJbnRIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaW50IHY7Ci0KLSAgICAgICAgdHJ5IHsgdiA9IEludGVnZXIucGFyc2VJbnQoUGFyc2VVdGlsLnRyaW1Jbml0aWFsUGx1cyhzKSk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgICAgICAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF9pbnQodik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9pbnQoaW50IHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9pbnQodik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBKYXZhRGVjaW1hbEhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBwYXR0ZXJuCi0gICAgICAgIGlmIChzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludGVnZXIgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGludCB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gdG90YWwgZGlnaXRzCi0gICAgICAgIFhtbE9iamVjdCB0ZCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gSW50ZWdlci50b1N0cmluZyh2KTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0ZW1wLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgdGVtcC5jaGFyQXQoMCkgPT0gJy0nKQotICAgICAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZSh0ZCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyIHRvdGFsIGRpZ2l0cyAoIiArIHRlbXAgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgZGlnaXRzIGZhY2V0ICgiICsgZ2V0SW50VmFsdWUodGQpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBleAotICAgICAgICBYbWxPYmplY3QgbWluZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtID0gZ2V0SW50VmFsdWUobWluZSk7Ci0gICAgICAgICAgICBpZiAoISh2ID4gbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGluCi0gICAgICAgIFhtbE9iamVjdCBtaW5pID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZShtaW5pKTsKLSAgICAgICAgICAgIGlmICghKHYgPj0gbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGluCi0gICAgICAgIFhtbE9iamVjdCBtYXhpID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZShtYXhpKTsKLSAgICAgICAgICAgIGlmICghKHYgPD0gbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGV4Ci0gICAgICAgIFhtbE9iamVjdCBtYXhlID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZShtYXhlKTsKLSAgICAgICAgICAgIGlmICghKHYgPCBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbnVtZXJhdGlvbgotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2ID09IGdldEludFZhbHVlKHZhbHNbaV0pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludGVnZXIgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggYW55IGVudW1lcmF0aW9uIHZhbHVlcyBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW50VmFsdWUoWG1sT2JqZWN0IG8pIHsKLSAgICAgICAgU2NoZW1hVHlwZSBzID0gby5zY2hlbWFUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAocy5nZXREZWNpbWFsU2l6ZSgpKSAKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdEZWNpbWFsVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkoKFhtbE9iamVjdEJhc2UpbykubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGludFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50ZWdlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzRmODA2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnRlZ2VySG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9JTlRFR0VSOyB9Ci0KLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzL3NldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3ZhbHVlLnRvU3RyaW5nKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHNldF9CaWdJbnRlZ2VyKGxleChzLCBfdm9vclZjKSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBsZXgoU3RyaW5nIHMsIFZhbGlkYXRpb25Db250ZXh0IHZjKSAKLSAgICB7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpID4gMCAmJiBzLmNoYXJBdCggMCApID09ICcrJyApCi0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHMpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB2Yy5pbnZhbGlkKCJOb3QgYSB2YWxpZCBpbnRlZ2VyOiAiICsgcyk7IHJldHVybiBudWxsOyB9Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9Ci0gICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IF92YWx1ZSA9IHYudG9CaWdJbnRlZ2VyKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpIHsgX3ZhbHVlID0gdjsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBpZiAoKChTaW1wbGVWYWx1ZSlpKS5pbnN0YW5jZVR5cGUoKS5nZXREZWNpbWFsU2l6ZSgpID4gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSKQotICAgICAgICAgICAgcmV0dXJuIC1pLmNvbXBhcmVUbyh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUbygoKFhtbE9iamVjdEJhc2UpaSkuYmlnSW50ZWdlclZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgaWYgKCgoU2ltcGxlVmFsdWUpaSkuaW5zdGFuY2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKSA+IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUikKLSAgICAgICAgICAgIHJldHVybiBpLnZhbHVlRXF1YWxzKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSlpKS5iaWdJbnRlZ2VyVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgQmlnSW50ZWdlciBfbWF4bG9uZyA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSk7Ci0gICAgc3RhdGljIHByaXZhdGUgQmlnSW50ZWdlciBfbWlubG9uZyA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlLCB0aGlzIGlzIGNhcmVmdWxseSBhbGlnbmVkIHdpdGggaGFzaCBjb2RlcyBmb3IgYWxsIHhzZDpkZWNpbWFsCi0gICAgICogcHJpbWl0aXZlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICBpZiAoX3ZhbHVlLmNvbXBhcmVUbyhfbWF4bG9uZykgPiAwIHx8Ci0gICAgICAgICAgICBfdmFsdWUuY29tcGFyZVRvKF9taW5sb25nKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0KLSAgICAgICAgbG9uZyBsb25ndmFsID0gX3ZhbHVlLmxvbmdWYWx1ZSgpOwotCi0gICAgICAgIHJldHVybiAoaW50KSgobG9uZ3ZhbCA+PiAzMikgKiAxOSArIGxvbmd2YWwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlMmUyNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50ZWdlckhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUludGVnZXJIb2xkZXJFeCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyCi17Ci0gICAgcHVibGljIEphdmFJbnRlZ2VySG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgQmlnSW50ZWdlciB2ID0gbGV4KHMsIF92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9CaWdJbnRlZ2VyKHYpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9CaWdJbnRlZ2VyKHYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgSmF2YURlY2ltYWxIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgcGF0dGVybgotICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKEJpZ0ludGVnZXIgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIHRvdGFsIGRpZ2l0cwotICAgICAgICBYbWxJbnQgdGQgPSAoWG1sSW50KXNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gdi50b1N0cmluZygpOwotICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCi0gICAgICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgICAgICBpZiAobGVuID4gdGQuZ2V0SW50VmFsdWUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyIHRvdGFsIGRpZ2l0cyAoIiArIHRlbXAgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgZGlnaXRzIGZhY2V0ICgiICsgdGQuZ2V0SW50VmFsdWUoKSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gZXgKLSAgICAgICAgWG1sT2JqZWN0IG1pbmUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWluZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG0gPSBnZXRCaWdJbnRlZ2VyVmFsdWUobWluZSk7Ci0gICAgICAgICAgICBpZiAoISh2LmNvbXBhcmVUbyhtKSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBpbgotICAgICAgICBYbWxPYmplY3QgbWluaSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtaW5pKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pID49IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBpbgotICAgICAgICBYbWxPYmplY3QgbWF4aSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtYXhpKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pIDw9IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBleAotICAgICAgICBYbWxPYmplY3QgbWF4ZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtYXhlKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pIDwgMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZW51bWVyYXRpb24KLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoZ2V0QmlnSW50ZWdlclZhbHVlKHZhbHNbaV0pKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIGFueSBlbnVtZXJhdGlvbiB2YWx1ZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoWG1sT2JqZWN0IG8pCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHMgPSBvLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgc3dpdGNoIChzLmdldERlY2ltYWxTaXplKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0RlY2ltYWxWYWx1ZSgpLnRvQmlnSW50ZWdlcigpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmFkIGZhY2V0IHR5cGUgZm9yIEJpZyBJbnQ6ICIgKyBzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShiaWdJbnRlZ2VyVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTG9uZ0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM5YmNkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTG9uZ0hvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTE9ORzsgfQotCi0gICAgcHJpdmF0ZSBsb25nIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBMb25nLnRvU3RyaW5nKF92YWx1ZSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeSB7IHNldF9sb25nKExvbmcucGFyc2VMb25nKFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gMEw7Ci0gICAgfQotCi0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBCaWdEZWNpbWFsLnZhbHVlT2YoX3ZhbHVlKTsgfQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihfdmFsdWUpOyB9Ci0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXggPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21pbiA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSk7Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IHNldF9CaWdJbnRlZ2VyKHYudG9CaWdJbnRlZ2VyKCkpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQotICAgIHsKLSAgICAgICAgaWYgKHYuY29tcGFyZVRvKF9tYXgpID4gMCB8fCB2LmNvbXBhcmVUbyhfbWluKSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF92YWx1ZSA9IHYubG9uZ1ZhbHVlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgbCkgeyBfdmFsdWUgPSBsOyB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgbCkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWwpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgIHJldHVybiAtbC5jb21wYXJlVG8odGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpbCkubG9uZ1ZhbHVlKCkgPyAwIDoKLSAgICAgICAgICAgICAgIF92YWx1ZSA8ICgoWG1sT2JqZWN0QmFzZSlsKS5sb25nVmFsdWUoKSA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgbCkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWwpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgIHJldHVybiBsLnZhbHVlRXF1YWxzKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxPYmplY3RCYXNlKWwpLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KSgoX3ZhbHVlID4+IDMyKSAqIDE5ICsgX3ZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmODE2MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTG9uZ0hvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlBhcnNlVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFMb25nSG9sZGVyRXggZXh0ZW5kcyBKYXZhTG9uZ0hvbGRlcgotewotICAgIHB1YmxpYyBKYXZhTG9uZ0hvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBsb25nIHY7Ci0KLSAgICAgICAgdHJ5IHsgdiA9IExvbmcucGFyc2VMb25nKFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICAgICAgCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRfbG9uZyh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyB2KQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBzdXBlci5zZXRfbG9uZyh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgSmF2YURlY2ltYWxIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgcGF0dGVybgotICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShsb25nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyB0b3RhbCBkaWdpdHMKLSAgICAgICAgWG1sT2JqZWN0IHRkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKHRkKTsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gTG9uZy50b1N0cmluZyh2KTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0ZW1wLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgdGVtcC5jaGFyQXQoMCkgPT0gJy0nKQotICAgICAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICAgICAgaWYgKGxlbiA+IG0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciB0b3RhbCBkaWdpdHMgKCIgKyB0ZW1wICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGRpZ2l0cyBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGV4Ci0gICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKG1pbmUpOwotICAgICAgICAgICAgaWYgKCEodiA+IG0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBpbgotICAgICAgICBYbWxPYmplY3QgbWluaSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbSA9IGdldExvbmdWYWx1ZShtaW5pKTsKLSAgICAgICAgICAgIGlmICghKHYgPj0gbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGluCi0gICAgICAgIFhtbE9iamVjdCBtYXhpID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKG1heGkpOwotICAgICAgICAgICAgaWYgKCEodiA8PSBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggZXgKLSAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG0gPSBnZXRMb25nVmFsdWUobWF4ZSk7Ci0gICAgICAgICAgICBpZiAoISh2IDwgbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZW51bWVyYXRpb24KLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBnZXRMb25nVmFsdWUodmFsc1tpXSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKFhtbE9iamVjdCBvKSB7Ci0gICAgICAgIFNjaGVtYVR5cGUgcyA9IG8uc2NoZW1hVHlwZSgpOwotICAgICAgICBzd2l0Y2ggKHMuZ2V0RGVjaW1hbFNpemUoKSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykuYmlnRGVjaW1hbFZhbHVlKCkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCYWQgZmFjZXQgdHlwZTogIiArIHMpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUobG9uZ1ZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDBmMzU1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFOb3RhdGlvbkhvbGRlciBleHRlbmRzIFhtbFFOYW1lSW1wbAotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT1RBVElPTjsgfQotCi0vLyAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotLy8gICAgICAgIHsgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7IH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NGRmODMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTm90YXRpb25Ib2xkZXJFeCBleHRlbmRzIEphdmFOb3RhdGlvbkhvbGRlcgotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgSmF2YU5vdGF0aW9uSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hlY2socywgX3NjaGVtYVR5cGUpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgaWYgKCFfc2NoZW1hVHlwZS5tYXRjaFBhdHRlcm5GYWNldChzKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbm90YXRpb24oU3RyaW5nIHYpCi0gICAgeyBzZXRfdGV4dCh2KTsgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVjayhTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBsZW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCk7Ci0gICAgICAgIGlmIChsZW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbGVuKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCEodi5sZW5ndGgoKSAhPSBtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1pbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbWluKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCEodi5sZW5ndGgoKSA+PSBtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1heCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbWF4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCEodi5sZW5ndGgoKSA8PSBtKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFRTmFtZUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2RhZWUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotICAgCi1wdWJsaWMgY2xhc3MgSmF2YVFOYW1lSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhUU5hbWVIb2xkZXIoKSB7fQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX1FOQU1FOyB9Ci0KLSAgICBwcml2YXRlIFFOYW1lIF92YWx1ZTsKLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgICAgIHsgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7IH0KLSAgICAKLSAgICAvLyBhbiBlcmdvbm9taWMgcHJlZml4ZXIgc28gdGhhdCB5b3UgY2FuIHNheSBzdHJpbmdWYWx1ZSgpIG9uIGEgZnJlZS1mbG9hdGluZyBRTmFtZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lc3BhY2VNYW5hZ2VyIFBSRVRUWV9QUkVGSVhFUiA9IG5ldyBQcmV0dHlOYW1lc3BhY2VNYW5hZ2VyKCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJldHR5TmFtZXNwYWNlTWFuYWdlciBpbXBsZW1lbnRzIE5hbWVzcGFjZU1hbmFnZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpKFN0cmluZyBuc3VyaSwgU3RyaW5nIHN1Z2dlc3RlZF9wcmVmaXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5zdWdnZXN0UHJlZml4KHN1Z2dlc3RlZF9wcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICB7Ci0gICAgICAgIGlmIChuc20gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgdXNlZCB0bzogdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBRTmFtZSBwcmVmaXggb3V0c2lkZSBvZiBhIGRvY3VtZW50Iik7Ci0gICAgICAgICAgICAvLyBidXQgaXQncyBub3QgbmljZSB0byB0aHJvdyBvbiBzdHJpbmdWYWx1ZSgpCi0gICAgICAgICAgICBuc20gPSBQUkVUVFlfUFJFRklYRVI7Ci0gICAgICAgIH0KLQotLy8gVE9ETyAtIHdoYXQgSSByZWFsbHkgbmVlZCB0byBkbyBoZXJlIGlzIHRoYXQgaWYgdGhlcmUgaXMgbm8KLS8vIG5hbWVzcGFjZSBmb3IgdGhpcyBxbmFtZSwgdGhlbiBpbnN0ZWFkIG9mIGZpbmRpbmcgdGhlIHByZWZpeCBmb3IgdGhlCi0vLyB1cmksIEkgc2hvdWxkIG1ha2UgYSBjYWxsIHRvIHNldCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZQotLy8gaW1tZWRpYXRlIGNvbnRleHQgZm9yIHRoaXMgcW5hbWUgdG8gYmUgIiIuICAKLSAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gX3ZhbHVlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gX3ZhbHVlLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsb2NhbFBhcnQ7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNtLmZpbmRfcHJlZml4X2Zvcl9uc3VyaSggbmFtZXNwYWNlLCBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHZhbGlkYXRlTGV4aWNhbCgKLSAgICAgICAgU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gcGFyc2UodiwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgbmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgcGFyc2UoU3RyaW5nIHYsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCwgbG9jYWxuYW1lOwotICAgICAgICBpbnQgc3RhcnQ7Ci0gICAgICAgIGludCBlbmQ7Ci0gICAgICAgIGZvciAoZW5kID0gdi5sZW5ndGgoKTsgZW5kID4gMDsgZW5kIC09IDEpCi0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZSh2LmNoYXJBdChlbmQtMSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IDEpCi0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZSh2LmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGludCBmaXJzdGNvbG9uID0gdi5pbmRleE9mKCc6Jywgc3RhcnQpOwotICAgICAgICBpZiAoZmlyc3Rjb2xvbiA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmaXggPSB2LnN1YnN0cmluZyhzdGFydCwgZmlyc3Rjb2xvbik7Ci0gICAgICAgICAgICBsb2NhbG5hbWUgPSB2LnN1YnN0cmluZyhmaXJzdGNvbG9uICsgMSwgZW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgbG9jYWxuYW1lID0gdi5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB1cmkgPQotICAgICAgICAgICAgcmVzb2x2ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvbHZlci5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiQ2FuJ3QgcmVzb2x2ZSBwcmVmaXg6ICIgKyBwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoIHVyaSwgbG9jYWxuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIgPSBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCAmJiBoYXNfc3RvcmUoKSkKLSAgICAgICAgICAgIHJlc29sdmVyID0gZ2V0X3N0b3JlKCk7Ci0gICAgICAgIAotICAgICAgICBfdmFsdWUgPSBwYXJzZShzLCByZXNvbHZlcik7Ci0gICAgfQotCi0gICAgLy8gQlVHQlVHIC0gaGF2aW5nIHByZWZpeCBoZXJlIG1heSBub3Qgd29yawotICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIFN5bmMgZm9yY2Ugb2YgY3JlYXRpb24gb2YgbmFtZXNhcGNlIG1hcHBpbmcgLi4KLSAgICAgICAgCi0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgICAgIGdldF9zdG9yZSgpLmZpbmRfcHJlZml4X2Zvcl9uc3VyaSggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgX3ZhbHVlID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sYW55c2ltcGxlKFhtbEFueVNpbXBsZVR5cGUgdmFsdWUpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBwYXJzZSh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpLCBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpIHsgX3ZhbHVlID0gbnVsbDsgfQotCi0gICAgLy8gc2V0dGVycywgZ2V0dGVycyAoc2V0dGVyIGFscmVhZHkgaGFuZGxlZCB2aWEgc2V0X3RleHQpCi0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKW9iaikucU5hbWVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFRTmFtZUhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDc0OTMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFRTmFtZUhvbGRlckV4IGV4dGVuZHMgSmF2YVFOYW1lSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhUU5hbWVIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBQcmVmaXhSZXNvbHZlciByZXNvbHZlciA9IE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpOwotCi0gICAgICAgIGlmIChyZXNvbHZlciA9PSBudWxsICYmIGhhc19zdG9yZSgpKQotICAgICAgICAgICAgcmVzb2x2ZXIgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBRTmFtZSB2OwotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdiA9IHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYywgcmVzb2x2ZXIpOwotICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gSmF2YVFOYW1lSG9sZGVyLnZhbGlkYXRlTGV4aWNhbChzLCBfdm9vclZjLCByZXNvbHZlcik7Ci0KLSAgICAgICAgc3VwZXIuc2V0X1FOYW1lKHYpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKG5hbWUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgc3VwZXIuc2V0X1FOYW1lKCBuYW1lICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGFueXNpbXBsZShYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQotICAgIHsKLSAgICAgICAgUU5hbWUgdjsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYgPSB2YWxpZGF0ZUxleGljYWwodmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSwgX3NjaGVtYVR5cGUsIF92b29yVmMsIE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpKTsKLQotICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gSmF2YVFOYW1lSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpLCBfdm9vclZjLCBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKSk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X1FOYW1lKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBQcmVmaXhSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBKYXZhUU5hbWVIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQsIHJlc29sdmVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KLSAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZXNjcmliZSBzdHJpbmcgYW5kIHBhdHRlcm4gaGVyZSBpbiBlcnJvcgotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3QgeDsKLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoKCgoWG1sT2JqZWN0QmFzZSl4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoKCgoWG1sT2JqZWN0QmFzZSl4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA+IHYubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtaW4gbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoKCgoWG1sT2JqZWN0QmFzZSl4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA8IHYubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtYXggbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShRTmFtZSB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLnFOYW1lVmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgaXMgbm90IGEgdmFsaWQgZW51ZW1yYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUocU5hbWVWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZWFiYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeAotewotICAgIHB1YmxpYyBKYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHR5cGUsIGNvbXBsZXgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBfdmFsOwotCi0gICAgLy8gdXBkYXRlIHRoZSBpbnR2YWwgd2hlbiBzZXR0aW5nIHZpYSB0ZXh0LCBuaWwuCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW0gPSBzY2hlbWFUeXBlKCkuZW51bUZvclN0cmluZyhzKTsKLSAgICAgICAgaWYgKGVudW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oIlN0cmluZyAnIiArIHMgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgc2NoZW1hVHlwZSgpKTsKLQotICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKLSAgICAgICAgX3ZhbCA9IGVudW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEphdmFTdHJpbmdIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwodiwgc1R5cGUsIGNvbnRleHQpOwotCi0gICAgICAgIGlmIChzVHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVHlwZS5lbnVtRm9yU3RyaW5nKHYpID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiU3RyaW5nICciICsgdiArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWwgPSBudWxsOwotICAgICAgICBzdXBlci5zZXRfbmlsKCk7Ci0gICAgfQotCi0gICAgLy8gc2V0L2dldCB0aGUgZW51bQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICByZXR1cm4gX3ZhbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZW51bShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW0pCi0gICAgewotICAgICAgICBDbGFzcyBlamMgPSBzY2hlbWFUeXBlKCkuZ2V0RW51bUphdmFDbGFzcygpOwotICAgICAgICBpZiAoZWpjICE9IG51bGwgJiYgIWVudW0uZ2V0Q2xhc3MoKS5lcXVhbHMoZWpjKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBzdXBlci5zZXRfdGV4dChlbnVtLnRvU3RyaW5nKCkpOwotICAgICAgICBfdmFsID0gZW51bTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdkOWU4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBKYXZhU3RyaW5nSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhU3RyaW5nSG9sZGVyKCkge30KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9TVFJJTkc7IH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgICAgIHsgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7IH0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWU7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykgeyBfdmFsdWUgPSBzOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpIHsgX3ZhbHVlID0gbnVsbDsgfQotCi0gICAgLy8gc3RyaW5nIHNldHRlciBhbmQgZ2V0dGVyIGFscmVhZHkgaGFuZGxlZCBieSBYbWxPYmplY3RCYXNlCi0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbE9iamVjdEJhc2Upb2JqKS5zdHJpbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzX2RlZmF1bHRhYmxlX3dzKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDFmZWIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFTdHJpbmdIb2xkZXJFeCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhU3RyaW5nSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X3RleHQocyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbCh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IHBhdHRlcm4KLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiU3RyaW5nOiAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBsZW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCk7Ci0gICAgICAgIGlmIChsZW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbGVuKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYubGVuZ3RoKCkgIT0gbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgbGVuZ3RoICgiICsgdi5sZW5ndGgoKSArICIpIGRvZXMgbm90IG1hdGNoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBtaW4gbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBtaW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpOwotICAgICAgICBpZiAobWluICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtID0gKChYbWxPYmplY3RCYXNlKW1pbikuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2Lmxlbmd0aCgpIDwgbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgbGVuZ3RoICgiICsgdi5sZW5ndGgoKSArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gbGVuZ3RoIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1heCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbWF4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYubGVuZ3RoKCkgPiBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggKCIgKyB2Lmxlbmd0aCgpICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBsZW5ndGggZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChzdHJpbmdWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjAzMWMzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlVUkk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhVXJpSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBKYXZhVXJpSG9sZGVyKCkge30KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVVJJOyB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAiIiA6IF92YWx1ZTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3Zvb3JWYyk7Ci0gICAgICAgIF92YWx1ZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIEVub3VnaCB2YWxpZGF0aW9uIHRvIGdldCBzY2hlbWEgZm9yIHNjaGVtYSB3b3JraW5nCi0KLSAgICAgICAgaWYgKHYuc3RhcnRzV2l0aCggIiMjIiApKQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJYbWxBbnlVUkkgaXMgbWFsZm9ybWVkOiAiICsgdiApOwotCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKSB7IF92YWx1ZSA9IG51bGw7IH0KLQotICAgIC8vIHN0cmluZyBzZXR0ZXIgYW5kIGdldHRlciBhbHJlYWR5IGhhbmRsZWQgYnkgWG1sT2JqZWN0QmFzZQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxBbnlVUkkpb2JqKS5nZXRTdHJpbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZmVkNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVXJpSG9sZGVyRXggZXh0ZW5kcyBKYXZhVXJpSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgSmF2YVVyaUhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNoZWNrKHMsIF9zY2hlbWFUeXBlKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmICghX3NjaGVtYVR5cGUubWF0Y2hQYXR0ZXJuRmFjZXQocykpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc2V0X3RleHQocyk7Ci0gICAgfQotCi0vLyAgICAvLyBzZXR0ZXJzCi0vLyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdXJpKFVSSSB1cmkpCi0vLyAgICB7Ci0vLyAgICAgICAgaWYgKCFjaGVjayh1cmkudG9TdHJpbmcoKSwgX3NjaGVtYVR5cGUpKQotLy8gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0vLwotLy8gICAgICAgIHN1cGVyLnNldF91cmkodXJpKTsKLS8vICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxBbnlVcmlJbXBsLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotCi0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCB2YWxzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGUgPSAoKFNpbXBsZVZhbHVlKXZhbHNbaV0pLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZS5lcXVhbHMoIHYgKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IHZhbHMubGVuZ3RoKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiYW55VVJJICciICsgdiArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBwYXR0ZXJuCi0gICAgICAgIGlmIChzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gZGVzY3JpYmUgc3RyaW5nIGFuZCBwYXR0ZXJuIGhlcmUgaW4gZXJyb3IKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSB2YWx1ZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdCB4OwotCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICgoKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiYW55VVJJIHZhbHVlICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBmYWNldCAoIiArICgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKCgoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpID4gdi5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSB2YWx1ZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtaW4gbGVuZ3RoIGZhY2V0ICgiICsgKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoKCgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPCB2Lmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiYW55VVJJIHZhbHVlICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIG1heCBsZW5ndGggZmFjZXQgKCIgKyAoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IHY9PW51bGwgPyAwIDogdi5sZW5ndGgoKTsKLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IGxlbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKTsKLSAgICAgICAgaWYgKGxlbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoU2ltcGxlVmFsdWUpbGVuKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCEobGVuZ3RoICE9IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWluID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKTsKLSAgICAgICAgaWYgKG1pbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoU2ltcGxlVmFsdWUpbWluKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCEobGVuZ3RoID49IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWF4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKTsKLSAgICAgICAgaWYgKG1heCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoU2ltcGxlVmFsdWUpbWF4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCEobGVuZ3RoIDw9IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHN0cmluZ1ZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VDb250ZXh0LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNGMzNTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlQ29udGV4dCBpbXBsZW1lbnRzIFByZWZpeFJlc29sdmVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RPUkUgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFQICAgICAgICAgICA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZFUiAgICAgID0gNTsKLQotICAgIHByaXZhdGUgT2JqZWN0IF9vYmo7Ci0gICAgcHJpdmF0ZSBpbnQgX2NvZGU7Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChNYXAgcHJlZml4VG9VcmlNYXApCi0gICAgewotICAgICAgICBfY29kZSA9IE1BUDsKLSAgICAgICAgX29iaiA9IHByZWZpeFRvVXJpTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0KFR5cGVTdG9yZSB0eXBlU3RvcmUpCi0gICAgewotICAgICAgICBfY29kZSA9IFRZUEVfU1RPUkU7Ci0gICAgICAgIF9vYmogPSB0eXBlU3RvcmU7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQoWG1sT2JqZWN0IHhtbE9iamVjdCkKLSAgICB7Ci0gICAgICAgIF9jb2RlID0gWE1MX09CSkVDVDsKLSAgICAgICAgX29iaiA9IHhtbE9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChTdGFydEVsZW1lbnQgc3RhcnQpCi0gICAgewotICAgICAgICBfY29kZSA9IFNUQVJUX0VMRU1FTlQ7Ci0gICAgICAgIF9vYmogPSBzdGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChQcmVmaXhSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIF9jb2RlID0gUkVTT0xWRVI7Ci0gICAgICAgIF9vYmogPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFjayBtYW5hZ2VtZW50IGlmIChoZWF2ZW4gaGVscCB1cykgd2UgZXZlciBuZWVkIHRvIGRvCi0gICAgICogbmVzdGVkIGNvbXBpbGF0aW9uIG9mIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOYW1lc3BhY2VDb250ZXh0U3RhY2sKLSAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUNvbnRleHQgY3VycmVudDsKLSAgICAgICAgQXJyYXlMaXN0IHN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCB2b2lkIHB1c2goTmFtZXNwYWNlQ29udGV4dCBuZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGFjay5hZGQoY3VycmVudCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCB2b2lkIHBvcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnQgPSAoTmFtZXNwYWNlQ29udGV4dClzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCBOYW1lc3BhY2VDb250ZXh0U3RhY2sgPSBuZXcgVGhyZWFkTG9jYWwoKQotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7IHJldHVybiBuZXcgTmFtZXNwYWNlQ29udGV4dFN0YWNrKCk7IH0KLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHB1c2goTmFtZXNwYWNlQ29udGV4dCBuZXh0KQotICAgIHsKLSAgICAgICAgKChOYW1lc3BhY2VDb250ZXh0U3RhY2spTmFtZXNwYWNlQ29udGV4dFN0YWNrLmdldCgpKS5wdXNoKG5leHQpOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygieG1sIikpCi0gICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKF9jb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhNTF9PQkpFQ1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVHlwZVN0b3JlVXNlciBpbXBsOwotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBfb2JqOwotICAgICAgICAgICAgICAgIGlmIChQcm94eS5pc1Byb3h5Q2xhc3Mob2JqLmdldENsYXNzKCkpKQotICAgICAgICAgICAgICAgICAgICBvYmogPSBQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihvYmopOwotCi0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFR5cGVTdG9yZVVzZXIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFR5cGVTdG9yZVVzZXIpb2JqKS5nZXRfc3RvcmUoKS5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKLQotICAgICAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSAoKFhtbE9iamVjdClfb2JqKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBYbWxDdXJzb3IuVG9rZW5UeXBlLkFUVFIpCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXIudG9QYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIGN1ci5uYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBNQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpKChNYXApX29iaikuZ2V0KHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFRZUEVfU1RPUkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoVHlwZVN0b3JlKV9vYmopLmdldE5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBTVEFSVF9FTEVNRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFN0YXJ0RWxlbWVudClfb2JqKS5nZXROYW1lc3BhY2VVcmkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgUkVTT0xWRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoUHJlZml4UmVzb2x2ZXIpX29iaikuZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJJbXByb3Blcmx5IGluaXRpYWxpemVkIE5hbWVzcGFjZUNvbnRleHQuIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUHJlZml4UmVzb2x2ZXIgZ2V0Q3VycmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gKChOYW1lc3BhY2VDb250ZXh0U3RhY2spTmFtZXNwYWNlQ29udGV4dFN0YWNrLmdldCgpKS5jdXJyZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9wKCkKLSAgICB7Ci0gICAgICAgICgoTmFtZXNwYWNlQ29udGV4dFN0YWNrKU5hbWVzcGFjZUNvbnRleHRTdGFjay5nZXQoKSkucG9wKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9TdHJpbmdFbnVtVmFsdWUuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1N0cmluZ0VudW1WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg0ZmI5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1N0cmluZ0VudW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlOwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nRW51bVZhbHVlIGV4dGVuZHMgU3RyaW5nRW51bUFic3RyYWN0QmFzZQotewotICAgIHB1YmxpYyBTdHJpbmdFbnVtVmFsdWUoU3RyaW5nIHMsIGludCBpKQotICAgICAgICB7IHN1cGVyKHMsIGkpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmMzlhMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGFueVNpbXBsZVR5cGUgZm9yIFhNTC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxBbnlTaW1wbGVUeXBlSW1wbCBleHRlbmRzIFhtbE9iamVjdEJhc2UgaW1wbGVtZW50cyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGVJbXBsKCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0gICAgU3RyaW5nIF90ZXh0dmFsdWUgPSAiIjsKLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKLSAgICB9Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF90ZXh0dmFsdWU7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIF90ZXh0dmFsdWUgPSBzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3RleHR2YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgLy8gY29tcGFyZXMgYWdhaW5zdCBhbm90aGVyIGFueVNpbXBsZVR5cGUKLSAgICAgICAgLy8gcnVsZSBpczogbGV4aWNhbCB2YWx1ZXMgbXVzdCBtYXRjaC4KLSAgICAgICAgcmV0dXJuIF90ZXh0dmFsdWUuZXF1YWxzKCgoWG1sQW55U2ltcGxlVHlwZSlvYmopLmdldFN0cmluZ1ZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIC8vIG1hdGNoZXMgSmF2YVN0cmluZ0hvbGRlcidzIHZhbHVlX2hhc2hfY29kZSwgc28gd2UgY2FuIGJlIGhhc2VkIGFnYWluc3Qgc3RyaW5ncwotICAgICAgICByZXR1cm4gKF90ZXh0dmFsdWUgPT0gbnVsbCA/IDAgOiBfdGV4dHZhbHVlLmhhc2hDb2RlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVNpbXBsZVR5cGVSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDcwZTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZVJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24gZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlSW1wbAotewotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY3ZTY4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBhbnlUeXBlIGZvciBYTUwuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWG1sQW55VHlwZUltcGwgZXh0ZW5kcyBYbWxDb21wbGV4Q29udGVudEltcGwgaW1wbGVtZW50cyBYbWxPYmplY3QKLXsKLSAgICBwdWJsaWMgWG1sQW55VHlwZUltcGwoKQotICAgICAgICB7IHN1cGVyKHR5cGUpOyB9Ci0KLSAgICBwdWJsaWMgWG1sQW55VHlwZUltcGwoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICB7IHN1cGVyKHR5cGUpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTMzYjAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1wdWJsaWMgY2xhc3MgWG1sQW55VXJpSW1wbCBleHRlbmRzIEphdmFVcmlIb2xkZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVVSSQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVVyaVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTUzMmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbEFueVVyaVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YVVyaUhvbGRlckV4IGltcGxlbWVudHMgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlVUkkKLXsKLSAgICBwdWJsaWMgWG1sQW55VXJpUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhYjlmMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnk7Ci0KLQotcHVibGljIGNsYXNzIFhtbEJhc2U2NEJpbmFyeUltcGwgZXh0ZW5kcyBKYXZhQmFzZTY0SG9sZGVyIGltcGxlbWVudHMgWG1sQmFzZTY0QmluYXJ5Ci17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwZmIyZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmFzZTY0QmluYXJ5OwotCi1wdWJsaWMgY2xhc3MgWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhQmFzZTY0SG9sZGVyRXggaW1wbGVtZW50cyBYbWxCYXNlNjRCaW5hcnkKLXsKLSAgICBwdWJsaWMgWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg5YTQ3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJvb2xlYW47Ci0KLXB1YmxpYyBjbGFzcyBYbWxCb29sZWFuSW1wbCBleHRlbmRzIEphdmFCb29sZWFuSG9sZGVyIGltcGxlbWVudHMgWG1sQm9vbGVhbgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhblJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5NjQzYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxCb29sZWFuUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhQm9vbGVhbkhvbGRlckV4IGltcGxlbWVudHMgWG1sQm9vbGVhbgotewotICAgIHB1YmxpYyBYbWxCb29sZWFuUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJ5dGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCeXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmExMDVmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJ5dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJ5dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxCeXRlSW1wbCBleHRlbmRzIEphdmFJbnRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEJ5dGUKLXsKLSAgICBwdWJsaWMgWG1sQnl0ZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEJ5dGUudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEJ5dGVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxDb21wbGV4Q29udGVudEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Q2MDRlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci0KLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVZpc2l0b3JJbXBsOwotCi1wdWJsaWMgY2xhc3MgWG1sQ29tcGxleENvbnRlbnRJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBYbWxDb21wbGV4Q29udGVudEltcGwoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgX3NjaGVtYVR5cGUgPSAoU2NoZW1hVHlwZUltcGwpdHlwZTsKLSAgICAgICAgaW5pdENvbXBsZXhUeXBlKHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlSW1wbCBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgICAgICB7IHJldHVybiBudWxsOyB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRfU3RyaW5nKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9zY2hlbWFUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDsKLQotICAgICAgICBpZiAoX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgJiYKLSAgICAgICAgICAgICAgICAhX3NjaGVtYVR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVHlwZSBkb2VzIG5vdCBhbGxvdyBmb3IgdGV4dHVhbCBjb250ZW50OiAiICsgX3NjaGVtYVR5cGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF9TdHJpbmcodik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldF90ZXh0KFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgIF9zY2hlbWFUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UIHx8Ci0gICAgICAgICAgICAgICAgX3NjaGVtYVR5cGUuaXNOb1R5cGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVfZnJvbV9jb21wbGV4X2NvbnRlbnQoKQotICAgIHsKLSAgICAgICAgLy8gTm8gY29tcGxleCBjYWNoaW5nIHlldCAuLi4KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0X25pbCgpCi0gICAgICAgIHsgLyogQlVHQlVHOiB3aGF0IHRvIGRvPyAqLyB9Ci0KLSAgICAvLyBMRUZUCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGNvbXBsZXhPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLmVxdWFscyhjb21wbGV4T2JqZWN0LnNjaGVtYVR5cGUoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gQlVHQlVHOiBieS12YWx1ZSBzdHJ1Y3R1cmUgY29tcGFyaXNvbiB1bmRvbmUKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTEVGVAotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbXBsZXggdHlwZXMgY2Fubm90IGJlIHVzZWQgYXMgaGFzaCBrZXlzIik7Ci0gICAgfQotCi0gICAgLy8gRE9ORQotICAgIHB1YmxpYyBUeXBlU3RvcmVWaXNpdG9yIG5ld192aXNpdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKF9zY2hlbWFUeXBlLmdldENvbnRlbnRNb2RlbCgpKTsKLSAgICB9Ci0KLSAgICAvLyBET05FCi0gICAgcHVibGljIGJvb2xlYW4gaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5pc09yZGVyU2Vuc2l0aXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRfZWxlbWVudGZsYWdzKFFOYW1lIGVsdE5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRQcm9wZXJ0eShlbHROYW1lKTsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUgfHwKLSAgICAgICAgICAgIHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuSEFTREVGQVVMVCkgfAotICAgICAgICAgICAgKHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuRklYRUQpIHwKLSAgICAgICAgICAgIChwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLk5JTExBQkxFKTsKLSAgICB9Ci0KLSAgICAvLyBET05FCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChhdHRyTmFtZSk7Ci0gICAgfQotCi0gICAgLy8gRE9ORQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KFFOYW1lIGVsdE5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRQcm9wZXJ0eShlbHROYW1lKTsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHByb3AuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIENvZGUgZ2VuIGhlbHBlcnMKLSAgICAvLwotICAgIC8vIFNvIG11Y2ggcmVkdW5kYW50IGNvZGUgLi4uLi4gd2hhdCBJJ2QgZ2l2ZSBmb3IgZ2VuZXJpY3MhCi0gICAgLy8KLQotICAgIHByb3RlY3RlZCB2b2lkIHVuaW9uQXJyYXlTZXR0ZXJIZWxwZXIgKCBPYmplY3RbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5vYmplY3RTZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBib29sZWFuW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggZmxvYXRbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBkb3VibGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBieXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBzaG9ydFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggaW50W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggbG9uZ1tdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEJpZ0RlY2ltYWxbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBCaWdJbnRlZ2VyW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBieXRlW11bXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBHRGF0ZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEdEdXJhdGlvbltdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIENhbGVuZGFyW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggRGF0ZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFFOYW1lW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggU3RyaW5nRW51bUFic3RyYWN0QmFzZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIExpc3RbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdW5pb25BcnJheVNldHRlckhlbHBlciAoIE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikub2JqZWN0U2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggYm9vbGVhbltdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggZmxvYXRbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGRvdWJsZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggYnl0ZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggc2hvcnRbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGludFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggbG9uZ1tdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQmlnRGVjaW1hbFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQmlnSW50ZWdlcltdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggU3RyaW5nW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBieXRlW11bXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEdEYXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBHRHVyYXRpb25bXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIENhbGVuZGFyW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBEYXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBRTmFtZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggU3RyaW5nRW51bUFic3RyYWN0QmFzZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggTGlzdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBYbWxPYmplY3RbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBnZXRfc3RvcmUoKS5hcnJheV9zZXR0ZXIoIHNvdXJjZXMsIGVsZW1OYW1lICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBYbWxPYmplY3RbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzdmMjUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbERhdGVJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxEYXRlCi17Ci0gICAgcHVibGljIFhtbERhdGVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxEYXRlLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxEYXRlSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZVRpbWVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlVGltZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3MDI3ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlVGltZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGVUaW1lOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxEYXRlVGltZUltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERhdGVUaW1lCi17Ci0gICAgcHVibGljIFhtbERhdGVUaW1lSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRGF0ZVRpbWUudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbERhdGVUaW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjMzNTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKLQotcHVibGljIGNsYXNzIFhtbERlY2ltYWxJbXBsIGV4dGVuZHMgSmF2YURlY2ltYWxIb2xkZXIgaW1wbGVtZW50cyBYbWxEZWNpbWFsCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWU3OWQwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbERlY2ltYWxSZXN0cmljdGlvbiBleHRlbmRzIEphdmFEZWNpbWFsSG9sZGVyRXggaW1wbGVtZW50cyBYbWxEZWNpbWFsCi17Ci0gICAgcHVibGljIFhtbERlY2ltYWxSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUxY2IzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG91YmxlOwotCi1wdWJsaWMgY2xhc3MgWG1sRG91YmxlSW1wbCBleHRlbmRzIEphdmFEb3VibGVIb2xkZXIgaW1wbGVtZW50cyBYbWxEb3VibGUKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEb3VibGVSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY5YjA1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZVJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvdWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxEb3VibGVSZXN0cmljdGlvbiBleHRlbmRzIEphdmFEb3VibGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERvdWJsZQotewotICAgIHB1YmxpYyBYbWxEb3VibGVSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRHVyYXRpb25JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2N2ViMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxEdXJhdGlvbkltcGwgZXh0ZW5kcyBKYXZhR0R1cmF0aW9uSG9sZGVyRXggaW1wbGVtZW50cyBYbWxEdXJhdGlvbgotewotICAgIHB1YmxpYyBYbWxEdXJhdGlvbkltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbER1cmF0aW9uLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxEdXJhdGlvbkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0aWVzSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXRpZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGJkMWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXRpZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFTlRJVElFUzsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRW50aXRpZXNJbXBsIGV4dGVuZHMgWG1sTGlzdEltcGwgaW1wbGVtZW50cyBYbWxFTlRJVElFUwotewotICAgIHB1YmxpYyBYbWxFbnRpdGllc0ltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEVOVElUSUVTLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxFbnRpdGllc0ltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0eUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlMTVkZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUWTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbEVudGl0eUltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxFTlRJVFkKLXsKLSAgICBwdWJsaWMgWG1sRW50aXR5SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRU5USVRZLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxFbnRpdHlJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxGbG9hdEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODE5NTk2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxGbG9hdDsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRmxvYXRJbXBsIGV4dGVuZHMgSmF2YUZsb2F0SG9sZGVyIGltcGxlbWVudHMgWG1sRmxvYXQKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0UmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0UmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4MDAwNy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxGbG9hdFJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEZsb2F0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbEZsb2F0UmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhRmxvYXRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEZsb2F0Ci17Ci0gICAgcHVibGljIFhtbEZsb2F0UmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdEYXlJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHRGF5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGFhN2VjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdEYXlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdEYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxHRGF5SW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR0RheQotewotICAgIHB1YmxpYyBYbWxHRGF5SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sR0RheS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR0RheUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aERheUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aERheUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhYzdkYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHTW9udGhEYXlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHTW9udGhEYXk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxHTW9udGhEYXlJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHTW9udGhEYXkKLXsKLSAgICBwdWJsaWMgWG1sR01vbnRoRGF5SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sR01vbnRoRGF5LnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxHTW9udGhEYXlJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHTW9udGhJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHTW9udGhJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNzFmMzkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR01vbnRoOyAKLQotcHVibGljIGNsYXNzIFhtbEdNb250aEltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEdNb250aAotewotICAgIHB1YmxpYyBYbWxHTW9udGhJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxHTW9udGgudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEdNb250aEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdZZWFySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1M2VkNTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHWWVhcjsKLQotcHVibGljIGNsYXNzIFhtbEdZZWFySW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR1llYXIKLXsKLSAgICBwdWJsaWMgWG1sR1llYXJJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxHWWVhci50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR1llYXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJNb250aEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiZjhhYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR1llYXJNb250aDsgCi0KLXB1YmxpYyBjbGFzcyBYbWxHWWVhck1vbnRoSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR1llYXJNb250aAotewotICAgIHB1YmxpYyBYbWxHWWVhck1vbnRoSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sR1llYXJNb250aC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR1llYXJNb250aEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljODk4ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxIZXhCaW5hcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEhleEJpbmFyeTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sSGV4QmluYXJ5SW1wbCBleHRlbmRzIEphdmFIZXhCaW5hcnlIb2xkZXIgaW1wbGVtZW50cyBYbWxIZXhCaW5hcnkKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxIZXhCaW5hcnlSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYzMzM4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxIZXhCaW5hcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxIZXhCaW5hcnlSZXN0cmljdGlvbiBleHRlbmRzIEphdmFIZXhCaW5hcnlIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEhleEJpbmFyeQotewotICAgIHB1YmxpYyBYbWxIZXhCaW5hcnlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNmNhMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJZEltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxJRAotewotICAgIHB1YmxpYyBYbWxJZEltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbElELnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxJZEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OGU2NjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRFJFRjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sSWRSZWZJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sSURSRUYKLXsKLSAgICBwdWJsaWMgWG1sSWRSZWZJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxJRFJFRi50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sSWRSZWZJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZnNJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjM1N2MuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSURSRUZTOwotCi1wdWJsaWMgY2xhc3MgWG1sSWRSZWZzSW1wbCBleHRlbmRzIFhtbExpc3RJbXBsIGltcGxlbWVudHMgWG1sSURSRUZTCi17Ci0gICAgcHVibGljIFhtbElkUmVmc0ltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbElEUkVGUy50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sSWRSZWZzSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWIwNGRmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50OwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJbnRJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlciBpbXBsZW1lbnRzIFhtbEludAotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50UmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludFJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODUyOGEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50UmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludDsKLQotcHVibGljIGNsYXNzIFhtbEludFJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sSW50Ci17Ci0gICAgcHVibGljIFhtbEludFJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50ZWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiYTlkZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyIGltcGxlbWVudHMgWG1sSW50ZWdlcgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50ZWdlclJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4ODkzYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBYbWxJbnRlZ2VyUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlckV4IGltcGxlbWVudHMgWG1sSW50ZWdlcgotewotICAgIHB1YmxpYyBYbWxJbnRlZ2VyUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExhbmd1YWdlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGFuZ3VhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTNlNGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGFuZ3VhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExhbmd1YWdlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbExhbmd1YWdlSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbExhbmd1YWdlCi17Ci0gICAgcHVibGljIFhtbExhbmd1YWdlSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTGFuZ3VhZ2UudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbExhbmd1YWdlSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGlzdEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGYzYjguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaW1wbGVMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFhtbExpc3RJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICBwdWJsaWMgWG1sTGlzdEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLSAgICBwcml2YXRlIFhtbFNpbXBsZUxpc3QgX3ZhbHVlOwotICAgIHByaXZhdGUgWG1sU2ltcGxlTGlzdCBfanZhbHVlOwotCi0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBudWxsQXNFbXB0eShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb21wdXRlX2xpc3RfdGV4dChMaXN0IHhMaXN0KQotICAgIHsKLSAgICAgICAgaWYgKHhMaXN0LnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICIiOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKG51bGxBc0VtcHR5KCgoU2ltcGxlVmFsdWUpeExpc3QuZ2V0KDApKS5nZXRTdHJpbmdWYWx1ZSgpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB4TGlzdC5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobnVsbEFzRW1wdHkoKChTaW1wbGVWYWx1ZSl4TGlzdC5nZXQoaSkpLmdldFN0cmluZ1ZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVfbGlzdF90ZXh0KF92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhtbFNpbXBsZUxpc3Qgc2F2ZWRWYWx1ZSA9IF92YWx1ZTsKLSAgICAgICAgICAgIHNldF90ZXh0KHYpOwotCi0gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZQotICAgICAgICAgICAgX3ZhbHVlID0gc2F2ZWRWYWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGFnYWluc3QgYW55IHBhdHRlcm5zLi4uCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpICYmICFfc2NoZW1hVHlwZS5tYXRjaFBhdHRlcm5GYWNldChzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBTY2hlbWFUeXBlIGl0ZW1UeXBlID0gX3NjaGVtYVR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0KLSAgICAgICAgWG1sU2ltcGxlTGlzdCBuZXd2YWwgPSBsZXgocywgaXRlbVR5cGUsIF92b29yVmMsIGhhc19zdG9yZSgpID8gZ2V0X3N0b3JlKCkgOiBudWxsKTsKLQotICAgICAgICAvLyBjaGVjayBlbnVtZXJhdGlvbgotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUobmV3dmFsLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgLy8gd2UgbWFkZSBpdCBhbGwgdGhlIHdheSB0aHJvdWdoOyBzbyB3ZSdyZSBPSy4KLSAgICAgICAgX3ZhbHVlID0gbmV3dmFsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdBUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdF9saXN0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVFJJTkdBUlJBWTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmIFhNTENoYXIuaXNTcGFjZShzLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgaWYgKGkgPj0gcy5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KEVNUFRZX1NUUklOR0FSUkFZKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgcy5sZW5ndGgoKSAmJiAhWE1MQ2hhci5pc1NwYWNlKHMuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHMuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBYbWxTaW1wbGVMaXN0IGxleChTdHJpbmcgcywgU2NoZW1hVHlwZSBpdGVtVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY3R4LCBQcmVmaXhSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHBhcnRzID0gc3BsaXRfbGlzdChzKTsKLQotICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gbmV3QXJyYXkgPSBuZXcgWG1sQW55U2ltcGxlVHlwZVtwYXJ0cy5sZW5ndGhdOwotICAgICAgICBib29sZWFuIHB1c2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KHJlc29sdmVyKSk7Ci0gICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0FycmF5W2ldID0gaXRlbVR5cGUubmV3VmFsdWUocGFydHNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdHguaW52YWxpZCgiTGlzdCBpdGVtICciICsgcGFydHNbaV0gKyAiJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBvZiAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoaXRlbVR5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHVzaGVkKQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBYbWxTaW1wbGVMaXN0KEFycmF5cy5hc0xpc3QobmV3QXJyYXkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgeGxpc3RWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGxpc3RWYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKF9qdmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfanZhbHVlOwotICAgICAgICBMaXN0IGphdmFSZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3ZhbHVlLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgamF2YVJlc3VsdC5hZGQoamF2YV92YWx1ZSgoWG1sT2JqZWN0KV92YWx1ZS5nZXQoaSkpKTsKLSAgICAgICAgX2p2YWx1ZSA9IG5ldyBYbWxTaW1wbGVMaXN0KGphdmFSZXN1bHQpOwotICAgICAgICByZXR1cm4gX2p2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHBlcm1pdHNfaW5uZXJfc3BhY2UoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoKChTaW1wbGVWYWx1ZSlvYmopLmluc3RhbmNlVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zX3doaXRlX3NwYWNlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHMuaW5kZXhPZignICcpID49IDAgfHwKLSAgICAgICAgICAgICAgICBzLmluZGV4T2YoJ1x0JykgPj0gMCB8fAotICAgICAgICAgICAgICAgIHMuaW5kZXhPZignXG4nKSA+PSAwIHx8Ci0gICAgICAgICAgICAgICAgcy5pbmRleE9mKCdccicpID49IDA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0X2xpc3QoTGlzdCBsaXN0KQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBpdGVtVHlwZSA9IF9zY2hlbWFUeXBlLmdldExpc3RJdGVtVHlwZSgpOwotICAgICAgICBYbWxTaW1wbGVMaXN0IHhMaXN0OwotCi0gICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7Ci0gICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIG5ld3ZhbCA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZW50cnkgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGVudHJ5IGluc3RhbmNlb2YgWG1sT2JqZWN0KSAmJiBwZXJtaXRzX2lubmVyX3NwYWNlKChYbWxPYmplY3QpbGlzdC5nZXQoaSkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ3JlcCA9IGxpc3QuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc193aGl0ZV9zcGFjZShzdHJpbmdyZXApKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXd2YWxbaV0gPSBpdGVtVHlwZS5uZXdWYWx1ZShlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4TGlzdCA9IG5ldyBYbWxTaW1wbGVMaXN0KEFycmF5cy5hc0xpc3QobmV3dmFsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHVzaGVkKQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGVudW1lcmF0aW9uICsgbWluL21heC9ldGMKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUoeExpc3QsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgfQotCi0gICAgICAgIF92YWx1ZSA9IHhMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKFhtbFNpbXBsZUxpc3QgaXRlbXMsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3RbXSBlbnVtdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGNoZWNrRW51bTogaWYgKGVudW12YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bXZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGVxdWFsX3htbExpc3RzKGl0ZW1zLCAoKFhtbE9iamVjdEJhc2UpZW51bXZhbHNbaV0pLnhsaXN0VmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGNoZWNrRW51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiTGlzdCAoIiArIGl0ZW1zICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3QgbzsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIICkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgIT0gaXRlbXMuc2l6ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyBpdGVtcyArICIpIGRvZXMgbm90IGhhdmUgIiArIGkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyBwZXIgbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSA+IGl0ZW1zLnNpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJMaXN0ICgiICsgaXRlbXMgKyAiKSBoYXMgb25seSAiICsgaXRlbXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMsIGZld2VyIHRoYW4gbWluIGxlbmd0aCBmYWNldCAoIiArIGkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpIDwgaXRlbXMuc2l6ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyBpdGVtcyArICIpIGhhcyAiICsgaXRlbXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMsIG1vcmUgdGhhbiBtYXggbGVuZ3RoIGZhY2V0ICgiICsgaSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIC8vIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkgLSBubyBzb3J0aW5nIG9yZGVyOyBpbmhlcml0IGZyb20gYmFzZQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcXVhbF94bWxMaXN0cyhfdmFsdWUsICgoWG1sT2JqZWN0QmFzZSlvYmopLnhsaXN0VmFsdWUoKSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsX3htbExpc3RzKExpc3QgYSwgTGlzdCBiKQotICAgIHsKLSAgICAgICAgaWYgKGEuc2l6ZSgpICE9IGIuc2l6ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghYS5nZXQoaSkuZXF1YWxzKGIuZ2V0KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gaGFzaCBjb2RlIHByb2JlcyA5IGRpc3RyaWJ1dGVkIHZhbHVlcywgcGx1cyB0aGUgbGFzdAotICAgICAgICBpbnQgaGFzaCA9IF92YWx1ZS5zaXplKCk7Ci0gICAgICAgIGludCBpbmNyID0gX3ZhbHVlLnNpemUoKSAvIDk7Ci0gICAgICAgIGlmIChpbmNyIDwgMSkKLSAgICAgICAgICAgIGluY3IgPSAxOwotCi0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3ZhbHVlLnNpemUoKTsgaSArPSBpbmNyKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYXNoICo9IDE5OwotICAgICAgICAgICAgaGFzaCArPSBfdmFsdWUuZ2V0KGkpLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA8IF92YWx1ZS5zaXplKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhc2ggKj0gMTk7Ci0gICAgICAgICAgICBoYXNoICs9IF92YWx1ZS5nZXQoaSkuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZSgoWG1sU2ltcGxlTGlzdCl4bGlzdFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTG9uZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkODM1Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxMb25nOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxMb25nSW1wbCBleHRlbmRzIEphdmFMb25nSG9sZGVyIGltcGxlbWVudHMgWG1sTG9uZwotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTG9uZ1Jlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzYjJjYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExvbmc7Ci0KLXB1YmxpYyBjbGFzcyBYbWxMb25nUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhTG9uZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTG9uZwotewotICAgIHB1YmxpYyBYbWxMb25nUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5DTmFtZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5DTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwMzVmNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOQ05hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5DTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci0KLXB1YmxpYyBjbGFzcyBYbWxOQ05hbWVJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTkNOYW1lCi17Ci0gICAgcHVibGljIFhtbE5DTmFtZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5DTmFtZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTkNOYW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmICggIVhNTENoYXIuaXNWYWxpZE5DTmFtZSh2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiVmFsdWUgJyIgKyB2ICsgIicgaXQncyBub3QgYSB2YWxpZCBOQ05hbWUuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTk4OGUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5hbWU7Ci0KLQotcHVibGljIGNsYXNzIFhtbE5hbWVJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTmFtZQotewotICAgIHB1YmxpYyBYbWxOYW1lSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTmFtZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTmFtZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5lZ2F0aXZlSW50ZWdlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5lZ2F0aXZlSW50ZWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3Y2E1YS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOZWdhdGl2ZUludGVnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOZWdhdGl2ZUludGVnZXI7Ci0KLQotcHVibGljIGNsYXNzIFhtbE5lZ2F0aXZlSW50ZWdlckltcGwgZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlckV4IGltcGxlbWVudHMgWG1sTmVnYXRpdmVJbnRlZ2VyCi17Ci0gICAgcHVibGljIFhtbE5lZ2F0aXZlSW50ZWdlckltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5lZ2F0aXZlSW50ZWdlci50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDUxM2UuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk1UT0tFTjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7Ci0KLQotcHVibGljIGNsYXNzIFhtbE5tVG9rZW5JbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTk1UT0tFTgotewotICAgIHB1YmxpYyBYbWxObVRva2VuSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTk1UT0tFTi50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTm1Ub2tlbkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAoICFYTUxDaGFyLmlzVmFsaWRObXRva2VuKHYpICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJWYWx1ZSAnIiArIHYgKyAiJyBpdCdzIG5vdCBhIHZhbGlkIE5NVE9LRU4uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2Vuc0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEzMDA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk1UT0tFTlM7Ci0KLQotcHVibGljIGNsYXNzIFhtbE5tVG9rZW5zSW1wbCBleHRlbmRzIFhtbExpc3RJbXBsIGltcGxlbWVudHMgWG1sTk1UT0tFTlMKLXsKLSAgICBwdWJsaWMgWG1sTm1Ub2tlbnNJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxOTVRPS0VOUy50eXBlLCBmYWxzZSk7fQotICAgIHB1YmxpYyBYbWxObVRva2Vuc0ltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vbk5lZ2F0aXZlSW50ZWdlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vbk5lZ2F0aXZlSW50ZWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5ZWZkZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vbk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbE5vbk5lZ2F0aXZlSW50ZWdlckltcGwgZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlckV4IGltcGxlbWVudHMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyCi17Ci0gICAgcHVibGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlckltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5vbk5lZ2F0aXZlSW50ZWdlci50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWIxZGE2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vblBvc2l0aXZlSW50ZWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vblBvc2l0aXZlSW50ZWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb25Qb3NpdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9ybWFsaXplZFN0cmluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNjNhMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9ybWFsaXplZFN0cmluZzsKLQotcHVibGljIGNsYXNzIFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTm9ybWFsaXplZFN0cmluZwotewotICAgIHB1YmxpYyBYbWxOb3JtYWxpemVkU3RyaW5nSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTm9ybWFsaXplZFN0cmluZy50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTm9ybWFsaXplZFN0cmluZ0ltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZGU5MGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5PVEFUSU9OOwotCi1wdWJsaWMgY2xhc3MgWG1sTm90YXRpb25JbXBsIGV4dGVuZHMgSmF2YU5vdGF0aW9uSG9sZGVyIGltcGxlbWVudHMgWG1sTk9UQVRJT04KLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0ZWY0NC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3RhdGlvblJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5PVEFUSU9OOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbE5vdGF0aW9uUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhTm90YXRpb25Ib2xkZXJFeCBpbXBsZW1lbnRzIFhtbE5PVEFUSU9OCi17Ci0gICAgcHVibGljIFhtbE5vdGF0aW9uUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1MWY0OC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxPYmplY3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjc5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkdsb2JhbExvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVZpc2l0b3JJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3IuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb2N1bWVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkZpbHRlclhtbE9iamVjdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFR5cGVTdG9yZVVzZXIsIFNlcmlhbGl6YWJsZSwgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTUFKT1JfVkVSU0lPTl9OVU1CRVIgPSAoc2hvcnQpIDE7IC8vIGZvciBzZXJpYWxpemF0aW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNSU5PUl9WRVJTSU9OX05VTUJFUiA9IChzaG9ydCkgMTsgLy8gZm9yIHNlcmlhbGl6YXRpb24KLQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbW9uaXRvcigpCi0gICAgewotICAgICAgICBpZiAoaGFzX3N0b3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0X3N0b3JlKCkuZ2V0X3Jvb3Rfb2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBYbWxPYmplY3RCYXNlIHVuZGVybHlpbmcoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWG1sT2JqZWN0QmFzZSkKLSAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0QmFzZSlvYmo7Ci0gICAgICAgIHdoaWxlIChvYmogaW5zdGFuY2VvZiBGaWx0ZXJYbWxPYmplY3QpCi0gICAgICAgICAgICBvYmogPSAoKEZpbHRlclhtbE9iamVjdClvYmopLnVuZGVybHlpbmdYbWxPYmplY3QoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdEJhc2UpCi0gICAgICAgICAgICByZXR1cm4gKFhtbE9iamVjdEJhc2Upb2JqOwotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb24tbmF0aXZlIGltcGxlbWVudGF0aW9ucyBvZiBYbWxPYmplY3Qgc2hvdWxkIGV4dGVuZCBGaWx0ZXJYbWxPYmplY3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgWG1sT2JqZWN0IGNvcHkoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGltbXV0YWJsZSBvYmplY3RzIGRvbid0IGdldCBjb3BpZWQuIFRoZXkncmUgaW1tdXRhYmxlCi0gICAgICAgICAgICBpZiAoaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLQotICAgICAgICAgICAgY2hlY2tfb3JwaGFuZWQoKTsKLQotICAgICAgICAgICAgLy8gY29weSB0aGUgdHlwZQotICAgICAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGdldF9zdG9yZSgpLmdldF9zY2hlbWF0eXBlbG9hZGVyKCkubmV3SW5zdGFuY2Uoc2NoZW1hVHlwZSgpLCBudWxsKTsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvLyBjb3B5IHRoZSBkYXRhCi0gICAgICAgICAgICBYbWxPYmplY3RCYXNlIHRhcmdldCA9IHVuZGVybHlpbmcocmVzdWx0KTsKLSAgICAgICAgICAgIHRhcmdldC5nZXRfc3RvcmUoKS5jb3B5X2NvbnRlbnRzX2Zyb20oZ2V0X3N0b3JlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMoKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLmRvY3VtZW50UHJvcGVydGllcygpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSgpCi0gICAgICAgIHsgcmV0dXJuIG5ld1hNTElucHV0U3RyZWFtKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLm5ld1hNTElucHV0U3RyZWFtKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSgpCi0gICAgICAgIHsgcmV0dXJuIG5ld0lucHV0U3RyZWFtKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLm5ld0lucHV0U3RyZWFtKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyKCkKLSAgICAgICAgeyByZXR1cm4gbmV3UmVhZGVyKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgUmVhZGVyIG5ld1JlYWRlcihYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIubmV3UmVhZGVyKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUoKQotICAgICAgICB7IHJldHVybiBuZXdEb21Ob2RlKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgcmV0dXJuIGN1ci5uZXdEb21Ob2RlKG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgY3VyLnNhdmUoY2gsIGxoLCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgY3VyLnNhdmUoZmlsZSwgbWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IGN1ci5zYXZlKG9zLCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyBjdXIuc2F2ZSh3LCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKENvbnRlbnRIYW5kbGVyIGNoLCBMZXhpY2FsSGFuZGxlciBsaCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7IHNhdmUoIGNoLCBsaCwgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggZmlsZSwgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggb3MsIG51bGwgKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggdywgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvckZvcmNlKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZW5zdXJlU3RvcmUoKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sT2JqZWN0IGVuc3VyZVN0b3JlKCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0KLSAgICAgICAgICAgIChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMAotICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICA6IGNvbXB1dGVfdGV4dCggaGFzX3N0b3JlKCkgPyBnZXRfc3RvcmUoKSA6IG51bGwgKTsKLQotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpLnNldERvY3VtZW50VHlwZShzY2hlbWFUeXBlKCkpOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoIG9wdGlvbnMgKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5pbnNlcnRDaGFycyggdmFsdWUgKTsKLQotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxPcHRpb25zIG1ha2VJbm5lck9wdGlvbnMoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgWG1sT3B0aW9ucyBpbm5lck9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOwotICAgICAgICBpbm5lck9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU5ORVIgKTsKLSAgICAgICAgcmV0dXJuIGlubmVyT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvcigpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJYTUwgVmFsdWUgT2JqZWN0cyBjYW5ub3QgY3JlYXRlIGN1cnNvcnMiKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfb3JwaGFuZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RvcmUoKS5uZXdfY3Vyc29yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQotICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHJldHVybiBpc05pbCgpID8gbnVsbCA6IHNjaGVtYVR5cGUoKTsgfSB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUZpZWxkIHNjaGVtYUZpZWxkKCkgewotICAgICAgICBTY2hlbWFUeXBlIHN0ID0gc2NoZW1hVHlwZSgpOwotICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZDsKLQotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGZpZWxkIGhhcyBhbiBhbm9ueW1vdXMgdHlwZQotICAgICAgICBmaWVsZCA9IHN0LmdldENvbnRhaW5lckZpZWxkKCk7Ci0KLSAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCi0gICAgICAgICAgICBmaWVsZCA9IGdldF9zdG9yZSgpLmdldF9zY2hlbWFfZmllbGQoKTsKLQotICAgICAgICByZXR1cm4gZmllbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIF92b29yVmMgd2hlbiB5b3Ugd2FudCB0byB0aHJvdyBhIFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiB3aGVuCi0gICAgICogdmFsaWRhdGluZyBhIHNpbXBsZSB0eXBlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFZhbHVlT3V0T2ZSYW5nZVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgVmFsaWRhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGludmFsaWQoU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc3VwcGx5IHZhbGlkYXRpb24gY29udGV4dCBmb3IgdGhlIHZhbGlkYXRlX3ZhbHVlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbW11dGFibGVWYWx1ZVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgVmFsaWRhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgWG1sT2JqZWN0IF9sb2M7Ci0gICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfY29sbDsKLSAgICAgICAgSW1tdXRhYmxlVmFsdWVWYWxpZGF0aW9uQ29udGV4dChDb2xsZWN0aW9uIGNvbGwsIFhtbE9iamVjdCBsb2MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb2xsID0gY29sbDsKLSAgICAgICAgICAgIF9sb2MgPSBsb2M7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZChTdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgICBfY29sbC5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KG1lc3NhZ2UsIF9sb2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsaWRhdGlvbkNvbnRleHQgX3Zvb3JWYyA9IG5ldyBWYWx1ZU91dE9mUmFuZ2VWYWxpZGF0aW9uQ29udGV4dCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKQotICAgICAgICB7IHJldHVybiB2YWxpZGF0ZShudWxsKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9pbW11dGFibGUob3B0aW9ucyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJYTUwgb2JqZWN0cyB3aXRoIG5vIHVuZGVybHlpbmcgc3RvcmUgY2Fubm90IGJlIHZhbGlkYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzY2hlbWFGaWVsZCgpOwotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gc2NoZW1hVHlwZSgpOwotCi0gICAgICAgICAgICBUeXBlU3RvcmUgdHlwZVN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPQotICAgICAgICAgICAgICAgIG5ldyBWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGZpZWxkLCB0eXBlU3RvcmUuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSwgb3B0aW9ucywgbnVsbCk7Ci0KLSAgICAgICAgICAgIHR5cGVTdG9yZS52YWxpZGF0ZSggdmFsaWRhdG9yICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlX2ltbXV0YWJsZShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIgPSBvcHRpb25zID09IG51bGwgPyBudWxsIDogKENvbGxlY3Rpb24pb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5FUlJPUl9MSVNURU5FUik7Ci0gICAgICAgIFhtbEVycm9yV2F0Y2hlciB3YXRjaGVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcihlcnJvckxpc3RlbmVyKTsKLSAgICAgICAgaWYgKCFzY2hlbWFUeXBlKCkuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNhbm5vdCBoYXZlIGFueSByZXF1aXJlZCBhdHRyaWJ1dGVzIG9yIGVsZW1lbnRzCi0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMgPSBzY2hlbWFUeXBlKCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmdldE1pbk9jY3VycygpLnNpZ251bSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkocHJvcGVydGllc1tpXS5nZXROYW1lKCkpLCB0aGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTWlzc2luZyByZXF1aXJlZCBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkocHJvcGVydGllc1tpXS5nZXROYW1lKCkpLCB0aGlzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSgpLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIXdhdGNoZXIuaGFzRXJyb3IoKTsgLy8gZG9uJ3QgdmFsaWRhdGUgbm9uLXNpbXBsZS1jb250ZW50Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGV4dCA9IChTdHJpbmcpX3RleHRzb3VyY2U7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICB0ZXh0ID0gIiI7Ci0gICAgICAgIHZhbGlkYXRlX3NpbXBsZXZhbCh0ZXh0LCBuZXcgSW1tdXRhYmxlVmFsdWVWYWxpZGF0aW9uQ29udGV4dCh3YXRjaGVyLCB0aGlzKSk7Ci0gICAgICAgIHJldHVybiAhd2F0Y2hlci5oYXNFcnJvcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbE9iamVjdFtdIF90eXBlZEFycmF5KFhtbE9iamVjdFtdIGlucHV0KQotICAgIHsKLSAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGlucHV0OwotICAgICAgICBTY2hlbWFUeXBlIGNvbW1vblR5cGUgPSBpbnB1dFswXS5zY2hlbWFUeXBlKCk7Ci0gICAgICAgIGlmIChjb21tb25UeXBlLmVxdWFscyhYbWxPYmplY3QudHlwZSkpCi0gICAgICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1vblR5cGUgPSBjb21tb25UeXBlLmdldENvbW1vbkJhc2VUeXBlKGlucHV0W2ldLnNjaGVtYVR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAoY29tbW9uVHlwZS5lcXVhbHMoWG1sT2JqZWN0LnR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyBkZXNpcmVkQ2xhc3MgPSBjb21tb25UeXBlLmdldEphdmFDbGFzcygpOwotICAgICAgICB3aGlsZSAoZGVzaXJlZENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1vblR5cGUgPSBjb21tb25UeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoWG1sT2JqZWN0LnR5cGUuZXF1YWxzKGNvbW1vblR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKLSAgICAgICAgICAgIGRlc2lyZWRDbGFzcyA9IGNvbW1vblR5cGUuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3RbXSByZXN1bHQgPSAoWG1sT2JqZWN0W10pQXJyYXkubmV3SW5zdGFuY2UoZGVzaXJlZENsYXNzLCBpbnB1dC5sZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGlucHV0LCAwLCByZXN1bHQsIDAsIGlucHV0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICByZXR1cm4gc2VsZWN0UGF0aCggcGF0aCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3RbXSBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBYbWxPYmplY3QgW10gc2VsZWN0aW9uczsKLQotICAgICAgICAvLyBhbGwgdXNlci1sZXZlbCBjb2RlOyBkb2Vzbid0IG5lZWQgdG8gYmUgc3luY2hyb25pemVkCi0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBuZXdDdXJzb3IoKTsKLQotICAgICAgICBpZiAoYyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuc2VsZWN0UGF0aCggcGF0aCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBpZiAoIWMuaGFzTmV4dFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMgPSBuZXcgWG1sT2JqZWN0WyAwIF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9ucyA9IG5ldyBYbWxPYmplY3QgWyBjLmdldFNlbGVjdGlvbkNvdW50KCkgXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgYy50b05leHRTZWxlY3Rpb24oKSA7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0aW9uc1sgaSBdID0gYy5nZXRPYmplY3QoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGggbXVzdCBzZWxlY3Qgb25seSBlbGVtZW50cyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgYXR0cmlidXRlcyIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF90eXBlZEFycmF5KHNlbGVjdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3RbXSBleGVjUXVlcnkgKCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICByZXR1cm4gZXhlY1F1ZXJ5KCBwYXRoLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlIHR5cGVTdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgICAgICBpZiAodHlwZVN0b3JlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRvIFhRdWVyeSBvbiBYTUwgVmFsdWUgT2JqZWN0cyIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF90eXBlZEFycmF5KHR5cGVTdG9yZS5leGVjX3F1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgdHlwZSAobnVsbCkiICk7Ci0KLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJYTUwgVmFsdWUgT2JqZWN0cyBjYW5ub3QgaGF2ZSB0aGllciB0eXBlIGNoYW5nZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfb3JwaGFuZWQoKTsKLSAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBnZXRfc3RvcmUoKS5jaGFuZ2VfdHlwZSggdHlwZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX2ZsYWdzOwotICAgIHByaXZhdGUgT2JqZWN0IF90ZXh0c291cmNlOwotCi0gICAgcHJvdGVjdGVkIFhtbE9iamVjdEJhc2UoKQotICAgIHsKLSAgICAgICAgX2ZsYWdzID0gRkxBR19OSUxMQUJMRSB8IEZMQUdfTklMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRfZmxhZ3MoU2NoZW1hUHJvcGVydHkgcHJvcCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpIHJldHVybjsKLQotICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUgfHwKLSAgICAgICAgICAgIHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIF9mbGFncyB8PQotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCkgfAotICAgICAgICAgICAgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuTklMTEFCTEUpIHwKLSAgICAgICAgICAgIChGTEFHX05PVF9WQVJJQUJMRSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBhc3NlcnQgVHlwZVN0b3JlLk5JTExBQkxFICAgPT0gMTsKLSAgICAgICAgYXNzZXJ0IFR5cGVTdG9yZS5IQVNERUZBVUxUID09IDI7Ci0gICAgICAgIGFzc2VydCBUeXBlU3RvcmUuRklYRUQgICAgICA9PSA0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX05JTExBQkxFICAgICAgICA9IFR5cGVTdG9yZS5OSUxMQUJMRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNERUZBVUxUICAgICAgPSBUeXBlU3RvcmUuSEFTREVGQVVMVDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSVhFRCAgICAgICAgICAgPSBUeXBlU3RvcmUuRklYRUQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVRUUklCVVRFICAgICAgID0gICAgIDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1RPUkUgICAgICAgICAgID0gICAgMTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVkFMVUVfREFURUQgICAgID0gICAgMzI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMICAgICAgICAgICAgID0gICAgNjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMX0RBVEVEICAgICAgID0gICAxMjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSVNERUZBVUxUICAgICAgID0gICAyNTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRUxFTUVOVF9EQVRFRCAgID0gICA1MTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0VUVElOR0RFRkFVTFQgID0gIDEwMjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JQSEFORUQgICAgICAgID0gIDIwNDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU1NVVRBQkxFICAgICAgID0gIDQwOTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUExFWFRZUEUgICAgID0gIDgxOTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUExFWENPTlRFTlQgID0gMTYzODQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTk9UX1ZBUklBQkxFICAgID0gMzI3Njg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVkFMSURBVEVfT05fU0VUID0gNjU1MzY7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSB0aHJlZSBkYXRlZCBmbGFncyBhcmUgYWx3YXlzIHN0YWNrZWQ6Ci0gICAgICogICAgIEZMQUdfRUxFTUVOVF9EQVRFRCBpbXBsaWVzIEZMQUdfTklMX0RBVEVEIGlzIHNldAotICAgICAqICAgICBGTEFHX05JTF9EQVRFRCBpbXBsaWVzIEZMQUdfVEVYVF9EQVRFRCBpcyBzZXQuCi0gICAgICogY2hlY2tlcnMgd29yayBvbiB0aGUgZmxhZ3MgZnJvbSB0b3AgdG8gYm90dG9tLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHU19EQVRFRCA9Ci0gICAgICAgICAgICBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQgfCBGTEFHX0VMRU1FTlRfREFURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGhyZWUgZWxlbWVudCBzdGF0dXMgZmxhZ3MgaGF2ZSBvbmUgaW50ZXJybGF0aW9uc2hpb3A6Ci0gICAgICogICAgIEZMQUdfRklYRUQgaW1wbGllcyBGTEFHX0hBU0RFRkFVTFQgaXMgc2V0LgotICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gc2V0dGluZyBuaWxzLCBkZWZhdWx0cywgc3RyaW5ncy4KLSAgICAgKiBTaW5jZSBhbiBpbml0aWFsIGdldCBpbXBsaWVzIHNldHRpbmcgZnJvbSB0ZXh0LCB0aGV5J3JlCi0gICAgICogYWxzbyB1c2VkIGR1cmluZyBnZXR0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHU19FTEVNRU5UID0KLSAgICAgICAgICAgIEZMQUdfTklMTEFCTEUgfCBGTEFHX0ZJWEVEIHwgRkxBR19IQVNERUZBVUxUOwotCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgcmVzdHJpY3Rpb24gc3ViY2xhc3NlcyB3aXRoaW4gdGhlaXIgY29uc3RydWN0b3JzIHRvIGVuYWJsZQotICAgICAqIGNvbXBsZXggdHlwZSBzdXBwb3J0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wbGV4VHlwZShib29sZWFuIGNvbXBsZXhUeXBlLCBib29sZWFuIGNvbXBsZXhDb250ZW50KQotICAgIHsKLSAgICAgICAgX2ZsYWdzIHw9IChjb21wbGV4VHlwZSA/IEZMQUdfQ09NUExFWFRZUEUgOiAwKSB8Ci0gICAgICAgICAgICAgICAgICAoY29tcGxleENvbnRlbnQgPyBGTEFHX0NPTVBMRVhDT05URU5UIDogMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2lzQ29tcGxleFR5cGUoKQotICAgICAgICB7IHJldHVybiAoX2ZsYWdzICYgRkxBR19DT01QTEVYVFlQRSkgIT0gMDsgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2lzQ29tcGxleENvbnRlbnQoKQotICAgICAgICB7IHJldHVybiAoX2ZsYWdzICYgRkxBR19DT01QTEVYQ09OVEVOVCkgIT0gMDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVPblNldCgpIHsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMSURBVEVfT05fU0VUOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIF92YWxpZGF0ZU9uU2V0KCkKLSAgICAgICAgeyByZXR1cm4gKF9mbGFncyAmIEZMQUdfVkFMSURBVEVfT05fU0VUKSAhPSAwOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBuaWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOaWwoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gKChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBmaXhlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpeGVkKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLSAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19GSVhFRCkgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYWxsb3dlZCB0byBiZSBuaWwuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiAoKF9mbGFncyAmIEZMQUdfTklMTEFCTEUpICE9IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGN1cnJlbnRseSBkZWZhdWx0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0YWJsZSgpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiAoKF9mbGFncyAmIEZMQUdfSEFTREVGQVVMVCkgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgY3VycmVudGx5IGRlZmF1bHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHQoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19JU0RFRkFVTFQpICE9IDApOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTmlscyB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TmlsKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSdyZSBub3QgbmlsbGFibGUsIHRocm93IGV4Y2VwdGlvbiBvbiBzZXROaWwodHJ1ZSkKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OSUxMQUJMRSkgPT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICAvLyB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHplcm8gdGhlIHZhbHVlIHRvIHJlZmxlY3QgbmlsCi0gICAgICAgICAgICBzZXRfbmlsKCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgbmlsIGZsYWcKLSAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX05JTDsKLQotICAgICAgICAgICAgLy8gb3JkaW5hcnkgY29tbWl0IGV4Y2VwdCBubyBjbGVhcmluZyBvZiBuaWwgZmxhZwotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR1NfREFURUQ7Ci0gICAgICAgICAgICAgICAgZ2V0X3N0b3JlKCkuaW52YWxpZGF0ZV9uaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdGV4dHNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciBzaXR1YXRpb25zIHdoZXJlIHRoZXNlIGZsYWdzIG11c3QgYmUgcGFzc2VkIG9uIHRvCi0gICAgICogY2hhaW5lZCB2YWx1ZXMuIChTZWUgWG1sQW55U2ltcGxlVHlwZSAoYWxsU2ltcGxlVmFsdWUpLCB1bmlvbgotICAgICAqIGltcGxlbWVudGF0aW9ucykuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBlbGVtZW50RmxhZ3MoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOwotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdTX0VMRU1FTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gbWFrZSBhIGZyZWUtc3RhbmRpbmcgeG1sIHNpbXBsZSB2YWx1ZSBpbnN0YW5jZSBpbW11dGFibGUuCi0gICAgICogVGhpcyBpcyBhIG9uZS13YXkgc3RyZWV0LCBhbmQgaXQgaXMgaWxsZWdhbCB0byBhdHRlbXB0IHRvIG1ha2UgYQotICAgICAqIHZhbHVlIHRoYXQgaXMgZW1iZWRkZWQgaW4gYW4geG1sIGRvY3VtZW50IGltbXV0YWJsZS4KLSAgICAgKgotICAgICAqIE9uY2UgYSB2YWx1ZSBpcyBtYXJrZWQgYXMgaW1tdXRhYmxlLCBpdCBpcyBpbGxlZ2FsIHRvIGNhbGwgc2V0dGVycwotICAgICAqIG9mIGFueSBraW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltbXV0YWJsZSgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIChGTEFHX0lNTVVUQUJMRSB8IEZMQUdfU1RPUkUpKSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIF9mbGFncyB8PSBGTEFHX0lNTVVUQUJMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIGluc3RhbmNlIGFuIGltbXV0YWJsZSB2YWx1ZT8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwOwotICAgIH0KLQotCi0KLQotICAgIC8vIFRFWFRVU0VSIGltcGxlbWVudGF0aW9uCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgVHlwZVN0b3JlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFhtbE9iamVjdAotICAgICAqIGltcGxlbWVudGF0aW9uLiBJZiBub3QgY2FsbGVkLCB0aGlzIGlzIGEgZnJlZS1mbG9hdGluZyB2YWx1ZSBob2xkZXIuCi0gICAgICoKLSAgICAgKiBXaGVuIGEgdmFsdWUgaXMgZmlyc3QgYXR0YWNoZWQsIGl0IGlzIHB1dCBpbiBhIGNvbXBsZXRlbHkgaW52YWxpZGF0ZWQKLSAgICAgKiBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhdHRhY2hfc3RvcmUoVHlwZVN0b3JlIHN0b3JlKQotICAgIHsKLSAgICAgICAgX3RleHRzb3VyY2UgPSBzdG9yZTsKLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0lNTVVUQUJMRSkgIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfU1RPUkUgfCBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQgfCBGTEFHX0VMRU1FTlRfREFURUQ7Ci0KLSAgICAgICAgaWYgKHN0b3JlLmlzX2F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfQVRUUklCVVRFOwotCi0gICAgICAgIGlmIChzdG9yZS52YWxpZGF0ZV9vbl9zZXQoKSkKLSAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX1ZBTElEQVRFX09OX1NFVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGV4dCBoYXMgYmVlbgotICAgICAqIGludmFsaWRhdGVkIGFuZCBzaG91bGQgYmUgZmV0Y2hlZCBuZXh0IHRpbWUgdGhlIHZhbHVlIGlzCi0gICAgICogbmVlZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludmFsaWRhdGVfdmFsdWUoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gdXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IHNjaGVtYVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGUuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGEgVHlwZVN0b3JlIHRvIGluZGljYXRlIHRoYXQgdGhlIHhzaTpuaWwgYXR0cmlidXRlCi0gICAgICogb24gdGhlIGNvbnRhaW5pbmcgZWxlbWVudCAoYW5kIHBvc3NpYmx5IHRoZSB0ZXh0KSBoYXMgYmVlbgotICAgICAqIGludmFsaWRhdGVkIGFuZCBib3RoIHNob3VsZCBiZSBjb25zdWx0ZWQgbmV4dCB0aW1lIHRoZSB2YWx1ZQotICAgICAqIGlzIG5lZWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZhbGlkYXRlX25pbHZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIF9mbGFncyB8PSBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGEgVHlwZVN0b3JlIHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQncyBkZWZhdWx0Ci0gICAgICogdmFsdWUsIG5pbGxhYmlsaXR5LCBmaXhlZG5lc3MsIGV0YywgbWF5IGhhdmUgY2hhbmdlZCBieQotICAgICAqIHZpcnR1ZSBvZiB0aGUgZWxlbWVudCBvcmRlciBjaGFuZ2luZyAoYW5kIHhzaTpuaWwgYW5kIHRoZQotICAgICAqIHRleHQgbWF5IGhhdmUgY2hhbmdlZCB0b28pOyBzbyB0aGUgc3RvcmUgc2hvdWxkIGJlIGNvbnN1bHRlZAotICAgICAqIG5leHQgdGltZSBhbnkgc2V0dGVyIG9yIGdldHRlciBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIF9mbGFncyB8PSBGTEFHX1ZBTFVFX0RBVEVEIHwgRkxBR19OSUxfREFURUQgfCBGTEFHX0VMRU1FTlRfREFURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCBieSB0aGUgQ29tcGxleFR5cGVJbXBsIHN1YmNsYXNzIHRvIGdldCBkaXJlY3QgYWNjZXNzCi0gICAgICogdG8gdGhlIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBUeXBlU3RvcmUgZ2V0X3N0b3JlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIHJldHVybiAoVHlwZVN0b3JlKV90ZXh0c291cmNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc19zdG9yZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGEgVHlwZVN0b3JlIHRvIHB1bGwgb3V0IHRoZSBtb3N0IHJlYXNvbmFibGUKLSAgICAgKiB0ZXh0IHZhbHVlIGZyb20gdXMuIFRoaXMgaXMgZG9uZSBhZnRlciB3ZSBoYXZlIGludmFsaWRhdGVkCi0gICAgICogdGhlIHN0b3JlICh0eXBpY2FsbHkgd2hlbiBvdXIgdmFsdWUgaGFzIGJlZW4gc2V0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGJ1aWxkX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfVkFMVUVfREFURUQpID09IDApOwotICAgICAgICBpZiAoKF9mbGFncyAmIChGTEFHX05JTCB8IEZMQUdfSVNERUZBVUxUKSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVfdGV4dCgKLSAgICAgICAgICAgICAgICAgICAgbnNtID09IG51bGwgPyBoYXNfc3RvcmUoKSA/IGdldF9zdG9yZSgpIDogbnVsbCA6IG5zbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBidWlsZF9uaWwgYWZ0ZXIgd2UndmUgY2FsbGVkIGludmFsaWRhdGVfbmlsCi0gICAgICogYW5kIGl0IG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgbmlsIHZhbHVlIGlzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGJ1aWxkX25pbCgpCi0gICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfVkFMVUVfREFURUQpID09IDApOwotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gdmFsaWRhdGVfbm93IHRvIGZvcmNlIHVzIHRvIGxvb2sgYXQKLSAgICAgKiB0aGUgdGV4dCBpZiB3ZSdyZSBpbiBhbiBpbnZhbGlkIHN0YXRlLiBXZSdyZSBhbGxvd2VkIHRvIHRocm93Ci0gICAgICogYW4gZXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGlzbid0IHZhbGlkIGZvciBvdXIgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZV9ub3coKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIGNhbGxzIGJhY2sgaGVyZSBpbiBvcmRlciB0byBmb3JjZSBhIGRpc2Nvbm5lY3QuCi0gICAgICogQWZ0ZXIgdGhpcyBpcyBkb25lLCB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGludmFsaWQuCi0gICAgICogQW55IGF0dGVtcHQgdG8gYWNjZXNzIG9yIHNldCBhIHZhbHVlIHNob3VsZCByZXN1bHQgaW4gYW4KLSAgICAgKiBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBob3cgd2UgaGFuZGxlIGRlbGV0aW9ucyBhbmQgeHNpOnR5cGUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0X3N0b3JlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIF9mbGFncyB8PSBGTEFHU19EQVRFRCB8IEZMQUdfT1JQSEFORUQ7Ci0gICAgICAgIC8vIGRvIE5PVCBudWxsIG91dCBfdGV4dHNvdXJjZSwgYmVjYXVzZSB3ZSBuZWVkIGl0IG5vbi1udWxsIGZvciBzeW5jaHJvbml6YXRpb24KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKLSAgICAgKiBhIGdpdmVuIGVsZW1lbnQgY2hpbGQgbmFtZSBhcyBsb25nIGFzIHlvdSBhbHNvIHBhc3MgdGhlCi0gICAgICogcW5hbWUgY29udGFpbmVkIGJ5IHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUsIGlmIGFueS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSB3aWxsIGlnbm9yZSB0aGUgeHNpVHlwZSBpZiBpdCB0dXJucyBvdXQgdG8gYmUgaW52YWxpZC4KLSAgICAgKgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzdHJvbmdseSB0eXBlZCBpbmZvcm1hdGlvbiBmb3IgdGhhdAotICAgICAqIGdpdmVuIGVsZW1lbnQgKHdoaWNoIGltcGxpZXMsIHJlY3VzaXZlbHksIG5vIHN0cm9uZ2x5IHR5cGVkIGluZm9ybWF0aW9uCi0gICAgICogZG93bndhcmRzKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBjcmVhdGVfZWxlbWVudF91c2VyKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChUeXBlU3RvcmVVc2VyKQotICAgICAgICAgICAgICAgICgoU2NoZW1hVHlwZUltcGwpIHNjaGVtYVR5cGUoKSkuY3JlYXRlRWxlbWVudFR5cGUoCi0gICAgICAgICAgICAgICAgICAgIGVsdE5hbWUsIHhzaVR5cGUsIGdldF9zdG9yZSgpLmdldF9zY2hlbWF0eXBlbG9hZGVyKCkgKTsKLQotICAgICAgICAvKgotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzdHlwZSA9IChTY2hlbWFUeXBlSW1wbClzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFR5cGUoZWx0TmFtZSwgeHNpVHlwZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSk7Ci0gICAgICAgIGlmIChzdHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoVHlwZVN0b3JlVXNlcilzdHlwZS5jcmVhdGVVbmF0dGFjaGVkTm9kZSgpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIGNyZWF0ZSBhIG5ldyBUeXBlU3RvcmVVc2VyIGluc3RhbmNlIGZvcgotICAgICAqIGEgZ2l2ZW4gYXR0cmlidXRlIGNoaWxkLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3Ryb25nbHkgdHlwZWQgaW5mb3JtYXRpb24gZm9yIHRoYXQKLSAgICAgKiBnaXZlbiBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9hdHRyaWJ1dGVfdXNlcihRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVHlwZVN0b3JlVXNlcikoKFNjaGVtYVR5cGVJbXBsKXNjaGVtYVR5cGUoKSkuY3JlYXRlQXR0cmlidXRlVHlwZShhdHRyTmFtZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0X3NjaGVtYV90eXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0X2VsZW1lbnRfdHlwZShRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50VHlwZSgKLSAgICAgICAgICAgIGVsdE5hbWUsIHhzaVR5cGUsIGdldF9zdG9yZSgpLmdldF9zY2hlbWF0eXBlbG9hZGVyKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRfYXR0cmlidXRlX3R5cGUoUU5hbWUgYXR0ck5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldEF0dHJpYnV0ZVR5cGUoCi0gICAgICAgICAgICBhdHRyTmFtZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZWxlbWVudCB0ZXh0LCBpZiBpdCdzIGNvbnNpc3RlbnQuIElmIGl0J3MKLSAgICAgKiBub3QgY29uc2lzdGVudCwgcmV0dXJucyBudWxsLCBhbmQgcmVxdWlyZXMgYSB2aXNpdG9yIHdhbGsuCi0gICAgICoKLSAgICAgKiBBbHNvIHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGF0IGFsbCAoYWx0aG91Z2gKLSAgICAgKiB0aGF0IGNhbiBhbHNvIGJlIGRpc2NvdmVyZWQgdmlhIGdldF9lbGVtZW50ZmxhZ3Mgd2l0aG91dAotICAgICAqIGRvaW5nIGEgd2FsaykuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydChfaXNDb21wbGV4Q29udGVudCgpKTsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4Q29udGVudCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gcHJvcC5nZXREZWZhdWx0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHRleHQgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aAotICAgICAqIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vIGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIGFzc2VydChfaXNDb21wbGV4VHlwZSgpKTsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4VHlwZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0QXR0cmlidXRlUHJvcGVydHkoYXR0ck5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gcHJvcC5nZXREZWZhdWx0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRmbGFncywgaWYgdGhleSdyZSBjb25zaXN0ZW50LiBJZiB0aGV5J3JlCi0gICAgICogbm90LCByZXR1cm5zIC0xLCBhbmQgcmVxdWlyZXMgYSB2aXN0b3Igd2Fsay4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldF9lbGVtZW50ZmxhZ3MoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghX2lzQ29tcGxleENvbnRlbnQoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8Ci0gICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCkgfAotICAgICAgICAgICAgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuTklMTEFCTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0X2F0dHJpYnV0ZWZsYWdzKFFOYW1lIGF0dHJOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4VHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0QXR0cmlidXRlUHJvcGVydHkoYXR0ck5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCk7Ci0gICAgICAgIC8vIEJVR0JVRzogdG9kbzogaG9vayB1cCByZXF1aXJlZD8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIGNoaWxkIGVsZW1lbnRzIGFyZSBpbnNlbnNpdGl2ZSB0byBvcmRlcjsKLSAgICAgKiBpZiBpdCByZXR1cm5zIHRydWUsIHlvdSdyZSByZXF1aXJlZCB0byBjYWxsIGludmFsaWRhdGVfZWxlbWVudF9vcmRlcgotICAgICAqIG9uIGNoaWxkcmVuIHRvIHRoZSByaWdodCBvZiBhbnkgY2hpbGQgb3JkZXIgcmVhcnJhbmdlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpCi0gICAgewotICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuaXNPcmRlclNlbnNpdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydGluZyBhIG5ldyBlbGVtZW50IGlzIGFsd2F5cyB1bmFtYmlndW91cyBleGNlcHQgaW4gb25lCi0gICAgICogc2l0dWF0aW9uOiB3aGVuIGFkZGluZyBhbiBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IG9uZSB3aXRoCi0gICAgICogdGhhdCBuYW1lIChvciB0aGUgZmlyc3Qgb25lIGlmIHRoZXJlIGFyZSBub25lKS4KLSAgICAgKgotICAgICAqIEluIHRoYXQgY2FzZSwgYWRkIHRoZSBlbGVtZW50IGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBzbG90Ci0gICAgICogQkVGT1JFIGFueSBlbGVtZW50IHdob3NlIHFuYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGUgUU5hbWVTZXQKLSAgICAgKiBnaXZlbi4gKElmIHRoZSBRTmFtZVNldCBpcyBlbXB0eSwgdGhhdCBtZWFucyBhZGQgdGhlIG5ldwotICAgICAqIGVsZW1lbnQgYXQgdGhlIHZlcnkgZW5kLikKLSAgICAgKgotICAgICAqIElmIHRoZSByZXR1cm5lZCBRTmFtZVNldCBpcyBudWxsLCB0cmVhdCBpdCBhcyBpZiB0aGUgUU5hbWVTZXQKLSAgICAgKiBjb250YWluZWQgYWxsIFFOYW1lcywgaS5lLiwgYWRkIHRoZSBuZXcgZWxlbWVudCBhdCB0aGUgdmVyeQotICAgICAqIGZpcnN0IHBvc2l0aW9uIHBvc3NpYmxlIChhZGphY2VudCB0byB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQotICAgICAqIHNhbWUgbmFtZSwgb3IgYXQgdGhlIHZlcnkgZmlyc3Qgc2xvdCBpZiBpdCBpcyB0aGUgZmlyc3QgZWx0Ci0gICAgICogd2l0aCB0aGF0IG5hbWUpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBRTmFtZVNldCBnZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyhRTmFtZSBlbHRuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50UHJvcGVydHkoZWx0bmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHByb3AuZ2V0SmF2YVNldHRlckRlbGltaXRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIHJldHVybiBhIHZpc2l0b3IgdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUKLSAgICAgKiBkZWZhdWx0IHRleHQgYW5kIGVsZW1lbnRmbGFncyBmb3IgYW4gYXJiaXRyYXJ5IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKHNjaGVtYVR5cGUoKS5nZXRDb250ZW50TW9kZWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUZpZWxkIGdldF9hdHRyaWJ1dGVfZmllbGQoUU5hbWUgYXR0ck5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBtb2RlbCA9IHNjaGVtYVR5cGUoKS5nZXRBdHRyaWJ1dGVNb2RlbCgpOwotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHRpbmcgYSBzdHJpbmcgcHJlc2VydmVzIGFueSBub25jYW5vbmljYWwgbGl0ZXJhbAotICAgICAqIHJlcHJlc2VudGF0aW9uLiBUaGlzIGlzIGRvbmUgYnkgc3RvcmluZyB0aGUgYWN0dWFsCi0gICAgICogc3RyaW5nIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JlIGFmdGVyIGNoZWNraW5nIGl0Ci0gICAgICogYWdhaW5zdCB0aGUgcHJpbWl0aXZlIHR5cGUgZm9yIHZhbGlkaXR5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9TdHJpbmcoU3RyaW5nIHYpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIGJvb2xlYW4gd2FzTmlsbGVkID0gKChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGZyb20gdGhlIHN0cmluZwotICAgICAgICBTdHJpbmcgd3NjYW5vbiA9IGFwcGx5X3dzY2Fub24odik7Ci0gICAgICAgIHVwZGF0ZV9mcm9tX3dzY2Fub25fdGV4dCh3c2Nhbm9uKTsKLQotICAgICAgICAvLyBOb3cgc3RvcmUgdGhlIGxpdGVyYWwgdGV4dCBpbW1lZGlhdGVseSBpbiB0aGUgdW5kZXJseWluZwotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19WQUxVRV9EQVRFRDsKLSAgICAgICAgICAgIGdldF9zdG9yZSgpLnN0b3JlX3RleHQodik7Ci0gICAgICAgICAgICBpZiAod2FzTmlsbGVkKQotICAgICAgICAgICAgICAgIGdldF9zdG9yZSgpLmludmFsaWRhdGVfbmlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3RleHRzb3VyY2UgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgdmFsdWUgYmFzZWQgb24gY29tcGxleCBjb250ZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZV9mcm9tX2NvbXBsZXhfY29udGVudCgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSB0byB1cGRhdGUgdGhlIHZhbHVlIGJhc2VkIG9uIGEgc3RyaW5nIHRoYXQKLSAgICAgKiB3YXMgcGFzc2VkIGVpdGhlciBmcm9tIHRoZSB0ZXh0IHN0b3JlIG9yIGZyb20gdGhlIHVzZXIuCi0gICAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjYXNlcyB3aGVyZSB0aGVyZSBpcyBhIGRlZmF1bHQKLSAgICAgKiB0aGF0IG11c3QgYmUgYXBwbGllZCwgYW5kIHdoZXJlIHRoZSB2YWx1ZSBtdXN0IG1hdGNoCi0gICAgICogYSBmaXhlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgdXBkYXRlX2Zyb21fd3NjYW5vbl90ZXh0KFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgLy8gV2hpdGVzcGFjZSBpcyBkZWZhdWx0IGlmIHRoaXMgdHlwZSB0cmVhdHMgdGhpcyBzcGFjZSBhcyBkZWZhdWx0YWJsZQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSEFTREVGQVVMVCkgIT0gMCAmJiAgKF9mbGFncyAmIEZMQUdfU0VUVElOR0RFRkFVTFQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgcXVpdGUgY29ycmVjdCBzaW5jZSB0aGUgLmVxdWFscygiIikgdGVzdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRvbmUgb24gdGhlIGFjdHVhbCB0ZXh0LCBub3QgdGhlIHdzY2Fub24gdGV4dAotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FUVFJJQlVURSkgPT0gMCAmJiB2LmVxdWFscygiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlZiA9IGdldF9zdG9yZSgpLmNvbXB1dGVfZGVmYXVsdF90ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaW9uIHdpdGggdGhpcyBmbGFnCi0gICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfU0VUVElOR0RFRkFVTFQ7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgdGhpcy5zZXQoZGVmKTsgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBfZmxhZ3MgJj0gfkZMQUdfU0VUVElOR0RFRkFVTFQ7IH0KLSAgICAgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfTklMOwotICAgICAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0lTREVGQVVMVDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCByZXR1cm5lZCB5ZXQsIHRoZSBkZWZhdWx0IGRvZXNuJ3QgYXBwbHkuCi0KLSAgICAgICAgLy8gQXNrIHVuZGVybHlpbmcgaW1wbCB0byBwYXJzZSBvcmRpbmFyeSBub24tZGVmYXVsdCB0ZXh0Ci0gICAgICAgIHNldF90ZXh0KHYpOwotICAgICAgICBfZmxhZ3MgJj0gfihGTEFHX05JTCB8IEZMQUdfSVNERUZBVUxUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlcyBzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHRoZXkgZG9uJ3QgdHJlYXQgdGhlIGdpdmVuCi0gICAgICogd2hpdGVzcGFjZSBhcyBhIGRlZmF1bHQgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aGl0ZXNwYWNlIHJ1bGUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlCi0gICAgICogYnVpbGRpbmcgYSBzdHJpbmcgdG8gcGFzcyB0byBnZXRfdGV4dCgpLgotICAgICAqCi0gICAgICogT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgbmVlZCB0aGVpciB0ZXh0Ci0gICAgICogZm9yIHNldF90ZXh0IGNhbm9uaWNhbGl6ZWQ7IHBlcmhhcHMgdGhleSBhbHJlYWR5IGltcGxlbWVudAotICAgICAqIHNjYW5uZXJzIHRoYXQgY2FuIGRlYWwgd2l0aCB3aGl0ZXNwYWNlLCBhbmQgdGhleSBrbm93Ci0gICAgICogdGhleSBoYXZlIG5vIHJlZ2V4IHBhdHRlcm4gcmVzdHJpY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY2Fub25pY2FsaXplIHdoaXRlc3BhY2UgYmVmb3JlIGNhbGxpbmcgc2V0X3RleHQuCi0gICAgICoKLSAgICAgKiBUcmllcyB0byBhdm9pZCBhbGxvY2F0aW9uIHdoZW4gdGhlIHN0cmluZyBpcyBhbHJlYWR5IGNhbm9uaWNhbCwgYnV0Ci0gICAgICogb3RoZXJ3aXNlIHRoaXMgaXMgbm90IHBhcnRpY3VsYXJseSBlZmZpY2llbnQuIEhvcGVmdWxseSB0aGUgY29tbW9uCi0gICAgICogY2FzZSBpcyB0aGF0IHdlIHBhc3Mgb3VyIHdzY2Fub24gcnVsZSB0byB0aGUgc3RvcmUgdmlhIGZldGNoX3RleHQKLSAgICAgKiBhbmQgaXQncyBjYW5vbmljYWxpemVkIGJlZm9yZSB3ZSBldmVuIHNlZSBpdCBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcHBseV93c2Nhbm9uKFN0cmluZyB2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFhtbFdoaXRlc3BhY2UuY29sbGFwc2UodiwgZ2V0X3dzY2Fub25fcnVsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IHNldCBhbmQgZ2V0LCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlCi0gICAgICogYSBjb3JyZWN0IHBpY3R1cmUgb2Ygd2hldGhlciB3ZSdyZSBuaWxsYWJsZSwgZml4ZWQsIG9yCi0gICAgICogaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYmUgYXBwbGllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2hlY2tfZWxlbWVudF9kYXRlZCgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfRUxFTUVOVF9EQVRFRCkgIT0gMCAmJgotICAgICAgICAgICAgKF9mbGFncyAmIEZMQUdfTk9UX1ZBUklBQkxFKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIGludCBlbHRmbGFncyA9IGdldF9zdG9yZSgpLmNvbXB1dGVfZmxhZ3MoKTsKLSAgICAgICAgICAgIC8vIGludCBlbHRmbGFncyA9IDA7Ci0gICAgICAgICAgICBfZmxhZ3MgJj0gfihGTEFHU19FTEVNRU5UIHwgRkxBR19FTEVNRU5UX0RBVEVEKTsKLSAgICAgICAgICAgIF9mbGFncyB8PSBlbHRmbGFnczsKLSAgICAgICAgfQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfTk9UX1ZBUklBQkxFKSAhPSAwKQotICAgICAgICAgICAgX2ZsYWdzICY9IH4oRkxBR19FTEVNRU5UX0RBVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgdGhlIG9ycGhhbmVkIHN0YXR1cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc19vcnBoYW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBnZXR0ZXIgYW5kIHNldHRlciBvbiB0aGUgc3Ryb25nbHkKLSAgICAgKiB0eXBlZCBjbGFzc2VzIHRvIGVuc3VyZSB0aGF0IHRoZSBvYmplY3QgaGFzIG5vdCBiZWVuCi0gICAgICogb3JwaGFuZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tfb3JwaGFuZWQoKQotICAgIHsKLSAgICAgICAgaWYgKGlzX29ycGhhbmVkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgcHJpb3IgdG8gZXZlcnkgZ2V0IG9wZXJhdGlvbiwgdG8gZW5zdXJlCi0gICAgICogdGhhdCB0aGUgdmFsdWUgYmVpbmcgcmVhZCBpcyB2YWxpZC4gSWYgdGhlIHZhbHVlCi0gICAgICogaGFzIGJlZW4gaW52YWxpZGF0ZWQsIGl0IGlzIHJlLXJlYWQgZnJvbSB0aGUgdW5kZXJseWluZwotICAgICAqIHRleHQgc3RvcmUsIGFuZCB0aGlzIG1heSBjYXVzZSBhbiBvdXQgb2YgcmFuZ2UgZXhjZXB0aW9uLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgZGVhbHMgd2l0aCBuaWxzLCBuaWxsYWJpbGl0eSwgZGVmYXVsdHMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjaGVja19kYXRlZCgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdTX0RBVEVEKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0KLSAgICAgICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLQotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0VMRU1FTlRfREFURUQpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGVsdGZsYWdzID0gZ2V0X3N0b3JlKCkuY29tcHV0ZV9mbGFncygpOwotICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdTX0VMRU1FTlQgfCBGTEFHX0VMRU1FTlRfREFURUQpOwotICAgICAgICAgICAgICAgIF9mbGFncyB8PSBlbHRmbGFnczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBuaWxsZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTF9EQVRFRCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0X3N0b3JlKCkuZmluZF9uaWwoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OSUxMQUJMRSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgLy8gbmlsIG5vdCBhbGxvd2VkCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBpbXBsZW1lbnRhdGlvbiBrbm93IHRoYXQgd2UncmUgbmlsIG5vdwotICAgICAgICAgICAgICAgICAgICBzZXRfbmlsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfTklMOwotICAgICAgICAgICAgICAgICAgICBuaWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfTklMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfTklMX0RBVEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW5pbGxlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDsKLQotICAgICAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19DT01QTEVYQ09OVEVOVCkgIT0gMCB8fCAodGV4dCA9IGdldF93c2Nhbm9uX3RleHQoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2Zyb21fY29tcGxleF9jb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7IHVwZGF0ZV9mcm9tX3dzY2Fub25fdGV4dCh0ZXh0KTsgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1ZBTFVFX0RBVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBzZXQgb3BlcmF0aW9uIChleGNlcHQgZm9yIHRoZQotICAgICAqIHNwZWNpYWwgY2FzZSBvZiBzZXR0aW5nIGEgc3RyaW5nKSB0bzoKLSAgICAgKiAoMSkgZ2V0IHRoZSBuaWxsYWJsZSwgZml4ZWQsIGV0YyBmbGFncwotICAgICAqICgyKSB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQncyBmaXhlZCAobm90IGZvciBzdHJpbmdzKQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBzZXRfcHJlcGFyZSgpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGFmdGVyIGV2ZXJ5IHNldCBvcGVyYXRpb24gdG8gaW52YWxpZGF0ZQotICAgICAqIHRoZSBhdHRhY2hlZCByYXcgdGV4dC4gQWxzbywgaWYgd2Ugd2VyZSBkYXRlZCwKLSAgICAgKiB3ZSBtYWtlIGEgbm90ZSB0aGF0IHdlJ3JlIG5vdyBjdXJyZW50LCBzaW5jZSB0aGUKLSAgICAgKiBsYXRlc3Qgc2V0IGJlYXRzIHRoZSBwcmV2aW91cyBpbnZhbGlkYXRlLiBBbHNvLAotICAgICAqIGlmIHdlIHdlcmUgbmlsLCB3ZSdyZSBubyBsb25nZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldF9jb21taXQoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB3YXNOaWxsZWQgPSAoKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwKTsKLSAgICAgICAgICBfZmxhZ3MgJj0gfihGTEFHX05JTCB8IEZMQUdfSVNERUZBVUxUKTsKLQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdTX0RBVEVEKTsKLSAgICAgICAgICAgIGdldF9zdG9yZSgpLmludmFsaWRhdGVfdGV4dCgpOwotICAgICAgICAgICAgaWYgKHdhc05pbGxlZCkKLSAgICAgICAgICAgICAgICBnZXRfc3RvcmUoKS5pbnZhbGlkYXRlX25pbCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgX3RleHRzb3VyY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3JhYnMgdGhlIHVuZGVseWluZyBsaXRyYWwgcmVwcmVzZW50YXRpb24sIGFwcGx5aW5nIHRoZQotICAgICAqIGltcGxlbWVudGF0aW9uJ3Mgd3NjYW5vbiBydWxlLgotICAgICAqIE51bGwgaWYgbm90IHNpbXBsZSBjb250ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0X3dzY2Fub25fdGV4dCgpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBseV93c2Nhbm9uKChTdHJpbmcpX3RleHRzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgcmV0dXJuIGdldF9zdG9yZSgpLmZldGNoX3RleHQoZ2V0X3dzY2Fub25fcnVsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGZyb20gdGV4dCwKLSAgICAgKiBvciB0aHJvdyBhbiBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gaWYgaXQgY2FuJ3QuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHRleHQpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBzaG91bGQgY2xlYXIgdGhlIHZhbHVlLCBhbmQgc2V0IGl0IHRvIHdoYXRldmVyCi0gICAgICogaXMgc3VwcG9zZWQgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgdmFsdWUgaXMgbmlsbGVkLgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgc2hvdWxkIHJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLgotICAgICAqIE9ubHkgY2FsbGVkIHdoZW4gbm9uLW5pbC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSk7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCi0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQotICAgICAgICB7IEJpZ0RlY2ltYWwgYmQgPSBiaWdEZWNpbWFsVmFsdWUoKTsgcmV0dXJuIGJkID09IG51bGwgPyAwLjBmIDogYmQuZmxvYXRWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0gICAgICAgIHsgQmlnRGVjaW1hbCBiZCA9IGJpZ0RlY2ltYWxWYWx1ZSgpOyByZXR1cm4gYmQgPT0gbnVsbCA/IDAuMCA6IGJkLmRvdWJsZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgLy8gbnVtZXJpY3M6IGludGVncmFsCi0gICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkKLSAgICAgICAgeyBCaWdEZWNpbWFsIGJkID0gYmlnRGVjaW1hbFZhbHVlKCk7IHJldHVybiBiZCA9PSBudWxsID8gbnVsbCA6IGJkLnRvQmlnSW50ZWdlcigpOyB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgbG9uZyBsID0gaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKGwgPiBCeXRlLk1BWF9WQUxVRSkgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICBpZiAobCA8IEJ5dGUuTUlOX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoYnl0ZSlsOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgbCA9IGludFZhbHVlKCk7Ci0gICAgICAgIGlmIChsID4gU2hvcnQuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChsIDwgU2hvcnQuTUlOX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoc2hvcnQpbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgbCA9IGxvbmdWYWx1ZSgpOwotICAgICAgICBpZiAobCA+IEludGVnZXIuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChsIDwgSW50ZWdlci5NSU5fVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChpbnQpbDsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWF4ID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9taW4gPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpOwotCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIEJpZ0ludGVnZXIgYiA9IGJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gMEw7Ci0gICAgICAgIGlmIChiLmNvbXBhcmVUbyhfbWF4KSA+PSAwKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChiLmNvbXBhcmVUbyhfbWluKSA8PSAwKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBiLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGlvbnMgX3RvU3RyaW5nT3B0aW9ucyA9Ci0gICAgICAgIGJ1aWxkSW5uZXJQcmV0dHlPcHRpb25zKCk7Ci0KLSAgICBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBidWlsZElubmVyUHJldHR5T3B0aW9ucygpCi0gICAgewotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX0lOTkVSICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfQUdHUkVTU0lWRV9OQU1FU1BBQ0VTICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIC8qCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkdW1wU3RhY2sgKCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSggIkM6XFxlZS50eHQiLCB0cnVlICk7Ci0gICAgICAgICAgICBqYXZhLmlvLlByaW50U3RyZWFtIHBzID0gbmV3IGphdmEuaW8uUHJpbnRTdHJlYW0oIGZvcyApOwotICAgICAgICAgICAgcHMucHJpbnRsbiggIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiApOwotICAgICAgICAgICAgcHMucHJpbnRsbiggbXNnICk7Ci0gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCBwcyApOwotICAgICAgICAgICAgcHMuY2xvc2UoKTsKLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlbnN1cmVTdG9yZSgpLnhtbFRleHQoX3RvU3RyaW5nT3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhtbFRleHQobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0IChYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGN1ci54bWxUZXh0KG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVudW1zCi0gICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLQotICAgIC8vIHZhcmlvdXMKLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIC8vIFNpbmNlIGNvbXBsZXgtY29udGVudCB0eXBlcyBkb24ndCBoYXZlIGEgIm5hdHVyYWwiIHN0cmluZyB2YWx1ZSwgd2UKLSAgICAgICAgLy8gZW1pdCB0aGUgZGVlcGx5IGNvbmNhdGVuYXRlZCwgdGFnLXJlbW92ZWQgY29udGVudCBvZiB0aGUgdGFnLgotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9pc0NvbXBsZXhDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldF9zdG9yZSgpLmZldGNoX3RleHQoVHlwZVN0b3JlLldTX1BSRVNFUlZFKTsKLQotICAgICAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OSUwpICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gY29tcHV0ZV90ZXh0KGhhc19zdG9yZSgpID8gZ2V0X3N0b3JlKCkgOiBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKQotICAgICAgICB7IHJldHVybiBzdHJpbmdWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gYm9vbGVhblZhbHVlKCk7IH0KLSAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlVmFsdWUoKQotICAgICAgICB7IHJldHVybiBieXRlVmFsdWUoKTsgfQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gc2hvcnRWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGludFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKQotICAgICAgICB7IHJldHVybiBsb25nVmFsdWUoKTsgfQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGJpZ0ludGVnZXJWYWx1ZSgpOyB9Ci0gICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gYmlnRGVjaW1hbFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGZsb2F0VmFsdWUoKTsgfQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKQotICAgICAgICB7IHJldHVybiBkb3VibGVWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlQXJyYXlWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGJ5dGVBcnJheVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBnZXRFbnVtVmFsdWUoKQotICAgICAgICB7IHJldHVybiBlbnVtVmFsdWUoKTsgfQotICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gY2FsZW5kYXJWYWx1ZSgpOyB9Ci0gICAgcHVibGljIERhdGUgZ2V0RGF0ZVZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gZGF0ZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGdEYXRlVmFsdWUoKTsgfQotICAgIHB1YmxpYyBHRHVyYXRpb24gZ2V0R0R1cmF0aW9uVmFsdWUoKQotICAgICAgICB7IHJldHVybiBnRHVyYXRpb25WYWx1ZSgpOyB9Ci0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lVmFsdWUoKQotICAgICAgICB7IHJldHVybiBxTmFtZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgTGlzdCB4Z2V0TGlzdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4geGxpc3RWYWx1ZSgpOyB9Ci0gICAgcHVibGljIExpc3QgZ2V0TGlzdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gbGlzdFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gb2JqZWN0VmFsdWUoKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsVmFsdWUoQmlnRGVjaW1hbCBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKGZsb2F0IHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpCi0gICAgICAgIHsgc2V0KHYpOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0Qnl0ZUFycmF5VmFsdWUoYnl0ZVtdIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEVudW1WYWx1ZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShPYmplY3Qgb2JqKQotICAgICAgICB7IG9iamVjdFNldChvYmopOyB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBHRGF0ZSBnRGF0ZVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgRGF0ZSBkYXRlVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgT2JqZWN0IG9iamVjdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gamF2YV92YWx1ZSh0aGlzKTsgfQotCi0gICAgLy8gc2V0IHRoaXMgdmFsdWUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoYm9vbGVhbiB2KQotICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9ib29sZWFuKHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChieXRlIHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2J5dGUodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KHNob3J0IHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X3Nob3J0KHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChpbnQgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfaW50KHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChsb25nIHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2xvbmcodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGZsb2F0IHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2Zsb2F0KHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChkb3VibGUgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfZG91YmxlKHYpOyBzZXRfY29tbWl0KCk7IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChieXRlW10gb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfQnl0ZUFycmF5KG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9lbnVtKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoQmlnSW50ZWdlciBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9CaWdJbnRlZ2VyKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9CaWdEZWNpbWFsKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoQ2FsZW5kYXIgb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfQ2FsZW5kYXIob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChEYXRlIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0RhdGUob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfR0RhdGUob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0dEdXJhdGlvbihvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KFFOYW1lIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X1FOYW1lKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoTGlzdCBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9saXN0KG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoU3RyaW5nIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X1N0cmluZyhvYmopOyAvKiBzdHJpbmdzIGFyZSBzcGVjaWFsLCBzbyBzZXRfU3RyaW5nIGRvZXMgaXRzIG93biBjb21taXQuKi8gfSB9IH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdFNldChPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmIChvID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldE5pbCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxPYmplY3QpCi0gICAgICAgICAgICBzZXQoIChYbWxPYmplY3QpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHNldCggKFN0cmluZykgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nRW51bUFic3RyYWN0QmFzZSkKLSAgICAgICAgICAgIHNldCggKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpCi0gICAgICAgICAgICBzZXQoIChCaWdJbnRlZ2VyKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCaWdEZWNpbWFsKQotICAgICAgICAgICAgc2V0KCAoQmlnRGVjaW1hbCkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQnl0ZSkKLSAgICAgICAgICAgIHNldCggKChCeXRlKW8pLmJ5dGVWYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTaG9ydCkKLSAgICAgICAgICAgIHNldCggKChTaG9ydClvKS5zaG9ydFZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICBzZXQoICgoSW50ZWdlcilvKS5pbnRWYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgc2V0KCAoKExvbmcpbykubG9uZ1ZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICAgICAgICBzZXQoICgoQm9vbGVhbilvKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgRmxvYXQpCi0gICAgICAgICAgICBzZXQoICgoRmxvYXQpbykuZmxvYXRWYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICBzZXQoICgoRG91YmxlKW8pLmRvdWJsZVZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIENhbGVuZGFyKQotICAgICAgICAgICAgc2V0KCAoKENhbGVuZGFyKW8pICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBEYXRlKQotICAgICAgICAgICAgc2V0KCAoRGF0ZSkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgR0RhdGVTcGVjaWZpY2F0aW9uKQotICAgICAgICAgICAgc2V0KCAoR0RhdGVTcGVjaWZpY2F0aW9uKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHRHVyYXRpb25TcGVjaWZpY2F0aW9uKQotICAgICAgICAgICAgc2V0KCAoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbikgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgUU5hbWUpCi0gICAgICAgICAgICBzZXQoIChRTmFtZSkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHNldCggKExpc3QpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIGJ5dGVbXSkKLSAgICAgICAgICAgIHNldCggKGJ5dGVbXSkgbyApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB1bmlvbiBvYmplY3Qgb2YgY2xhc3MgOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldF9uZXdWYWx1ZShYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iai5pc05pbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXROaWwoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW1pdGl2ZToKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbEFueVNpbXBsZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgdiA9IChYbWxBbnlTaW1wbGVUeXBlKW9iajsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgaW5zdGFuY2VUeXBlID0gKChTaW1wbGVWYWx1ZSl2KS5pbnN0YW5jZVR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgIT0gbnVsbCkgOiAiTmlsIGNhc2Ugc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkiOwotCi0gICAgICAgICAgICAvLyBoYW5kbGUgbGlzdHMKLSAgICAgICAgICAgIGlmIChpbnN0YW5jZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9saXN0KCgoU2ltcGxlVmFsdWUpdikueGdldExpc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2NvbW1pdCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgYXRvbWljIHR5cGVzCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoaW5zdGFuY2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQyk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChpbnN0YW5jZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAiZW5jb3VudGVyZWQgbm9ucHJpbWl0aXZlIHR5cGUuIjsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOiAgVGhpcyBpcyBoYW5kbGVkIGJlbG93Li4uCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBldmVudHVhbGx5IHdhbnQgdG8gaGFuZGxlIGl0IHdpdGggYSB0cmVlY29weSwgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnR1YWxseSB3ZSBzaG91bGQgYnJlYWsgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHByaW1pdGl2ZTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYm9vbCA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0Qm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2Jvb2xlYW4oYm9vbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZUFyciA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfYjY0KGJ5dGVBcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZUFyciA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfaGV4KGJ5dGVBcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0UU5hbWVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9RTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfZmxvYXQoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQgPSAoKFNpbXBsZVZhbHVlKXYpLmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RvdWJsZShkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnN0YW5jZVR5cGUuZ2V0RGVjaW1hbFNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CWVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBiID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCeXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2J5dGUoYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHMgPSAoKFNpbXBsZVZhbHVlKXYpLmdldFNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Nob3J0KHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9pbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRMb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2xvbmcobCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfQmlnSW50ZWdlcihiaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIGJkID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X0JpZ0RlY2ltYWwoYmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB2LmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RleHQodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdi5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9ub3RhdGlvbihzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBnZCA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfR0R1cmF0aW9uKGdkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdEYXRlIGdkID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRHRGF0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X0dEYXRlKGdkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHYuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfU3RyaW5nKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQodikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF94bWxhbnlzaW1wbGUodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXNoZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0X2NvbW1pdCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gcHJpbWl0aXZlIG5vZGUgdHJlZSBjb3B5IGhhbmRsZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb21wbGV4IHR5cGUgdW5leHBlY3RlZCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZVN0b3JlVXNlciBzZXR0ZXJIZWxwZXIgKCBYbWxPYmplY3RCYXNlIHNyYyApCi0gICAgewotICAgICAgICBjaGVja19vcnBoYW5lZCgpOwotCi0gICAgICAgIHNyYy5jaGVja19vcnBoYW5lZCgpOwotCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgZ2V0X3N0b3JlKCkuY29weV9jb250ZW50c19mcm9tKCBzcmMuZ2V0X3N0b3JlKCkgKS4KLSAgICAgICAgICAgICAgICBnZXRfc3RvcmUoKS5jaGFuZ2VfdHlwZSggc3JjLnNjaGVtYVR5cGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBYbWxPYmplY3Qgc2V0KFhtbE9iamVjdCBzcmMpCi0gICAgewotICAgICAgICBpZiAoaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBzZXQgdGhlIHZhbHVlIG9mIGFuIGltbXV0YWJsZSBYbWxPYmplY3QiKTsKLQotICAgICAgICBYbWxPYmplY3RCYXNlIG9iaiA9IHVuZGVybHlpbmcoc3JjKTsKLQotICAgICAgICBUeXBlU3RvcmVVc2VyIG5ld09iaiA9IHRoaXM7Ci0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXROaWwoKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iai5pc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgc2V0KG9iai5zdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvcigpID09IG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqID0gc2V0dGVySGVscGVyKCBvYmogKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCB0byBncmFiIHR3byBsb2NrczogZG9uJ3QgZGVhZGxvY2sgb3Vyc2VsdmVzCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAob2JqLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqID0gc2V0dGVySGVscGVyKCBvYmogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFhtbE9iamVjdCkgbmV3T2JqOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9saXN0KExpc3QgbGlzdCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYm9vbGVhbihib29sZWFuIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2J5dGUoYnl0ZSB2KQotICAgICAgICB7IHNldF9pbnQoKGludCkgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfc2hvcnQoc2hvcnQgdikKLSAgICAgICAgeyBzZXRfaW50KChpbnQpIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgdikKLSAgICAgICAgeyBzZXRfbG9uZygobG9uZykgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIHYpCi0gICAgICAgIHsgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9jaGFyKGNoYXIgdikKLSAgICAgICAgeyBzZXRfU3RyaW5nKENoYXJhY3Rlci50b1N0cmluZyh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikKLSAgICAgICAgeyBzZXRfQmlnRGVjaW1hbChuZXcgQmlnRGVjaW1hbCh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KQotICAgICAgICB7IHNldF9CaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKHYpKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2VudW0oU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYjY0KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9CeXRlQXJyYXkoYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaGV4KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9CeXRlQXJyYXkoYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgICAgIHsgc2V0KG5ldyBCaWdEZWNpbWFsKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfRGF0ZShEYXRlIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NhbGVuZGFyKENhbGVuZGFyIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9Db21wbGV4WG1sKFhtbE9iamVjdCB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25vdGF0aW9uKFN0cmluZyB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGFueXNpbXBsZShYbWxBbnlTaW1wbGVUeXBlIHYpCi0gICAgICAgIHsgc2V0X1N0cmluZyh2LmdldFN0cmluZ1ZhbHVlKCkpOyB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tcGFyYWJsZV92YWx1ZV9zcGFjZXMoU2NoZW1hVHlwZSB0MSwgU2NoZW1hVHlwZSB0MikKLSAgICB7Ci0gICAgICAgIGFzc2VydCh0MS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTiAmJiB0Mi5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7Ci0KLSAgICAgICAgaWYgKCF0MS5pc1NpbXBsZVR5cGUoKSAmJiAhdDIuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gKHQxLmdldENvbnRlbnRUeXBlKCkgPT0gdDIuZ2V0Q29udGVudFR5cGUoKSk7Ci0KLSAgICAgICAgaWYgKCF0MS5pc1NpbXBsZVR5cGUoKSB8fCAhdDIuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHQxLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QgJiYgdDIuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICh0MS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUIHx8IHQyLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuICh0MS5nZXRQcmltaXRpdmVUeXBlKCkuZXF1YWxzKHQyLmdldFByaW1pdGl2ZVR5cGUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB2YWx1ZUVxdWFsc0ltcGwoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSB0eXBldGhpcyA9IGluc3RhbmNlVHlwZSgpOwotICAgICAgICBTY2hlbWFUeXBlIHR5cGVvdGhlciA9ICgoU2ltcGxlVmFsdWUpeG1sb2JqKS5pbnN0YW5jZVR5cGUoKTsKLQotICAgICAgICBpZiAodHlwZXRoaXMgPT0gbnVsbCAmJiB0eXBlb3RoZXIgPT0gbnVsbCkgLy8gZGV0ZWN0cyBuaWwKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICh0eXBldGhpcyA9PSBudWxsIHx8IHR5cGVvdGhlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICghY29tcGFyYWJsZV92YWx1ZV9zcGFjZXModHlwZXRoaXMsIHR5cGVvdGhlcikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHhtbG9iai5zY2hlbWFUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgICAgICByZXR1cm4gKHVuZGVybHlpbmcoeG1sb2JqKSkuZXF1YWxfdG8odGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIGVxdWFsX3RvKHhtbG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmFsdWVFcXVhbHMoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4bWxvYmouaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVxdWFsc0ltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVFcXVhbHNJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbG9iai5pc0ltbXV0YWJsZSgpIHx8IG1vbml0b3IoKSA9PSB4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVxdWFsc0ltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWxzSW1wbCh4bWxvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyBDb21wYXJhYmxlLiBUaGlzIGNvbXBhcmVUbyBpcyBpbmNvbnNpc3RlbnQgd2l0aAotICAgICAqIGVxdWFscyB1bmxlc3MgaXNJbW11dGFibGUoKSBpcyB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gY29tcGFyZVZhbHVlKChYbWxPYmplY3Qpb2JqKTsgLy8gY2FuIHRocm93IENsYXNzQ2FzdAotICAgICAgICBpZiAocmVzdWx0ID09IDIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb3dlZCB0byByZXR1cm4gMiBmb3IgaW5jb21wYXJhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGNvbXBhcmVWYWx1ZUltcGwoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZTEsIHR5cGUyOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlMSA9IGluc3RhbmNlVHlwZSgpOwotICAgICAgICAgICAgdHlwZTIgPSAoKFNpbXBsZVZhbHVlKXhtbG9iaikuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlMSA9PSBudWxsICYmIHR5cGUyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHR5cGUxID09IG51bGwgfHwgdHlwZTIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIGlmICghdHlwZTEuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZTEuaXNVUlR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIGlmICghdHlwZTIuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZTIuaXNVUlR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIHR5cGUxID0gdHlwZTEuZ2V0UHJpbWl0aXZlVHlwZSgpOwotICAgICAgICB0eXBlMiA9IHR5cGUyLmdldFByaW1pdGl2ZVR5cGUoKTsKLQotICAgICAgICAvLyBEaWZmZXJlbnQgdmFsdWUgc3BhY2VzOiBkaWZmZXJlbnQKLSAgICAgICAgaWYgKHR5cGUxLmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IHR5cGUyLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgLy8gbm93IHdlJ2xsIGRlcGVuZCBvbiBvdXIgaW1wbCBjbGFzcyB0byBkbyB0aGUgd29yawotICAgICAgICByZXR1cm4gY29tcGFyZV90byh4bWxvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVZhbHVlKFhtbE9iamVjdCB4bWxvYmopCi0gICAgewotICAgICAgICBpZiAoeG1sb2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeG1sb2JqLmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZVZhbHVlSW1wbCh4bWxvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbG9iai5pc0ltbXV0YWJsZSgpIHx8IG1vbml0b3IoKSA9PSB4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sb2JqLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBjb21wYXJlX3RvIGlzIGFsbG93ZWQgdG8gZG8gdHdvCi0gICAgICogdW51c3VhbCB0aGluZ3M6Ci0gICAgICogKDEpIGl0IGNhbiBhc3N1bWUgdGhhdCB0aGUgeG1sb2JqIHBhc3NlZCBoYXMgYSBwcmltaXRpdmUKLSAgICAgKiAgICAgdHlwZSB1bmRlcmx5aW5nIHRoZSBpbnN0YW5jZSB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUKLSAgICAgKiAgICAgY3VycmVudCBpbnN0YW5jZSwgYW5kIHRoYXQgbmVpdGhlciBpcyBuaWwuCi0gICAgICogKDIpIGl0IGlzIGFsbG93ZWQgdG8gcmV0dXJuIDIgZm9yICJpbmNvbXBhcmFibGUiOwotICAgICAqICAgICBpdCBzaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChlcXVhbF90byh4bWxvYmopKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCB4bWxvYmopOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCB2YWx1ZV9oYXNoX2NvZGUoKTsKLQotICAgIHB1YmxpYyBpbnQgdmFsdWVIYXNoQ29kZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlX2hhc2hfY29kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlT2YoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBteVR5cGU7Ci0KLSAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAobXlUeXBlID0gaW5zdGFuY2VUeXBlKCk7IG15VHlwZSAhPSBudWxsOyBteVR5cGUgPSBteVR5cGUuZ2V0QmFzZVR5cGUoKSkKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBteVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2V0IGN0eXBlcyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSkpOwotICAgICAgICAgICAgZm9yIChteVR5cGUgPSBpbnN0YW5jZVR5cGUoKTsgbXlUeXBlICE9IG51bGw7IG15VHlwZSA9IG15VHlwZS5nZXRCYXNlVHlwZSgpKQotICAgICAgICAgICAgICAgIGlmIChjdHlwZXMuY29udGFpbnMobXlUeXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmICghaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYbWxPYmplY3QpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFhtbE9iamVjdCB4bWxvYmogPSAoWG1sT2JqZWN0KW9iajsKLSAgICAgICAgaWYgKCF4bWxvYmouaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdmFsdWVFcXVhbHMoeG1sb2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmICghaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNOaWwoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlX2hhc2hfY29kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2FuIHdyaXRlUmVwbGFjZSBlaXRoZXIgYW4gdW53cmFwcGVkIFhtbE9iamVjdEJhc2UKLSAgICAgKiBvciBhbiBYQmVhbiBwcm94eS4gIEEgInRydWUiIGFyZ3VtZW50IG1lYW5zIHVud3JhcHBlZC4KLSAgICAgKgotICAgICAqIFRoZSBzZXJpYWxpemF0aW9uIHN0cmF0ZWd5IGZvciBYbWxPYmplY3RzIGlzIHRoaXM6Ci0gICAgICoKLSAgICAgKiAoMSkgT25seSB0aGUgcm9vdCBYbWxPYmplY3QgZm9yIGEgZG9jdW1lbnQgYWN0dWFsbHkgZ2V0cwotICAgICAqICAgICBmdWxseSBzZXJpYWxpemVkOyBpdCBpcyBzZXJpYWxpemVkIGFzIGEgU2VyaWFsaXplZFJvb3RPYmplY3QsCi0gICAgICogICAgIHdoaWNoIHNpbXBseSBzYXZlcyBpdHNlbGYgYXMgWE1MIHRleHQuCi0gICAgICoKLSAgICAgKiAoMikgSW50ZXJpb3IgWG1sT2JqZWN0cyBnZXQgc2VyaWFsaXplZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUKLSAgICAgKiAgICAgcm9vdCBYbWxPYmplY3QgZm9yIHRoZWlyIGRvY3VtZW50LCBwbHVzIGFuIGludGVnZXIgd2hpY2gKLSAgICAgKiAgICAgaW5kaWNhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgWG1sT2JqZWN0IHdpdGhpbiB0aGUgb3duZXIKLSAgICAgKiAgICAgZG9jdW1lbnQuIFRoaXMgcGFpciBpcyBzdG9yZWQgYXMgYSBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QuCi0gICAgICoKLSAgICAgKiBCb3RoIG9iamVjdHMgY2FuIGJlIG1ha2VkIGFzIHdyYXBwZWQgb3IgdW53cmFwcGVkLiBJZiB3cmFwcGVkLAotICAgICAqIHRoZW4gdGhlIHByb3h5IGlzIHJldHVybmVkIHdoZW4gZGVzZXJpYWxpemluZzsgaWYgdW53cmFwcGVkLCB0aGVuCi0gICAgICogdGhlIHByb3h5IGlzIHN0cmlwcGVkIHdoZW4gZGVzZXJpYWxpemluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzUm9vdFhtbE9iamVjdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplZFJvb3RPYmplY3QodGhpcyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplZEludGVyaW9yT2JqZWN0KHRoaXMsIGdldFJvb3RYbWxPYmplY3QoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYXQgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Jvb3RYbWxPYmplY3QoKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvcigpOwotICAgICAgICBpZiAoY3VyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAhY3VyLnRvUGFyZW50KCk7Ci0gICAgICAgIGN1ci5kaXNwb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm9vdCBYbWxPYmplY3QgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgZ2V0Um9vdFhtbE9iamVjdCgpCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yKCk7Ci0gICAgICAgIGlmIChjdXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICBjdXIudG9TdGFydERvYygpOwotICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICBjdXIuZGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6YWJsZSByZXdyaXRlIG9iamVjdCB0aGF0IGtub3dzIGhvdyB0byByZXNvbHZlCi0gICAgICogdG8gYW4gWG1sT2JqZWN0QmFzZSBvciBhIHByb3h5IGZvciB0aGUgcm9vdCBvYmplY3Qgb2YKLSAgICAgKiBhIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZWRSb290T2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCi0gICAgICAgIHRyYW5zaWVudCBDbGFzcyBfeGJlYW5DbGFzczsKLSAgICAgICAgdHJhbnNpZW50IFhtbE9iamVjdCBfaW1wbDsKLQotICAgICAgICBwcml2YXRlIFNlcmlhbGl6ZWRSb290T2JqZWN0KCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemVkUm9vdE9iamVjdChYbWxPYmplY3QgaW1wbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3hiZWFuQ2xhc3MgPSBpbXBsLnNjaGVtYVR5cGUoKS5nZXRKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIF9pbXBsID0gaW1wbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KF94YmVhbkNsYXNzKTsKLSAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzaG9ydCBpcyB3cml0dGVuIG91dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgIC8vIGl0IHdpbGwgYWx3YXlzIGJlIHplcm8gZm9yIG9iamVjdHMgd3JpdHRlbiB3aXRoCi0gICAgICAgICAgICAvLyB0aGlzIGNvZGUsIGJ1dCBpdCB1c2VkIHRvIGJlIHRoZSBmaXJzdCAyIGJ5dGVzIG9mIHRoZQotICAgICAgICAgICAgLy8gd3JpdGVVVEYoKSBtZXRob2QKLSAgICAgICAgICAgIG91dC53cml0ZVNob3J0KChzaG9ydCkwKTsKLSAgICAgICAgICAgIG91dC53cml0ZVNob3J0KE1BSk9SX1ZFUlNJT05fTlVNQkVSKTsKLSAgICAgICAgICAgIG91dC53cml0ZVNob3J0KE1JTk9SX1ZFUlNJT05fTlVNQkVSKTsKLSAgICAgICAgICAgIC8vIENSMTIyNDAxIC0gbmVlZCB0byB1c2Ugd3JpdGVPYmplY3QgaW5zdGVhZCBvZiB3cml0ZVVURgotICAgICAgICAgICAgLy8gZm9yIHhtbFRleHQgYXMgd3JpdGVVVEYgaGFzIGEgbGVuZ3RoIGxpbWl0YXRpb24gb2YKLSAgICAgICAgICAgIC8vIDY1NTM1IGJ5dGVzCi0gICAgICAgICAgICBTdHJpbmcgeG1sVGV4dCA9IF9pbXBsLnhtbFRleHQoKTsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCh4bWxUZXh0KTsKLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyByZWFkIGNsYXNzIG9iamVjdCBmaXJzdCAtIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBqdXN0IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgLSByZWFsbHkKLSAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSB0aGUgdmVyc2lvbiBudW1iZXJzCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QKLSAgICAgICAgICAgICAgICBfeGJlYW5DbGFzcyA9IChDbGFzcylpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgdXRmQnl0ZXMgPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOwotCi0gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHZlcnNpb24gbnVtYmVycwotICAgICAgICAgICAgICAgIC8vIGlmIHV0ZkJ5dGVzIGlzIG5vbi16ZXJvIHRoZW4gd2UgZGVmYXVsdCB0byAwLjAKLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZXhwZWN0IG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMKLSAgICAgICAgICAgICAgICAvLyB0byBiZSBuZXh0IGVudHJpZXMgaW4gc3RyZWFtCi0gICAgICAgICAgICAgICAgaW50IG1ham9yVmVyc2lvbk51bSA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IG1pbm9yVmVyc2lvbk51bSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHV0ZkJ5dGVzID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYWpvclZlcnNpb25OdW0gPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBtaW5vclZlcnNpb25OdW0gPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxUZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbk51bSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gb3JpZ2luYWwsIHVubnVtYmVyZWQgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbm9yVmVyc2lvbk51bSBpcyBhbHdheXMgemVybwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sVGV4dCA9IHJlYWRPYmplY3RWMChpbiwgdXRmQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW4ucmVhZEJvb2xlYW4oKTsgLy8gaWdub3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtaW5vclZlcnNpb25OdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0ID0gKFN0cmluZylpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLnJlYWRCb29sZWFuKCk7IC8vIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlc2VyaWFsaXphdGlvbiBlcnJvcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gbnVtYmVyICIgKyBtYWpvclZlcnNpb25OdW0gKyAiLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yVmVyc2lvbk51bSArICIgbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlc2VyaWFsaXphdGlvbiBlcnJvcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIG51bWJlciAiICsgbWFqb3JWZXJzaW9uTnVtICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3JWZXJzaW9uTnVtICsgIiBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RG9jdW1lbnRUeXBlKFhtbEJlYW5zLnR5cGVGb3JDbGFzcyhfeGJlYW5DbGFzcykpOwotICAgICAgICAgICAgICAgIF9pbXBsID0gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSh4bWxUZXh0LCBudWxsLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pKG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSkuaW5pdENhdXNlKGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGlzIGZvciByZWFkaW5nIHRoZSBVVEYtOCBTdHJpbmcgdGhhdCB1c2VkIHRvIGJlCi0gICAgICAgIC8vIHdyaXR0ZW4gb3V0IGZvciBhIHNlcmlhbGl6ZWQgWG1sT2JqZWN0IGFjY29yZGluZyB0byB0aGUKLSAgICAgICAgLy8gb3JpZ2luYWwgZm9ybWF0IGJlZm9yZSB0aGlzIGZpeCwgaS5lLiBpdCBleHBlY3RzIGl0Ci0gICAgICAgIC8vIHRvIGhhdmUgYmVlbiB3cml0dGVuIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgotICAgICAgICAvLwotICAgICAgICAvLyB3cml0ZU9iamVjdChDbGFzcyBvYmplY3QpCi0gICAgICAgIC8vIHdyaXRlVVRGKHhtbFRleHQgb2Ygb2JqZWN0IGFzIFN0cmluZykKLSAgICAgICAgLy8gd3JpdGVCb29sZWFuKCkKLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhpcyBtZXRob2QgaXMgcGFzc2VkIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0gcG9zaXRpb25lZCBhcyB0aG91Z2gKLSAgICAgICAgLy8gaXQgaGFkIGp1c3QgcmVhZCB0aGUgY2xhc3Mgb2JqZWN0IHBsdXMgdGhlIG5leHQgMiBieXRlcy4gVGhvc2UgMgotICAgICAgICAvLyBieXRlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgc2hvcnQgc2F5aW5nIGhvdyBtYW55IG1vcmUKLSAgICAgICAgLy8gYnl0ZXMgdGhlcmUgYXJlIHJlcHJlc2VudGluZyB0aGUgYnl0ZXMgb2YgdGhlIFVURi04LWZvcm1hdHRlZCBTdHJpbmc7Ci0gICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgcGFzc2VkIGluIGFzIHRoZSBhcmd1bWVudCB1dGZCeXRlcwotICAgICAgICBwcml2YXRlIFN0cmluZyByZWFkT2JqZWN0VjAoT2JqZWN0SW5wdXRTdHJlYW0gaW4sIGludCB1dGZCeXRlcykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWxsb3cgYW4gZXh0cmEgMiBieXRlcyB1cCBmcm9udCBmb3IgdGhlIHVuc2lnbmVkIHNob3J0Ci0gICAgICAgICAgICBieXRlW10gYkFycmF5ID0gbmV3IGJ5dGVbdXRmQnl0ZXMrMl07Ci0KLSAgICAgICAgICAgIC8vIGZvciBmb3JtYXQgb2YgdGhlc2UgZmlyc3QgMiBieXRlcyBzZWUKLSAgICAgICAgICAgIC8vIEphdmEgQVBJIGRvY3MgLSBEYXRhT3V0cHV0U3RyZWFtLndyaXRlU2hvcnQoKQotICAgICAgICAgICAgYkFycmF5WzBdID0gKGJ5dGUpKCAweGZmICYgKHV0ZkJ5dGVzID4+IDgpICk7Ci0gICAgICAgICAgICBiQXJyYXlbMV0gPSAoYnl0ZSkoIDB4ZmYgJiB1dGZCeXRlcyApOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBuZXh0IG51bUJ5dGVzIGJ5dGVzIGZyb20gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgLy8gaW50byB0aGUgYnl0ZSBhcnJheSBzdGFydGluZyBhdCBvZmZzZXQgMjsgdGhpcyBtYXkKLSAgICAgICAgICAgIC8vIHRha2UgbXVsdGlwbGUgY2FsbHMgdG8gcmVhZCgpCi0gICAgICAgICAgICBpbnQgdG90YWxCeXRlc1JlYWQgPSAwOwotICAgICAgICAgICAgaW50IG51bVJlYWQ7Ci0gICAgICAgICAgICB3aGlsZSAodG90YWxCeXRlc1JlYWQgPCB1dGZCeXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBudW1SZWFkID0KLSAgICAgICAgICAgICAgICAgICAgaW4ucmVhZChiQXJyYXksIDIrdG90YWxCeXRlc1JlYWQsIHV0ZkJ5dGVzLXRvdGFsQnl0ZXNSZWFkKTsKLSAgICAgICAgICAgICAgICBpZiAobnVtUmVhZCA9PSAtMSkgLy8gcmVhY2hlZCBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgKz0gbnVtUmVhZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkICE9IHV0ZkJ5dGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyBiYWNrd2FyZHMgY29tcGF0aWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJYbWxPYmplY3Q6IG51bWJlciBvZiBieXRlcyByZWFkICgiICsgdG90YWxCeXRlc1JlYWQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIikgIT0gbnVtYmVyIGV4cGVjdGVkICgiICsgdXRmQnl0ZXMgKyAiKSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IHNldCB1cCBhIERhdGFJbnB1dFN0cmVhbSB0byByZWFkIHRob3NlCi0gICAgICAgICAgICAvLyBieXRlcyBhcyBhIFVURi04IFN0cmluZyBpLmUuIGFzIHRob3VnaCB3ZSdkIG5ldmVyCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBmaXJzdCAyIGJ5dGVzIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbQotICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGRpcyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJBcnJheSkpOwotICAgICAgICAgICAgICAgIHN0ciA9IGRpcy5yZWFkVVRGKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemFibGUgcmV3cml0ZSBvYmplY3QgdGhhdCBrbm93cyBob3cgdG8gcmVzb2x2ZQotICAgICAqIHRvIGFuIFhtbE9iamVjdEJhc2Ugb3IgYSBwcm94eSBmb3IgYW4gaW50ZXJpb3IgcG9zaXRpb24KLSAgICAgKiB3aXRoaW4gYSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLSAgICAgICAgdHJhbnNpZW50IFhtbE9iamVjdCBfaW1wbDsKLSAgICAgICAgdHJhbnNpZW50IFhtbE9iamVjdCBfcm9vdDsKLQotICAgICAgICBwcml2YXRlIFNlcmlhbGl6ZWRJbnRlcmlvck9iamVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2VyaWFsaXplZEludGVyaW9yT2JqZWN0KFhtbE9iamVjdCBpbXBsLCBYbWxPYmplY3Qgcm9vdCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ltcGwgPSBpbXBsOwotICAgICAgICAgICAgX3Jvb3QgPSByb290OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoX3Jvb3QpOwotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQoZGlzdGFuY2VUb1Jvb3QoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yb290ID0gKFhtbE9iamVjdClpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICAgICAgX2ltcGwgPSBvYmplY3RBdERpc3RhbmNlKGluLnJlYWRJbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9pbXBsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZGlzdGFuY2VUb1Jvb3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gX2ltcGwubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFjdXIudG9QcmV2VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ci5jdXJyZW50VG9rZW5UeXBlKCkuaXNOYW1lc3BhY2UoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bnQ6ICIgKyBjb3VudCArICIgIiArIGN1ci5jdXJyZW50VG9rZW5UeXBlKCkudG9TdHJpbmcoKSArICIgIiArIFFOYW1lLnByZXR0eShjdXIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWG1sT2JqZWN0IG9iamVjdEF0RGlzdGFuY2UoaW50IGNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gX3Jvb3QubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1ci50b05leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGlmICghY3VyLmN1cnJlbnRUb2tlblR5cGUoKS5pc05hbWVzcGFjZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb3VudDogIiArIGNvdW50ICsgIiAiICsgY3VyLmN1cnJlbnRUb2tlblR5cGUoKS50b1N0cmluZygpICsgIiAiICsgUU5hbWUucHJldHR5KGN1ci5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBqYXZhX3ZhbHVlKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqLmlzTmlsKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYbWxBbnlTaW1wbGVUeXBlKSkKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUgPSAoKFNpbXBsZVZhbHVlKW9iaikuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgIT0gbnVsbCkgOiAiTmlsIGNhc2Ugc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlIjsKLQotICAgICAgICAvLyBoYW5kbGUgbGlzdHMKLSAgICAgICAgaWYgKGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpb2JqKS5nZXRMaXN0VmFsdWUoKTsKLQotICAgICAgICBTaW1wbGVWYWx1ZSBiYXNlID0gKFNpbXBsZVZhbHVlKW9iajsKLQotICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCb29sZWFuVmFsdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRRTmFtZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChiYXNlLmdldEZsb2F0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKGJhc2UuZ2V0RG91YmxlVmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXREZWNpbWFsU2l6ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQllURToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZShiYXNlLmdldEJ5dGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQoYmFzZS5nZXRTaG9ydFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihiYXNlLmdldEludFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcoYmFzZS5nZXRMb25nVmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAiZW5jb3VudGVyZWQgbm9ucHJpbWl0aXZlIHR5cGUuIjsKLSAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotCi0gICAgICAgICAgICAvLyBOQjogZm9yIHN0cmluZyBlbnVtcyB3ZSBqdXN0IGRvIGphdmEubGFuZy5TdHJpbmcKLSAgICAgICAgICAgIC8vIHdoZW4gaW4gdGhlIGNvbnRleHQgb2YgdW5pb25zLiBJdCdzIGVhc2llciBvbiB1c2Vycy4KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gYmFzZS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBjb2RlIGdlbmVyYXRlZCBjb2RlIHRvIGdldCB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdmFsdWUKLSAgICAgKiBmb3IgYSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYbWxBbnlTaW1wbGVUeXBlIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV92YWx1ZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNjaGVtYVR5cGUoKTsKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgYU1vZGVsID0gc1R5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKTsKLSAgICAgICAgaWYgKGFNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNBdHRyID0gYU1vZGVsLmdldEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgaWYgKHNBdHRyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHNBdHRyLmdldERlZmF1bHRWYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFBvc2l0aXZlSW50ZWdlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFBvc2l0aXZlSW50ZWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljZTZlMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxQb3NpdGl2ZUludGVnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQb3NpdGl2ZUludGVnZXJJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFBvc2l0aXZlSW50ZWdlcgotewotICAgIHB1YmxpYyBYbWxQb3NpdGl2ZUludGVnZXJJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxQb3NpdGl2ZUludGVnZXIudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbFBvc2l0aXZlSW50ZWdlckltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFFOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OTVhMTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxRTmFtZUltcGwgZXh0ZW5kcyBKYXZhUU5hbWVIb2xkZXIgaW1wbGVtZW50cyBYbWxRTmFtZQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFkMjBjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFFOYW1lUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotCi1wdWJsaWMgY2xhc3MgWG1sUU5hbWVSZXN0cmljdGlvbiBleHRlbmRzIEphdmFRTmFtZUhvbGRlckV4IGltcGxlbWVudHMgWG1sUU5hbWUKLXsKLSAgICBwdWJsaWMgWG1sUU5hbWVSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU2hvcnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlN2MwOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2hvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxTaG9ydEltcGwgZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxTaG9ydAotewotICAgIHB1YmxpYyBYbWxTaG9ydEltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbFNob3J0LnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxTaG9ydEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0VudW1lcmF0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJlYjJiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0VudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7Ci0KLXB1YmxpYyBjbGFzcyBYbWxTdHJpbmdFbnVtZXJhdGlvbiBleHRlbmRzIEphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4IGltcGxlbWVudHMgWG1sU3RyaW5nCi17Ci0gICAgcHVibGljIFhtbFN0cmluZ0VudW1lcmF0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzE2YzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7Ci0KLQotcHVibGljIGNsYXNzIFhtbFN0cmluZ0ltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyIGltcGxlbWVudHMgWG1sU3RyaW5nCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxM2I0Ni4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU3RyaW5nOwotCi1wdWJsaWMgY2xhc3MgWG1sU3RyaW5nUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxTdHJpbmcKLXsKLSAgICBwdWJsaWMgWG1sU3RyaW5nUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFRpbWVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUaW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDFmZTM4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFRpbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxUaW1lSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sVGltZQotewotICAgIHB1YmxpYyBYbWxUaW1lSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sVGltZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVGltZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFRva2VuSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVG9rZW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzMwMzEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVG9rZW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVG9rZW5JbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sVG9rZW4KLXsKLSAgICBwdWJsaWMgWG1sVG9rZW5JbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxUb2tlbi50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVG9rZW5JbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbmlvbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTZhMWRjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgc2ltcGxlIHVuaW9uIHR5cGVzLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhtbFVuaW9uSW1wbCBleHRlbmRzIFhtbE9iamVjdEJhc2UgaW1wbGVtZW50cyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgcHVibGljIFhtbFVuaW9uSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgaW5zdGFuY2VUeXBlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmluc3RhbmNlVHlwZSgpOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0gICAgcHJpdmF0ZSBYbWxBbnlTaW1wbGVUeXBlIF92YWx1ZTsgLy8gdW5kZXJseWluZyB2YWx1ZQotICAgIHByaXZhdGUgU3RyaW5nIF90ZXh0dmFsdWUgPSAiIjsgLy8gdGV4dHVhbCB2YWx1ZQotCi0KLQotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgICAgIHsgcmV0dXJuIF90ZXh0dmFsdWU7IH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzX2RlZmF1bHRhYmxlX3dzKFN0cmluZyB2KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIHNhdmVkVmFsdWUgPSBfdmFsdWU7Ci0gICAgICAgICAgICBzZXRfdGV4dCh2KTsKLQotICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgc2F2ZWQgdmFsdWUKLSAgICAgICAgICAgIF92YWx1ZSA9IHNhdmVkVmFsdWU7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICAvLyBmaXJzdCBjaGVjayBhZ2FpbnN0IGFueSBwYXR0ZXJucy4uLgotICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIC8vIHNhdmUgc3RhdGUgZm9yIHJvbGxiYWNrCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbCA9IF90ZXh0dmFsdWU7Ci0gICAgICAgIF90ZXh0dmFsdWUgPSBzOwotCi0gICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdHlwZXMsIHRyeWluZyB0byBjcmVhdGUgYSB0eXBlCi0gICAgICAgIFNjaGVtYVR5cGVbXSBtZW1iZXJzID0gX3NjaGVtYVR5cGUuZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydChtZW1iZXJzICE9IG51bGwpOwotCi0gICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIGJvb2xlYW4gd2Fzc3RyaWN0ID0gc2V0X3N0cmljdCh0cnVlKTsgLy8gdGVsbCB0eXBlcyB0byBjb21wbGFpbiBmZXJ2ZXJlbnRseSBhYm91dCBlcnJvcnMKLSAgICAgICAgaWYgKGhhc19zdG9yZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoZ2V0X3N0b3JlKCkpKTsKLSAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBGcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBmb2xsb3dpbmcgY2FsbCwgInRoaXMiIGlzIGEgZ2VuZXJpYwotICAgICAgICAgICAgICAgIC8vIFhtbEFueVNpbXBsZVR5cGUgaW1wbGVtZW50YXRpb24sIGZvciB3aGljaCBvbmx5IGdldFRleHQgY2FuIGJlIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAvLyAoTm90ZSB0aGF0ICJ0aGlzIiBpcyBub3Qgd3JhcHBlZCBpbiB0aGUgcHJveHkgb2JqZWN0LikKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgbmV3dmFsID0gKChTY2hlbWFUeXBlSW1wbCltZW1iZXJzW2ldKS5uZXdWYWxpZGF0aW5nVmFsdWUocyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCAoZW51ZW1yYXRpb24pIHJlc3RyaWN0aW9ucwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrKG5ld3ZhbCwgX3NjaGVtYVR5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIHRoYXQgd29ya3MhCi0gICAgICAgICAgICAgICAgICAgIF92YWx1ZSA9IG5ld3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRyb3VibGVzb21lIHVuaW9uIGV4Y2VwdGlvbiBjYXVzZWQgYnkgdW5leHBlY3RlZCAiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFzc2VydChmYWxzZSkgOiAiVW5leHBlY3RlZCAiICsgZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHB1c2hlZCkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgLy8gc2V0X3N0cmljdCh3YXNzdHJpY3QpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgbWVtYmVyczsgcm9sbGJhY2sgYW5kIHRocm93Ci0gICAgICAgIF90ZXh0dmFsdWUgPSBvcmlnaW5hbDsKLSAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICAgICAgX3RleHR2YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQotCi0KLSAgICAvLyBudW1lcmljcwotICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwLjBmIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmZsb2F0VmFsdWUoKTsgfQotCi0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMC4wIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmRvdWJsZVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5iaWdEZWNpbWFsVmFsdWUoKTsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJpZ0ludGVnZXJWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuYnl0ZVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLnNob3J0VmFsdWUoKTsgfQotCi0gICAgcHVibGljIGludCBpbnRWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5pbnRWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkubG9uZ1ZhbHVlKCk7IH0KLQotCi0gICAgLy8gdmFyaW91cwotICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5VmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuYnl0ZUFycmF5VmFsdWUoKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBmYWxzZSA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5ib29sZWFuVmFsdWUoKTsgfQotCi0gICAgcHVibGljIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuY2FsZW5kYXJWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBkYXRlVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZGF0ZVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBHRGF0ZSBnRGF0ZVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmdEYXRlVmFsdWUoKTsgfQotCi0gICAgcHVibGljIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5nRHVyYXRpb25WYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5xTmFtZVZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBMaXN0IGxpc3RWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5saXN0VmFsdWUoKTsgfQotCi0gICAgcHVibGljIExpc3QgeGxpc3RWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS54bGlzdFZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5lbnVtVmFsdWUoKTsgfQotCi0gICAgcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6IF92YWx1ZS5zdHJpbmdWYWx1ZSgpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwYWNlIG9mIGNhbm9uaWNhbCBsZXhpY2FsIGZvcm1zCi0gICAgICogb2YgdGhlIGZpcnN0IChzb3VyY2UpIHR5cGUgb3ZlcmxhcHMgd2l0aCB0aGUgZnVsbCBsZXhpY2FsIHNwYWNlCi0gICAgICogb2YgdGhlIHNlY29uZCAodGFyZ2V0KSB0eXBlLiBCb3RoIHR5cGVzIG11c3QgYmUgcHJpbWl0aXZlcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBsZXhpY2FsX292ZXJsYXAoaW50IHNvdXJjZSwgaW50IHRhcmdldCkKLSAgICB7Ci0gICAgICAgIC8vIHR5cGVzIGFyZSB0aGUgc2FtZQotICAgICAgICBpZiAoc291cmNlID09IHRhcmdldCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIC8vIG9uZSBvZiB0aGUgdHlwZXMgaGFzIHRoZSBmdWxsIGxleGljYWwgc3BhY2UKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFIHx8Ci0gICAgICAgICAgICB0YXJnZXQgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSB8fAotICAgICAgICAgICAgc291cmNlID09IFNjaGVtYVR5cGUuQlRDX1NUUklORyB8fAotICAgICAgICAgICAgdGFyZ2V0ID09IFNjaGVtYVR5cGUuQlRDX1NUUklORyB8fAotICAgICAgICAgICAgc291cmNlID09IFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkgfHwKLSAgICAgICAgICAgIHRhcmdldCA9PSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgc3dpdGNoIChzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjogc3dpdGNoKHRhcmdldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOiAgICAgICAvLyAidHJ1ZSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiAgICAvLyAidHJ1ZSIgaXMgdmFsaWQgTkNOYW1lCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6IHN3aXRjaCh0YXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOiAgICAgLy8gIjAiIGlzIHZhbGlkIGJvb2xlYW4KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6ICAvLyAiMCIgaXMgdmFsaWQgaGV4Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRTogICAgICAgLy8gImEiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjogICAgLy8gImEiIGlzIHZhbGlkIE5jTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6ICAgICAgIC8vICIwIiBpcyB2YWxpZCBmbG9hdAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOiAgICAgIC8vICIwIiBpcyB2YWxpZCBkb3VibGUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6ICAgICAvLyAiMCIgaXMgdmFsaWQgZGVjaW1hbAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046ICAgIC8vICJQMVkyTTNEVDEwSDMwTSIgaXMgYm90aCBiNjQgYW5kIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6ICAgICAgLy8gIjE5OTkiIGlzIHZhbGlkIHllYXIKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgLy8gIi0iIGFuZCAiOiIgY2Fubm90IGNvbWUgZnJvbSBiNjQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWTogc3dpdGNoKHRhcmdldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46ICAgICAvLyAiMCIgaXMgdmFsaWQgYm9vbGVhbgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6ICAvLyAiMCIgaXMgdmFsaWQgYjY0Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRTogICAgICAgLy8gIkEiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjogICAgLy8gIkEiIGlzIHZhbGlkIE5jTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6ICAgICAgIC8vICIwIiBpcyB2YWxpZCBmbG9hdAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOiAgICAgIC8vICIwIiBpcyB2YWxpZCBkb3VibGUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6ICAgICAvLyAiMCIgaXMgdmFsaWQgZGVjaW1hbAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOiAgICAgIC8vICIxOTk5IiBpcyB2YWxpZCB5ZWFyCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgIC8vICItIiBhbmQgIjoiIGNhbm5vdCBjb21lIGZyb20gYjY0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjogc3dpdGNoKHRhcmdldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46ICAgICAvLyAidHJ1ZSIgaXMgdmFsaWQgYm9vbGVhbgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6ICAvLyAiYSIgaXMgdmFsaWQgYjY0Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOiAgLy8gImEiIGlzIHZhbGlkIGhleAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6ICAgICAgIC8vICJBIiBpcyB2YWxpZCBOY05hbWUgYW5kIHRoZXJlZm9yZSBRTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046ICAgIC8vICJBIiBpcyB2YWxpZCBOY05hbWUgYW5kIHRoZXJlZm9yZSBRTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046ICAgIC8vICJQMVkyTTNEVDEwSDMwTSIgaXMgYm90aCBOY05hbWUgYW5kIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOiBzd2l0Y2godGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6IC8vICIwIiBpcyB2YWxpZCBiNjQKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6ICAvLyAiMCIgaXMgdmFsaWQgaGV4Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDogICAgICAgLy8gIjAiIGlzIHZhbGlkIGZsb2F0Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6ICAgICAgLy8gIjAiIGlzIHZhbGlkIGRvdWJsZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDogICAgIC8vICIwIiBpcyB2YWxpZCBkZWNpbWFsCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6ICAgICAgLy8gIjE5OTkiIGlzIHZhbGlkIHllYXIKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjogc3dpdGNoKHRhcmdldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzY2hlbWEgdHlwZSdzIGxvZ2ljYWwgdHlwZSBpcyBhIG1hdGNoIGZvcgotICAgICAqIHRoZSBnaXZlbiBjYXRlZ29yeSBvZiBqYXZhIGNvbmNlcHRzLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfTlVNQkVSID0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9EQVRFID0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DQUxFTkRBUiA9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfQllURUFSUkFZID0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MSVNUID0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9naWNhbF9vdmVybGFwKFNjaGVtYVR5cGUgdHlwZSwgaW50IGphdmFjb2RlKQotICAgIHsKLSAgICAgICAgLy8gbm9uLXVuaW9uIHR5cGVzIGJlY2F1c2UgaXQncyBiZWluZyBhcHBsaWVkIG9uIGlycmVkdWNpYmxlIHVuaW9uIG1lbWJlcnMhCi0gICAgICAgIGFzc2VydCh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKTsKLQotICAgICAgICBpZiAoamF2YWNvZGUgPD0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICByZXR1cm4gKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpID09IGphdmFjb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoamF2YWNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBKQVZBX05VTUJFUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBKQVZBX0RBVEU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgY2FzZSBKQVZBX0JZVEVBUlJBWToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEpBVkFfTElTVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQoZmFsc2UpIDogIm1pc3NpbmcgY2FzZSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHcmFicyBhIGNoYWluZWQgdmFsdWUgb2YgdHlwZSBzdCwgY3JlYXRpbmcgYW5kIGF0dGFjaGluZwotICAgICAqIG9uZSBpZiBub3QgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0X3ByaW1pdGl2ZShpbnQgdHlwZWNvZGUsIE9iamVjdCB2YWwpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlW10gbWVtYmVycyA9IF9zY2hlbWFUeXBlLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotICAgICAgICBhc3NlcnQobWVtYmVycyAhPSBudWxsKTsKLQotICAgICAgICBib29sZWFuIHB1c2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAoaGFzX3N0b3JlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dChnZXRfc3RvcmUoKSkpOwotICAgICAgICAgICAgcHVzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0ZXI6IGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjYW5kaWRhdGVzIG11c3QgYmUgYSBsb2dpY2FsIG1hdGNoIGZvciB0aGUgZGVzaXJlZCB0eXBlY29kZQotICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsX292ZXJsYXAobWVtYmVyc1tpXSwgdHlwZWNvZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBuZXd2YWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCA9IG1lbWJlcnNbaV0ubmV3VmFsdWUodmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggdGhpcyB0eXBlIGV2ZW4gdGhvdWdoIGxvZ2ljYWwgY2F0ZWdvcmllcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSB1cCAocHJvYmFibHkgYmVjYXVzZSBvZiByZXN0cmljaXRvbik7IHRyeSB0aGUgbmV4dCB0eXBlLgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIlVuZXhwZWN0ZWQgIiArIGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IHJldGhpbmsgdGhpcyAtIGRpc2FibGluZyBmb3Igbm93LgotCi0gICAgICAgICAgICAgICAgICAgIC8vIE9LLCBub3cgd2UndmUgZ290IGEgbmV3dmFsLi4uIFdlIGhhdmUgdG8gdmVyaWZ5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbGV4aWNhbGx5IGl0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIHByZXZpb3VzIHR5cGVzCi0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld3ZhbHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIGlubmVyOiBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlcnNbal0uZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleGljYWxfb3ZlcmxhcChtZW1iZXJzW2pdLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsLnNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgcHJlY2VkaW5nIHR5cGUgdGhhdCBtYXkgbGV4aWNhbGx5IG92ZXJsYXAgd2l0aCBvdXJzLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgbGV4aWNhbGx5IGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb3VyIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3Bvc2VkIHZhbHVlLCB0aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgdGhlIHVuaW9uIHRvIGhhdmUgb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9naWNhbCB2YWx1ZSAoYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGJlZW4gbWFza2VkKSBhbmQgdGhyb3cgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3dmFsdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx0ZXh0ID0gbmV3dmFsLnN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzW2ldLm5ld1ZhbHVlKG5ld3ZhbHRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9oIGJhZCwgd2Ugc3VjY2VlZGVkLiBPdXIgaW5zdGFuY2UgbGV4aWNhbGx5IGxvb2tzIGxpa2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB0eXBlLCBhbmQgdGhpcyBpc24ndCBhIHZhbGlkIHZhbHVlLiBLZWVwIG9uIGh1bnRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGdvb2Q6IHRoaXMgZXJyb3IgbWVhbnMgdGhhdCBvdXIgdmFsdWUgZG9lc24ndCBsb29rIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG90aGVyIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGlubmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gbGV4aWNhbCBtYXNraW5nOiB3ZSdyZSBPSwotICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSBuZXd2YWw7Ci0gICAgICAgICAgICAgICAgICAgIF90ZXh0dmFsdWUgPSBfdmFsdWUuc3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwdXNoZWQpCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGhlcmUgYXJlIHRoZSBzZXR0ZXJzCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYm9vbGVhbihib29sZWFuIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19CT09MRUFOLCBuZXcgQm9vbGVhbih2KSk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9ieXRlKGJ5dGUgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgQnl0ZSh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfc2hvcnQoc2hvcnQgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgU2hvcnQodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgSW50ZWdlcih2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgbmV3IExvbmcodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2Zsb2F0KGZsb2F0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgbmV3IEZsb2F0KHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX05VTUJFUiwgbmV3IERvdWJsZSh2KSk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIGIpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0JZVEVBUlJBWSwgYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaGV4KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9CWVRFQVJSQVksIGIpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2I2NChieXRlW10gYikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfQllURUFSUkFZLCBiKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfUU5BTUUsIHYpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQ2FsZW5kYXIoQ2FsZW5kYXIgYykKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfQ0FMRU5EQVIsIGMpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0RhdGUoRGF0ZSBkKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9EQVRFLCBkKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZCkKLSAgICB7Ci0gICAgICAgIGludCBidGMgPSBkLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotICAgICAgICBpZiAoYnRjIDw9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHNldF9wcmltaXRpdmUoYnRjLCBkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZCkKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OLCBkKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2VudW0oU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfU1RSSU5HLCBlKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xpc3QoTGlzdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9MSVNULCB2KTsgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZmxvYXQoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19GTE9BVCwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZG91YmxlKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfRE9VQkxFLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkZWNpbWFsKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfREVDSU1BTCwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZHVyYXRpb24oWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19EVVJBVElPTiwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZGF0ZXRpbWUoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbHRpbWUoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19USU1FLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkYXRlKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfREFURSwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ3llYXJtb250aChYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USCwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ3llYXIoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19HX1lFQVIsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGdtb250aGRheShYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxnZGF5KFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19EQVksIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGdtb250aChYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEgsIHYpOyB9Ci0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVjayhYbWxPYmplY3QgdiwgU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHNbaV0udmFsdWVFcXVhbHModikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUudmFsdWVFcXVhbHMoeG1sb2JqKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdHguaW52YWxpZCgiVW5pb24gdmFsdWUgIiArIGxleGljYWwgKyAiIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbWVtYmVyIHR5cGVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc2NoZW1hVHlwZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdHguaW52YWxpZCgiVW5pb24gdmFsdWUgIiArIGxleGljYWwgKyAiIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbWVtYmVyIHR5cGVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc2NoZW1hVHlwZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICgoWG1sT2JqZWN0QmFzZSlfdmFsdWUpLnZhbGlkYXRlX3NpbXBsZXZhbChsZXhpY2FsLCAgY3R4KTsKLSAgICB9Ci0gICAgCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRCeXRlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRCeXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI0MzU3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkQnl0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRCeXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRCeXRlSW1wbCBleHRlbmRzIEphdmFJbnRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFVuc2lnbmVkQnl0ZQotewotICAgIHB1YmxpYyBYbWxVbnNpZ25lZEJ5dGVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZEJ5dGUudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkQnl0ZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkSW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRJbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YzIzZmEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRJbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkSW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRJbnRJbXBsIGV4dGVuZHMgSmF2YUxvbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFVuc2lnbmVkSW50Ci17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkSW50SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sVW5zaWduZWRJbnQudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkSW50SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRMb25nSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRMb25nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJiM2ZlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkTG9uZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRMb25nOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRMb25nSW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxVbnNpZ25lZExvbmcKLXsKLSAgICBwdWJsaWMgWG1sVW5zaWduZWRMb25nSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sVW5zaWduZWRMb25nLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxVbnNpZ25lZExvbmdJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZFNob3J0SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRTaG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiMzRhZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZFNob3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZFNob3J0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbFVuc2lnbmVkU2hvcnRJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRTaG9ydAotewotICAgIHB1YmxpYyBYbWxVbnNpZ25lZFNob3J0SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sVW5zaWduZWRTaG9ydC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVW5zaWduZWRTaG9ydEltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzA1ZGJhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKLSAgICBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiAoICkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uICggU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UgKTsKLSAgICB9Ci0gICAgCi0gICAgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gKCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCBjYXVzZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyZTEzNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxN2JjYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotcHVibGljIGNsYXNzIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotewotICAgIHB1YmxpYyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKSB7fQotICAgIHB1YmxpYyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsgc3VwZXIobWVzc2FnZSk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU09BUEFycmF5VHlwZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2JmZjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU09BUEFycmF5VHlwZQotewotICAgIC8vIEV4YW1wbGUgZm9vOmJhclssXVtdWywsXVs3LDldCi0gICAgLy8gLT4gX3R5cGUgPSBRTmFtZShmb286YmFyKQotICAgIC8vIC0+IF9yYW5rcyA9IHsyLDEsM30KLSAgICAvLyAtPiBfZGltZW5zaW9ucyA9IHs3LDl9Ci0gICAgcHJpdmF0ZSBRTmFtZSBfdHlwZTsKLSAgICBwcml2YXRlIGludFtdIF9yYW5rczsgLy8gaWYgcmFua3MgaXMgZW1wdHksIGl0IG1lYW5zIHRoZXJlIGFyZSBubyBuZXN0ZWQgYXJyYXlzCi0gICAgcHJpdmF0ZSBpbnRbXSBfZGltZW5zaW9uczsgLy8gQW55IGRpbWVuc2lvbiBjYW4gYmUgLTEgdG8gaW5kaWNhdGUgImFueSIuCi0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSByYW5rcyBmb3IgdGhlIHBhc3NlZCBTT0FQQXJyYXlUeXBlCi0gICAgICogYXJlIGVxdWFsIHRvIHRoaXMgb25lLgotICAgICAqCi0gICAgICogRG9lcyBOT1QgY29tcGFyZSB0aGUgX3R5cGUgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZVJhbmtBcyhTT0FQQXJyYXlUeXBlIG90aGVyVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChfcmFua3MubGVuZ3RoICE9IG90aGVyVHlwZS5fcmFua3MubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9yYW5rc1tpXSAhPSBvdGhlclR5cGUuX3JhbmtzW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoX2RpbWVuc2lvbnMubGVuZ3RoICE9IG90aGVyVHlwZS5fZGltZW5zaW9ucy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIFNPQVAgMS4xLWZvcm1hdHRlZCBpbmRleCBzdHJpbmcsIHJldHVybnMgYW4gYXJyYXkKLSAgICAgKiBpbmRleC4gIEZvciBleGFtcGxlLCBnaXZlbiAiWzQsMyw1XSIsIHJldHVybnMgYW4gaW50IGFycmF5Ci0gICAgICogY29udGFpbmluZyA0LCAzLCBhbmQgNS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludFtdIHBhcnNlU29hcDExSW5kZXgoU3RyaW5nIGluYnJhY2VzKQotICAgIHsKLSAgICAgICAgaW5icmFjZXMgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKGluYnJhY2VzLCBYbWxXaGl0ZXNwYWNlLldTX0NPTExBUFNFKTsKLSAgICAgICAgaWYgKCFpbmJyYWNlcy5zdGFydHNXaXRoKCJbIikgfHwgIWluYnJhY2VzLmVuZHNXaXRoKCJdIikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNmb3JtZWQgU09BUCAxLjEgaW5kZXg6IG11c3QgYmUgY29udGFpbmVkIGluIGJyYWNlcyBbXSIpOwotICAgICAgICByZXR1cm4gaW50ZXJuYWxQYXJzZUNvbW1hSW50U3RyaW5nKGluYnJhY2VzLnN1YnN0cmluZygxLCBpbmJyYWNlcy5sZW5ndGgoKSAtIDEpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBpbnRlcm5hbFBhcnNlQ29tbWFJbnRTdHJpbmcoU3RyaW5nIGNzbCkKLSAgICB7Ci0gICAgICAgIExpc3QgZGltU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaiA9IGNzbC5pbmRleE9mKCcsJywgaSk7Ci0gICAgICAgICAgICBpZiAoaiA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGltU3RyaW5ncy5hZGQoY3NsLnN1YnN0cmluZyhpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaW1TdHJpbmdzLmFkZChjc2wuc3Vic3RyaW5nKGksIGopKTsKLSAgICAgICAgICAgIGkgPSBqICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbZGltU3RyaW5ncy5zaXplKCldOwotICAgICAgICBpID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGRpbVN0cmluZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkaW1TdHJpbmcgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKChTdHJpbmcpaXQubmV4dCgpLCBYbWxXaGl0ZXNwYWNlLldTX0NPTExBUFNFKTsKLSAgICAgICAgICAgIGlmIChkaW1TdHJpbmcuZXF1YWxzKCIqIikgfHwgZGltU3RyaW5nLmVxdWFscygiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBJbnRlZ2VyLnBhcnNlSW50KGRpbVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oIk1hbGZvcm1lZCBpbnRlZ2VyIGluIFNPQVAgYXJyYXkgaW5kZXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBTT0FQIDEuMSBhcnJheSB0eXBlIHN0cmluZy4KLSAgICAgKgotICAgICAqIFNpbmNlIGFuIGFycmF5IHR5cGUgc3RyaW5nIGNvbnRhaW5zIGEgUU5hbWUsIGEgcHJlZml4IHJlc29sdmVyCi0gICAgICogbXVzdCBiZSBwYXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIFNPQVBBcnJheVR5cGUoU3RyaW5nIHMsIFByZWZpeFJlc29sdmVyIG0pCi0gICAgewotICAgICAgICBpbnQgZmlyc3RicmFjZSA9IHMuaW5kZXhPZignWycpOwotICAgICAgICBpZiAoZmlyc3RicmFjZSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gZ3JhYiB0aGUgUU5hbWUKLSAgICAgICAgU3RyaW5nIGZpcnN0cGFydCA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2Uocy5zdWJzdHJpbmcoMCwgZmlyc3RicmFjZSksIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICBpbnQgZmlyc3Rjb2xvbiA9IGZpcnN0cGFydC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgaWYgKGZpcnN0Y29sb24gPj0gMCkKLSAgICAgICAgICAgIHByZWZpeCA9IGZpcnN0cGFydC5zdWJzdHJpbmcoMCwgZmlyc3Rjb2xvbik7Ci0KLSAgICAgICAgU3RyaW5nIHVyaSA9IG0uZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBfdHlwZSA9IFFOYW1lSGVscGVyLmZvckxOUyhmaXJzdHBhcnQuc3Vic3RyaW5nKGZpcnN0Y29sb24gKyAxKSwgdXJpKTsKLQotICAgICAgICBpbml0RGltZW5zaW9ucyhzLCBmaXJzdGJyYWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBFTVBUWV9JTlRfQVJSQVkgPSBuZXcgaW50WzBdOwotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIFNPQVAgMS4xKGFkdmFuY2VkKSBhcnJheSB0eXBlIHN0cmluZ3MuCi0gICAgICoKLSAgICAgKiBTaW5jZSBpbiBTT0FQIDEuMShhZHZhbmNlZCkgdGhlIGRpbWVuc2lvbiBzcGVjaWZpY2F0aW9uIGlzIHNlcGFyYXRlZCBmcm9tIHRoZQotICAgICAqIFFOYW1lIGZvciB0aGUgdW5kZXJseWluZyB0eXBlLCB0aGVzZSBhcmUgcGFzc2VkIGluIHNlcGFyYXRlCi0gICAgICogYXJndW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBkaW1lbnNpb25zKQotICAgIHsKLSAgICAgICAgaW50IGZpcnN0YnJhY2UgPSBkaW1lbnNpb25zLmluZGV4T2YoJ1snKTsKLSAgICAgICAgaWYgKGZpcnN0YnJhY2UgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdHlwZSA9IG5hbWU7Ci0gICAgICAgICAgICBfcmFua3MgPSBFTVBUWV9JTlRfQVJSQVk7Ci0gICAgICAgICAgICBkaW1lbnNpb25zID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShkaW1lbnNpb25zLCBYbWxXaGl0ZXNwYWNlLldTX0NPTExBUFNFKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRpbVN0cmluZ3MgPSBkaW1lbnNpb25zLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpbVN0cmluZyA9IGRpbVN0cmluZ3NbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGRpbVN0cmluZy5lcXVhbHMoIioiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9kaW1lbnNpb25zW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIC8vIF9oYXNJbmRldGVybWluYXRlRGltZW5zaW9ucyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfZGltZW5zaW9uc1tpXSA9IEludGVnZXIucGFyc2VJbnQoZGltU3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfdHlwZSA9IG5hbWU7Ci0gICAgICAgICAgICBpbml0RGltZW5zaW9ucyhkaW1lbnNpb25zLCBmaXJzdGJyYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgbmVzdGVkIFNPQVBBcnJheVR5cGUgYW5kIGEgc2V0IG9mIGRpbWVuc2lvbnMgZm9yIHRoZSBvdXRlcm1vc3QKLSAgICAgKiBhcnJheSwgY29tZXMgdXAgd2l0aCB0aGUgcmlnaHQgU09BUEFycmF5VHlwZSBmb3IgdGhlIHdob2xlIHRoaW5nLgotICAgICAqCi0gICAgICogRS5nLiwKLSAgICAgKiBOZXN0ZWQgZm9vOmJhclssXVtdWywsXVsxLDJdCi0gICAgICogRGltZW5zaW9ucyBbNiw3LDhdCi0gICAgICogUmVzdWx0IC0+IGZvbzpiYXJbLF1bXVssLF1bLF1bNiw3LDhdCi0gICAgICovCi0gICAgcHVibGljIFNPQVBBcnJheVR5cGUoU09BUEFycmF5VHlwZSBuZXN0ZWQsIGludFtdIGRpbWVuc2lvbnMpCi0gICAgewotICAgICAgICBfdHlwZSA9IG5lc3RlZC5fdHlwZTsKLQotICAgICAgICBfcmFua3MgPSBuZXcgaW50W25lc3RlZC5fcmFua3MubGVuZ3RoICsgMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3JhbmtzLCAwLCBuZXN0ZWQuX3JhbmtzLCAwLCBuZXN0ZWQuX3JhbmtzLmxlbmd0aCk7Ci0gICAgICAgIF9yYW5rc1tfcmFua3MubGVuZ3RoIC0gMV0gPSBuZXN0ZWQuX2RpbWVuc2lvbnMubGVuZ3RoOwotCi0gICAgICAgIF9kaW1lbnNpb25zID0gbmV3IGludFtkaW1lbnNpb25zLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGltZW5zaW9ucywgMCwgX2RpbWVuc2lvbnMsIDAsIGRpbWVuc2lvbnMubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGRpbWVuc2lvbnMgYmFzZWQgb24gU09BUDExIHBhcnNlZCBkaW1lbnNpb24gc3Vic3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREaW1lbnNpb25zKFN0cmluZyBzLCBpbnQgZmlyc3RicmFjZSkKLSAgICB7Ci0gICAgICAgIExpc3QgYnJhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgbGFzdGJyYWNlID0gLTE7Ci0gICAgICAgIGZvciAoaW50IGkgPSBmaXJzdGJyYWNlOyBpID49IDA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdGJyYWNlID0gcy5pbmRleE9mKCddJywgaSk7Ci0gICAgICAgICAgICBpZiAobGFzdGJyYWNlIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBicmFjZXMuYWRkKHMuc3Vic3RyaW5nKGkgKyAxLCBsYXN0YnJhY2UpKTsKLSAgICAgICAgICAgIGkgPSBzLmluZGV4T2YoJ1snLCBsYXN0YnJhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRyYWlsZXIgPSBzLnN1YnN0cmluZyhsYXN0YnJhY2UgKyAxKTsKLSAgICAgICAgaWYgKCFYbWxXaGl0ZXNwYWNlLmlzQWxsU3BhY2UodHJhaWxlcikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgaW4gcmFuayBhcnJheQotICAgICAgICBfcmFua3MgPSBuZXcgaW50W2JyYWNlcy5zaXplKCkgLSAxXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmFua3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21tYXMgPSAoU3RyaW5nKWJyYWNlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpbnQgY29tbWFjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbW1hcy5sZW5ndGgoKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjb21tYXMuY2hhckF0KGopOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1hY291bnQgKz0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghWG1sV2hpdGVzcGFjZS5pc1NwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3JhbmtzW2ldID0gY29tbWFjb3VudCArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5hbGx5IGZpbGwgaW4gZGltZW5zaW9uIGFycmF5Ci0gICAgICAgIF9kaW1lbnNpb25zID0gaW50ZXJuYWxQYXJzZUNvbW1hSW50U3RyaW5nKChTdHJpbmcpYnJhY2VzLmdldChicmFjZXMuc2l6ZSgpIC0gMSkpOwotCi0gICAgICAgIC8qCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2RpbWVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfZGltZW5zaW9uc1tpXSA8IDApCi0gICAgICAgICAgICAgICAgX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFFOYW1lIGZvciB0aGUgcmVmZXJlbmNlZCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgcmFua3MgZm9yIGlubmVyIG5lc3RlZCBhcnJheXMuCi0gICAgICogSW4gU09BUCAxLjEtYWR2YW5jZWQsIHRoaXMgaXMgYWx3YXlzIGFuIGFycmF5IG9mIGxlbmd0aCB6ZXJvLgotICAgICAqIEluIFNPQVAgMS4xLCB0aGlzIGFycmF5IHJlZmxlY3RzIHRoZSByYW5rcyBvZiBuZXN0ZWQKLSAgICAgKiBhcnJheXMuIEZvciBleGFtcGxlIGZvbzpiYXJbLF1bLCxdW11bNSw2XSB3aWxsIHByb2R1Y2UKLSAgICAgKiBhIHJhbmtzIHJlc3VsdCBvZiAyLCAzLCAxLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRbXSBnZXRSYW5rcygpCi0gICAgewotICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W19yYW5rcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9yYW5rcywgMCwgcmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBkaW1lbnNpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRbXSBnZXREaW1lbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbX2RpbWVuc2lvbnMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfZGltZW5zaW9ucywgMCwgcmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgYXJyYXkgY29udGFpbnMgbmVzdGVkIGFycmF5cy4gRXF1aXZhbGVudAotICAgICAqIHRvIChnZXRSYW5rcygpLmxlbmd0aCA+IDApLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTmVzdGVkQXJyYXlzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX3JhbmtzLmxlbmd0aCA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgYXMgYSBzdHJpbmcsIGUuZy4sIFssXVsyLDMsNF0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvYXAxMURpbWVuc2lvblN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gc29hcDExRGltZW5zaW9uU3RyaW5nKF9kaW1lbnNpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhbiBhY3R1YWwgc2V0IG9mIGRpbWVuc2lvbnMgdGhhdCBtYXkgZGlmZmVyIGZyb20KLSAgICAgKiB0aGUgZGVmYXVsdCB0aGF0IGlzIHN0b3JlZCwgb3V0cHV0cyB0aGUgc29hcCBhcnJheVR5cGUKLSAgICAgKiBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzb2FwMTFEaW1lbnNpb25TdHJpbmcoaW50W10gYWN0dWFsRGltZW5zaW9ucykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmFua3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBfcmFua3NbaV07IGorKykKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXScpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsRGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgaWYgKGFjdHVhbERpbWVuc2lvbnNbaV0gPj0gMCkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYWN0dWFsRGltZW5zaW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgU09BUEFycmF5VHlwZSgpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNPQVAgMS4yCi0gICAgICogQ29uc3RydWN0cyBhIFNPQVBBcnJheVR5cGUgZnJvbSBzb2FwLWVuYzppdGVtVHlwZSBhbmQKLSAgICAgKiBzb2FwLWVuYzphcnJheVNpemUgYXR0cmlidXRlcwotICAgICAqIEBwYXJhbSBpdGVtVHlwZSB0aGUgaXRlbSB0eXBlIFFOYW1lCi0gICAgICogQHBhcmFtIGFycmF5U2l6ZSBhIHN0cmluZyB3aXRoIGRpbWVudGlvbnMgbGlrZTogKiAzIDQKLSAgICAgKiBAcmV0dXJuIGEgU09BUEFycmF5VHlwZSB0byByZXByZXNlbnQgdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUEFycmF5VHlwZSBuZXdTb2FwMTJBcnJheShRTmFtZSBpdGVtVHlwZSwgU3RyaW5nIGFycmF5U2l6ZSkKLSAgICB7Ci0gICAgICAgIGludCBbXSByYW5rcyA9IEVNUFRZX0lOVF9BUlJBWTsKLSAgICAgICAgYXJyYXlTaXplID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShhcnJheVNpemUsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICBTdHJpbmdbXSBkaW1TdHJpbmdzID0gYXJyYXlTaXplLnNwbGl0KCIgIik7Ci0gICAgICAgIGludFtdIGRpbWVuc2lvbnMgPSBuZXcgaW50W2RpbVN0cmluZ3MubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1TdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZGltU3RyaW5nID0gZGltU3RyaW5nc1tpXTsKLSAgICAgICAgICAgIGlmIChpPT0wICYmIGRpbVN0cmluZy5lcXVhbHMoIioiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaW1lbnNpb25zW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgLy8gX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnNbaV0gPSBJbnRlZ2VyLnBhcnNlSW50KGRpbVN0cmluZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFNPQVBBcnJheVR5cGUgc290ID0gbmV3IFNPQVBBcnJheVR5cGUoKTsKLSAgICAgICAgc290Ll9yYW5rcyA9IHJhbmtzOwotICAgICAgICBzb3QuX3R5cGUgPSBpdGVtVHlwZTsKLSAgICAgICAgc290Ll9kaW1lbnNpb25zID0gZGltZW5zaW9uczsKLSAgICAgICAgcmV0dXJuIHNvdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTT0FQIDEuMgotICAgICAqIEdpdmVuIGFuIGFjdHVhbCBzZXQgb2YgZGltZW5zaW9ucyB0aGF0IG1heSBkaWZmZXIgZnJvbQotICAgICAqIHRoZSBkZWZhdWx0IHRoYXQgaXMgc3RvcmVkLCBvdXRwdXRzIHRoZSBzb2FwIGFycmF5U2l6ZQotICAgICAqIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvYXAxMkRpbWVuc2lvblN0cmluZyhpbnRbXSBhY3R1YWxEaW1lbnNpb25zKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsRGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgaWYgKGFjdHVhbERpbWVuc2lvbnNbaV0gPj0gMCkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYWN0dWFsRGltZW5zaW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFNPQVBBcnJheVR5cGUgcmVmbGVjdGluZyB0aGUgZGltZW5zaW9ucwotICAgICAqIG9mIHRoZSBuZXh0IG5lc3RlZCBhcnJheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEFycmF5VHlwZSBuZXN0ZWRBcnJheVR5cGUoKQotICAgIHsKLSAgICAgICAgaWYgKCFjb250YWluc05lc3RlZEFycmF5cygpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNPQVBBcnJheVR5cGUgcmVzdWx0ID0gbmV3IFNPQVBBcnJheVR5cGUoKTsKLQotICAgICAgICByZXN1bHQuX3R5cGUgPSBfdHlwZTsKLQotICAgICAgICByZXN1bHQuX3JhbmtzID0gbmV3IGludFtfcmFua3MubGVuZ3RoIC0gMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3JhbmtzLCAwLCByZXN1bHQuX3JhbmtzLCAwLCByZXN1bHQuX3JhbmtzLmxlbmd0aCk7Ci0KLSAgICAgICAgcmVzdWx0Ll9kaW1lbnNpb25zID0gbmV3IGludFtfcmFua3NbX3JhbmtzLmxlbmd0aCAtIDFdXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuX2RpbWVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQuX2RpbWVuc2lvbnNbaV0gPSAtMTsKLQotICAgICAgICAvLyByZXN1bHQuX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gKHJlc3VsdC5fZGltZW5zaW9ucy5sZW5ndGggPiAwKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChfdHlwZS5oYXNoQ29kZSgpICsgX2RpbWVuc2lvbnMubGVuZ3RoICsgX3JhbmtzLmxlbmd0aCArIChfZGltZW5zaW9ucy5sZW5ndGggPT0gMCA/IDAgOiBfZGltZW5zaW9uc1swXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKCFvYmouZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0Q2xhc3MoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSBzYXQgPSAoU09BUEFycmF5VHlwZSlvYmo7Ci0KLSAgICAgICAgaWYgKCFfdHlwZS5lcXVhbHMoc2F0Ll90eXBlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoX3JhbmtzLmxlbmd0aCAhPSBzYXQuX3JhbmtzLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoX2RpbWVuc2lvbnMubGVuZ3RoICE9IHNhdC5fZGltZW5zaW9ucy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmFua3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoX3JhbmtzW2ldICE9IHNhdC5fcmFua3NbaV0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2RpbWVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoX2RpbWVuc2lvbnNbaV0gIT0gc2F0Ll9kaW1lbnNpb25zW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NjaGVtYVdTRExBcnJheVR5cGUuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFhNzY5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXA7Ci0KLS8qKgotICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHNjaGVtYSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcwotICogY2FuIGJlIGNvZXJjZWQgdG8gdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIHZhbHVlCi0gKiBvZiB0aGUgd3NkbDphcnJheVR5cGUgYXR0cmlidXRlcyBvbiBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFXU0RMQXJyYXlUeXBlCi17Ci0gICAgU09BUEFycmF5VHlwZSBnZXRXU0RMQXJyYXlUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlTWFuYWdlci5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NjY3OS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKLQotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2VNYW5hZ2VyIGV4dGVuZHMgUHJlZml4UmVzb2x2ZXIKLXsKLSAgICAvKioKLSAgICAgKiBDYWxlZCB3aGVuIHRoZSB1c2VyIG5lZWRzIGEgcHJlZml4IGJ5IHdoaWNoIHRvIHJlZmVyZW5jZSBhIGdpdmVuCi0gICAgICogWG1sIG5hbWVzcGFjZS4gQSBzdWdnZXN0ZWQgcHJlZml4IGlzIHBhc3NlZCwgd2hpY2ggbWF5IGJlIG51bGw7Ci0gICAgICogdGhlIHN1Z2dlc3Rpb24gbWF5IGJlIGlnbm9yZWQuCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSAoIFN0cmluZyBuc3VyaSwgU3RyaW5nIHN1Z2dlc3RlZF9wcmVmaXggKTsKLX0KLSAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmUuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxNzNjMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBUeXBlU3RvcmUgZXh0ZW5kcyBOYW1lc3BhY2VNYW5hZ2VyCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBqdXN0IGJlZm9yZSB0aGUgcGFydCBvZiB0aGUgdHJlZQotICAgICAqIHdoZXJlIHRoaXMgVHlwZVN0b3JlIGlzIGxvY2F0ZWQuCi0gICAgICovCi0gICAgWG1sQ3Vyc29yIG5ld19jdXJzb3IoKTsKLQotICAgIC8qKgotICAgICAqLwotICAgIHZvaWQgdmFsaWRhdGUgKCBWYWxpZGF0b3JMaXN0ZW5lciB2RXZlbnRTaW5rICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNjaGVtYVR5cGVMb2FkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9yZSBjb250aWFuaW5nIHRoaXMKLSAgICAgKiBUeXBlU3RvcmUuCi0gICAgICovCi0gICAgU2NoZW1hVHlwZUxvYWRlciBnZXRfc2NoZW1hdHlwZWxvYWRlciAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgdGhlIHR5cGUgb2YgdGhpcyBzdG9yZSAocGVyaGFwcyBieSBhcHBseWluZyB4c2k6dHlwZSkgYW5kCi0gICAgICogcmV0dXJuIHRoZSBuZXcgVHlwZVN0b3JlVXNlciAob3Igb2xkIG9uZSBpZiB0aGUgbmV3IHR5cGUgaXMgbm90Ci0gICAgICogZGlmZmVyZW50KS4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVVc2VyIGNoYW5nZV90eXBlICggU2NoZW1hVHlwZSBzVHlwZSApOwotCi0gICAgLyoqCi0gICAgICogVGVsbHMgaWYgdGhpcyBzdG9yZSBpcyBhbiBhdHRyaWJ1dGUgb3Igbm90Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc19hdHRyaWJ1dGUgKCApOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB4c2k6dHlwZS4gIFJldHVybiBudWxsIGlmIG5vbmUgb3IgdGhpcyBpcyBhbiBhdHRyaWJ1dGUKLSAgICAgKiBzdG9yZS4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXRfeHNpX3R5cGUgKCApOwotCi0gICAgLyoqCi0gICAgICogQSB1c2VyIG9mIGEgVHlwZVN0b3JlIGNhbGxzIGludmFsaWRhdGVfdGV4dCB3aGVuIHRoZSB1bmRlcmx5aW5nCi0gICAgICogdmFsdWUgaGFzIGNoYW5nZWQgYW5kIGhlIHdhbnRzIHRoZSB0ZXh0c3RvcmUgdG8gY2FsbCBoaW0gYmFjayB3aXRoCi0gICAgICogYSBmZXRjaF90ZXh0IChUeXBlU3RvcmUvVHlwZVN0b3JlVXNlcnMgd29yayBpbiBwYWlycykuCi0gICAgICovCi0gICAgdm9pZCBpbnZhbGlkYXRlX3RleHQoKTsKLQotICAgIC8qKgotICAgICAqIEEgdXNlciBvZiBhIFR5cGVTdG9yZSBjYWxscyBmZXRjaF90ZXh0IHdoZW4gaGUga25vd3MgaGlzIHZpZXcKLSAgICAgKiBvZiB0aGUgdGV4dCBpcyBpbnZhbGlkIGFuZCBoZSB3YW50cyB0byBzZWUgd2hhdCB0aGUgYWN0dWFsIHRleHQKLSAgICAgKiB2YWx1ZSBpcy4KLSAgICAgKi8KLSAgICAvLyBCVUdCVUcgKGVyaWN2YXMpIDEyMTExCi0gICAgU3RyaW5nIGZldGNoX3RleHQoaW50IHdoaXRlc3BhY2VSdWxlKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IFdTX1VOU1BFQ0lGSUVEID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBXU19QUkVTRVJWRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgV1NfUkVQTEFDRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgV1NfQ09MTEFQU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogQSB1c2VyIG9mIGEgVHlwZVN0b3JlIGNhbGxzIHN0b3JlX3RleHQgd2hlbiBoZSB3YW50cyB0aGUgVHlwZVN0b3JlCi0gICAgICogdG8gcmVtZW1iZXIgdGhlIGdpdmVuIHRleHQgaW1tZWRpYXRlbHkuIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbgotICAgICAqIHRoZSB1c2VyIGhhcyBhIG5vbmNhbm9uaWNhbCAoYnV0IHZhbGlkKSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdG8gc2F2ZSwKLSAgICAgKiBidXQgZG9lc24ndCBoYXZlIHRoZSBzdG9yYWdlIGluIHdoaWNoIHRvIHNhdmUgaXQuCi0gICAgICovCi0gICAgdm9pZCBzdG9yZV90ZXh0KFN0cmluZyB0ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEhlcmUgdGhlIFR5cGVTdG9yZSBpcyByZXNwb25zaWJsZSBmb3IgbG9jYXRpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogVGhpcyBpcyBkb25lIGFzIGZvbGxvd3MKLSAgICAgKiAoMSkgZ28gdG8gdGhlIHBhcmVudCBUeXBlU3RvcmVVc2VyCi0gICAgICogKDIpIGFzayBpdCB0byBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQocW5hbWUpIChvciBfYXR0cmlidXRlXyksIGFuZCByZXR1cm4gaXQgaWYgbm90IG51bGwuCi0gICAgICogKDIpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgKiAoMykgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCi0gICAgICogKDQpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X2RlZmF1bHRfdGV4dCgpLgotICAgICAqLwotICAgIFN0cmluZyBjb21wdXRlX2RlZmF1bHRfdGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogSGVyZSB0aGUgVHlwZVN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBmaWd1cmluZyBpZiB0aGlzIHZhbHVlIGlzCi0gICAgICogbmlsbGFibGUgYW5kL29yIGZpeGVkLiBUaGlzIGlzIGRvbmUgYnkKLSAgICAgKiAoMSkgZ28gdG8gdGhlIHBhcmVudCBUeXBlU3RvcmVVc2VyCi0gICAgICogKDIpIGFzayBpdCB0byBnZXRfZWxlbWVudGZsYWdzKHFuYW1lKSwgYW5kIHJldHVybiBpdCBpZiBub3QgLTEuCi0gICAgICogKDIpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgKiAoMykgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCi0gICAgICogKDQpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X2VsZW1lbnRmbGFncygpLgotICAgICAqLwotICAgIGludCBjb21wdXRlX2ZsYWdzKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIGlmIHRoaXMgc3RvcmUgd2FzIGNyZWF0ZWQgd2l0aCB0aGlzIG9wdGlvbiB3aGljaCB0ZWxscyB0aGUgc3Ryb25nbHkgdHlwZWQKLSAgICAgKiBvYmplY3RzIHRvIHBlcmZvcm0gbGV4aWNhbCBhbmQgdmFsdWUgdmFsaWRhdGlvbiBhZnRlciBhIHNldHRlciBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiB2YWxpZGF0ZV9vbl9zZXQoKTsKLQotICAgIC8qKgotICAgICAqIEhlcmUgdGhlIHR5cGVzdG9yZSBpcyByZXNwb3NpYmxlIGZvciBmaW5kaW5nIHRoZSBzY2hlbWEgZmllbGQgZm9yCi0gICAgICogdGhpcyBvYmplY3QuIFRoaXMgaXMgZG9uZSBieQotICAgICAqICgxKSBvdGhlcndpc2UsIGdyYWIgYSBuZXcgVHlwZVN0b3JlVXNlclZpc2l0b3IgdmlhIHYgPSBwYXJlbnR1c2VyLm5ld192aXNpdG9yKCk7Ci0gICAgICogKDIpIGNhbGwgdi52aXNpdChuYW1lKSBvbiBfZXZlcnlfIGVsZW1lbnQgcW5hbWUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIG9uZSBpbiBvcmRlcgotICAgICAqICgzKSByZXR1cm4gdGhlIHJlc3VsdCBvZiB2LmdldF9zY2hlbWFfZmllbGQoKS4KLSAgICAgKi8KLSAgICBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUxMQUJMRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTREVGQVVMVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYRUQgPSA0OyAvLyBhbHdheXMgc2V0IHdpdGggSEFTREVGQVVMVAotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIG5pbGxlZCBvciB1bm5pbGxlZCwgc28gdGhlIHRleHRzdG9yZQotICAgICAqIGtub3dzIGl0IG5lZWRzIHRvIHVwZGF0ZSB0aGUgeHNpOm5pbCBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgdm9pZCBpbnZhbGlkYXRlX25pbCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFR5cGVTdG9yZSBpcyByZXBvbnNpYmxlIGZvciBkaXNjb3ZlcmluZyBpZiB0aGlzIHZhbHVlIGlzIG5pbC4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgKDEpIGdvaW5nIHRvIHRoZSBlbGVtZW50IGFuZCAoMikgZmluZGluZyB0aGUKLSAgICAgKiB4c2k6bmlsIGF0dHJpYnV0ZSBpZiBwcmVzZW50IGFuZCAoMykgcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxhcHNlZAotICAgICAqIHRleHR1YWwgdmFsdWUgaXMgZWl0aGVyIGV4YWN0bHkgdGhlIHN0cmluZyAidHJ1ZSIgb3IgIjEiLgotICAgICAqLwotICAgIGJvb2xlYW4gZmluZF9uaWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIG5hbWUgb3duZWQgYnkgdGhpcwotICAgICAqIHRleHRzdG9yZS4KLSAgICAgKi8KLSAgICBpbnQgY291bnRfZWxlbWVudHMoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIG9mIHRoZSBuYW1lcy4KLSAgICAgKi8KLSAgICBpbnQgY291bnRfZWxlbWVudHMoUU5hbWVTZXQgbmFtZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVHlwZVN0b3JlVXNlciB1bmRlcm5lYXRoIHRoZSBpdGggZWxlbWVudCB3aXRoIHRoZSBnaXZlbgotICAgICAqIG5hbWUgb3duZWQgYnkgdGhpcyB0ZXh0c3RvcmUsIG9yIG51bGwgaWYgbm9uZSB3YXMgZm91bmQuCi0gICAgICoKLSAgICAgKiBEbyBub3QgdGhyb3cgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpIGlzIGJhZCAtCi0gICAgICogcmV0dXJuIG51bGwgaW5zdGVhZC4gVGhlIHJlYXNvbiBpcyB0byBhbGxvdyB1cyB0byBmYWlsCi0gICAgICogYW5kIHRoZW4gZm9sbG93IHdpdGggYW4gYWRkX2VsZW1lbnRfZXRjIGlmIHdlIGNob29zZSB0bywKLSAgICAgKiB3aXRob3V0IHJhbmRvbWx5IGNhdGNoaW5nIGV4Y2VwdGlvbnMuCi0gICAgICovCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9lbGVtZW50Ci0gICAgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihRTmFtZSBuYW1lLCBpbnQgaSk7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIGZpbmRfZWxlbWVudF91c2VyIGJ1dCBhY2NlcHRzIGEgc2V0IG9mIG5hbWVzIHRvIHNlYXJjaCBmb3IuCi0gICAgICovCi0gICAgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihRTmFtZVNldCBuYW1lcywgaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIFR5cGVTdG9yZVVzZXJzIGNvcnJlc3BvbmRpbmcgdG8gZWxlbWVudHMgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lIG93bmVkIGJ5IHRoaXMgdHlwZXN0b3JlLCBvciB0aGUgZW1wdHkgYXJyYXkgb2YKLSAgICAgKiBUeXBlU3RvcmVVc2VycyBpZiBub25lIHdhcyBmb3VuZC4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2FsbF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hbGxfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYWxsX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2FsbF9lbGVtZW50Ci0gICAgdm9pZCBmaW5kX2FsbF9lbGVtZW50X3VzZXJzKFFOYW1lIG5hbWUsIExpc3QgZmlsbE1lVXApOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBUeXBlU3RvcmVVc2VycyBjb3JyZXNwb25kaW5nIHRvIGVsZW1lbnRzIHdpdGggb25lCi0gICAgICogb2YgdGhlIG5hbWVzIGlzIHRoZSBRTmFtZVNldC4KLSAgICAgKi8KLSAgICB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMoUU5hbWVTZXQgbmFtZSwgTGlzdCBmaWxsTWVVcCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIHBvc2l0aW9uIHRoYXQgd2lsbCBtYWtlIGl0Ci0gICAgICogdGhlIGl0aCBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgb3duZWQgYnkgdGhpcyB0ZXh0c3RvcmUsCi0gICAgICogYW5kIHJldHVybnMgYSBUeXBlU3RvcmVVc2VyIGZvciB0aGF0IGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGVsZW1lbnRzIG9mIHRoZSBnaXZlbgotICAgICAqIG5hbWUsIHlvdSBtYXkgbmVlZCB0byBjYWxsIGJhY2sgdG8gZGlzY292ZXIgdGhlIHByb3BlcgotICAgICAqIG9yZGVyaW5nIHRvIHVzZSB0byBpbnNlcnQgdGhlIGZpcnN0IG9uZS4gT3RoZXJ3aXNlLAotICAgICAqIGl0IHNob3VsZCBiZSBpbnNlcnRlZCBhZGphY2VudCB0byBleGlzdGluZyBlbGVtZW50cyB3aXRoCi0gICAgICogdGhlIHNhbWUgbmFtZS4KLSAgICAgKgotICAgICAqIFNob3VsZCB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGkgPCAwCi0gICAgICogb3IgaWYgaSA+ICMgb2YgZWx0cwotICAgICAqLwotCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zZXJ0X2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNlcnRfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGluc2VydF9lbGVtZW50Ci0gICAgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyKFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIExpa2UgdGhlIGFib3ZlIG1ldGhvZCwgZXhjZXB0IHRoYXQgaXQgaW5zZXJ0cyBhbiBlbGVtZW50IG5hbWVkCi0gICAgICogbmFtZSwgYWZ0ZXIgdGhlIGl0aCBtZW1iZXIgb2Ygc2V0LgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgaW5zZXJ0X2VsZW1lbnRfdXNlcihRTmFtZVNldCBzZXQsIFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgbGFzdCBwb3NpdGlvbiBhZGphY2VudCB0byBleGlzdGluZwotICAgICAqIGVsZW1lbnRzIG9mIHRoZSBzYW1lIG5hbWUuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGVsZW1lbnRzIG9mIHRoZSBnaXZlbgotICAgICAqIG5hbWUsIHRoZSBzYW1lIGNvbW1lbnQgYXBwbGllcyBhcyB3aXRoIGluc2VydF9lbGVtZW50X3VzZXIuCi0gICAgICovCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2VsZW1lbnQKLSAgICBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBpdGggZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqCi0gICAgICogU2hvdWxkIHRocm93IGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaSA8IDAKLSAgICAgKiBvciBpZiBpID4gIyBvZiBlbHRzLTEuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVfZWxlbWVudChRTmFtZSBuYW1lLCBpbnQgaSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBpdGggZWxlbWVudCB0aGF0IG1hdGNoZXMgbmFtZXMuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVfZWxlbWVudChRTmFtZVNldCBuYW1lcywgaW50IGkpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBUeXBlU3RvcmVVc2VyIHVuZGVybmVhdGggdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbgotICAgICAqIG5hbWUsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBhdHRyaWJ1dGUuCi0gICAgICovCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hdHRyaWJ1dGUKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2F0dHJpYnV0ZQotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYXR0cmlidXRlCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hdHRyaWJ1dGUKLSAgICBUeXBlU3RvcmVVc2VyIGZpbmRfYXR0cmlidXRlX3VzZXIoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCByZXR1cm5zIGEgVHlwZVN0b3JlVXNlcgotICAgICAqIHVuZGVybmVhdGggaXQuIFNob3VsZCB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZXJlCi0gICAgICogaXMgYWxyZWFkeSBhbiBleGlzdGluZyBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfYXR0cmlidXRlCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2F0dHJpYnV0ZQotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9hdHRyaWJ1dGUKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfYXR0cmlidXRlCi0gICAgVHlwZVN0b3JlVXNlciBhZGRfYXR0cmlidXRlX3VzZXIoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBUeXBlU3RvcmUgKGluY2x1ZGluZyBhdHRyaWJ1dGVzLAotICAgICAqIGVsZW1lbnRzLCBhbmQgbWl4ZWQgY29udGVudCksIHRvIHRoZSB0YXJnZXQgdHlwZSBzdG9yZS4KLSAgICAgKgotICAgICAqIFNQRUNJQUwgTk9URTogVGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbQotICAgICAqIHRoZSB0YXJnZXQgb3IgY29waWVkIGZyb20gdGhlIHNvcnVjZSwgYW5kIHRoZSBUeXBlU3RvcmVVc2VyIGF0dGFjaGVkCi0gICAgICogdG8gdGhpcyBUeXBlU3RvcmUgc2hvdWxkIG5vdCBiZSBkaXNjb25uZWN0ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcgb2JqLnNldChmb28pLgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgY29weV9jb250ZW50c19mcm9tKFR5cGVTdG9yZSBzb3VyY2UpOwotICAgIAotLy8gQlVHQlVHIC0gTmVlZCB0byB1c2UgdGhpcyBpbiB0aGUgZnV0dXJlCi0vLyAgICAvKioKLS8vICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFR5cGVTdG9yZSAoaW5jbHVkaW5nIGF0dHJpYnV0ZXMsCi0vLyAgICAgKiBlbGVtZXRzLCBtaXhlZCBjb250ZW50KSwgdG8gdGhlIGNoaWxkIGVsZW1lbnQgZ2l2ZW4gYnkgdGhlIGdpdmVuCi0vLyAgICAgKiBuYW1lIGFuZCBpbmRleC4gQW55IFR5cGVTdG9yZVVzZXIgdGhhdCBtaWdodCBiZSBjdXJyZW50bHkgYXR0YWNoZWQKLS8vICAgICAqIHRvIHRoYXQgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQuICBUaGUgeHNpOnR5cGUgYXR0cmlidXRlIG9mIHRoZQotLy8gICAgICogZWxlbWVudCBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gUU5hbWUgKG9yIGRlbGV0ZWQgaWYKLS8vICAgICAqIHRoZSB4c2l0eXBlIGFyZ3VtZW50IGlzIG51bGwpCi0vLyAgICAgKi8KLS8vICAgIHZvaWQgY29weV90b19lbGVtZW50KAotLy8gICAgICAgIFR5cGVTdG9yZSBzb3VyY2UsIFFOYW1lIHhzaXR5cGUsIFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5IG9mIFhtbE9iamVjdCAoaW5jbHVkaW5nCi0gICAgICogYXR0cmlidXRlcywgZWxlbWVudHMsIG1peGVkIGNvbnRlbnQpLCBvdmVyIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlCi0gICAgICogZ2l2ZW4gbmFtZSB1bmRlciB0aGUgY3VycmVudCB0eXBlc3RvcmUuCi0gICAgICoKLSAgICAgKiBUaGUgbGVuZ3RocyBvZiB0aGUgdHdvIGFycmF5cyB0aGF0IGFyZSBwYXNzZWQgc2hvdWxkIGJlIHRoZSBzYW1lLgotICAgICAqCi0gICAgICogSWYgdGhlcmUgYXJlIG4gY3VycmVudCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbmFtZSBhbmQgbSBlbGVtZW50cwotICAgICAqIGluIHRoZSBzb3VyY2UgYXJyYXksIHRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIGZvciBpbmRpdmlkdWFsIGVsZW1lbnRzOgotICAgICAqCi0gICAgICogMS4gSWYgaSA8IG4gYW5kIGkgPCBtLCB0aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgaXRoIHNvdXJjZSBhcmUgY29waWVkCi0gICAgICogICAgdW5kZXJuZWF0aCB0aGUgaXRoIGVsZW1lbnQ7IHRoZSBpdGggZWxlbWVudCBpcyBub3QgbW92ZWQsIGJ1dCBpdHMKLSAgICAgKiAgICBUeXBlU3RvcmVVc2VyIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgKiAyLiBpZiBpID49IG4gYW5kIGkgPCBtLCB0aGVuIGZpcnN0IGVub3VnaCBuZXcgZWxlbWVudHMgYXJlIGFwcGVuZGVkCi0gICAgICogICAgc28gdGhhdCB0aGVyZSBpcyBhbiBlbGVtZW50IHdpdGggdGhlIG5hbWUgaSwgdGhlbiBydWxlICMxIGlzIGZvbGxvd2VkLgotICAgICAqIDMuIGlmIGkgPj0gbSBhbmQgaSA8IG4sIHRoZW4gdGhlIGVsZW1lbnQgI2kgYW5kIGFsbCBpdHMgY29udGVudHMKLSAgICAgKiAgICBhcmUgcmVtb3ZlZC4KLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGFycmF5X3NldHRlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1lbnROYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBWaXNpdHMgYWxsIHRoZSBlbGVtZW50cyBpbW1lZGlhdGVseSwgdXNpbmcgdGhlIGdpdmVuIHZpc2l0b3IuCi0gICAgICogQSBUeXBlU3RvcmVVc2VyIGNhbGxzIHRoaXMgd2hlbiBzb21lYm9keSBoYXMgcmVxdWVzdGVkIHZhbGlkYXRpb24uCi0gICAgICovCi0gICAgdm9pZCB2aXNpdF9lbGVtZW50cyhUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IpOwotCi0gICAgWG1sT2JqZWN0W10gZXhlY19xdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb25pdG9yIG9iamVjdCwgdXNlZCBmb3Igc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIGRvYy4KLSAgICAgKi8gCi0gICAgT2JqZWN0IGdldF9yb290X29iamVjdCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGFkODUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgZ2l2ZXMgdGhlIG5vbiBkZWZhdWx0IGJpbmRpbmdzIHRvIHRha2UgY29udHJvbCBvZiBUeXBlU3RvcmVVc2VyCi0gKiBjcmVhdGlvbi4gSXQgaXMgc2V0IG9uY2UgcGVyIGRvY3VtZW50IGFuZCBjYWxsZWQgZWFjaCB0aW1lIGluc3RlYWQgb2YKLSAqIFR5cGVTdG9yZVVzZXIuY3JlYXRlRWxlbWVudFVzZXIoKSBhbmQgY3JlYXRlQXR0cmlidXRlVXNlcigpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZVN0b3JlRmFjdG9yeQotewotICAgIC8qKiBBIGtleSB0byBwYXNzIGluIGZvciB0aGUgWG1sT3B0aW9ucyB0byBzZXQgdGhlIGZhY3RvcnkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAiVHlwZVN0b3JlRmFjdG9yeSI7Ci0KLSAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZUVsZW1lbnRVc2VyKFNjaGVtYVR5cGUgcGFyZW50VHlwZSwgUU5hbWUgbmFtZSwgUU5hbWUgeHNpVHlwZSk7Ci0KLSAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZUF0dHJpYnV0ZVVzZXIoU2NoZW1hVHlwZSBwYXJlbnRUeXBlLCBRTmFtZSBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZlZjUzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIHN0cm9uZ2x5LXR5cGVkIHVzZXIgb2YgYSB0eXBlc3RvcmUuCi0gKiBBIHR5cGVzdG9yZSBpcyByZXNwb25zaWJsZSBmb3IgYWxsIHRoZSBsZXhpY2FsIGFzcGVjdHMgb2YgWE1MLCBhbmQKLSAqIGEgdHlwZXN0b3JlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbCBzdHJvbmdseS10eXBlZCBhc3BlY3RzLgotICogV2hlcmUgdGhlcmUgaXMgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdHdvIG1vZGVscywgaXQgaXMgcmVwcmVzZW50ZWQKLSAqIGJ5IHRoZSBUeXBlU3RvcmUgYW5kIFR5cGVTdG9yZVVzZXIgaW50ZXJmYWNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlU3RvcmVVc2VyCi17Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGF0dGFjaCB0byB0aGUgZ2l2ZW4gdGV4dFN0b3JlLiBXaGVuIGEgVHlwZVN0b3JlVXNlciBpcwotICAgICAqIGF0dGFjaGVkLCBpdCBpcyBwdXQgaW50byBhIGNvbXBsZXRlbHkgaW52YWxpZGF0ZWQgc3RhdGUuCi0gICAgICovCi0gICAgdm9pZCBhdHRhY2hfc3RvcmUoVHlwZVN0b3JlIHN0b3JlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjaGVtYSB0eXBlIG9mIHRoaXMgdXNlcgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgZ2V0X3NjaGVtYV90eXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZSB0byB3aGljaCB0aGlzIHR5cGVzdG9yZXVzZXIgaXMgYXR0YWNoZWQsIG9yCi0gICAgICogbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIFR5cGVTdG9yZSBnZXRfc3RvcmUoKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gaW52YWxpZGF0ZV92YWx1ZSB3aGVuIGl0cyB0ZXh0IGhhcwotICAgICAqIGNoYW5nZWQgYW5kIGl0IHRoZXJlZm9yZSBrbm93cyB0aGF0IGFueSBjYWNoZWQgdHlwZSB2YWx1ZSBpcwotICAgICAqIGludmFsaWQuIEl0IGlzIHRoZSByZXNwb25zaWJpbHR5IG9mIHRoZSB0eXBlIHRvIGNhbGwgZmV0Y2hfdGV4dAotICAgICAqIGFuZCByZXBhcnNlIG5leHQgdGltZSB0aGUgdXNlciBkb2VzIGEgc3Ryb25nbHktdHlwZWQgZ2V0LgotICAgICAqLwotICAgIHZvaWQgaW52YWxpZGF0ZV92YWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSBjYW4gY2FsbCB1c2VzX2ludmFsaWRhdGVfdmFsdWUgdG8ga25vdyBpZiBjYWxscyB0bwotICAgICAqIGludmFsaWRhdGVfdmFsdWUgd2lsbCBiZSBmcnVpdGZ1bC4gIElmIHVzZXNfaW52YWxpZGF0ZV92YWx1ZQotICAgICAqIHJldHVybnMgZmFsc2UsIGludmFsaWRhdGVfdmFsdWUgbmVlZCBuZXZlciBiZSBjYWxsZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiB1c2VzX2ludmFsaWRhdGVfdmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gYnVpbGRfdGV4dCB3aGVuIGl0IGtub3dzIGl0cyBvd24gdGV4dAotICAgICAqIGlzIGludmFsaWQgYW5kIG5lZWRzIHRvIGZpbGwgaXQgaW4uICBJZiBmb3JFeHRlcm5hbCBpcyB0cnVlLCB0aGVuCi0gICAgICogdGhlIHZhbHVlIHJldHVybmVkIHdpbGwgYmUgdXNlZCB0byByZXBsZW5pc2ggdGhlIHN0b3JlJ3MgY2FjaGUgb2YKLSAgICAgKiB0aGUgdmFsdWUuICBPdGhlcndpc2UsIHRoZSB2YWx1ZSBpcyBiZWluZyBjb21wdXRlZCBmb3IgcHVycG9zZXMKLSAgICAgKiBvdGhlciB0aGFuIHZhbGlkYXRpb24sIGxpa2UgcGVyc2lzdGVuY2UuCi0gICAgICoKLSAgICAgKiBBbHNvLCB0aGUgb25seSBtZW1iZXIgb24gVHlwZVN0b3JlIHdoaWNoIG1heSBiZSBjYWxsZWQgd2hpbGUgYnVpbGRfdGV4dAotICAgICAqIGlzIG9uIHRoZSBzdGFjayBpcyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkgd2hpY2ggbXVzdCBoYXZlIHRoZQotICAgICAqIGZvckV4dGVybmFsIHN0YXRlIHBhc3NlZCB0byBpdCBhcyBpdCBpcyBwYXNzZWQgaGVyZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgYnVpbGRfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIHdpbGwgY2FsbCBiYWNrIG9uIGJ1aWxkX25pbCBhZnRlciB5b3UndmUgY2FsbGVkIGludmFsaWRhdGVfbmlsCi0gICAgICogYW5kIGl0IG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgbmlsIHZhbHVlIGlzLgotICAgICAqLwotICAgIGJvb2xlYW4gYnVpbGRfbmlsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIGNhbGxzIGJhY2sgb24gaW52YWxpZGF0ZV9uaWx2YWx1ZSB3aGVuIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSB4c2k6bmlsIHRhZyBoYXMgY2hhbmdlZC4KLSAgICAgKi8KLSAgICB2b2lkIGludmFsaWRhdGVfbmlsdmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBvbiBpbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIgd2hlbiBhIHJlYXJyYW5nbWVudAotICAgICAqIG9mIHNpYmxpbmcgZWxlbWVudHMgdG8gdGhlIGxlZnQgb2YgdGhpcyBlbGVtZW50IG1lYW5zIHRoYXQgdGhlCi0gICAgICogbmlsbGFibGUgdmFsdWUgbWF5IG5vIGxvbmdlciBiZSB2YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIGludmFsaWRhdGVfZWxlbWVudF9vcmRlcigpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiB2YWxpZGF0ZV9ub3cgdG8gZm9yY2UgdXMgdG8gbG9vayBhdAotICAgICAqIHRoZSB0ZXh0IGlmIHdlJ3JlIGluIGFuIGludmFsaWQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZAotICAgICAqIGFuZCBleHBlY3RlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHRleHQgaXNuJ3QgdmFsaWQgZm9yCi0gICAgICogb3VyIHR5cGUuCi0gICAgICovCi0gICAgdm9pZCB2YWxpZGF0ZV9ub3coKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBvbiB0aGlzIGNhbGwgaW4gb3JkZXIgdG8gZm9yY2UgYSBkaXNjb25uZWN0LgotICAgICAqIEFmdGVyIHRoaXMgaXMgZG9uZSwgdGhlIG9iamVjdCBzaG91bGQgYmUgY29uc2lkZXJlZCBpbnZhbGlkLgotICAgICAqLwotICAgIHZvaWQgZGlzY29ubmVjdF9zdG9yZSgpOwotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gY3JlYXRlIGEgbmV3IFR5cGVTdG9yZVVzZXIgaW5zdGFuY2UgZm9yCi0gICAgICogYSBnaXZlbiBlbGVtZW50IGNoaWxkIG5hbWUgYXMgbG9uZyBhcyB5b3UgYWxzbyBwYXNzIHRoZQotICAgICAqIHFuYW1lIGNvbnRhaW5lZCBieSB0aGUgeHNpOnR5cGUgYXR0cmlidXRlLCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgd2Ugd2lsbCBpZ25vcmUgdGhlIHhzaVR5cGUgaWYgaXQgdHVybnMgb3V0IHRvIGJlIGludmFsaWQuCi0gICAgICovCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfZWxlbWVudF91c2VyKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gY3JlYXRlIGEgbmV3IFR5cGVTdG9yZVVzZXIgaW5zdGFuY2UgZm9yCi0gICAgICogYSBnaXZlbiBhdHRyaWJ1dGUgY2hpbGQsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9hdHRyaWJ1dGVfdXNlcihRTmFtZSBhdHRyTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFNjaGVtYVR5cGUgd2hpY2ggYSBjaGlsZCBlbGVtZW50IG9mIHRoaXMgbmFtZSBhbmQgeHNpOnR5cGUKLSAgICAgKiB3b3VsZCBiZS4KLSAgICAgKi8KLQotICAgIFNjaGVtYVR5cGUgZ2V0X2VsZW1lbnRfdHlwZShRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFNjaGVtYVR5cGUgd2hpY2ggYW4gYXR0cmlidXRlIG9mIHRoaXMgbmFtZSB3b3VsZCBiZS4KLSAgICAgKi8KLQotICAgIFNjaGVtYVR5cGUgZ2V0X2F0dHJpYnV0ZV90eXBlKFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZWxlbWVudCB0ZXh0LCBpZiBpdCdzIGNvbnNpc3RlbnQuIElmIGl0J3MKLSAgICAgKiBub3QgY29uc2lzdGVudCwgcmV0dXJucyBudWxsLCBhbmQgcmVxdWlyZXMgYSB2aXNpdG9yIHdhbGsuCi0gICAgICovCi0gICAgU3RyaW5nIGdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dChRTmFtZSBlbHROYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHRleHQgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aAotICAgICAqIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIFN0cmluZyBnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChRTmFtZSBhdHRyTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50ZmxhZ3MsIGlmIHRoZXkncmUgY29uc2lzdGVudC4gSWYgdGhleSdyZQotICAgICAqIG5vdCwgcmV0dXJucyAtMSwgYW5kIHJlcXVpcmVzIGEgdmlzdG9yIHdhbGsuCi0gICAgICovCi0gICAgaW50IGdldF9lbGVtZW50ZmxhZ3MoUU5hbWUgZWx0TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmbGFncyBmb3IgYW4gYXR0cmlidXRlLgotICAgICAqLwotICAgIGludCBnZXRfYXR0cmlidXRlZmxhZ3MoUU5hbWUgYXR0ck5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIGZpZWxkIGZvciBhbiBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBTY2hlbWFGaWVsZCBnZXRfYXR0cmlidXRlX2ZpZWxkKFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZmFsc2UgaWYgY2hpbGQgZWxlbWVudHMgYXJlIGluc2Vuc2l0aXZlIHRvIG9yZGVyOwotICAgICAqIGlmIGl0IHJldHVybnMgdHJ1ZSwgeW91J3JlIHJlcXVpcmVkIHRvIGNhbGwgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyCi0gICAgICogb24gY2hpbGRyZW4gdG8gdGhlIHJpZ2h0IG9mIGFueSBjaGlsZCBvcmRlciByZWFycmFuZ2VtZW50LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKTsKLQotICAgIC8qKgotICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIHJldHVybiB0aGUgZWxlbWVudCBzb3J0IG9yZGVyIHRvIHVzZSBmb3IKLSAgICAgKiBpbnNlcnRpb24gb3BlcmF0aW9ucyBpZiBuZWVkZWQuIFNldHRhYmxlIGVsZW1lbnRzIHNob3VsZAotICAgICAqIGJlIHN0b3JlZCBpbiB0aGlzIG9yZGVyIGlmIHBvc3NpYmxlLgotICAgICAqLwotICAgIFFOYW1lU2V0IGdldF9lbGVtZW50X2VuZGluZ19kZWxpbWl0ZXJzKFFOYW1lIGVsdG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gcmV0dXJuIGEgdmlzaXRvciB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZQotICAgICAqIGRlZmF1bHQgdGV4dCBhbmQgZWxlbWVudGZsYWdzIGZvciBhbiBhcmJpdHJhcnkgZWxlbWVudC4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVWaXNpdG9yIG5ld192aXNpdG9yKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVXNlckZhY3RvcnkuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTE0ZmI4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi0vKioKLSAqIEV2ZXJ5IFNjaGVtYVR5cGVMb2FkZXIgaXMgYWN0dWFsbHkgYSBUeXBlU3RvcmVVc2VyRmFjdG9yeS4KLSAqCi0gKiBUbyBnZXQgYW5kIHVzZSB0aGUgZGVmYXVsdCBUeXBlU3RvcmVVc2VyRmFjdG9yeSwgZG8gdGhlIGZvbGxvd2luZzoKLSAqCi0gKiBUeXBlU3RvcmVVc2VyIHVzZXIgPSAoKFR5cGVTdG9yZVVzZXJGYWN0b3J5KVNjaGVtYVR5cGVMb2FkZXIuZ2xvYmFsKCkpLmNyZWF0ZVR5cGVTdG9yZVVzZXIoc3RvcmUpOwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVVzZXJGYWN0b3J5Ci17Ci0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVUeXBlU3RvcmVVc2VyKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NWZhOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIFR5cGVTdG9yZSB0byB2aXNpdCBldmVyeSBlbGVtZW50IGluIG9yZGVyCi0gKiB0byBjb21wdXRlIG5pbGxhYmxlIGZsYWdzIGFuZCBkZWZhdWx0IHZhbHVlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlU3RvcmVWaXNpdG9yCi17Ci0gICAgLyoqCi0gICAgICogV2hlbiB1c2luZyBhIHZpc2l0b3IsIHlvdSBtdXN0IGNhbGwgInZpc2l0IiBvbiBldmVyeSBxbmFtZSBvZgotICAgICAqIGV2ZXJ5IGVsZW1lbnQgaW4gb3JkZXIgdXAgdG8gdGhlIG9uZSB5b3UncmUgaW50ZXJlc3RlZCBpbi4KLSAgICAgKgotICAgICAqIElmIHlvdSdyZSB1c2luZyBpdCBmb3IgdmFsaWRhdGlvbiwgY2FsbCB2aXNpdChudWxsKSBhdCB0aGUgZW5kCi0gICAgICogb2YgdGhlIHNlcXVlbmNlIG9mIGNoaWxkcmVuLiBJZiB5b3UncmUgbm90IHZhbGlkYXRpbmcsIHlvdSBjYW4KLSAgICAgKiBqdXN0IHdhbGsgYXdheSBvbmNlIHlvdSBnZXQgdGhlIGluZm8geW91IG5lZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiB2aXNpdChRTmFtZSBlbHROYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRmbGFncyBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIGludCBnZXRfZWxlbWVudGZsYWdzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0X2RlZmF1bHRfdGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIGZpZWxkIGZvciB0aGlzIGZpZWxkLgotICAgICAqLwotICAgIFNjaGVtYUZpZWxkIGdldF9zY2hlbWFfZmllbGQoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdG9yZS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTZjODcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFN0b3JlCi17Ci0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBYbWxPYmplY3QgbG9hZFhtbCAoIFN0cmluZyBzLCAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggSW5wdXRTdHJlYW0gaW4sICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggUmVhZGVyIHIsICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICBYbWxPYmplY3QgbG9hZFhtbCAoIE5vZGUgbm9kZSwgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotICAgIAotICAgIFhtbFNheEhhbmRsZXIgbmV3U2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0KLSAgICBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTIzOGEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBjb20uYmVhLngyMDAzLngwMS54bWxiZWFuLnhzZG93bmxvYWQuRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudDsKLWltcG9ydCBjb20uYmVhLngyMDAzLngwMS54bWxiZWFuLnhzZG93bmxvYWQuRG93bmxvYWRlZFNjaGVtYUVudHJ5OwotaW1wb3J0IGNvbS5iZWEueDIwMDMueDAxLnhtbGJlYW4ueHNkb3dubG9hZC5Eb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50LkRvd25sb2FkZWRTY2hlbWFzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlciBleHRlbmRzIFNjaGVtYUltcG9ydFJlc29sdmVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHRDb3B5RGlyZWN0b3J5OwotICAgIHByaXZhdGUgRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudCBfaW1wb3J0c0RvYzsKLSAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JGaWxlbmFtZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yVVJMID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JOYW1lc3BhY2UgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9yZXNvdXJjZUZvckRpZ2VzdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yQ2FjaGVFbnRyeSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgX3JlZG93bmxvYWRTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgcHJvdGVjdGVkIEJhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgLy8gY29uY3JldGUgc3ViY2xhc3NlcyBzaG91bGQgY2FsbCBpbml0IGluIHRoZWlyIGNvbnN0cnVjdG9ycwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgaWYgKGZpbGVFeGlzdHMoZ2V0SW5kZXhGaWxlbmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ltcG9ydHNEb2MgPSBEb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoIGlucHV0U3RyZWFtRm9yRmlsZSggZ2V0SW5kZXhGaWxlbmFtZSgpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pbXBvcnRzRG9jID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgeHNkb3dubG9hZC54bWw6IHBsZWFzZSBmaXggb3IgZGVsZXRlIHRoaXMgZmlsZSIpKS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKF9pbXBvcnRzRG9jID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pbXBvcnRzRG9jID0gRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAiPGRsczpkb3dubG9hZGVkLXNjaGVtYXMgeG1sbnM6ZGxzPSdodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMS94bWxiZWFuL3hzZG93bmxvYWQnIGRlZmF1bHREaXJlY3Rvcnk9JyIgKyBnZXREZWZhdWx0U2NoZW1hRGlyKCkgKyAiJy8+IgotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGVmYXVsdERpciA9IF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCkuZ2V0RGVmYXVsdERpcmVjdG9yeSgpOwotICAgICAgICBpZiAoZGVmYXVsdERpciA9PSBudWxsKQotICAgICAgICAgICAgZGVmYXVsdERpciA9IGdldERlZmF1bHRTY2hlbWFEaXIoKTs7Ci0gICAgICAgIF9kZWZhdWx0Q29weURpcmVjdG9yeSA9IGRlZmF1bHREaXI7Ci0KLSAgICAgICAgLy8gbm93IGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzCi0gICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeVtdIGVudHJpZXMgPSBfaW1wb3J0c0RvYy5nZXREb3dubG9hZGVkU2NoZW1hcygpLmdldEVudHJ5QXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVSZXNvdXJjZShlbnRyaWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQ2FjaGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gX2ltcG9ydHNEb2MubmV3SW5wdXRTdHJlYW0obmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKSk7Ci0gICAgICAgIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoaW5wdXQsIGdldEluZGV4RmlsZW5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc0FsbChib29sZWFuIHN5bmMsIGJvb2xlYW4gcmVmcmVzaCwgYm9vbGVhbiBpbXBvcnRzKQotICAgIHsKLSAgICAgICAgaWYgKHJlZnJlc2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGFsbEZpbGVuYW1lcyA9IGdldEFsbFhTREZpbGVuYW1lcygpOwotCi0gICAgICAgIGlmIChzeW5jKQotICAgICAgICAgICAgc3luY0NhY2hlV2l0aExvY2FsWHNkRmlsZXMoYWxsRmlsZW5hbWVzLCBmYWxzZSk7Ci0KLSAgICAgICAgU2NoZW1hUmVzb3VyY2VbXSBzdGFydGVycyA9IChTY2hlbWFSZXNvdXJjZVtdKQotICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVJlc291cmNlWzBdKTsKLQotICAgICAgICBpZiAocmVmcmVzaCkKLSAgICAgICAgICAgIHJlZG93bmxvYWRFbnRyaWVzKHN0YXJ0ZXJzKTsKLQotICAgICAgICBpZiAoaW1wb3J0cykKLSAgICAgICAgICAgIHJlc29sdmVJbXBvcnRzKHN0YXJ0ZXJzKTsKLQotICAgICAgICBfcmVkb3dubG9hZFNldCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2VzcyhTdHJpbmdbXSB1cmlzLCBTdHJpbmdbXSBmaWxlbmFtZXMsIGJvb2xlYW4gc3luYywgYm9vbGVhbiByZWZyZXNoLCBib29sZWFuIGltcG9ydHMpCi0gICAgewotICAgICAgICBpZiAocmVmcmVzaCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGVuYW1lcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgc3luY0NhY2hlV2l0aExvY2FsWHNkRmlsZXMoZmlsZW5hbWVzLCB0cnVlKTsKLSAgICAgICAgZWxzZSBpZiAoc3luYykKLSAgICAgICAgICAgIHN5bmNDYWNoZVdpdGhMb2NhbFhzZEZpbGVzKGdldEFsbFhTREZpbGVuYW1lcygpLCBmYWxzZSk7Ci0KLSAgICAgICAgU2V0IHN0YXJ0ZXJzZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpbG9va3VwUmVzb3VyY2UobnVsbCwgdXJpc1tpXSk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGFydGVyc2V0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yRmlsZW5hbWUuZ2V0KGZpbGVuYW1lcyk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGFydGVyc2V0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFSZXNvdXJjZVtdIHN0YXJ0ZXJzID0gKFNjaGVtYVJlc291cmNlW10pCi0gICAgICAgICAgICAgICBzdGFydGVyc2V0LnRvQXJyYXkobmV3IFNjaGVtYVJlc291cmNlWzBdKTsKLQotICAgICAgICBpZiAocmVmcmVzaCkKLSAgICAgICAgICAgIHJlZG93bmxvYWRFbnRyaWVzKHN0YXJ0ZXJzKTsKLQotICAgICAgICBpZiAoaW1wb3J0cykKLSAgICAgICAgICAgIHJlc29sdmVJbXBvcnRzKHN0YXJ0ZXJzKTsKLQotICAgICAgICBfcmVkb3dubG9hZFNldCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBpdGVtcyB0byB0aGUgY2FjaGUgdGhhdCBwb2ludCB0byBuZXcgZmlsZXMgdGhhdCBhcmVuJ3QKLSAgICAgKiBkZXNjcmliZWQgaW4gdGhlIGNhY2hlLCBhbmQgb3B0aW9uYWxseSBkZWxldGVzIG9sZCBlbnRyaWVzLgotICAgICAqCi0gICAgICogSWYgYW4gb2xkIGZpbGUgaXMgZ29uZSBhbmQgYSBuZXcgZmlsZSBpcwotICAgICAqIGZvdW5kIHdpdGggZXhhY3RseSB0aGUgc2FtZSBjb250ZW50cywgdGhlIGNhY2hlIGVudHJ5IGlzIG1vdmVkCi0gICAgICogdG8gcG9pbnQgdG8gdGhlIG5ldyBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bmNDYWNoZVdpdGhMb2NhbFhzZEZpbGVzKFN0cmluZ1tdIGZpbGVuYW1lcywgYm9vbGVhbiBkZWxldGVPbmx5TWVudGlvbmVkKQotICAgIHsKLSAgICAgICAgU2V0IHNlZW5SZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgdmFuaXNoZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlbmFtZXNbaV07Ci0KLSAgICAgICAgICAgIC8vIGZpcnN0LCBpZiB0aGUgZmlsZW5hbWUgbWF0Y2hlcyBleGFjdGx5LCB0cnVzdCB0aGUgZmlsZW5hbWUKLSAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvckZpbGVuYW1lLmdldChmaWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0cyhmaWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHNlZW5SZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHZhbmlzaGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5ldyBmaWxlIHRoYXQgaXMgbm90IGluIHRoZSBpbmRleD8KLSAgICAgICAgICAgIC8vIG5vdCBpZiB0aGUgZGlnZXN0IGlzIGtub3duIHRvIHRoZSBpbmRleCBhbmQgdGhlIG9yaWdpbmFsIGZpbGUgaXMgZ29uZSAtIHRoYXQncyBhIHJlbmFtZSEKLSAgICAgICAgICAgIFN0cmluZyBkaWdlc3QgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlnZXN0ID0gc2hhRGlnZXN0Rm9yRmlsZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yRGlnZXN0LmdldChkaWdlc3QpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9sZEZpbGVuYW1lID0gcmVzb3VyY2UuZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3RzKG9sZEZpbGVuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRmlsZSAiICsgZmlsZW5hbWUgKyAiIGlzIGEgcmVuYW1lIG9mICIgKyBvbGRGaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc291cmNlRm9yRmlsZW5hbWUuZ2V0KG9sZEZpbGVuYW1lKSA9PSByZXNvdXJjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JGaWxlbmFtZS5yZW1vdmUob2xkRmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXNvdXJjZUZvckZpbGVuYW1lLmNvbnRhaW5zS2V5KGZpbGVuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JGaWxlbmFtZS5wdXQoZmlsZW5hbWUsIHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdW5hYmxlIHRvIHJlYWQgZGlnZXN0Li4uIG5vIHByb2JsZW0sIGlnbm9yZSB0aGVuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9rLCB0aGlzIHJlYWxseSBpcyBhIG5ldyBYU0QgZmlsZSB0aGVuLCBvZiB1bmtub3duIFVSTCBvcmlnaW4KLSAgICAgICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeSBuZXdFbnRyeSA9IGFkZE5ld0VudHJ5KCk7Ci0gICAgICAgICAgICBuZXdFbnRyeS5zZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICB3YXJuaW5nKCJDYWNoaW5nIGluZm9ybWF0aW9uIG9uIG5ldyBsb2NhbCBmaWxlICIgKyBmaWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGlnZXN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbmV3RW50cnkuc2V0U2hhMShkaWdlc3QpOwotCi0gICAgICAgICAgICBzZWVuUmVzb3VyY2VzLmFkZCh1cGRhdGVSZXNvdXJjZShuZXdFbnRyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlbGV0ZU9ubHlNZW50aW9uZWQpCi0gICAgICAgICAgICBkZWxldGVSZXNvdXJjZXNJblNldCh2YW5pc2hlZFJlc291cmNlcywgdHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlbGV0ZVJlc291cmNlc0luU2V0KHNlZW5SZXNvdXJjZXMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIGV2ZXJ5IGVudHJ5IGFuZCByZWZldGNoZXMgaXQgZnJvbSBpdHMgcHJpbWFyeSBVUkwsCi0gICAgICogaWYga25vd24uICBSZXBsYWNlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgaWYgdGhlIGRhdGEgaXMgZGlmZmVyZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWRvd25sb2FkRW50cmllcyhTY2hlbWFSZXNvdXJjZVtdIHJlc291cmNlcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRvd25sb2FkUmVzb3VyY2UocmVzb3VyY2VzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVSZXNvdXJjZXNJblNldChTZXQgc2VlblJlc291cmNlcywgYm9vbGVhbiBzZXRUb0RlbGV0ZSkKLSAgICB7Ci0gICAgICAgIFNldCBzZWVuQ2FjaGVFbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2VlblJlc291cmNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHNlZW5DYWNoZUVudHJpZXMuYWRkKHJlc291cmNlLl9jYWNoZUVudHJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIERvd25sb2FkZWRTY2hlbWFzIGRvd25sb2FkZWRTY2hlbWFzID0gX2ltcG9ydHNEb2MuZ2V0RG93bmxvYWRlZFNjaGVtYXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb3dubG9hZGVkU2NoZW1hcy5zaXplT2ZFbnRyeUFycmF5KCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5IGNhY2hlRW50cnkgPSBkb3dubG9hZGVkU2NoZW1hcy5nZXRFbnRyeUFycmF5KGkpOwotCi0gICAgICAgICAgICBpZiAoc2VlbkNhY2hlRW50cmllcy5jb250YWlucyhjYWNoZUVudHJ5KSA9PSBzZXRUb0RlbGV0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JDYWNoZUVudHJ5LmdldChjYWNoZUVudHJ5KTsKLSAgICAgICAgICAgICAgICB3YXJuaW5nKCJSZW1vdmluZyBvYnNvbGV0ZSBjYWNoZSBlbnRyeSBmb3IgIiArIHJlc291cmNlLmdldEZpbGVuYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JDYWNoZUVudHJ5LnJlbW92ZShjYWNoZUVudHJ5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gX3Jlc291cmNlRm9yRmlsZW5hbWUuZ2V0KHJlc291cmNlLmdldEZpbGVuYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucmVtb3ZlKHJlc291cmNlLmdldEZpbGVuYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBfcmVzb3VyY2VGb3JEaWdlc3QuZ2V0KHJlc291cmNlLmdldFNoYTEoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JEaWdlc3QucmVtb3ZlKHJlc291cmNlLmdldFNoYTEoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IF9yZXNvdXJjZUZvck5hbWVzcGFjZS5nZXQocmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yTmFtZXNwYWNlLnJlbW92ZShyZXNvdXJjZS5nZXROYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRmluYWxseSwgYW55IG9yIGFsbCBVUklzCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHVybHMgPSByZXNvdXJjZS5nZXRTY2hlbWFMb2NhdGlvbkFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdXJscy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IF9yZXNvdXJjZUZvclVSTC5nZXQodXJsc1tqXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yVVJMLnJlbW92ZSh1cmxzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRvd25sb2FkZWRTY2hlbWFzLnJlbW92ZUVudHJ5KGkpOwotICAgICAgICAgICAgICAgIGkgLT0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2NoZW1hUmVzb3VyY2UgdXBkYXRlUmVzb3VyY2UoRG93bmxvYWRlZFNjaGVtYUVudHJ5IGVudHJ5KQotICAgIHsKLSAgICAgICAgLy8gVGhlIGZpbGUKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZW50cnkuZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgaWYgKGZpbGVuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBTY2hlbWFSZXNvdXJjZShlbnRyeSk7Ci0gICAgICAgIF9yZXNvdXJjZUZvckNhY2hlRW50cnkucHV0KGVudHJ5LCByZXNvdXJjZSk7Ci0KLSAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JGaWxlbmFtZS5jb250YWluc0tleShmaWxlbmFtZSkpCi0gICAgICAgICAgICBfcmVzb3VyY2VGb3JGaWxlbmFtZS5wdXQoZmlsZW5hbWUsIHJlc291cmNlKTsKLQotICAgICAgICAvLyBUaGUgZGlnZXN0Ci0gICAgICAgIFN0cmluZyBkaWdlc3QgPSByZXNvdXJjZS5nZXRTaGExKCk7Ci0gICAgICAgIGlmIChkaWdlc3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JEaWdlc3QuY29udGFpbnNLZXkoZGlnZXN0KSkKLSAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JEaWdlc3QucHV0KGRpZ2VzdCwgcmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTmV4dCwgdGhlIG5hbWVzcGFjZQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JOYW1lc3BhY2UuY29udGFpbnNLZXkobmFtZXNwYWNlKSkKLSAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucHV0KG5hbWVzcGFjZSwgcmVzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluYWxseSwgYW55IG9yIGFsbCBVUklzCi0gICAgICAgIFN0cmluZ1tdIHVybHMgPSByZXNvdXJjZS5nZXRTY2hlbWFMb2NhdGlvbkFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdXJscy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JVUkwuY29udGFpbnNLZXkodXJsc1tqXSkpCi0gICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yVVJMLnB1dCh1cmxzW2pdLCByZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGlnZXN0SW5wdXRTdHJlYW0gZGlnZXN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgewotICAgICAgICBNZXNzYWdlRGlnZXN0IHNoYTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNoYSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBzdHIgPSBuZXcgRGlnZXN0SW5wdXRTdHJlYW0oaW5wdXQsIHNoYSk7Ci0KLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERvd25sb2FkZWRTY2hlbWFFbnRyeSBhZGROZXdFbnRyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ltcG9ydHNEb2MuZ2V0RG93bmxvYWRlZFNjaGVtYXMoKS5hZGROZXdFbnRyeSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2NoZW1hUmVzb3VyY2UgaW1wbGVtZW50cyBTY2hlbWFJbXBvcnRSZXNvbHZlci5TY2hlbWFSZXNvdXJjZQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UoRG93bmxvYWRlZFNjaGVtYUVudHJ5IGVudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBfY2FjaGVFbnRyeSA9IGVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5IF9jYWNoZUVudHJ5OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NhY2hlRW50cnkuc2V0RmlsZW5hbWUoZmlsZW5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXRGaWxlbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWZpbGVFeGlzdHMoZ2V0RmlsZW5hbWUoKSkpCi0gICAgICAgICAgICAgICAgcmVkb3dubG9hZFJlc291cmNlKHRoaXMpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShpbnB1dFN0cmVhbUZvckZpbGUoZ2V0RmlsZW5hbWUoKSkpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyByZXR1cm4gbnVsbCBpZiBfYW55XyBwcm9ibGVtcyByZWFkaW5nIHNjaGVtYSBmaWxlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNoYTEoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NhY2hlRW50cnkuZ2V0U2hhMSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NhY2hlRW50cnkuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NhY2hlRW50cnkuc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYUxvY2F0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jYWNoZUVudHJ5LnNpemVPZlNjaGVtYUxvY2F0aW9uQXJyYXkoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldFNjaGVtYUxvY2F0aW9uQXJyYXkoMCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTY2hlbWFMb2NhdGlvbkFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldFNjaGVtYUxvY2F0aW9uQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RmlsZW5hbWUoKS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzID09IG9iaiB8fCBnZXRGaWxlbmFtZSgpLmVxdWFscygoKFNjaGVtYVJlc291cmNlKW9iaikuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFMb2NhdGlvbihTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jYWNoZUVudHJ5LmFkZFNjaGVtYUxvY2F0aW9uKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBJbXBvcnRMb2FkZXIgd2lzaGVzIHRvIHJlc29sdmUgdGhlCi0gICAgICogZ2l2ZW4gaW1wb3J0LiAgU2hvdWxkIHJldHVybiBhIFNjaGVtYVJlc291cmNlIHdob3NlCi0gICAgICogImVxdWFscyIgcmVsYXRpb25zaGlwIHJldmVhbHMgd2hlbiBhIFNjaGVtYVJlc291cmNlIGlzCi0gICAgICogZHVwbGljYXRlZCBhbmQgc2hvdWxkbid0IGJlIGV4YW1pbmVkIGFnYWluLgotICAgICAqCi0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSByZXNvdXJjZSByZWZlcmVuY2Ugc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUltcG9ydFJlc29sdmVyLlNjaGVtYVJlc291cmNlIGxvb2t1cFJlc291cmNlKFN0cmluZyBuc1VSSSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzdWx0ID0gZmV0Y2hGcm9tQ2FjaGUobnNVUkksIHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3JlZG93bmxvYWRTZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWRvd25sb2FkUmVzb3VyY2UocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd2FybmluZygiTm8gY2FjaGVkIHNjaGVtYSBmb3IgbmFtZXNwYWNlICciICsgbnNVUkkgKyAiJywgYW5kIG5vIHVybCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gY29weU9ySWRlbnRpZnlEdXBsaWNhdGVVUkwoc2NoZW1hTG9jYXRpb24sIG5zVVJJKTsKLSAgICAgICAgaWYgKF9yZWRvd25sb2FkU2V0ICE9IG51bGwpCi0gICAgICAgICAgICBfcmVkb3dubG9hZFNldC5hZGQocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVJlc291cmNlIGZldGNoRnJvbUNhY2hlKFN0cmluZyBuc1VSSSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzdWx0OwotCi0gICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yVVJMLmdldChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuc1VSSSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yTmFtZXNwYWNlLmdldChuc1VSSSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUZpbGVuYW1lRm9yVVJJKFN0cmluZyBzY2hlbWFMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhbEZpbGVuYW1lID0gbmV3IFVSSSggc2NoZW1hTG9jYXRpb24gKS5nZXRSYXdQYXRoKCk7Ci0gICAgICAgIGludCBpID0gbG9jYWxGaWxlbmFtZS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICBpZiAoaSA+PSAwKQotICAgICAgICAgICAgbG9jYWxGaWxlbmFtZSA9IGxvY2FsRmlsZW5hbWUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgaWYgKGxvY2FsRmlsZW5hbWUuZW5kc1dpdGgoIi54c2QiKSkKLSAgICAgICAgICAgIGxvY2FsRmlsZW5hbWUgPSBsb2NhbEZpbGVuYW1lLnN1YnN0cmluZygwLCBsb2NhbEZpbGVuYW1lLmxlbmd0aCgpIC0gNCk7Ci0gICAgICAgIGlmIChsb2NhbEZpbGVuYW1lLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICBsb2NhbEZpbGVuYW1lID0gInNjaGVtYSI7Ci0KLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG90aGVyIHVuc2FmZSBjaGFyYWN0ZXJzIGZvciBmaWxlbmFtZXM/Ci0KLSAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZUZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZTsKLSAgICAgICAgaW50IHN1ZmZpeCA9IDE7Ci0gICAgICAgIHdoaWxlIChzdWZmaXggPCAxMDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgY2FuZGlkYXRlID0gX2RlZmF1bHRDb3B5RGlyZWN0b3J5ICsgIi8iICsgY2FuZGlkYXRlRmlsZW5hbWUgKyAiLnhzZCI7Ci0gICAgICAgICAgICBpZiAoIWZpbGVFeGlzdHMoY2FuZGlkYXRlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlOwotICAgICAgICAgICAgc3VmZml4ICs9IDE7Ci0gICAgICAgICAgICBjYW5kaWRhdGVGaWxlbmFtZSA9IGxvY2FsRmlsZW5hbWUgKyBzdWZmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlByb2JsZW0gd2l0aCBmaWxlbmFtZSAiICsgbG9jYWxGaWxlbmFtZSArICIueHNkIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZG93bmxvYWRSZXNvdXJjZShTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVkb3dubG9hZFNldCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3JlZG93bmxvYWRTZXQuY29udGFpbnMocmVzb3VyY2UpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSByZXNvdXJjZS5nZXRGaWxlbmFtZSgpOwotICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSByZXNvdXJjZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICBTdHJpbmcgZGlnZXN0ID0gbnVsbDsKLQotICAgICAgICAvLyBub3RoaW5nIHRvIGRvPwotICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCB8fCBmaWxlbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCBzY2hlbWFMb2NhdGlvbiApOwotICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJCRUEgWE1MIEJlYW5zLzEuMCIpOwotICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyoiKTsKLSAgICAgICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGlucHV0ID0gZGlnZXN0SW5wdXRTdHJlYW0oY29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIElPVXRpbC5jb3B5Q29tcGxldGVseShpbnB1dCwgYnVmZmVyKTsKLSAgICAgICAgICAgIGRpZ2VzdCA9IEhleEJpbi5ieXRlc1RvU3RyaW5nKGlucHV0LmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJDb3VsZCBub3QgY29weSByZW1vdGUgcmVzb3VyY2UgIiArIHNjaGVtYUxvY2F0aW9uICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpZ2VzdC5lcXVhbHMocmVzb3VyY2UuZ2V0U2hhMSgpKSAmJiBmaWxlRXhpc3RzKGZpbGVuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgd2FybmluZygiUmVzb3VyY2UgIiArIGZpbGVuYW1lICsgIiBpcyB1bmNoYW5nZWQgZnJvbSAiICsgc2NoZW1hTG9jYXRpb24gKyAiLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNvdXJjZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICB3cml0ZUlucHV0U3RyZWFtVG9GaWxlKHNvdXJjZSwgZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAiICsgZmlsZW5hbWUgKyAiIGZvciAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3YXJuaW5nKCJSZWZyZXNoZWQgIiArIGZpbGVuYW1lICsgIiBmcm9tICIgKyBzY2hlbWFMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFSZXNvdXJjZSBjb3B5T3JJZGVudGlmeUR1cGxpY2F0ZVVSTChTdHJpbmcgc2NoZW1hTG9jYXRpb24sIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICBTdHJpbmcgdGFyZ2V0RmlsZW5hbWU7Ci0gICAgICAgIFN0cmluZyBkaWdlc3Q7Ci0gICAgICAgIFNjaGVtYVJlc291cmNlIHJlc3VsdDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0RmlsZW5hbWUgPSB1bmlxdWVGaWxlbmFtZUZvclVSSShzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJJbnZhbGlkIFVSSSAnIiArIHNjaGVtYUxvY2F0aW9uICsgIic6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGxvY2FsIGZpbGUgZm9yICIgKyBzY2hlbWFMb2NhdGlvbiArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCBzY2hlbWFMb2NhdGlvbiApOwotICAgICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gaW5wdXQgPSBkaWdlc3RJbnB1dFN0cmVhbSh1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgICAgIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoaW5wdXQsIHRhcmdldEZpbGVuYW1lKTsKLSAgICAgICAgICAgIGRpZ2VzdCA9IEhleEJpbi5ieXRlc1RvU3RyaW5nKGlucHV0LmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJDb3VsZCBub3QgY29weSByZW1vdGUgcmVzb3VyY2UgIiArIHNjaGVtYUxvY2F0aW9uICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yRGlnZXN0LmdldChkaWdlc3QpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZUZpbGUodGFyZ2V0RmlsZW5hbWUpOwotICAgICAgICAgICAgcmVzdWx0LmFkZFNjaGVtYUxvY2F0aW9uKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yVVJMLmNvbnRhaW5zS2V5KHNjaGVtYUxvY2F0aW9uKSkKLSAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JVUkwucHV0KHNjaGVtYUxvY2F0aW9uLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHdhcm5pbmcoIkRvd25sb2FkZWQgIiArIHNjaGVtYUxvY2F0aW9uICsgIiB0byAiICsgdGFyZ2V0RmlsZW5hbWUpOwotCi0gICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeSBuZXdFbnRyeSA9IGFkZE5ld0VudHJ5KCk7Ci0gICAgICAgIG5ld0VudHJ5LnNldEZpbGVuYW1lKHRhcmdldEZpbGVuYW1lKTsKLSAgICAgICAgbmV3RW50cnkuc2V0U2hhMShkaWdlc3QpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICBuZXdFbnRyeS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgbmV3RW50cnkuYWRkU2NoZW1hTG9jYXRpb24oc2NoZW1hTG9jYXRpb24pOwotICAgICAgICByZXR1cm4gdXBkYXRlUmVzb3VyY2UobmV3RW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYWN0dWFsIG5hbWVzcGFjZSBpbiB0aGUgdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVwb3J0QWN0dWFsTmFtZXNwYWNlKFNjaGVtYUltcG9ydFJlc29sdmVyLlNjaGVtYVJlc291cmNlIHJyZXNvdXJjZSwgU3RyaW5nIGFjdHVhbE5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKXJyZXNvdXJjZTsKLSAgICAgICAgU3RyaW5nIG9sZE5hbWVzcGFjZSA9IHJlc291cmNlLmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAob2xkTmFtZXNwYWNlICE9IG51bGwgJiYgX3Jlc291cmNlRm9yTmFtZXNwYWNlLmdldChvbGROYW1lc3BhY2UpID09IHJlc291cmNlKQotICAgICAgICAgICAgX3Jlc291cmNlRm9yTmFtZXNwYWNlLnJlbW92ZShvbGROYW1lc3BhY2UpOwotICAgICAgICBpZiAoIV9yZXNvdXJjZUZvck5hbWVzcGFjZS5jb250YWluc0tleShhY3R1YWxOYW1lc3BhY2UpKQotICAgICAgICAgICAgX3Jlc291cmNlRm9yTmFtZXNwYWNlLnB1dChhY3R1YWxOYW1lc3BhY2UsIHJlc291cmNlKTsKLSAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZXNwYWNlKGFjdHVhbE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2hhRGlnZXN0Rm9yRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gc3RyID0gZGlnZXN0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW1Gb3JGaWxlKGZpbGVuYW1lKSk7Ci0KLSAgICAgICAgYnl0ZVtdIGR1bW15ID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpID4gMDsgaSA9IHN0ci5yZWFkKGR1bW15KSk7Ci0KLSAgICAgICAgc3RyLmNsb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIEhleEJpbi5ieXRlc1RvU3RyaW5nKHN0ci5nZXRNZXNzYWdlRGlnZXN0KCkuZGlnZXN0KCkpOwotICAgIH0KLQotICAgIC8vIFNPTUUgTUVUSE9EUyBUTyBPVkVSUklERSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGV4RmlsZW5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIuL3hzZG93bmxvYWQueG1sIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTY2hlbWFEaXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIuL3NjaGVtYSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgZGlhZ25vc3RpYyBtZXNzYWdlcyBzdWNoIGFzICJkb3dubG9hZGluZyBYIHRvIGZpbGUgWSIuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgd2FybmluZyhTdHJpbmcgbXNnKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXhpc3RzLiAgVGhlIGZpbGVuYW1lcwotICAgICAqIGFyZSBvZiB0aGUgZm9ybSAiL2Zvby9iYXIvemVlLnhzZCIgYW5kIHNob3VsZCBiZSBjb25zdHJ1ZWQKLSAgICAgKiBhcyByb290ZWQgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgZmlsZW5hbWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gZmlsZW5hbWUgYXMgYW4gSW5wdXRTdHJlYW0uCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIElucHV0U3RyZWFtIGlucHV0U3RyZWFtRm9yRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBlbnRpcmUgZmlsZSBpbiBvbmUgc3RlcC4gIEFuIElucHV0U3RyZWFtIGlzIHBhc3NlZCBhbmQKLSAgICAgKiBjb3BpZWQgdG8gdGhlIGZpbGUuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbnB1dFN0cmVhbVRvRmlsZShJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGEgZmlsZS4gIFNvbWV0aW1lcyBpbW1lZGlhdGVseSBhZnRlciB3cml0aW5nIGEgbmV3IGZpbGUKLSAgICAgKiB3ZSBub3RpY2UgdGhhdCBpdCdzIGV4YWN0bHkgdGhlIHNhbWUgYXMgYW4gZXhpc3RpbmcgZmlsZSBhbmQKLSAgICAgKiB3ZSBkZWxldGUgaXQuIFdlIG5ldmVyIGRlbGV0ZSBhIGZpbGUgdGhhdCB3YXMgZ2l2ZW4gdG8gdXMKLSAgICAgKiBieSB0aGUgdXNlci4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkZWxldGVGaWxlKFN0cmluZyBmaWxlbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIFhTRCBmaWxlc25hbWVzIGluIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXRBbGxYU0RGaWxlbmFtZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db2RlR2VuVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWM3MzcwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENvZGVHZW5VdGlsCi17Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NRU1fU1RBUlQgPSAiOG0iOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUVNX01BWCA9ICIyNTZtIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0NPTVBJTEVSID0gImphdmFjIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0pBUiA9ICJqYXIiOwotCi0gICAgLy93b3JrYXJvdW5kIGZvciBTdW4gYnVnICMgNDcyMzcyNgotICAgIHB1YmxpYyBzdGF0aWMgVVJJIHJlc29sdmUoVVJJIGJhc2UsIFVSSSBjaGlsZCkKLSAgICB7Ci0gICAgICAgIFVSSSBydXJpID0gYmFzZS5yZXNvbHZlKGNoaWxkKTsKLSAgICAgICAgCi0gICAgICAgIC8vZml4IHVwIG5vcm1hbGl6YXRpb24gYnVnCi0gICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHJ1cmkuZ2V0U2NoZW1lKCkpICYmICEgY2hpbGQuZXF1YWxzKHJ1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmFzZS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLy8iKSAmJiAhcnVyaS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLy8iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICIvLy8iLmNvbmNhdChydXJpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydXJpID0gbmV3IFVSSSgiZmlsZSIsIG51bGwsIHBhdGgsIHJ1cmkuZ2V0UXVlcnkoKSwgcnVyaS5nZXRGcmFnbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIHVyaXMpCi0gICAgICAgICAgICAgICAge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnVyaTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgYWRkQWxsSmF2YUZpbGVzKExpc3Qgc3JjRmlsZXMsIExpc3QgYXJncykKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNyY0ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFmLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJncy5hZGQocXVvdGVBbmRFc2NhcGVGaWxlbmFtZShmLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbnNpZGUgPSAoQXJyYXlzLmFzTGlzdChmLmxpc3RGaWxlcygKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVGaWx0ZXIoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB8fCBmaWxlLmlzRGlyZWN0b3J5KCk7IH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICkpKTsKLSAgICAgICAgICAgICAgICBhZGRBbGxKYXZhRmlsZXMoaW5zaWRlLCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBxdW90ZUFuZEVzY2FwZUZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIGRvbid0IHF1b3RlIGlmIHRoZXJlJ3Mgbm8gc3BhY2UKLSAgICAgICAgaWYgKGZpbGVuYW1lLmluZGV4T2YoIiAiKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0KLSAgICAgICAgLy8gYml6YXJyZS4gIGphdmFjIGV4cGVjdHMgYmFja3NsYXNoIGVzY2FwaW5nIGlmIHdlIHF1b3RlIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgLy8gYml6YXJyZSBhbHNvLiAgcmVwbGFjZUFsbCBleHBlY3RzIHJlcGxhY2VtZW50IGJhY2tzbGFzaGVzIHRvIGJlIGRvdWJsZSBlc2NhcGVkLgotICAgICAgICByZXR1cm4gIlwiIiArIGZpbGVuYW1lLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFxcXFxcXFwiKSArICJcIiI7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIHF1b3RlTm9Fc2NhcGVGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICAvLyBkb24ndCBxdW90ZSBpZiB0aGVyZSdzIG5vIHNwYWNlLCBhbmQgZG9uJ3QgcXVvdGUgb24gbGludXgKLSAgICAgICAgaWYgKGZpbGVuYW1lLmluZGV4T2YoIiAiKSA8IDAgfHwgRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJykKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZTsKLQotICAgICAgICByZXR1cm4gIlwiIiArIGZpbGVuYW1lICsgIlwiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGphdmFjIG9uIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGluIG9yZGVyIHRvIHR1cm4gdGhlbQotICAgICAqIGludG8gYmluYXJ5IGZpbGVzIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGhpcyB3aWxsIHJldHVybiBhIGxpc3Qgb2YKLSAgICAgKiA8Y29kZT5HZW5GaWxlPC9jb2RlPnMgZm9yIGFsbCBvZiB0aGUgY2xhc3NlcyBwcm9kdWNlZCBvciBudWxsIGlmIGFuCi0gICAgICogZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHRlcm5hbENvbXBpbGUoTGlzdCBzcmNGaWxlcywgRmlsZSBvdXRkaXIsIEZpbGVbXSBjcCwgYm9vbGVhbiBkZWJ1ZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlcm5hbENvbXBpbGUoc3JjRmlsZXMsIG91dGRpciwgY3AsIGRlYnVnLCBERUZBVUxUX0NPTVBJTEVSLCBERUZBVUxUX01FTV9TVEFSVCwgREVGQVVMVF9NRU1fTUFYLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgamF2YWMgb24gdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgaW4gb3JkZXIgdG8gdHVybiB0aGVtCi0gICAgICogaW50byBiaW5hcnkgZmlsZXMgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuICBUaGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBvZgotICAgICAqIDxjb2RlPkdlbkZpbGU8L2NvZGU+cyBmb3IgYWxsIG9mIHRoZSBjbGFzc2VzIHByb2R1Y2VkIG9yIG51bGwgaWYgYW4KLSAgICAgKiBlcnJvciBvY2N1cnJlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gZXh0ZXJuYWxDb21waWxlKExpc3Qgc3JjRmlsZXMsIEZpbGUgb3V0ZGlyLCBGaWxlW10gY3AsIGJvb2xlYW4gZGVidWcsIFN0cmluZyBqYXZhY1BhdGgsIFN0cmluZyBtZW1TdGFydCwgU3RyaW5nIG1lbU1heCwgIGJvb2xlYW4gcXVpZXQsIGJvb2xlYW4gdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIExpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBGaWxlIGphdmFjID0gZmluZEphdmFUb29sKGphdmFjUGF0aCA9PSBudWxsID8gREVGQVVMVF9DT01QSUxFUiA6IGphdmFjUGF0aCk7Ci0gICAgICAgIGFzc2VydCAoamF2YWMuZXhpc3RzKCkpIDogImNvbXBpbGVyIG5vdCBmb3VuZCAiICsgamF2YWM7Ci0gICAgICAgIGFyZ3MuYWRkKGphdmFjLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBpZiAob3V0ZGlyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dGRpciA9IG5ldyBGaWxlKCIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmdzLmFkZCgiLWQiKTsKLSAgICAgICAgICAgIGFyZ3MuYWRkKHF1b3RlQW5kRXNjYXBlRmlsZW5hbWUob3V0ZGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3AgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY3AgPSBzeXN0ZW1DbGFzc3BhdGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjcC5sZW5ndGggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgY2xhc3NQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgLy8gQWRkIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIHRoZSBjbGFzc3BhdGguICBXZSBkbyB0aGlzIHNvIHRoYXQKLSAgICAgICAgICAgIC8vIGphdmFjIHdpbGwgYmUgYWJsZSB0byBmaW5kIGNsYXNzZXMgdGhhdCB3ZXJlIGNvbXBpbGVkCi0gICAgICAgICAgICAvLyBwcmV2aW91c2x5IGJ1dCBhcmUgbm90IGluIHRoZSBsaXN0IG9mIHNvdXJjZXMgdGhpcyB0aW1lLgotICAgICAgICAgICAgY2xhc3NQYXRoLmFwcGVuZChvdXRkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICAvLyBBZGQgZXZlcnl0aGluZyBvbiBvdXIgY2xhc3NwYXRoLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbGFzc1BhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgY2xhc3NQYXRoLmFwcGVuZChjcFtpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFyZ3MuYWRkKCItY2xhc3NwYXRoIik7Ci0KLSAgICAgICAgICAgIC8vIGJpemFycmUuICBqYXZhYyBleHBlY3RzIGJhY2tzbGFzaCBlc2NhcGluZyBpZiB3ZSBxdW90ZSB0aGUgY2xhc3NwYXRoCi0gICAgICAgICAgICBhcmdzLmFkZChxdW90ZUFuZEVzY2FwZUZpbGVuYW1lKGNsYXNzUGF0aC50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzLmFkZCgiLXNvdXJjZSIpOwotICAgICAgICBhcmdzLmFkZCgiMS40Iik7Ci0KLSAgICAgICAgYXJncy5hZGQoZGVidWcgPyAiLWciIDogIi1nOm5vbmUiKTsKLQotICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIGFyZ3MuYWRkKCItdmVyYm9zZSIpOwotCi0gICAgICAgIGFkZEFsbEphdmFGaWxlcyhzcmNGaWxlcywgYXJncyk7Ci0KLSAgICAgICAgRmlsZSBjbEZpbGUgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2xGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiamF2YWMiLCAiIik7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoY2xGaWxlKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBhcmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBmb3IgKGkubmV4dCgpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFyZyA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZncud3JpdGUoYXJnKTsKLSAgICAgICAgICAgICAgICBmdy53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICAgICAgICBMaXN0IG5ld2FyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBuZXdhcmdzLmFkZChhcmdzLmdldCgwKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZW1TdGFydCAhPSBudWxsICYmIG1lbVN0YXJ0Lmxlbmd0aCgpICE9IDApCi0gICAgICAgICAgICAgICAgbmV3YXJncy5hZGQoIi1KLVhtcyIgKyBtZW1TdGFydCk7Ci0gICAgICAgICAgICBpZiAobWVtTWF4ICE9IG51bGwgJiYgbWVtTWF4Lmxlbmd0aCgpICE9IDApCi0gICAgICAgICAgICAgICAgbmV3YXJncy5hZGQoIi1KLVhteCIgKyBtZW1NYXgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXdhcmdzLmFkZCgiQCIgKyBjbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgYXJncyA9IG5ld2FyZ3M7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBjcmVhdGUgY29tbWFuZC1saW5lIGZpbGUgZm9yIGphdmFjIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJncyA9IChTdHJpbmdbXSkgYXJncy50b0FycmF5KG5ldyBTdHJpbmdbYXJncy5zaXplKCldKTsKLQotICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiY29tcGlsZSBjb21tYW5kOiIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIgKyBzdHJBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgUHJvY2VzcyBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhzdHJBcmdzKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9yQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgVGhyZWFkZWRSZWFkZXIgb3V0ID0gbmV3IFRocmVhZGVkUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgIFRocmVhZGVkUmVhZGVyIGVyciA9IG5ldyBUaHJlYWRlZFJlYWRlcihwcm9jLmdldEVycm9yU3RyZWFtKCksIGVycm9yQnVmZmVyKTsKLQotICAgICAgICAgICAgcHJvYy53YWl0Rm9yKCk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlIHx8IHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnJvckJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGVycm9yQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChwcm9jLmV4aXRWYWx1ZSgpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbEZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGNsRmlsZS5kZWxldGUoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGVbXSBzeXN0ZW1DbGFzc3BhdGgoKQotICAgIHsKLSAgICAgICAgTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nW10gc3lzdGVtY3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3lzdGVtY3AubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwLmFkZChuZXcgRmlsZShzeXN0ZW1jcFtpXSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRmlsZVtdKWNwLnRvQXJyYXkobmV3IEZpbGVbY3Auc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGV4dGVybmFsSmFyKEZpbGUgc3JjZGlyLCBGaWxlIG91dGZpbGUpCi0gICAgewotICAgICAgICByZXR1cm4gZXh0ZXJuYWxKYXIoc3JjZGlyLCBvdXRmaWxlLCBERUZBVUxUX0pBUiwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gZXh0ZXJuYWxKYXIoRmlsZSBzcmNkaXIsIEZpbGUgb3V0ZmlsZSwgU3RyaW5nIGphclBhdGgsIGJvb2xlYW4gcXVpZXQsIGJvb2xlYW4gdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIExpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBGaWxlIGphciA9IGZpbmRKYXZhVG9vbChqYXJQYXRoID09IG51bGwgPyBERUZBVUxUX0pBUiA6IGphclBhdGgpOwotICAgICAgICBhc3NlcnQgKGphci5leGlzdHMoKSkgOiAiamFyIG5vdCBmb3VuZCAiICsgamFyOwotICAgICAgICBhcmdzLmFkZChqYXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIGFyZ3MuYWRkKCJjZiIgKyAodmVyYm9zZSA/ICJ2IiA6ICIiKSk7Ci0gICAgICAgIGFyZ3MuYWRkKHF1b3RlTm9Fc2NhcGVGaWxlbmFtZShvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0KLSAgICAgICAgYXJncy5hZGQoIi1DIik7Ci0gICAgICAgIGFyZ3MuYWRkKHF1b3RlTm9Fc2NhcGVGaWxlbmFtZShzcmNkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotICAgICAgICBhcmdzLmFkZCgiLiIpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcmdzID0gKFN0cmluZ1tdKSBhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcmdzLnNpemUoKV0pOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJqYXIgY29tbWFuZDoiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ckFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgc3RyQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoc3RyQXJncyk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJvckJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIFRocmVhZGVkUmVhZGVyIG91dCA9IG5ldyBUaHJlYWRlZFJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCksIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBUaHJlYWRlZFJlYWRlciBlcnIgPSBuZXcgVGhyZWFkZWRSZWFkZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpLCBlcnJvckJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIHByb2Mud2FpdEZvcigpOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSB8fCBwcm9jLmV4aXRWYWx1ZSgpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG91dHB1dEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXJyb3JCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnJvckJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcm9jLmV4aXRWYWx1ZSgpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgZm9yIHRvb2wgaW4gY3VycmVudCBkaXJlY3RvcnkgYW5kICR7SkFWQV9IT01FfS8uLi9iaW4gYW5kCi0gICAgICogdHJ5IHdpdGggLmV4ZSBmaWxlIGV4dGVuc2lvbi4KLSAgICAgKi8gCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBmaW5kSmF2YVRvb2woU3RyaW5nIHRvb2wpCi0gICAgewotICAgICAgICBGaWxlIHRvb2xGaWxlID0gbmV3IEZpbGUodG9vbCk7Ci0gICAgICAgIGlmICh0b29sRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRvb2xGaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSByZXN1bHQgPSBuZXcgRmlsZSh0b29sICsgIi5leGUiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOwotCi0gICAgICAgIFN0cmluZyBzZXAgID0gRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKGhvbWUgKyBzZXAgKyAiLi4iICsgc2VwICsgImJpbiIsIHRvb2wpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LmdldFBhdGgoKSArICIuZXhlIik7Ci0gICAgICAgIGlmIChyZXN1bHQuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShob21lICsgc2VwICsgImJpbiIsIHRvb2wpOwotICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LmdldFBhdGgoKSArICIuZXhlIik7Ci0gICAgICAgIGlmIChyZXN1bHQuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdG9vbEZpbGUgYW5kIGhvcGUgdGhhdCBpdCBpcyBvbiB0aGUgUEFUSC4KLSAgICAgICAgcmV0dXJuIHRvb2xGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHVudGlsIHRoZXJlIGlzCi0gICAgICogbm90aGluZyBsZWZ0IHRvIHJlYWQuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgVGhyZWFkZWRSZWFkZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBUaHJlYWRlZFJlYWRlcihJbnB1dFN0cmVhbSBzdHJlYW0sIGZpbmFsIFN0cmluZ0J1ZmZlciBvdXRwdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQotICAgICAgICAgICAgVGhyZWFkIHJlYWRlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgczsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocyA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQocyArICJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAge30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJlYWRlclRocmVhZC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29tbWFuZExpbmUuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvbW1hbmRMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmFlMzcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29tbWFuZExpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lCi17Ci0gICAgcHVibGljIENvbW1hbmRMaW5lKFN0cmluZ1tdIGFyZ3MsIENvbGxlY3Rpb24gc2NoZW1lKQotICAgIHsKLSAgICAgICAgX29wdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBBcnJheUxpc3QgZW5kYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmluZGV4T2YoJy0nKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBvcHQgPSBhcmdzW2ldLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgc2NoZW1lLmNvbnRhaW5zKG9wdCkgJiYgaSA8IGFyZ3MubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKLQotICAgICAgICAgICAgICAgIF9vcHRpb25zLnB1dChvcHQsIHZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5kYXJncy5hZGQoYXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfYXJncyA9IChTdHJpbmdbXSllbmRhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1tlbmRhcmdzLnNpemUoKV0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRMaWNlbnNlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoQ29tbWFuZExpbmUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJsaWNlbnNlLnR4dCIpLCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGljZW5zZSBhdmFpbGFibGUgaW4gdGhpcyBKQVIgaW4gbGljZW5zZS50eHQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIF9vcHRpb25zOwotICAgIHByaXZhdGUgU3RyaW5nW10gX2FyZ3M7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gYXJncygpCi0gICAgewotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW19hcmdzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2FyZ3MsIDAsIHJlc3VsdCwgMCwgX2FyZ3MubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wdChTdHJpbmcgb3B0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpX29wdGlvbnMuZ2V0KG9wdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb2xsZWN0RmlsZXMoRmlsZVtdIGRpcnMpCi0gICAgewotICAgICAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IGRpcnNbaV07Ci0gICAgICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGQoZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZXMuYWRkQWxsKGNvbGxlY3RGaWxlcyhmLmxpc3RGaWxlcygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBfZmlsZXM7Ci0gICAgcHJpdmF0ZSBGaWxlIF9iYXNlRGlyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVbXSBFTVBUWV9GSUxFQVJSQVkgPSBuZXcgRmlsZVswXTsKLQotICAgIHByaXZhdGUgTGlzdCBnZXRGaWxlTGlzdCgpCi0gICAgewotICAgICAgICBpZiAoX2ZpbGVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBhcmdzKCk7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVthcmdzLmxlbmd0aF07Ci0gICAgICAgICAgICBib29sZWFuIG5vQmFzZURpciA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVzW2ldID0gbmV3IEZpbGUoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFub0Jhc2VEaXIgJiYgKF9iYXNlRGlyID09IG51bGwpKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgX2Jhc2VEaXIgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX2Jhc2VEaXIgPSBmaWxlc1tpXS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSBjdXJyVXJpID0gZmlsZXNbaV0udG9VUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgb24gdGhlIGJhc2VkaXIuIFRoZXJlIG1heSBiZSBub25lCi0gICAgICAgICAgICAgICAgICAgIGlmIChfYmFzZURpciAhPSBudWxsICYmIF9iYXNlRGlyLnRvVVJJKCkucmVsYXRpdml6ZShjdXJyVXJpKS5lcXVhbHMoY3VyclVyaSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9iYXNlRGlyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vQmFzZURpciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZmlsZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNvbGxlY3RGaWxlcyhmaWxlcykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfZmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGVbXSBnZXRGaWxlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEZpbGVbXSlnZXRGaWxlTGlzdCgpLnRvQXJyYXkoRU1QVFlfRklMRUFSUkFZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRCYXNlRGlyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmFzZURpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZVtdIGZpbGVzRW5kaW5nV2l0aChTdHJpbmcgZXh0KQotICAgIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEZpbGVMaXN0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoZXh0KSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGYpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRmlsZVtdKXJlc3VsdC50b0FycmF5KEVNUFRZX0ZJTEVBUlJBWSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRXh0ZW5zaW9uLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1ZmMxOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi0gLyoqCi0gICogQW4gZXh0ZW5zaW9uIGlzIGEgamF2YWJlYW4gdGhhdCByZXByZXNlbnRzIGEgU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24gdG8gYmUgcGFzc2VkIGZvciBjYWxsYmFjayBpbnRvIHRoZQotICAqICBYbWxCZWFucyBTY2hlbWEgQ29tcGlsZXIuCi0gICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uIHsKLSAgICAgICAgcHJpdmF0ZSBDbGFzcyBjbGFzc05hbWU7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHVibGljIENsYXNzIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoQ2xhc3MgY2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgTGlzdCBnZXRQYXJhbXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBhcmFtIGNyZWF0ZVBhcmFtKCkgewotICAgICAgICAgICAgUGFyYW0gcCA9IG5ldyBQYXJhbSgpOwotICAgICAgICAgICAgcGFyYW1zLmFkZChwKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgUGFyYW0gaXMganVzdCBhIG5hbWUgdmFsdWUgcGFpciBhcHBsaWNhYmxlIHRvIHRoZSBleHRlbnNpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgY2xhc3MgUGFyYW0gewotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0ZhY3RvckltcG9ydHMuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0ZhY3RvckltcG9ydHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMjBlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9GYWN0b3JJbXBvcnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbENvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuVG9wTGV2ZWxTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuVG9wTGV2ZWxFbGVtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuVG9wTGV2ZWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5OYW1lZEdyb3VwOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuTmFtZWRBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkZvcm1DaG9pY2U7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbmNsdWRlRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhpcyBwcm9ncmFtIHRha2VzIGEgY29sbGVjdGlvbiBvZiAueHNkIGZpbGVzIGFzIGlucHV0LCBmaW5kcyBhbGwgZHVwbGljYXRlCi0gKiBuYW1lIGRlZmluaXRpb25zLCBhbmQgZmFjdG9ycyBvdXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGVhY2ggb2YgdGhvc2UgaW50bwotICogYSBjb21tb24ueHNkIGZpbGUsIGFkZGluZyBhbiBhcHByb3ByaWF0ZSA8aW1wb3J0PiBzdGF0ZW1lbnQgaW4gdGhlIG9yaWdpbmFsCi0gKiB4c2QgZmlsZS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBGYWN0b3JJbXBvcnRzCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJpbXBvcnQiLCAib3V0In0pKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzID0gY2wuYXJncygpOwotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWZhY3RvcnMgYSBkaXJlY3Rvcnkgb2YgLnhzZCBmaWxlcyB0byByZW1vdmUgbmFtZSBjb25mbGljdHMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNmYWN0b3IgWy1pbXBvcnQgY29tbW9uLnhzZF0gWy1vdXQgb3V0cHV0ZGlyXSBpbnB1dGRpciIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgd2hlcmUgaW5wdXRkaXIgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZyAueHNkIGZpbGVzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBhbmQgb3V0cHV0ZGlyIGlzIGEgZGlyZWN0b3J5IGludG8gd2hpY2ggbmV3IHhzZCBmaWxlcywiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIHBsdXMgYSBjb21tb25seSBpbXBvcnRlZCBjb21tb24ueHNkLCBpcyBwbGFjZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAtbGljZW5zZSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjb21tb25OYW1lID0gY2wuZ2V0T3B0KCJpbXBvcnQiKTsKLSAgICAgICAgaWYgKGNvbW1vbk5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbW1vbk5hbWUgPSAiY29tbW9uLnhzZCI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgb3V0ID0gY2wuZ2V0T3B0KCJvdXQiKTsKLSAgICAgICAgaWYgKG91dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIG91dHB1dCBkaXJlY3RvcnkgJ291dCciKTsKLSAgICAgICAgICAgIG91dCA9ICJvdXQiOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgb3V0ZGlyID0gbmV3IEZpbGUob3V0KTsKLSAgICAgICAgRmlsZSBiYXNlZGlyID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCwgcGFyc2UgYWxsIHRoZSBzY2hlbWEgZmlsZXMKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgTWFwIHNjaGVtYURvY3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBTZXQgZWxlbWVudE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGF0dHJpYnV0ZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IHR5cGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBtb2RlbEdyb3VwTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgYXR0ckdyb3VwTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAKLSAgICAgICAgU2V0IGR1cGVFbGVtZW50TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZHVwZUF0dHJpYnV0ZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGR1cGVUeXBlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZHVwZU1vZGVsR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBkdXBlQXR0ckdyb3VwTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZHVwZU5hbWVzcGFjZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbG9hZCBzY2hlbWEKLSAgICAgICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBkb2MgPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBzY2hlbWFEb2NzLnB1dChkb2MsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB3YXJuIGFib3V0IGZvciBpbXBvcnRzLCBpbmNsdWRlcwotICAgICAgICAgICAgICAgIGlmIChkb2MuZ2V0U2NoZW1hKCkuc2l6ZU9mSW1wb3J0QXJyYXkoKSA+IDAgfHwgZG9jLmdldFNjaGVtYSgpLnNpemVPZkluY2x1ZGVBcnJheSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3YXJuaW5nOiAiICsgZmlsZXNbaV0gKyAiIGNvbnRhaW5zIGltcG9ydHMgb3IgaW5jbHVkZXMgdGhhdCBhcmUgYmVpbmcgaWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IHRvZ2V0aGVyIG5hbWVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRvcExldmVsQ29tcGxleFR5cGUgY3RbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRDb21wbGV4VHlwZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoY3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIHR5cGVOYW1lcywgZHVwZVR5cGVOYW1lcywgZHVwZU5hbWVzcGFjZXMpOwotCi0gICAgICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlIHN0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoc3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIHR5cGVOYW1lcywgZHVwZVR5cGVOYW1lcywgZHVwZU5hbWVzcGFjZXMpOwotCi0gICAgICAgICAgICAgICAgVG9wTGV2ZWxFbGVtZW50IGVsW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudEFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoZWxbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGVsZW1lbnROYW1lcywgZHVwZUVsZW1lbnROYW1lcywgZHVwZU5hbWVzcGFjZXMpOwotCi0gICAgICAgICAgICAgICAgVG9wTGV2ZWxBdHRyaWJ1dGUgYXRbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRBdHRyaWJ1dGVBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXQubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGF0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lcywgZHVwZUF0dHJpYnV0ZU5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTmFtZWRHcm91cCBncltdID0gZG9jLmdldFNjaGVtYSgpLmdldEdyb3VwQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShncltqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgbW9kZWxHcm91cE5hbWVzLCBkdXBlTW9kZWxHcm91cE5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cCBhZ1tdID0gZG9jLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUdyb3VwQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFnLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShhZ1tqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgYXR0ckdyb3VwTmFtZXMsIGR1cGVBdHRyR3JvdXBOYW1lcywgZHVwZU5hbWVzcGFjZXMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid2FybmluZzogIiArIGZpbGVzW2ldICsgIiBpcyBub3QgYSBzY2hlbWEgZmlsZSAtICIgKyBlLmdldEVycm9yKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBsb2FkICIgKyBmaWxlc1tpXSArICIgLSAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHNjaGVtYURvY3Muc2l6ZSgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gc2NoZW1hIGZpbGVzIGZvdW5kLiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChkdXBlVHlwZU5hbWVzLnNpemUoKSArIGR1cGVFbGVtZW50TmFtZXMuc2l6ZSgpICsgZHVwZUF0dHJpYnV0ZU5hbWVzLnNpemUoKSArCi0gICAgICAgICAgICAgICAgZHVwZU1vZGVsR3JvdXBOYW1lcy5zaXplKCkgKyBkdXBlQXR0ckdyb3VwTmFtZXMuc2l6ZSgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gZHVwbGljYXRlIG5hbWVzIGZvdW5kLiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNyZWF0ZSBhIHNjaGVtYSBkb2MgZm9yIGVhY2ggbmFtZXNwYWNlIHRvIGJlIGltcG9ydGVkCi0gICAgICAgIE1hcCBjb21tb25Eb2NzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgTWFwIGNvbW1vbkZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZHVwZU5hbWVzcGFjZXMuc2l6ZSgpID09IDEgPyAwIDogMTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZHVwZU5hbWVzcGFjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBjb21tb25Eb2MgPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLz4iCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLnNldFRhcmdldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLnNldEVsZW1lbnRGb3JtRGVmYXVsdChGb3JtQ2hvaWNlLlFVQUxJRklFRCk7Ci0gICAgICAgICAgICBjb21tb25Eb2NzLnB1dChuYW1lc3BhY2UsIGNvbW1vbkRvYyk7Ci0gICAgICAgICAgICBjb21tb25GaWxlcy5wdXQoY29tbW9uRG9jLCBjb21tb25GaWxlRm9yKGNvbW1vbk5hbWUsIG5hbWVzcGFjZSwgY291bnQrKywgb3V0ZGlyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHB1bGwgb3V0IGFsbCB0aGUgZHVwbGljYXRlIGRlZmluaXRpb25zIGFuZCBkcm9wIHRoZW0gaW50byB0aGUgZmlsZQotICAgICAgICAvLyB3ZSByZXVzZSB0aGUgZWxlbWVudE5hbWVzIChldGMpIHNldHMgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBkZWZpbml0aW9ucwotICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgaW5zZXJ0ZWQuCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYURvY3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gKFNjaGVtYURvY3VtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjb2xsZWN0IHRvZ2V0aGVyIG5hbWVzCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZG9jLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBjb21tb25Eb2MgPSAoU2NoZW1hRG9jdW1lbnQpY29tbW9uRG9jcy5nZXQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBuZWVkSW1wb3J0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBUb3BMZXZlbENvbXBsZXhUeXBlIGN0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0Q29tcGxleFR5cGVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGN0Lmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoY3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVUeXBlTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShjdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld0NvbXBsZXhUeXBlKCkuc2V0KGN0W2pdKTsKLSAgICAgICAgICAgICAgICBuZWVkSW1wb3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0U2NoZW1hKCkucmVtb3ZlQ29tcGxleFR5cGUoaik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRvcExldmVsU2ltcGxlVHlwZSBzdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldFNpbXBsZVR5cGVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRHVwbGljYXRlKHN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBkdXBlVHlwZU5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoc3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIHR5cGVOYW1lcywgZHVwZVR5cGVOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5hZGROZXdTaW1wbGVUeXBlKCkuc2V0KHN0W2pdKTsKLSAgICAgICAgICAgICAgICBuZWVkSW1wb3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0U2NoZW1hKCkucmVtb3ZlU2ltcGxlVHlwZShqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVG9wTGV2ZWxFbGVtZW50IGVsW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudEFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVsLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoZWxbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVFbGVtZW50TmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShlbFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZWxlbWVudE5hbWVzLCBkdXBlRWxlbWVudE5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoZWxbal0pOwotICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVFbGVtZW50KGopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZSBhdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoYXRbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVBdHRyaWJ1dGVOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGF0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lcywgZHVwZUF0dHJpYnV0ZU5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoYXRbal0pOwotICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVFbGVtZW50KGopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBOYW1lZEdyb3VwIGdyW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0R3JvdXBBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBnci5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRHVwbGljYXRlKGdyW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBkdXBlTW9kZWxHcm91cE5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoZ3Jbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIG1vZGVsR3JvdXBOYW1lcywgZHVwZU1vZGVsR3JvdXBOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRvYy5nZXRTY2hlbWEoKS5hZGROZXdFbGVtZW50KCkuc2V0KGdyW2pdKTsKLSAgICAgICAgICAgICAgICBuZWVkSW1wb3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0U2NoZW1hKCkucmVtb3ZlRWxlbWVudChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXAgYWdbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRBdHRyaWJ1dGVHcm91cEFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFnLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoYWdbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVBdHRyR3JvdXBOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGFnW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBhdHRyR3JvdXBOYW1lcywgZHVwZUF0dHJHcm91cE5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoYWdbal0pOwotICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVFbGVtZW50KGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobmVlZEltcG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbmNsdWRlRG9jdW1lbnQuSW5jbHVkZSBuZXdJbmNsdWRlID0gZG9jLmdldFNjaGVtYSgpLmFkZE5ld0luY2x1ZGUoKTsKLSAgICAgICAgICAgICAgICBGaWxlIGlucHV0RmlsZSA9IChGaWxlKXNjaGVtYURvY3MuZ2V0KGRvYyk7Ci0gICAgICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gb3V0cHV0RmlsZUZvcihpbnB1dEZpbGUsIGJhc2VkaXIsIG91dGRpcik7Ci0gICAgICAgICAgICAgICAgRmlsZSBjb21tb25GaWxlID0gKEZpbGUpY29tbW9uRmlsZXMuZ2V0KGNvbW1vbkRvYyk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXdJbmNsdWRlLnNldFNjaGVtYUxvY2F0aW9uKHJlbGF0aXZlVVJJRm9yKG91dHB1dEZpbGUsIGNvbW1vbkZpbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbWFrZSB0aGUgZGlyZWN0b3J5IGZvciBvdXRwdXQKLSAgICAgICAgaWYgKCFvdXRkaXIuaXNEaXJlY3RvcnkoKSAmJiAhb3V0ZGlyLm1rZGlycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBtYWtlZGlyICIgKyBvdXRkaXIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyB3cml0ZSBhbGwgdGhvc2UgZG9jcyBiYWNrIG91dC4KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRG9jcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBkb2MgPSAoU2NoZW1hRG9jdW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlIGlucHV0RmlsZSA9IChGaWxlKXNjaGVtYURvY3MuZ2V0KGRvYyk7Ci0gICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBvdXRwdXRGaWxlRm9yKGlucHV0RmlsZSwgYmFzZWRpciwgb3V0ZGlyKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgY29weSAiICsgaW5wdXRGaWxlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkb2Muc2F2ZShvdXRwdXRGaWxlLCBuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpLnNldFNhdmVBZ2dyZXNpdmVOYW1lc3BhY2VzKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21tb25GaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBkb2MgPSAoU2NoZW1hRG9jdW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSAoRmlsZSljb21tb25GaWxlcy5nZXQoZG9jKTsKLSAgICAgICAgICAgIGRvYy5zYXZlKG91dHB1dEZpbGUsIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZUFnZ3Jlc2l2ZU5hbWVzcGFjZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgb3V0cHV0RmlsZUZvcihGaWxlIGZpbGUsIEZpbGUgYmFzZURpciwgRmlsZSBvdXRkaXIpCi0gICAgewotICAgICAgICBVUkkgYmFzZSA9IGJhc2VEaXIuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgVVJJIGFicyA9IGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgVVJJIHJlbCA9IGJhc2UucmVsYXRpdml6ZShhYnMpOwotICAgICAgICBpZiAocmVsLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgcmVsYXRpdml6ZSAiICsgZmlsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgVVJJIG91dGJhc2UgPSBvdXRkaXIudG9VUkkoKTsKLSAgICAgICAgVVJJIG91dCA9IENvZGVHZW5VdGlsLnJlc29sdmUob3V0YmFzZSwgcmVsKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG91dCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFVSSSBjb21tb25BbmNlc3RvcihVUkkgZmlyc3QsIFVSSSBzZWNvbmQpCi0gICAgewotICAgICAgICBTdHJpbmcgZmlyc3RTdHIgPSBmaXJzdC50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgc2Vjb25kU3RyID0gc2Vjb25kLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBsZW4gPSBmaXJzdFN0ci5sZW5ndGgoKTsKLSAgICAgICAgaWYgKHNlY29uZFN0ci5sZW5ndGgoKSA8IGxlbikKLSAgICAgICAgICAgIGxlbiA9IHNlY29uZFN0ci5sZW5ndGgoKTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpcnN0U3RyLmNoYXJBdChpKSAhPSBzZWNvbmRTdHIuY2hhckF0KGkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGkgLT0gMTsKLSAgICAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgICAgIGkgPSBmaXJzdFN0ci5sYXN0SW5kZXhPZignLycsIGkpOwotICAgICAgICBpZiAoaSA8IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKGZpcnN0U3RyLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVsYXRpdmVVUklGb3IoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgVVJJIGJhc2UgPSBzb3VyY2UuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgVVJJIGFicyA9IHRhcmdldC5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICAvLyBmaW5kIGNvbW1vbiBzdWJzdHJpbmcuLi4KLSAgICAgICAgVVJJIGNvbW1vbkJhc2UgPSBjb21tb25BbmNlc3RvcihiYXNlLCBhYnMpOwotICAgICAgICBpZiAoY29tbW9uQmFzZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGFicy50b1N0cmluZygpOwotICAgICAgICAKLSAgICAgICAgVVJJIGJhc2VyZWwgPSBjb21tb25CYXNlLnJlbGF0aXZpemUoYmFzZSk7Ci0gICAgICAgIFVSSSB0YXJnZXRyZWwgPSBjb21tb25CYXNlLnJlbGF0aXZpemUoYWJzKTsKLSAgICAgICAgaWYgKGJhc2VyZWwuaXNBYnNvbHV0ZSgpIHx8IHRhcmdldHJlbC5pc0Fic29sdXRlKCkpCi0gICAgICAgICAgICByZXR1cm4gYWJzLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgU3RyaW5nIHNvdXJjZVJlbCA9IGJhc2VyZWwudG9TdHJpbmcoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSZWwubGVuZ3RoKCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gc291cmNlUmVsLmluZGV4T2YoJy8nLCBpKTsKLSAgICAgICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHByZWZpeCArPSAiLi4vIjsKLSAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4ICsgdGFyZ2V0cmVsLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgY29tbW9uRmlsZUZvcihTdHJpbmcgY29tbW9uTmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgaW50IGksIEZpbGUgb3V0ZGlyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjb21tb25OYW1lOwotICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbW1vbk5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgICAgICAgICAgaW5kZXggPSBjb21tb25OYW1lLmxlbmd0aCgpOwotICAgICAgICAgICAgbmFtZSA9IGNvbW1vbk5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSArIGkgKyBjb21tb25OYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG91dGRpciwgbmFtZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbm90ZU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFNldCBzZWVuLCBTZXQgZHVwZXMsIFNldCBkdXBlTmFtZXNwYWNlcykKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgIGlmIChzZWVuLmNvbnRhaW5zKHFOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZHVwZXMuYWRkKHFOYW1lKTsKLSAgICAgICAgICAgIGR1cGVOYW1lc3BhY2VzLmFkZCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlZW4uYWRkKHFOYW1lKTsKLSAgICAgICAgCi0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmlyc3REdXBsaWNhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFNldCBub3RzZWVuLCBTZXQgZHVwZXMpCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpOwotICAgICAgICBpZiAoZHVwZXMuY29udGFpbnMocU5hbWUpICYmIG5vdHNlZW4uY29udGFpbnMocU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBub3RzZWVuLnJlbW92ZShxTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEdXBsaWNhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFNldCBkdXBlcykKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgIHJldHVybiAoZHVwZXMuY29udGFpbnMocU5hbWUpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvSW5zdGFuY2VWYWxpZGF0b3IuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0luc3RhbmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmI0ZDAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvSW5zdGFuY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEluc3RhbmNlVmFsaWRhdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0gICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbC5hcmdzKCkubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsaWRhdGVzIGEgc2NoZW1hIGRlZmludGlvbiBhbmQgaW5zdGFuY2VzIHdpdGhpbiB0aGUgc2NoZW1hLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogdmFsaWRhdGUgW3N3aXRjaGVzXSBzY2hlbWEueHNkIGluc3RhbmNlLnhtbCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hlczoiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kbCAgICBlbmFibGUgbmV0d29yayBkb3dubG9hZHMgZm9yIGltcG9ydHMgYW5kIGluY2x1ZGVzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbm9wdnIgZGlzYWJsZSBwYXJ0aWNsZSB2YWxpZCAocmVzdHJpY3Rpb24pIHJ1bGUiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1ub3VwYSBkaWFibGUgdW5pcXVlIHBhcnRpY2xlIGF0dHJpYnV0ZWlvbiBydWxlIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbGljZW5zZSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGRsID0gKGNsLmdldE9wdCgiZGwiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub3B2ciA9IChjbC5nZXRPcHQoIm5vcHZyIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm91cGEgPSAoY2wuZ2V0T3B0KCJub3VwYSIpICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgRmlsZVtdIHNjaGVtYUZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIueHNkIik7Ci0gICAgICAgIEZpbGVbXSBpbnN0YW5jZUZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIueG1sIik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHNkb2NzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNkb2NzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFGaWxlc1tpXSwgKG5ldyBYbWxPcHRpb25zKCkpLnNldExvYWRMaW5lTnVtYmVycygpLnNldExvYWRNZXNzYWdlRGlnZXN0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHNjaGVtYUZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3RbXSBzY2hlbWFzID0gKFhtbE9iamVjdFtdKXNkb2NzLnRvQXJyYXkobmV3IFhtbE9iamVjdFswXSk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzTG9hZGVyOwotICAgICAgICBDb2xsZWN0aW9uIGNvbXBFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFhtbE9wdGlvbnMgc2NoZW1hT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihjb21wRXJyb3JzKTsKLSAgICAgICAgaWYgKGRsKQotICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlRG93bmxvYWRVcmxzKCk7Ci0gICAgICAgIGlmIChub3B2cikKLSAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vUHZyUnVsZSgpOwotICAgICAgICBpZiAobm91cGEpCi0gICAgICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVOb1VwYVJ1bGUoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzTG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChzY2hlbWFzLCBzY2hlbWFPcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wRXJyb3JzLmlzRW1wdHkoKSB8fCAhKGUgaW5zdGFuY2VvZiBYbWxFeGNlcHRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTY2hlbWEgaW52YWxpZCIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tcEVycm9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpLm5leHQoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IHhvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhvYmogPQotICAgICAgICAgICAgICAgICAgICBzTG9hZGVyLnBhcnNlKCBpbnN0YW5jZUZpbGVzW2ldLCBudWxsLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgbm90IGxvYWRhYmxlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBpZiAoeG9iai5zY2hlbWFUeXBlKCkgPT0gWG1sT2JqZWN0LnR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluc3RhbmNlRmlsZXNbaV0gKyAiIE5PVCB2YWxpZC4gICIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBEb2N1bWVudCB0eXBlIG5vdCBmb3VuZC4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh4b2JqLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpKSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgdmFsaWQuIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluc3RhbmNlRmlsZXNbaV0gKyAiIE5PVCB2YWxpZC4iKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUHJldHR5UHJpbnRlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUHJldHR5UHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM5OGZhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1ByZXR0eVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJldHR5UHJpbnRlcgotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oImluZGVudCIpKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjbC5hcmdzKCkubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJldHR5IHByaW50cyBYTUwgZmlsZXMuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB4cHJldHR5IFtzd2l0Y2hlc10gZmlsZS54bWwiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoZXM6Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtaW5kZW50ICMgICB1c2UgdGhlIGdpdmVuIGluZGVudCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWxpY2Vuc2UgcHJpbnRzIGxpY2Vuc2UgaW5mb3JtYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGluZGVudFN0ciA9IGNsLmdldE9wdCgiaW5kZW50Iik7Ci0gICAgICAgIGludCBpbmRlbnQ7Ci0gICAgICAgIGlmIChpbmRlbnRTdHIgPT0gbnVsbCkKLSAgICAgICAgICAgIGluZGVudCA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluZGVudCA9IEludGVnZXIucGFyc2VJbnQoaW5kZW50U3RyKTsKLSAgICAgICAgCi0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGNsLmdldEZpbGVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgZG9jOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZmlsZXNbaV0sIChuZXcgWG1sT3B0aW9ucygpKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvYy5zYXZlKFN5c3RlbS5vdXQsIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZVByZXR0eVByaW50SW5kZW50KGluZGVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gcHJldHR5IHByaW50ICIgKyBmaWxlc1tpXSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9SdW5YUXVlcnkuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1J1blhRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNmNDlkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1J1blhRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy4qOwotCi1wdWJsaWMgY2xhc3MgUnVuWFF1ZXJ5Ci17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPQotICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lKAotICAgICAgICAgICAgICAgIGFyZ3MsCi0gICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCggbmV3IFN0cmluZ1tdIHsgInEiLCAicWYiIH0gKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzID0gY2wuYXJncygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUnVuIGFuIFhRdWVyeSBhZ2FpbnN0IGFuIFhNTCBpbnN0YW5jZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieHF1ZXJ5IFstdmVyYm9zZV0gWy1wcmV0dHldIFstcSA8cXVlcnk+IHwgLXFmIHF1ZXJ5LnhxXSBbZmlsZS54bWxdKiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLXEgPHF1ZXJ5PiB0byBzcGVjaWZ5IGEgcXVlcnkgb24gdGhlIGNvbW1hbmQtbGluZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLXFmIDxxdWVyeT4gdG8gc3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIHF1ZXJ5Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAtcHJldHR5IHByZXR0eS1wcmludHMgdGhlIHJlc3VsdHMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiB0aGUgcXVlcnkgaXMgcnVuIG9uIGVhY2ggWE1MIGZpbGUgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHZlcmJvc2UgPSBjbC5nZXRPcHQoICJ2ZXJib3NlIiApICE9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gcHJldHR5ID0gY2wuZ2V0T3B0KCAicHJldHR5IiApICE9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gR2V0IGFuZCBjb21waWxlIHRoZSBxdWVyeQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gY2wuZ2V0T3B0KCAicSIgKTsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ZmlsZSA9IGNsLmdldE9wdCggInFmIiApOwotCi0gICAgICAgIGlmIChxdWVyeSA9PSBudWxsICYmIHF1ZXJ5ZmlsZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJObyBxdWVyeSBzcGVjaWZpZWQiICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwgJiYgcXVlcnlmaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlNwZWNpZnkgLXFmIG9yIC1xLCBub3QgYm90aC4iICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChxdWVyeWZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIHF1ZXJ5RmlsZSA9IG5ldyBGaWxlKCBxdWVyeWZpbGUgKTsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBxdWVyeUZpbGUgKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpcyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSByLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAoY2hhcikgY2ggKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHF1ZXJ5ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiQ2Fubm90IHJlYWQgcXVlcnkgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDb21waWxlIFF1ZXJ5OiIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggcXVlcnkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5PSBYbWxCZWFucy5jb21waWxlUXVlcnkoIHF1ZXJ5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIGNvbXBpbGluZyBxdWVyeTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEdldCB0aGUgaW5zdGFuY2UKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGNsLmdldEZpbGVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlc1tpXSApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCA9IGlzLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZSggY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBmaWxlc1tpXSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3IgcGFyc2luZyBpbnN0YW5jZTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFeGVjdXRpbmcgUXVlcnkuLi4iICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBYbWxPYmplY3RbXSByZXN1bHQgPSBudWxsOwotICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0geC5leGVjUXVlcnkoIHF1ZXJ5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBleGVjdXRpbmcgcXVlcnk6ICIgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlF1ZXJ5IFJlc3VsdDoiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRzLnNldFNhdmVPdXRlcigpOwotICAgICAgICAgICAgaWYgKHByZXR0eSkKLSAgICAgICAgICAgICAgICBvcHRzLnNldFNhdmVQcmV0dHlQcmludCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbal0uc2F2ZSggU3lzdGVtLm91dCwgb3B0cyApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkNDRmZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb2RlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlQ29kZVByaW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci0KLWltcG9ydCByZXBhY2thZ2UuUmVwYWNrYWdlcjsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvZGVHZW5lcmF0b3IKLXsKLSAgICAvLyBpbnB1dCBkaXJlY3RvcnksIG91dHB1dCBkaXIgZmlsZW5hbWUKLSAgICAvLyB0b2RvOiBvdXRwdXQgamFyCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGVUeXBlU3lzdGVtKFNjaGVtYVR5cGVTeXN0ZW0gc2F2ZXIsIEZpbGUgc291cmNlZGlyLCBGaWxlW10gamF2YXNyYywgTWFwIHNvdXJjZXNUb0NvcHlNYXAsIEZpbGVbXSBjbGFzc3BhdGgsIEZpbGUgY2xhc3Nlc2RpciwgRmlsZSBvdXRwdXRKYXIsIGJvb2xlYW4gbm9qYXZhYywgYm9vbGVhbiBqYXhiLCBYbWxFcnJvcldhdGNoZXIgZXJyb3JzLCBTdHJpbmcgcmVwYWNrYWdlLCBib29sZWFuIHZlcmJvc2UsIExpc3Qgc291cmNlZmlsZXMgKQotICAgIHsKLQotICAgICAgICBpZiAoc291cmNlZGlyID09IG51bGwgfHwgY2xhc3Nlc2RpciA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIGFuZCBjbGFzcyBnZW4gZGlyIG11c3Qgbm90IGJlIG51bGwuIik7Ci0KLSAgICAgICAgYm9vbGVhbiBmYWlsdXJlID0gZmFsc2U7Ci0KLSAgICAgICAgc2F2ZXIuc2F2ZVRvRGlyZWN0b3J5KGNsYXNzZXNkaXIpOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIHNjaGVtYSBzb3VyY2VzIHRvIHRoZSBjbGFzc2VzIGRpcmVjdG9yeQotICAgICAgICBpZiAoKHNvdXJjZXNUb0NvcHlNYXAgIT0gbnVsbCkgJiYgKHNvdXJjZXNUb0NvcHlNYXAuc2l6ZSgpID4gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgc2NoZW1hc2RpciA9IGNyZWF0ZURpcihjbGFzc2VzZGlyLCAic2NoZW1hL3NyYyIpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzVG9Db3B5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYWxvY2F0aW9uID0gKFN0cmluZylzb3VyY2VzVG9Db3B5TWFwLmdldChrZXkpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHNjaGVtYXNkaXIsIHNjaGVtYWxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZSh0YXJnZXRGaWxlLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGlyKHBhcmVudERpciwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgZmlsZSBmcm9tIGZpbGVwYXRoIHRvIHNjaGVtYS9zcmMvPHNjaGVtYUZpbGU+Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShzY2hlbWFzZGlyLCBzY2hlbWFsb2NhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoaW4sIG91dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgPSB0cnVlOyAtIG5vdCBjYXVzZSBmb3IgZmFpbHVyZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFJlcGFja2FnZXIgcmVwYWNrYWdlciA9IHJlcGFja2FnZSA9PSBudWxsID8gbnVsbCA6IG5ldyBSZXBhY2thZ2VyKCByZXBhY2thZ2UgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU2NoZW1hVHlwZUNvZGVQcmludGVyLmluZGV4Q2xhc3NGb3JTeXN0ZW0oc2F2ZXIpLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIjsKLSAgICAgICAgICAgIEZpbGUgc291cmNlZmlsZSA9IG5ldyBGaWxlKHNvdXJjZWRpciwgZmlsZW5hbWUpOwotICAgICAgICAgICAgc291cmNlZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPQotICAgICAgICAgICAgICAgIHJlcGFja2FnZXIgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IChXcml0ZXIpIG5ldyBGaWxlV3JpdGVyKCBzb3VyY2VmaWxlICkKLSAgICAgICAgICAgICAgICAgICAgOiAoV3JpdGVyKSBuZXcgUmVwYWNrYWdpbmdXcml0ZXIoIHNvdXJjZWZpbGUsIHJlcGFja2FnZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5wcmludExvYWRlcih3cml0ZXIsIHNhdmVyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZChzb3VyY2VmaWxlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghIGpheGIpCi0gICAgICAgICAgICBmYWlsdXJlICY9IGdlblR5cGVzKHNhdmVyLCBzb3VyY2VmaWxlcywgc291cmNlZGlyLCByZXBhY2thZ2VyLCB2ZXJib3NlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmFpbHVyZSAmPSBqYXhiQ29kZUdlbmVyYXRvcihzYXZlciwgc291cmNlZmlsZXMsIHNvdXJjZWRpciwgY2xhc3Nlc2RpciwgZXJyb3JzKTsKLQotICAgICAgICBpZiAoZmFpbHVyZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGdlblR5cGVzKFNjaGVtYVR5cGVTeXN0ZW0gc2F2ZXIsIExpc3Qgc291cmNlZmlsZXMsIEZpbGUgc291cmNlZGlyLCBSZXBhY2thZ2VyIHJlcGFja2FnZXIsIGJvb2xlYW4gdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZSA9IGZhbHNlOwotCi0gICAgICAgIExpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNhdmVyLmdsb2JhbFR5cGVzKCkpKTsKLSAgICAgICAgdHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2F2ZXIuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIHR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNhdmVyLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSAoU2NoZW1hVHlwZSlpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ29tcGlsaW5nIHR5cGUgIiArIHR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNCdWlsdGluVHlwZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0RnVsbEphdmFOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGZqbiA9IHR5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChmam4uaW5kZXhPZignJCcpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmam4gPQotICAgICAgICAgICAgICAgICAgICBmam4uc3Vic3RyaW5nKCAwLCBmam4ubGFzdEluZGV4T2YoICcuJyApICkgKyAiLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZmpuLnN1YnN0cmluZyggZmpuLmluZGV4T2YoICckJyApICsgMSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmam4ucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmphdmEiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzb3VyY2VmaWxlID0gbmV3IEZpbGUoc291cmNlZGlyLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgc291cmNlZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiY3JlYXRlZCAiICsgc291cmNlZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgcmVwYWNrYWdlciA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IChXcml0ZXIpIG5ldyBGaWxlV3JpdGVyKCBzb3VyY2VmaWxlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogKFdyaXRlcikgbmV3IFJlcGFja2FnaW5nV3JpdGVyKCBzb3VyY2VmaWxlLCByZXBhY2thZ2VyICk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlQ29kZVByaW50ZXIucHJpbnRUeXBlKHdyaXRlciwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc291cmNlZmlsZXMuYWRkKHNvdXJjZWZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgeyBpZiAod3JpdGVyICE9IG51bGwpIHdyaXRlci5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gdHlwZS5nZXRGdWxsSmF2YUltcGxOYW1lKCkucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmphdmEiOwotICAgICAgICAgICAgICAgIEZpbGUgaW1wbEZpbGUgPSBuZXcgRmlsZShzb3VyY2VkaXIsICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiY3JlYXRlZCAiICsgaW1wbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIGltcGxGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdyaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXIgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyAoV3JpdGVyKSBuZXcgRmlsZVdyaXRlciggaW1wbEZpbGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgOiAoV3JpdGVyKSBuZXcgUmVwYWNrYWdpbmdXcml0ZXIoIGltcGxGaWxlLCByZXBhY2thZ2VyICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZUNvZGVQcmludGVyLnByaW50VHlwZUltcGwod3JpdGVyLCB0eXBlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGQoaW1wbEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgeyBpZiAod3JpdGVyICE9IG51bGwpIHdyaXRlci5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF4YkNvZGVHZW5lcmF0b3JIb2xkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfamF4YkNvZGVHZW5lcmF0b3JNZXRob2QgPSBidWlsZEpheGJDb2RlR2VuZXJhdG9yTWV0aG9kKCk7Ci0gICAgCi0gICAgICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBidWlsZEpheGJDb2RlR2VuZXJhdG9yTWV0aG9kKCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbXBpbGVyLkpheGJDb2RlR2VuZXJhdG9yIiwgZmFsc2UsIFNjaGVtYUNvZGVHZW5lcmF0b3IuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgiY29tcGlsZSIsIG5ldyBDbGFzc1tdIHtTY2hlbWFUeXBlU3lzdGVtLmNsYXNzLCBMaXN0LmNsYXNzLCBGaWxlLmNsYXNzLCBGaWxlLmNsYXNzLCBYbWxFcnJvcldhdGNoZXIuY2xhc3MgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIEpheGJDb2RlR2VuZXJhdG9yOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgICAgIGUyLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gamF4YkNvZGVHZW5lcmF0b3IoU2NoZW1hVHlwZVN5c3RlbSBzYXZlciwgTGlzdCBzb3VyY2VmaWxlcywgRmlsZSBzb3VyY2VkaXIsIEZpbGUgY2xhc3Nlc2RpciwgWG1sRXJyb3JXYXRjaGVyIGVycm9ycykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKUpheGJDb2RlR2VuZXJhdG9ySG9sZGVyLl9qYXhiQ29kZUdlbmVyYXRvck1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgc2F2ZXIsIHNvdXJjZWZpbGVzLCBzb3VyY2VkaXIsIGNsYXNzZXNkaXIsIGVycm9ycyB9KSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlMi5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICB0aHJvdyBlMjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGUyLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgIHRocm93IGUyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGNyZWF0ZURpcihGaWxlIHJvb3RkaXIsIFN0cmluZyBzdWJkaXIpCi0gICAgewotICAgICAgICBGaWxlIG5ld2RpciA9IChzdWJkaXIgPT0gbnVsbCkgPyByb290ZGlyIDogbmV3IEZpbGUocm9vdGRpciwgc3ViZGlyKTsKLSAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gKG5ld2Rpci5leGlzdHMoKSAmJiBuZXdkaXIuaXNEaXJlY3RvcnkoKSkgfHwgbmV3ZGlyLm1rZGlycygpOwotICAgICAgICBhc3NlcnQoY3JlYXRlZCkgOiAiQ291bGQgbm90IGNyZWF0ZSAiICsgbmV3ZGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICByZXR1cm4gbmV3ZGlyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ4YmVhbiIsIG51bGwpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IHRtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLnRtcCIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvcjogY3JlYXRlVGVtcEZpbGUgZGlkIG5vdCBjcmVhdGUgYSBmaWxlIGVuZGluZyB3aXRoIC50bXAiKTsKLSAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKLSAgICAgICAgRmlsZSB0bXBTcmNEaXIgPSBudWxsOwotCi0gICAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGF0aCArICIuZCIgKyAoY291bnQgPT0gMCA/ICIiIDogSW50ZWdlci50b1N0cmluZyhjb3VudCsrKSk7Ci0KLSAgICAgICAgICAgIHRtcFNyY0RpciA9IG5ldyBGaWxlKG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoIXRtcFNyY0Rpci5leGlzdHMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSB0bXBTcmNEaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNyZWF0ZWQgOiAiQ291bGQgbm90IGNyZWF0ZSAiICsgdG1wU3JjRGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0KLSAgICAgICAgcmV0dXJuIHRtcFNyY0RpcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdHJ5SGFyZFRvRGVsZXRlKEZpbGUgZGlyKQotICAgIHsKLSAgICAgICAgdHJ5VG9EZWxldGUoZGlyKTsKLSAgICAgICAgaWYgKGRpci5leGlzdHMoKSkKLSAgICAgICAgICAgIHRyeVRvRGVsZXRlTGF0ZXIoZGlyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvRGVsZXRlKEZpbGUgZGlyKQotICAgIHsKLSAgICAgICAgaWYgKGRpci5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpc3QgPSBkaXIubGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgdHJ5VG9EZWxldGUobmV3IEZpbGUoZGlyLCBsaXN0W2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpci5kZWxldGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vIGRvbid0IHRyeSB2ZXJ5IGhhcmQsIGJlY2F1c2Ugd2UncmUganVzdCBkZWxldGluZyB0bXAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQgZGVsZXRlRmlsZVF1ZXVlID0gbmV3IEhhc2hTZXQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdHJpZXNSZW1haW5pbmcgPSAwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ5Tm93VGhhdEl0c0xhdGVyKCkKLSAgICB7Ci0gICAgICAgIExpc3QgZmlsZXM7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKGRlbGV0ZUZpbGVRdWV1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KGRlbGV0ZUZpbGVRdWV1ZSk7Ci0gICAgICAgICAgICBkZWxldGVGaWxlUXVldWUuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRyeSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICAgICAgdHJ5VG9EZWxldGUoZmlsZSk7Ci0gICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICByZXRyeS5hZGQoZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZCAoZGVsZXRlRmlsZVF1ZXVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHJpZXNSZW1haW5pbmcgPiAwKQotICAgICAgICAgICAgICAgIHRyaWVzUmVtYWluaW5nIC09IDE7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodHJpZXNSZW1haW5pbmcgPD0gMCB8fCByZXRyeS5zaXplKCkgPT0gMCkgLy8gZG9uZT8KLSAgICAgICAgICAgICAgICB0cmllc1JlbWFpbmluZyA9IDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVsZXRlRmlsZVF1ZXVlLmFkZEFsbChyZXRyeSk7IC8vIHRyeSBhZ2Fpbj8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuICh0cmllc1JlbWFpbmluZyA8PSAwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdpdmVVcCgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGRlbGV0ZUZpbGVRdWV1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlRmlsZVF1ZXVlLmNsZWFyKCk7Ci0gICAgICAgICAgICB0cmllc1JlbWFpbmluZyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0RlbGV0ZUxhdGVyKEZpbGUgZGlyKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChkZWxldGVGaWxlUXVldWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZUZpbGVRdWV1ZS5hZGQoZGlyKTsKLSAgICAgICAgICAgIGlmICh0cmllc1JlbWFpbmluZyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwZWF0cyB0cnlOb3cgdW50aWwgdHJpZXNSZW1haW5pbmcgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlOb3dUaGF0SXRzTGF0ZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc3VjY2VlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogMyk7IC8vIHdhaXQgdGhyZWUgc2Vjb25kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVVcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRyaWVzUmVtYWluaW5nIDwgMTApCi0gICAgICAgICAgICAgICAgdHJpZXNSZW1haW5pbmcgPSAxMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgY2xhc3MgUmVwYWNrYWdpbmdXcml0ZXIgZXh0ZW5kcyBTdHJpbmdXcml0ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZXBhY2thZ2luZ1dyaXRlciAoIEZpbGUgZmlsZSwgUmVwYWNrYWdlciByZXBhY2thZ2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZpbGUgPSBmaWxlOwotICAgICAgICAgICAgX3JlcGFja2FnZXIgPSByZXBhY2thZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UgKCApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBnZXRCdWZmZXIoKTsKLQotICAgICAgICAgICAgX3JlcGFja2FnZXIucmVwYWNrYWdlKCBzYiApOwotCi0gICAgICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoIF9maWxlICk7Ci0gICAgICAgICAgICBmdy53cml0ZSggc2IudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRmlsZSBfZmlsZTsKLSAgICAgICAgcHJpdmF0ZSBSZXBhY2thZ2VyIF9yZXBhY2thZ2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvbXBpbGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjMyYTZiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvbXBpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvcgotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuUGF0aFJlc291cmNlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuUmVzb3VyY2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TdHNjU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlTG9hZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yUHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBjb20uYmVhLngyMDAyLngwOS54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvbXBpbGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGVzIGEgc2NoZW1hIGludG8gWE1MIEJlYW4gY2xhc3NlcyBhbmQgbWV0YWRhdGEuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBzY29tcCBbb3B0c10gW2RpcnNdKiBbc2NoZW1hLnhzZF0qIFtzZXJ2aWNlLndzZGxdKiBbY29uZmlnLnhzZGNvbmZpZ10qIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9wdGlvbnMgaW5jbHVkZToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1jcCBbYTtiO2NdIC0gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZCBbZGlyXSAtIHRhcmdldCBiaW5hcnkgZGlyZWN0b3J5IGZvciAuY2xhc3MgYW5kIC54c2IgZmlsZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1zcmMgW2Rpcl0gLSB0YXJnZXQgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgLmphdmEgZmlsZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1zcmNvbmx5IC0gZG8gbm90IGNvbXBpbGUgLmphdmEgZmlsZXMgb3IgamFyIHRoZSBvdXRwdXQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtb3V0IFtyZXN1bHQuamFyXSAtIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgamFyIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZGwgLSBwZXJtaXQgbmV0d29yayBkb3dubG9hZHMgZm9yIGltcG9ydHMgYW5kIGluY2x1ZGVzIChkZWZhdWx0IGlzIG9mZikiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1ub3VwYSAtIGRvIG5vdCBlbmZvcmNlIHRoZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gcnVsZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vcHZyIC0gZG8gbm90IGVuZm9yY2UgdGhlIHBhcnRpY2xlIHZhbGlkIChyZXN0cmljdGlvbikgcnVsZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWNvbXBpbGVyIC0gcGF0aCB0byBleHRlcm5hbCBqYXZhIGNvbXBpbGVyIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtamFyIC0gcGF0aCB0byBqYXIgdXRpbGl0eSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW1zIC0gaW5pdGlhbCBtZW1vcnkgZm9yIGV4dGVybmFsIGphdmEgY29tcGlsZXIgKGRlZmF1bHQgJyIgKyBDb2RlR2VuVXRpbC5ERUZBVUxUX01FTV9TVEFSVCArICInKSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW14IC0gbWF4aW11bSBtZW1vcnkgZm9yIGV4dGVybmFsIGphdmEgY29tcGlsZXIgKGRlZmF1bHQgJyIgKyBDb2RlR2VuVXRpbC5ERUZBVUxUX01FTV9NQVggKyAiJykiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kZWJ1ZyAtIGNvbXBpbGUgd2l0aCBkZWJ1ZyBzeW1ib2xzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtcXVpZXQgLSBwcmludCBmZXdlciBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtdmVyYm9zZSAtIHByaW50IG1vcmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWxpY2Vuc2UgLSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWFsbG93bWRlZiBcIltuc10gW25zXSBbbnNdXCIgLSBpZ25vcmVzIG11bHRpcGxlIGRlZnMgaW4gZ2l2ZW4gbmFtZXNwYWNlcyIpOwotICAgICAgICAgICAgLyogVW5kb2N1bWVudGVkIGZlYXR1cmUgLSBwYXNzIGluIG9uZSBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1yZXBhY2thZ2UgLSByZXBhY2thZ2Ugc3BlY2lmaWNhdGlvbiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWV4dGVuc2lvbiAtIHJlZ2lzdGVycyBhIHNjaGVtYSBjb21waWxlciBleHRlbnNpb24iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1leHRlbnNpb25QYXJtcyAtIHNwZWNpZnkgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBpbGVyIGV4dGVuc2lvbiIpOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZiB5b3UgcmVxdWlyZSBhIGRpZmZlcmVudCBqYXZhIGNvbXBpbGVyLCB1c2UgdGhlIFhNTEJlYW4gQW50IHRhc2sgaW5zdGVhZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0IG9wdHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBvcHRzLmFkZCgib3V0Iik7Ci0gICAgICAgIG9wdHMuYWRkKCJuYW1lIik7Ci0gICAgICAgIG9wdHMuYWRkKCJzcmMiKTsKLSAgICAgICAgb3B0cy5hZGQoImQiKTsKLSAgICAgICAgb3B0cy5hZGQoImNwIik7Ci0gICAgICAgIG9wdHMuYWRkKCJjb21waWxlciIpOwotICAgICAgICBvcHRzLmFkZCgiamFyIik7Ci0gICAgICAgIG9wdHMuYWRkKCJtcyIpOwotICAgICAgICBvcHRzLmFkZCgibXgiKTsKLSAgICAgICAgb3B0cy5hZGQoInJlcGFja2FnZSIpOwotICAgICAgICBvcHRzLmFkZCgiZXh0ZW5zaW9uIik7Ci0gICAgICAgIG9wdHMuYWRkKCJleHRlbnNpb25QYXJtcyIpOwotICAgICAgICBvcHRzLmFkZCgiYWxsb3dtZGVmIik7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIG9wdHMpOwotCi0gICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKLSAgICAgICAgYm9vbGVhbiB2ZXJib3NlID0gKGNsLmdldE9wdCgidmVyYm9zZSIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIHF1aWV0ID0gKGNsLmdldE9wdCgicXVpZXQiKSAhPSBudWxsKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBxdWlldCA9IGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXRmaWxlbmFtZSA9IGNsLmdldE9wdCgib3V0Iik7Ci0KLSAgICAgICAgU3RyaW5nIHJlcGFja2FnZSA9IGNsLmdldE9wdCgicmVwYWNrYWdlIik7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjbC5nZXRPcHQoIm5hbWUiKTsKLQotICAgICAgICBib29sZWFuIGRvd25sb2FkID0gKGNsLmdldE9wdCgiZGwiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub1VwYSA9IChjbC5nZXRPcHQoIm5vdXBhIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm9QdnIgPSAoY2wuZ2V0T3B0KCJub3B2ciIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIG5vamF2YWMgPSAoY2wuZ2V0T3B0KCJzcmNvbmx5IikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSAoY2wuZ2V0T3B0KCJkZWJ1ZyIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIGpheGIgPSAoY2wuZ2V0T3B0KCJqYXhiIikgIT0gbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIGFsbG93bWRlZiA9IGNsLmdldE9wdCgiYWxsb3dtZGVmIik7Ci0gICAgICAgIFNldCBtZGVmTmFtZXNwYWNlcyA9IChhbGxvd21kZWYgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChYbWxMaXN0SW1wbC5zcGxpdF9saXN0KGFsbG93bWRlZikpKSk7Ci0KLSAgICAgICAgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJleHRlbnNpb24iKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlID0gbmV3IEV4dGVuc2lvbigpOwotICAgICAgICAgICAgICAgIGUuc2V0Q2xhc3NOYW1lKENsYXNzLmZvck5hbWUoY2wuZ2V0T3B0KCJleHRlbnNpb24iKSwgZmFsc2UsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpKTsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFkZChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGZpbmQgZXh0ZW5zaW9uIGNsYXNzOiAiICsgY2wuZ2V0T3B0KCJleHRlbnNpb24iKSArICIgIElzIGl0IG9uIHlvdXIgY2xhc3NwYXRoPyIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZXhhbXBsZTogLWV4dGVuc2lvblBhcm1zIHR5cGVNYXBwaW5nRmlsZUxvY2F0aW9uPWQ6XHR5cGVzCi0gICAgICAgICAgICBpZiAoY2wuZ2V0T3B0KCJleHRlbnNpb25QYXJtcyIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZSA9IChFeHRlbnNpb24pIGV4dGVuc2lvbnMuZ2V0KDApOwotICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvblBhcm1zIGFyZSBkZWxpbWl0ZWQgYnkgJzsnCi0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcm1Ub2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsLmdldE9wdCgiZXh0ZW5zaW9uUGFybXMiKSwgIjsiKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocGFybVRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG5hbWUgdmFsdWUgcGFpciBmb3IgZWFjaCBleHRlbnNpb24gcGFybXMgYW5kIHN0aWNrIGludG8gZXh0ZW5zaW9uIHBhcm1zCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBudlBhaXIgPSBwYXJtVG9rZW5zLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBudlBhaXIuaW5kZXhPZignPScpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImV4dGVuc2lvblBhcm1zIHNob3VsZCBiZSBuYW1lPXZhbHVlO25hbWU9dmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0gbnZQYWlyLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gbnZQYWlyLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb24uUGFyYW0gcGFyYW0gPSBlLmNyZWF0ZVBhcmFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldE5hbWUobik7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFZhbHVlKHYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc2VzZGlyID0gY2wuZ2V0T3B0KCJkIik7Ci0gICAgICAgIEZpbGUgY2xhc3NlcyA9IG51bGw7Ci0gICAgICAgIGlmIChjbGFzc2VzZGlyICE9IG51bGwpCi0gICAgICAgICAgICBjbGFzc2VzID0gbmV3IEZpbGUoY2xhc3Nlc2Rpcik7Ci0KLSAgICAgICAgU3RyaW5nIHNyY2RpciA9IGNsLmdldE9wdCgic3JjIik7Ci0gICAgICAgIEZpbGUgc3JjID0gbnVsbDsKLSAgICAgICAgaWYgKHNyY2RpciAhPSBudWxsKQotICAgICAgICAgICAgc3JjID0gbmV3IEZpbGUoc3JjZGlyKTsKLSAgICAgICAgaWYgKG5vamF2YWMgJiYgc3JjZGlyID09IG51bGwgJiYgY2xhc3NlcyAhPSBudWxsKQotICAgICAgICAgICAgc3JjID0gY2xhc3NlczsKLQotICAgICAgICAvLyBjcmVhdGUgdGVtcCBkaXJlY3RvcnkKLSAgICAgICAgRmlsZSB0ZW1wZGlyID0gbnVsbDsKLSAgICAgICAgaWYgKHNyYyA9PSBudWxsIHx8IGNsYXNzZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcGRpciA9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY3JlYXRlVGVtcERpcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIGNyZWF0aW5nIHRlbXAgZGlyICIgKyBlKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgamFyZmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChvdXRwdXRmaWxlbmFtZSA9PSBudWxsICYmIGNsYXNzZXMgPT0gbnVsbCAmJiAhbm9qYXZhYykKLSAgICAgICAgICAgIG91dHB1dGZpbGVuYW1lID0gInhtbHR5cGVzLmphciI7Ci0gICAgICAgIGlmIChvdXRwdXRmaWxlbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgamFyZmlsZSA9IG5ldyBGaWxlKG91dHB1dGZpbGVuYW1lKTsKLQotICAgICAgICBpZiAoc3JjID09IG51bGwpCi0gICAgICAgICAgICBzcmMgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZURpcih0ZW1wZGlyLCAic3JjIik7Ci0gICAgICAgIGlmIChjbGFzc2VzID09IG51bGwpCi0gICAgICAgICAgICBjbGFzc2VzID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVEaXIodGVtcGRpciwgImNsYXNzZXMiKTsKLQotICAgICAgICBGaWxlW10gY2xhc3NwYXRoID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNwU3RyaW5nID0gY2wuZ2V0T3B0KCJjcCIpOwotICAgICAgICBpZiAoY3BTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gY3BwYXJ0cyA9IGNwU3RyaW5nLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgICAgICBMaXN0IGNwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3BwYXJ0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBjcExpc3QuYWRkKG5ldyBGaWxlKGNwcGFydHNbaV0pKTsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IChGaWxlW10pY3BMaXN0LnRvQXJyYXkobmV3IEZpbGVbY3BMaXN0LnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gQ29kZUdlblV0aWwuc3lzdGVtQ2xhc3NwYXRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29tcGlsZXIgPSBjbC5nZXRPcHQoImNvbXBpbGVyIik7Ci0gICAgICAgIFN0cmluZyBqYXIgPSBjbC5nZXRPcHQoImphciIpOwotCi0gICAgICAgIFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSA9IGNsLmdldE9wdCgibXMiKTsKLSAgICAgICAgU3RyaW5nIG1lbW9yeU1heGltdW1TaXplID0gY2wuZ2V0T3B0KCJteCIpOwotCi0gICAgICAgIEZpbGVbXSB4c2RGaWxlcyA9IGNsLmZpbGVzRW5kaW5nV2l0aCgiLnhzZCIpOwotICAgICAgICBGaWxlW10gd3NkbEZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIud3NkbCIpOwotICAgICAgICBGaWxlW10gamF2YUZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIuamF2YSIpOwotICAgICAgICBGaWxlW10gY29uZmlnRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54c2Rjb25maWciKTsKLQotICAgICAgICBpZiAoeHNkRmlsZXMubGVuZ3RoICsgd3NkbEZpbGVzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIGFueSB4c2Qgb3Igd3NkbCBmaWxlcyB0byBwcm9jZXNzLiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSBiYXNlRGlyID0gY2wuZ2V0QmFzZURpcigpOwotICAgICAgICBVUkkgYmFzZVVSSSA9IGJhc2VEaXIgPT0gbnVsbCA/IG51bGwgOiBiYXNlRGlyLnRvVVJJKCk7Ci0KLSAgICAgICAgWG1sRXJyb3JQcmludGVyIGVyciA9IG5ldyBYbWxFcnJvclByaW50ZXIodmVyYm9zZSwgYmFzZVVSSSk7Ci0KLSAgICAgICAgUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0QmFzZURpcihiYXNlRGlyKTsKLSAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKHhzZEZpbGVzKTsKLSAgICAgICAgcGFyYW1zLnNldFdzZGxGaWxlcyh3c2RsRmlsZXMpOwotICAgICAgICBwYXJhbXMuc2V0SmF2YUZpbGVzKGphdmFGaWxlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDb25maWdGaWxlcyhjb25maWdGaWxlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihqYXJmaWxlKTsKLSAgICAgICAgcGFyYW1zLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDb21waWxlcihjb21waWxlcik7Ci0gICAgICAgIHBhcmFtcy5zZXRKYXIoamFyKTsKLSAgICAgICAgcGFyYW1zLnNldE1lbW9yeUluaXRpYWxTaXplKG1lbW9yeUluaXRpYWxTaXplKTsKLSAgICAgICAgcGFyYW1zLnNldE1lbW9yeU1heGltdW1TaXplKG1lbW9yeU1heGltdW1TaXplKTsKLSAgICAgICAgcGFyYW1zLnNldE5vamF2YWMobm9qYXZhYyk7Ci0gICAgICAgIHBhcmFtcy5zZXRRdWlldChxdWlldCk7Ci0gICAgICAgIHBhcmFtcy5zZXRWZXJib3NlKHZlcmJvc2UpOwotICAgICAgICBwYXJhbXMuc2V0RG93bmxvYWQoZG93bmxvYWQpOwotICAgICAgICBwYXJhbXMuc2V0Tm9VcGEobm9VcGEpOwotICAgICAgICBwYXJhbXMuc2V0Tm9QdnIobm9QdnIpOwotICAgICAgICBwYXJhbXMuc2V0RGVidWcoZGVidWcpOwotICAgICAgICBwYXJhbXMuc2V0RXJyb3JMaXN0ZW5lcihlcnIpOwotICAgICAgICBwYXJhbXMuc2V0UmVwYWNrYWdlKHJlcGFja2FnZSk7Ci0gICAgICAgIHBhcmFtcy5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotICAgICAgICBwYXJhbXMuc2V0SmF4YihqYXhiKTsKLSAgICAgICAgcGFyYW1zLnNldE1kZWZOYW1lc3BhY2VzKG1kZWZOYW1lc3BhY2VzKTsKLQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGNvbXBpbGUocGFyYW1zKTsKLQotICAgICAgICBpZiAodGVtcGRpciAhPSBudWxsKQotICAgICAgICAgICAgU2NoZW1hQ29kZUdlbmVyYXRvci50cnlIYXJkVG9EZWxldGUodGVtcGRpcik7Ci0KLSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLQotICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyOwotICAgICAgICBwcml2YXRlIEZpbGVbXSB4c2RGaWxlczsKLSAgICAgICAgcHJpdmF0ZSBGaWxlW10gd3NkbEZpbGVzOwotICAgICAgICBwcml2YXRlIEZpbGVbXSBqYXZhRmlsZXM7Ci0gICAgICAgIHByaXZhdGUgRmlsZVtdIGNvbmZpZ0ZpbGVzOwotICAgICAgICBwcml2YXRlIEZpbGVbXSBjbGFzc3BhdGg7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBvdXRwdXRKYXI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBzcmNEaXI7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBjbGFzc2VzRGlyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBqYXI7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBub2phdmFjOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcXVpZXQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZG93bmxvYWQ7Ci0gICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbm9VcGE7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBub1B2cjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnOwotICAgICAgICBwcml2YXRlIFN0cmluZyByZXBhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBleHRlbnNpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGpheGI7Ci0gICAgICAgIHByaXZhdGUgU2V0IG1kZWZOYW1lc3BhY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEJhc2VEaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZURpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEaXIoRmlsZSBiYXNlRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRYc2RGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB4c2RGaWxlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFhzZEZpbGVzKEZpbGVbXSB4c2RGaWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy54c2RGaWxlcyA9IHhzZEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRXc2RsRmlsZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0V3NkbEZpbGVzKEZpbGVbXSB3c2RsRmlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMud3NkbEZpbGVzID0gd3NkbEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRKYXZhRmlsZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YUZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SmF2YUZpbGVzKEZpbGVbXSBqYXZhRmlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuamF2YUZpbGVzID0gamF2YUZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRDb25maWdGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25maWdGaWxlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGVzKEZpbGVbXSBjb25maWdGaWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb25maWdGaWxlcyA9IGNvbmZpZ0ZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVbXSBnZXRDbGFzc3BhdGgoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKEZpbGVbXSBjbGFzc3BhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0SmFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG91dHB1dEphcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEphcihGaWxlIG91dHB1dEphcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5vdXRwdXRKYXIgPSBvdXRwdXRKYXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRTcmNEaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3JjRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3JjRGlyKEZpbGUgc3JjRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNyY0RpciA9IHNyY0RpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldENsYXNzZXNEaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3Nlc0RpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzZXNEaXIoRmlsZSBjbGFzc2VzRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzZXNEaXIgPSBjbGFzc2VzRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb2phdmFjKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5vamF2YWM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb2phdmFjKGJvb2xlYW4gbm9qYXZhYykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ub2phdmFjID0gbm9qYXZhYzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUXVpZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcXVpZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWlldChib29sZWFuIHF1aWV0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmVyYm9zZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEb3dubG9hZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkb3dubG9hZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvd25sb2FkKGJvb2xlYW4gZG93bmxvYWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZG93bmxvYWQgPSBkb3dubG9hZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm9VcGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbm9VcGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb1VwYShib29sZWFuIG5vVXBhKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vVXBhID0gbm9VcGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vUHZyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5vUHZyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9QdnIoYm9vbGVhbiBub1B2cikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ub1B2ciA9IG5vUHZyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWJ1ZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5SW5pdGlhbFNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWVtb3J5SW5pdGlhbFNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlJbml0aWFsU2l6ZShTdHJpbmcgbWVtb3J5SW5pdGlhbFNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWVtb3J5SW5pdGlhbFNpemUgPSBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5TWF4aW11bVNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlNYXhpbXVtU2l6ZShTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWVtb3J5TWF4aW11bVNpemUgPSBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGlsZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlcihTdHJpbmcgY29tcGlsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tcGlsZXIgPSBjb21waWxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGphcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEphcihTdHJpbmcgamFyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmphciA9IGphcjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SmF4Yihib29sZWFuIGpheGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuamF4YiA9IGpheGI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRKYXhiKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuamF4YjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9yTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3JMaXN0ZW5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTGlzdGVuZXIoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmVycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXBhY2thZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwYWNrYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVwYWNrYWdlKFN0cmluZyBuZXdSZXBhY2thZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcGFja2FnZSA9IG5ld1JlcGFja2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbnMoTGlzdCBleHRlbnNpb25zKSB7Ci0gICAgICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldCBnZXRNZGVmTmFtZXNwYWNlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZGVmTmFtZXNwYWNlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1kZWZOYW1lc3BhY2VzKFNldCBtZGVmTmFtZXNwYWNlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tZGVmTmFtZXNwYWNlcyA9IG1kZWZOYW1lc3BhY2VzOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGxvYWRUeXBlU3lzdGVtKAotICAgICAgICBTdHJpbmcgbmFtZSwgRmlsZVtdIHhzZEZpbGVzLAotICAgICAgICBGaWxlW10gd3NkbEZpbGVzLCBGaWxlW10gY29uZmlnRmlsZXMsIFJlc291cmNlTG9hZGVyIGNwUmVzb3VyY2VMb2FkZXIsCi0gICAgICAgIGJvb2xlYW4gZG93bmxvYWQsIGJvb2xlYW4gbm9VcGEsIGJvb2xlYW4gbm9QdnIsIFNldCBtZGVmTmFtZXNwYWNlcywKLSAgICAgICAgRmlsZSBiYXNlRGlyLCBNYXAgc291cmNlc1RvQ29weU1hcCwgQ29sbGVjdGlvbiBvdXRlckVycm9yTGlzdGVuZXIpCi0gICAgewotICAgICAgICBYbWxFcnJvcldhdGNoZXIgZXJyb3JMaXN0ZW5lciA9IG5ldyBYbWxFcnJvcldhdGNoZXIob3V0ZXJFcnJvckxpc3RlbmVyKTsKLQotICAgICAgICAvLyBGb3IgcGFyc2luZyBYU0QgYW5kIFdTREwgZmlsZXMsIHdlIHNob3VsZCB1c2UgdGhlIFNjaGVtYURvY3VtZW50Ci0gICAgICAgIC8vIGNsYXNzbG9hZGVyIHJhdGhlciB0aGFuIHRoZSB0aHJlYWQgY29udGV4dCBjbGFzc2xvYWRlci4gIFRoaXMgaXMKLSAgICAgICAgLy8gYmVjYXVzZSBpbiBzb21lIHNpdHVhdGlvbnMgKHN1Y2ggYXMgd2hlbiBiZWluZyBpbnZva2VkIGJ5IGFudAotICAgICAgICAvLyB1bmRlcm5lYXRoIHRoZSBpZGUpIHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyIGlzIHBvdGVudGlhbGx5IHdlaXJkCi0gICAgICAgIC8vIChiZWNhdXNlIG9mIHRoZSBkZXNpZ24gb2YgYW50KS4KLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciA9IFhtbEJlYW5zLnR5cGVMb2FkZXJGb3JDbGFzc0xvYWRlcihTY2hlbWFEb2N1bWVudC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAvLyBzdGVwIDEsIHBhcnNlIGFsbCB0aGUgWFNEIGZpbGVzLgotICAgICAgICBBcnJheUxpc3Qgc2NvbnRlbnRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoeHNkRmlsZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKTsKLQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3Qgc2NoZW1hZG9jID0gbG9hZGVyLnBhcnNlKHhzZEZpbGVzW2ldLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NoZW1hZG9jIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkRvY3VtZW50ICIgKyB4c2RGaWxlc1tpXSArICIgaXMgbm90IGEgc2NoZW1hIGZpbGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHNjaGVtYWRvYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkSW5mbyhlcnJvckxpc3RlbmVyLCAiTG9hZGluZyBzY2hlbWEgZmlsZSAiICsgeHNkRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYWRvYy52YWxpZGF0ZShvcHRzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29udGVudGxpc3QuYWRkKCgoU2NoZW1hRG9jdW1lbnQpc2NoZW1hZG9jKS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZS5nZXRFcnJvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJDYW5ub3QgbG9hZCBmaWxlICIgKyB4c2RGaWxlc1tpXSArICI6ICIgKyBlLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHhzZEZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdGVwIDIsIHBhcnNlIGFsbCBXU0RMIGZpbGVzCi0gICAgICAgIGlmICh3c2RsRmlsZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCi0gICAgICAgICAgICAgICAgICAgICkpOwotCi0KLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHdzZGxkb2MgPSBsb2FkZXIucGFyc2Uod3NkbEZpbGVzW2ldLCBudWxsLCBvcHRpb25zKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoISh3c2RsZG9jIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5pbnRlcm5hbC54bWxiZWFucy53c2Rsc3Vic3QuRGVmaW5pdGlvbnNEb2N1bWVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkRvY3VtZW50ICIgKyB3c2RsRmlsZXNbaV0gKyAiIGlzIG5vdCBhIHdzZGwgZmlsZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgd3NkbGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzZGxDb250YWluc0VuY29kZWQod3NkbGRvYykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZFdhcm5pbmcoZXJyb3JMaXN0ZW5lciwgIlRoZSBXU0RMICIgKyB3c2RsRmlsZXNbaV0gKyAiIHVzZXMgU09BUCBlbmNvZGluZy4gU09BUCBlbmNvZGluZyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGxpdGVyYWwgWE1MIFNjaGVtYS4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHdzZGxkb2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEluZm8oZXJyb3JMaXN0ZW5lciwgIkxvYWRpbmcgd3NkbCBmaWxlICIgKyB3c2RsRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0W10gdHlwZXMgPSAoKG9yZy5hcGFjaGUuaW50ZXJuYWwueG1sYmVhbnMud3NkbHN1YnN0LkRlZmluaXRpb25zRG9jdW1lbnQpd3NkbGRvYykuZ2V0RGVmaW5pdGlvbnMoKS5nZXRUeXBlc0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjYXN0IGZvciBwYXJhbm9pYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYURvY3VtZW50LlNjaGVtYVtdIHNjaGVtYXMgPSAoU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10pdHlwZXNbal0uc2VsZWN0UGF0aCgiZGVjbGFyZSBuYW1lc3BhY2UgeHM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHhzOnNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2NoZW1hcy5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFzW2tdLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3RlbmVyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29udGVudGxpc3QuYWRkKHNjaGVtYXNba10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBzY2hlbWFzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRJbmZvKGVycm9yTGlzdGVuZXIsICJQcm9jZXNzaW5nICIgKyBjb3VudCArICIgc2NoZW1hKHMpIGluICIgKyB3c2RsRmlsZXNbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZS5nZXRFcnJvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJDYW5ub3QgbG9hZCBmaWxlICIgKyB3c2RsRmlsZXNbaV0gKyAiOiAiICsgZSwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCB3c2RsRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYURvY3VtZW50LlNjaGVtYVtdIHNkb2NzID0gKFNjaGVtYURvY3VtZW50LlNjaGVtYVtdKXNjb250ZW50bGlzdC50b0FycmF5KG5ldyBTY2hlbWFEb2N1bWVudC5TY2hlbWFbc2NvbnRlbnRsaXN0LnNpemUoKV0pOwotCi0gICAgICAgIC8vIG5vdyB0aGUgY29uZmlnIGZpbGVzLgotICAgICAgICBBcnJheUxpc3QgY2RvY2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChjb25maWdGaWxlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0ZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuTE9BRF9MSU5FX05VTUJFUlMgKTsKLQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgY29uZmlnZG9jID0gbG9hZGVyLnBhcnNlKGNvbmZpZ0ZpbGVzW2ldLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnZG9jIGluc3RhbmNlb2YgQ29uZmlnRG9jdW1lbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJEb2N1bWVudCAiICsgY29uZmlnRmlsZXNbaV0gKyAiIGlzIG5vdCBhbiB4c2QgY29uZmlnIGZpbGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIGNvbmZpZ2RvYyk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEluZm8oZXJyb3JMaXN0ZW5lciwgIkxvYWRpbmcgY29uZmlnIGZpbGUgIiArIGNvbmZpZ0ZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdkb2MudmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdGVuZXIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZG9jbGlzdC5hZGQoKChDb25maWdEb2N1bWVudCljb25maWdkb2MpLmdldENvbmZpZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlLmdldEVycm9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkNhbm5vdCBsb2FkIHhzZCBjb25maWcgZmlsZSAiICsgY29uZmlnRmlsZXNbaV0gKyAiOiAiICsgZSwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9DT05GSUdfRklMRSwgY29uZmlnRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDb25maWdEb2N1bWVudC5Db25maWdbXSBjZG9jcyA9IChDb25maWdEb2N1bWVudC5Db25maWdbXSljZG9jbGlzdC50b0FycmF5KG5ldyBDb25maWdEb2N1bWVudC5Db25maWdbY2RvY2xpc3Quc2l6ZSgpXSk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsaW5rVG8gPSBTY2hlbWFUeXBlTG9hZGVySW1wbC5idWlsZChudWxsLCBjcFJlc291cmNlTG9hZGVyLCBudWxsKTsKLQotICAgICAgICBVUkkgYmFzZVVSSSA9IG51bGw7Ci0gICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpCi0gICAgICAgICAgICBiYXNlVVJJID0gYmFzZURpci50b1VSSSgpOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIGlmIChkb3dubG9hZCkKLSAgICAgICAgICAgIG9wdHMuc2V0Q29tcGlsZURvd25sb2FkVXJscygpOwotICAgICAgICBpZiAobm9VcGEpCi0gICAgICAgICAgICBvcHRzLnNldENvbXBpbGVOb1VwYVJ1bGUoKTsKLSAgICAgICAgaWYgKG5vUHZyKQotICAgICAgICAgICAgb3B0cy5zZXRDb21waWxlTm9QdnJSdWxlKCk7Ci0gICAgICAgIGlmIChtZGVmTmFtZXNwYWNlcyAhPSBudWxsKQotICAgICAgICAgICAgb3B0cy5zZXRDb21waWxlTWRlZk5hbWVzcGFjZXMobWRlZk5hbWVzcGFjZXMpOwotICAgICAgICBvcHRzLnNldENvbXBpbGVOb1ZhbGlkYXRpb24oKTsgLy8gYWxyZWFkeSB2YWxpZGF0ZWQgaGVyZQotCi0gICAgICAgIC8vIG5vdyBwYXNzIGl0IHRvIHRoZSBtYWluIGNvbXBpbGUgZnVuY3Rpb24KLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHBhcmFtcy5zZXROYW1lKG5hbWUpOwotICAgICAgICBwYXJhbXMuc2V0U2NoZW1hcyhzZG9jcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRDb25maWdzKGNkb2NzKTsKLSAgICAgICAgcGFyYW1zLnNldExpbmtUbyhsaW5rVG8pOwotICAgICAgICBwYXJhbXMuc2V0T3B0aW9ucyhvcHRzKTsKLSAgICAgICAgcGFyYW1zLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0ZW5lcik7Ci0gICAgICAgIHBhcmFtcy5zZXRKYXZhaXplKHRydWUpOwotICAgICAgICBwYXJhbXMuc2V0QmFzZVVSSShiYXNlVVJJKTsKLSAgICAgICAgcGFyYW1zLnNldFNvdXJjZXNUb0NvcHlNYXAoc291cmNlc1RvQ29weU1hcCk7Ci0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFBhcmFtZXRlcnMgcGFyYW1zKQotICAgIHsKLSAgICAgICAgRmlsZSBiYXNlRGlyID0gcGFyYW1zLmdldEJhc2VEaXIoKTsKLSAgICAgICAgRmlsZVtdIHhzZEZpbGVzID0gcGFyYW1zLmdldFhzZEZpbGVzKCk7Ci0gICAgICAgIEZpbGVbXSB3c2RsRmlsZXMgPSBwYXJhbXMuZ2V0V3NkbEZpbGVzKCk7Ci0gICAgICAgIEZpbGVbXSBqYXZhRmlsZXMgPSBwYXJhbXMuZ2V0SmF2YUZpbGVzKCk7Ci0gICAgICAgIEZpbGVbXSBjb25maWdGaWxlcyA9IHBhcmFtcy5nZXRDb25maWdGaWxlcygpOwotICAgICAgICBGaWxlW10gY2xhc3NwYXRoID0gcGFyYW1zLmdldENsYXNzcGF0aCgpOwotICAgICAgICBGaWxlIG91dHB1dEphciA9IHBhcmFtcy5nZXRPdXRwdXRKYXIoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJhbXMuZ2V0TmFtZSgpOwotICAgICAgICBGaWxlIHNyY0RpciA9IHBhcmFtcy5nZXRTcmNEaXIoKTsKLSAgICAgICAgRmlsZSBjbGFzc2VzRGlyID0gcGFyYW1zLmdldENsYXNzZXNEaXIoKTsKLSAgICAgICAgU3RyaW5nIGNvbXBpbGVyID0gcGFyYW1zLmdldENvbXBpbGVyKCk7Ci0gICAgICAgIFN0cmluZyBqYXIgPSBwYXJhbXMuZ2V0SmFyKCk7Ci0gICAgICAgIFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSA9IHBhcmFtcy5nZXRNZW1vcnlJbml0aWFsU2l6ZSgpOwotICAgICAgICBTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUgPSBwYXJhbXMuZ2V0TWVtb3J5TWF4aW11bVNpemUoKTsKLSAgICAgICAgYm9vbGVhbiBub2phdmFjID0gcGFyYW1zLmlzTm9qYXZhYygpOwotICAgICAgICBib29sZWFuIGRlYnVnID0gcGFyYW1zLmlzRGVidWcoKTsKLSAgICAgICAgYm9vbGVhbiB2ZXJib3NlID0gcGFyYW1zLmlzVmVyYm9zZSgpOwotICAgICAgICBib29sZWFuIHF1aWV0ID0gcGFyYW1zLmlzUXVpZXQoKTsKLSAgICAgICAgYm9vbGVhbiBkb3dubG9hZCA9IHBhcmFtcy5pc0Rvd25sb2FkKCk7Ci0gICAgICAgIGJvb2xlYW4gbm9VcGEgPSBwYXJhbXMuaXNOb1VwYSgpOwotICAgICAgICBib29sZWFuIG5vUHZyID0gcGFyYW1zLmlzTm9QdnIoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBvdXRlckVycm9yTGlzdGVuZXIgPSBwYXJhbXMuZ2V0RXJyb3JMaXN0ZW5lcigpOwotICAgICAgICBTdHJpbmcgcmVwYWNrYWdlID0gcGFyYW1zLmdldFJlcGFja2FnZSgpOwotICAgICAgICBMaXN0IGV4dGVuc2lvbnMgPSBwYXJhbXMuZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICBib29sZWFuIGpheGIgPSBwYXJhbXMuZ2V0SmF4YigpOwotICAgICAgICBTZXQgbWRlZk5hbWVzcGFjZXMgPSBwYXJhbXMuZ2V0TWRlZk5hbWVzcGFjZXMoKTsKLQotICAgICAgICBpZiAoc3JjRGlyID09IG51bGwgfHwgY2xhc3Nlc0RpciA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3JjIGFuZCBjbGFzcyBnZW4gZGlyZWN0b3JpZXMgbWF5IG5vdCBiZSBudWxsLiIpOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHVzZW5hbWVzIGJhc2VkIG9uIHRoZSByZWxhdGl2aXplZCBmaWxlbmFtZXMgb24gdGhlIGZpbGVzeXN0ZW0KLSAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCi0gICAgICAgIFJlc291cmNlTG9hZGVyIGNwUmVzb3VyY2VMb2FkZXIgPSBudWxsOwotCi0gICAgICAgIE1hcCBzb3VyY2VzVG9Db3B5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpCi0gICAgICAgICAgICBjcFJlc291cmNlTG9hZGVyID0gbmV3IFBhdGhSZXNvdXJjZUxvYWRlcihjbGFzc3BhdGgpOwotCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotICAgICAgICAvLyBidWlsZCB0aGUgaW4tbWVtb3J5IHR5cGUgc3lzdGVtCi0gICAgICAgIFhtbEVycm9yV2F0Y2hlciBlcnJvckxpc3RlbmVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcihvdXRlckVycm9yTGlzdGVuZXIpOwotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSA9IGxvYWRUeXBlU3lzdGVtKG5hbWUsIHhzZEZpbGVzLCB3c2RsRmlsZXMsIGNvbmZpZ0ZpbGVzLCBjcFJlc291cmNlTG9hZGVyLCBkb3dubG9hZCwgbm9VcGEsIG5vUHZyLCBtZGVmTmFtZXNwYWNlcywgYmFzZURpciwgc291cmNlc1RvQ29weU1hcCwgZXJyb3JMaXN0ZW5lcik7Ci0gICAgICAgIGlmIChlcnJvckxpc3RlbmVyLmhhc0Vycm9yKCkpCi0gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKCFxdWlldCkKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZSB0byBidWlsZCBzY2hlbWEgdHlwZSBzeXN0ZW06ICIgKyAoKGRvdWJsZSkoZmluaXNoIC0gc3RhcnQpIC8gMTAwMC4wKSArICIgc2Vjb25kcyIgKTsKLQotICAgICAgICAvLyBub3cgY29kZSBnZW5lcmF0ZSBhbmQgY29tcGlsZSB0aGUgSkFSCi0gICAgICAgIGlmIChyZXN1bHQgJiYgc3lzdGVtICE9IG51bGwpIC8vIHRvZG86IGRvbid0IGNoZWNrICJyZXN1bHQiIGhlcmUgaWYgd2Ugd2FudCB0byBjb21waWxlIGFueXdheSwgaWdub3JpbmcgaW52YWxpZCBzY2hlbWFzCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdlbmVyYXRlIHNvdXJjZSBhbmQgLnhzYgotICAgICAgICAgICAgTGlzdCBzb3VyY2VmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHJlc3VsdCAmPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNvbXBpbGVUeXBlU3lzdGVtKHN5c3RlbSwgc3JjRGlyLCBqYXZhRmlsZXMsIHNvdXJjZXNUb0NvcHlNYXAsIGNsYXNzcGF0aCwgY2xhc3Nlc0Rpciwgb3V0cHV0SmFyLCBub2phdmFjLCBqYXhiLCBlcnJvckxpc3RlbmVyLCByZXBhY2thZ2UsIHZlcmJvc2UsIHNvdXJjZWZpbGVzKTsKLSAgICAgICAgICAgIHJlc3VsdCAmPSAhZXJyb3JMaXN0ZW5lci5oYXNFcnJvcigpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZSB0byBnZW5lcmF0ZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbXBpbGUgc291cmNlCi0gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFub2phdmFjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoamF2YUZpbGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZEFsbChqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChqYXZhRmlsZXMpKTsKLSAgICAgICAgICAgICAgICBpZiAoIUNvZGVHZW5VdGlsLmV4dGVybmFsQ29tcGlsZShzb3VyY2VmaWxlcywgY2xhc3Nlc0RpciwgY2xhc3NwYXRoLCBkZWJ1ZywgY29tcGlsZXIsIG1lbW9yeUluaXRpYWxTaXplLCBtZW1vcnlNYXhpbXVtU2l6ZSwgcXVpZXQsIHZlcmJvc2UpKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIXBhcmFtcy5pc1F1aWV0KCkpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZSB0byBjb21waWxlIGNvZGU6ICIgKyAoKGRvdWJsZSkoZmluaXNoIC0gc3RhcnQpIC8gMTAwMC4wKSArICIgc2Vjb25kcyIgKTsKLQotICAgICAgICAgICAgICAgIC8vIGphciBjbGFzc2VzIGFuZCAueHNiCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBvdXRwdXRKYXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQ29kZUdlblV0aWwuZXh0ZXJuYWxKYXIoY2xhc3Nlc0Rpciwgb3V0cHV0SmFyLCBqYXIsIHF1aWV0LCB2ZXJib3NlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIXBhcmFtcy5pc1F1aWV0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGVkIHR5cGVzIHRvOiAiICsgb3V0cHV0SmFyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlc3VsdCAmJiAhcXVpZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQlVJTEQgRkFJTEVEIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBjYWxsIHNjaGVtYSBjb21waWxlciBleHRlbnNpb24gaWYgcmVnaXN0ZXJlZAotICAgICAgICAgICAgcnVuRXh0ZW5zaW9ucyhleHRlbnNpb25zLCBzeXN0ZW0sIGNsYXNzZXNEaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNwUmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNwUmVzb3VyY2VMb2FkZXIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1bkV4dGVuc2lvbnMoTGlzdCBleHRlbnNpb25zLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgRmlsZSBjbGFzc2VzRGlyKQotICAgIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCAmJiBleHRlbnNpb25zLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uIHNjZSA9IG51bGw7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgICAgTWFwIGV4dGVuc2lvblBhcm1zID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2VzRGlyTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbGFzc2VzRGlyTmFtZSA9IGNsYXNzZXNEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV0FSTklORzogVW5hYmxlIHRvIGdldCB0aGUgcGF0aCBmb3Igc2NoZW1hIGphciBmaWxlIik7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlc0Rpck5hbWUgPSBjbGFzc2VzRGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChFeHRlbnNpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2NlID0gKFNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uKSBleHRlbnNpb24uZ2V0Q2xhc3NOYW1lKCkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVU5BQkxFIHRvIGluc3RhbnRpYXRlIHNjaGVtYSBjb21waWxlciBleHRlbnNpb246IiArIGV4dGVuc2lvbi5nZXRDbGFzc05hbWUoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVYVEVOU0lPTiBDbGFzcyB3YXMgbm90IHJ1biIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSUxMRUdBTCBBQ0NFU1MgRXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldENsYXNzTmFtZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVhURU5TSU9OIENsYXNzIHdhcyBub3QgcnVuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUnVubmluZyBFeHRlbnNpb246ICIgKyBzY2UuZ2V0RXh0ZW5zaW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25QYXJtcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgcGFybXNpID0gZXh0ZW5zaW9uLmdldFBhcmFtcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhcm1zaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb24uUGFyYW0gcCA9IChFeHRlbnNpb24uUGFyYW0pIHBhcm1zaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblBhcm1zLnB1dChwLmdldE5hbWUoKSwgcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uUGFybXMucHV0KCJjbGFzc2VzRGlyIiwgY2xhc3Nlc0Rpck5hbWUpOwotICAgICAgICAgICAgICAgIHNjZS5zY2hlbWFDb21waWxlckV4dGVuc2lvbihzeXN0ZW0sIGV4dGVuc2lvblBhcm1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3c2RsQ29udGFpbnNFbmNvZGVkKFhtbE9iamVjdCB3c2RsZG9jKQotICAgIHsKLSAgICAgICAgLy8gc2VhcmNoIGZvciBhbnkgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiLz4gZXRjLgotICAgICAgICBYbWxPYmplY3RbXSB1c2VBdHRycyA9IHdzZGxkb2Muc2VsZWN0UGF0aCgKLSAgICAgICAgICAgICAgICAiZGVjbGFyZSBuYW1lc3BhY2Ugc29hcD0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLycgIiArCi0gICAgICAgICAgICAgICAgIi4vL3NvYXA6Ym9keS9AdXNlfC4vL3NvYXA6aGVhZGVyL0B1c2V8Li8vc29hcDpmYXVsdC9AdXNlIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlQXR0cnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgiZW5jb2RlZCIuZXF1YWxzKCgoU2ltcGxlVmFsdWUpdXNlQXR0cnNbaV0pLmdldFN0cmluZ1ZhbHVlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMGM5YjIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgU2NoZW1hIENvbXBpbGVyIEV4dGVuc2lvbnMuICBCeSBpbXBsZW1lbnRpbmcgdGhpcyBjbGFzcwotICogIHlvdSBjYW4gdGhlbiBwYXNzIHRoaXMgY2xhc3MgdmlhIHRoZSBjb21tYW5kIGxpbmUgcGFyYW0gPGk+ZXh0ZW5zaW9uPC9pPiB0byB0aGUgU2NoZW1hQ29tcGlsZXIgY2xhc3MKLSAqICB3aGljaCB3aWxsIHRoZW4gaW4gdHVybiBjYWxsIHRoaXMgY2xhc3MgYmFjayBvbmNlIHRoZSBjb21waWxhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHRpbmcKLSAqICBTY2hlbWFUeXBlU3lzdGVtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uIHsKLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBieSB0aGUgWG1sQmVhbnMgU2NoZW1hIENvbXBpbGVyIHdpdGgKLSAgICAgKiAgdGhlIFNjaGVtYSBUeXBlIFN5c3RlbSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNvbXBpbGUuCi0gICAgICogQHBhcmFtIHNjaGVtYVR5cGVTeXN0ZW0gLSBUaGUgc2NoZW1hIHR5cGUgc3lzdGVtcyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGp1c3QgcHJpb3IgdG8gY2FsbGluZwotICAgICAqICAgdGhpcyBleHRlbnNpb24gY2xhc3MuCi0gICAgICogQHBhcmFtIHBhcm1zIC0gbmFtZSB2YWx1ZSBwYWlycyBvZiBvcHRpb25zIHRvIHRoaXMgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uKFNjaGVtYVR5cGVTeXN0ZW0gc2NoZW1hVHlwZVN5c3RlbSwgTWFwIHBhcm1zKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYzY5OC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5EZWZpbml0aW9uc0RvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuaW50ZXJuYWwueG1sYmVhbnMud3NkbHN1YnN0LlRJbXBvcnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkltcG9ydERvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuSW5jbHVkZURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29weQotewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEgfHwgYXJncy5sZW5ndGggPiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBzY2hlbWFjb3B5IHNvdXJjZXVybCBbdGFyZ2V0ZmlsZV0iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFVSSSBzb3VyY2UgPSBudWxsOwotICAgICAgICBVUkkgdGFyZ2V0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc291cmNlID0gbmV3IFVSSShhcmdzWzBdKTsKLSAgICAgICAgICAgIHNvdXJjZS50b1VSTCgpOyAvLyB0byB0cmlnZ2VyIGV4Y2VwdGlvbgotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJCYWRseSBmb3JtZWQgVVJMICIgKyBzb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJJIGRpciA9IG5ldyBGaWxlKCIuIikuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhc3RQYXJ0ID0gc291cmNlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICBsYXN0UGFydCA9IGxhc3RQYXJ0LnN1YnN0cmluZyhsYXN0UGFydC5sYXN0SW5kZXhPZignLycpICsgMSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShkaXIsIFVSSS5jcmVhdGUobGFzdFBhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBjYW5vbmljYWxpemUgY3VycmVudCBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgVVJJKGFyZ3NbMV0pOwotICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghdGFyZ2V0LmdldFNjaGVtZSgpLmVxdWFscygiZmlsZSIpKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBGaWxlKHRhcmdldCkuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGNhbm9uaWNhbGl6ZSBjdXJyZW50IGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIHRoaW5nc1RvQ29weSA9IGZpbmRBbGxSZWxhdGl2ZShzb3VyY2UsIHRhcmdldCk7Ci0gICAgICAgIGNvcHlBbGwodGhpbmdzVG9Db3B5LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlBbGwoTWFwIHVyaU1hcCwgYm9vbGVhbiBzdGRvdXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1cmlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVVJJIHNvdXJjZSA9IChVUkkpaS5uZXh0KCk7Ci0gICAgICAgICAgICBVUkkgdGFyZ2V0ID0gKFVSSSl1cmlNYXAuZ2V0KHNvdXJjZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoc291cmNlLCB0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdGRvdXQpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGNvcHkgIiArIHNvdXJjZSArICIgLT4gIiArIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3Rkb3V0KQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3BpZWQgIiArIHNvdXJjZSArICIgLT4gIiArIHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgc2NoZW1hIG9yIHdzZGwgYXQgdGhlIHNvdXJjZSBVUkkgdG8gdGhlIHRhcmdldCBVUkksIGFsb25nCi0gICAgICogd2l0aCBhbnkgcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoZSB0YXJnZXQgVVJJIHNob3VsZCBiZSBhIGZpbGUgVVJJLgotICAgICAqIElmIGRvQ29weSBpcyBmYWxzZSwgdGhlIGZpbGUgY29waWVzIGFyZSBub3QgYWN0dWFsbHkgZG9uZTsgdGhlIG1hcAotICAgICAqIHJldHVybmVkIGp1c3QgZGVzY3JpYmVzIHRoZSBjb3BpZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgYW4gYXJiaXRyYXJ5IFVSSSBkZXNjcmliaW5nIGEgc291cmNlIFNjaGVtYSBvciBXU0RMCi0gICAgICogQHBhcmFtIHRhcmdldCBhIGZpbGUgVVJJIGRlc2NyaWJpbmcgYSB0YXJnZXQgZmlsZW5hbWUKLSAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGFsbCB0aGUgc291cmNlL3RhcmdldCBVUklzIG5lZWRlZCB0byBjb3B5Ci0gICAgICogdGhlIGZpbGUgYWxvbmcgd2l0aCBhbGwgaXRzIHJlbGF0aXZlIHJlZmVyZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBmaW5kQWxsUmVsYXRpdmUoVVJJIHNvdXJjZSwgVVJJIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICByZXN1bHQucHV0KHNvdXJjZSwgdGFyZ2V0KTsKLQotICAgICAgICBMaW5rZWRMaXN0IHByb2Nlc3MgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICBwcm9jZXNzLmFkZChzb3VyY2UpOwotCi0gICAgICAgIHdoaWxlICghcHJvY2Vzcy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVSSSBuZXh0U291cmNlID0gKFVSSSlwcm9jZXNzLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICBVUkkgbmV4dFRhcmdldCA9IChVUkkpcmVzdWx0LmdldChuZXh0U291cmNlKTsKLSAgICAgICAgICAgIE1hcCBuZXh0UmVzdWx0cyA9IGZpbmRSZWxhdGl2ZUluT25lKG5leHRTb3VyY2UsIG5leHRUYXJnZXQpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV4dFJlc3VsdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVUkkgbmV3U291cmNlID0gKFVSSSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRhaW5zS2V5KG5ld1NvdXJjZSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobmV3U291cmNlLCBuZXh0UmVzdWx0cy5nZXQobmV3U291cmNlKSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzcy5hZGQobmV3U291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGlvbnMgbG9hZE9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpLgotICAgICAgICAgICAgc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiIAotICAgICAgICAgICAgKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgZmluZFJlbGF0aXZlSW5PbmUoVVJJIHNvdXJjZSwgVVJJIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgc291cmNlVVJMID0gc291cmNlLnRvVVJMKCk7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNvdXJjZVVSTCwgbG9hZE9wdGlvbnMpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIHhjdXIgPSB4b2JqLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgcHV0TWFwcGluZ3NGcm9tU2NoZW1hKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsICgoU2NoZW1hRG9jdW1lbnQpeG9iaikuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoeG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb25zRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgcHV0TWFwcGluZ3NGcm9tV3NkbChyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCAoKERlZmluaXRpb25zRG9jdW1lbnQpeG9iaikuZ2V0RGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYW55IGV4Y2VwdGlvbnMgcGFyc2luZyB0aGUgZ2l2ZW4gVVJMPyAgVGhlbiBza2lwIHRoaXMgZmlsZSBzaWxlbnRseQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXROZXdNYXBwaW5nKE1hcCByZXN1bHQsIFVSSSBvcmlnU291cmNlLCBVUkkgb3JpZ1RhcmdldCwgU3RyaW5nIGxpdGVyYWxVUkkpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxpdGVyYWxVUkkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBVUkkgbmV3UmVsYXRpdmUgPSBuZXcgVVJJKGxpdGVyYWxVUkkpOwotICAgICAgICAgICAgaWYgKG5ld1JlbGF0aXZlLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBVUkkgbmV3U291cmNlID0gQ29kZUdlblV0aWwucmVzb2x2ZShvcmlnU291cmNlLCBuZXdSZWxhdGl2ZSk7Ci0gICAgICAgICAgICBVUkkgbmV3VGFyZ2V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShvcmlnVGFyZ2V0LCBuZXdSZWxhdGl2ZSk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KG5ld1NvdXJjZSwgbmV3VGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVyaSBzeW50YXggcHJvYmxlbT8gZG8gbm90aGluZyBzaWxlbnRseS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0TWFwcGluZ3NGcm9tU2NoZW1hKE1hcCByZXN1bHQsIFVSSSBzb3VyY2UsIFVSSSB0YXJnZXQsIFNjaGVtYURvY3VtZW50LlNjaGVtYSBzY2hlbWEpCi0gICAgewotICAgICAgICBJbXBvcnREb2N1bWVudC5JbXBvcnRbXSBpbXBvcnRzID0gc2NoZW1hLmdldEltcG9ydEFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHB1dE5ld01hcHBpbmcocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgaW1wb3J0c1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLQotICAgICAgICBJbmNsdWRlRG9jdW1lbnQuSW5jbHVkZVtdIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcHV0TmV3TWFwcGluZyhyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCBpbmNsdWRlc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE1hcHBpbmdzRnJvbVdzZGwoTWFwIHJlc3VsdCwgVVJJIHNvdXJjZSwgVVJJIHRhcmdldCwgRGVmaW5pdGlvbnNEb2N1bWVudC5EZWZpbml0aW9ucyB3ZG9jKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gdHlwZXMgPSB3ZG9jLmdldFR5cGVzQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2NoZW1hcyA9IChTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSl0eXBlc1tpXS5zZWxlY3RQYXRoKCJkZWNsYXJlIG5hbWVzcGFjZSB4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIHhzOnNjaGVtYSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzY2hlbWFzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgIHB1dE1hcHBpbmdzRnJvbVNjaGVtYShyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCBzY2hlbWFzW2pdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRJbXBvcnRbXSBpbXBvcnRzID0gd2RvYy5nZXRJbXBvcnRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBwdXROZXdNYXBwaW5nKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsIGltcG9ydHNbaV0uZ2V0TG9jYXRpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hSW1wb3J0UmVzb2x2ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUltcG9ydFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2M4MmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hSW1wb3J0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbXBvcnREb2N1bWVudC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbmNsdWRlRG9jdW1lbnQuSW5jbHVkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNjaGVtYUltcG9ydFJlc29sdmVyCi17Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIEltcG9ydExvYWRlciB3aXNoZXMgdG8gcmVzb2x2ZSB0aGUKLSAgICAgKiBnaXZlbiBpbXBvcnQuICBTaG91bGQgcmV0dXJuIGEgU2NoZW1hUmVzb3VyY2Ugd2hvc2UKLSAgICAgKiAiZXF1YWxzIiByZWxhdGlvbnNoaXAgcmV2ZWFscyB3aGVuIGEgU2NoZW1hUmVzb3VyY2UgaXMKLSAgICAgKiBkdXBsaWNhdGVkIGFuZCBzaG91bGRuJ3QgYmUgZXhhbWluZWQgYWdhaW4uCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHJlc291cmNlIHJlZmVyZW5jZSBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUmVzb3VyY2UgbG9va3VwUmVzb3VyY2UoU3RyaW5nIG5zVVJJLCBTdHJpbmcgVVJMKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBub3RpZnkgdGhhdCB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlIGlzIGRpZmZlcmVudCBmcm9tIHRoZQotICAgICAqIGFjdHVhbCBuYW1lc3BhY2UsIG9yIGlmIG5vIG5hbWVzcGFjZSBpcyBrbm93biwgdG8gcmVwb3J0IHRoZQotICAgICAqIGRpc2NvdmVyZWQgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydEFjdHVhbE5hbWVzcGFjZShTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGFjdHVhbE5hbWVzcGFjZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHN1cHBseSBhIHNjaGVtYSByZXNvdXJjZSB3aXRoIGFuIG9wdGlvbmFsIGFzc29jaWF0ZWQKLSAgICAgKiBleHBlY3RlZC1uYW1lc3BhY2UtVVJJIGFuZCBvcmlnaW5hbC1sb2NhdGlvbi1VUkwuCi0gICAgICoKLSAgICAgKiBUaGUgZXF1YWxzIChhbmQgaGFzaENvZGUpIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU2NoZW1hUmVzb3VyY2UKLSAgICAgKiBvYmplY3RzIHdpbGwgYmUgdXNlZCB0byBhdm9pZCBleGFtaW5pbmcgdGhlIHNhbWUgcmVzb3VyY2UgdHdpY2U7Ci0gICAgICogdGhlc2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgcnVsZXMgZm9yCi0gICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0d28gcmVzb3VyY2VzIGFyZSB0aGUgc2FtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVJlc291cmNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHBhcnNlZCBzY2hlbWEgb2JqZWN0LgotICAgICAgICAgKi8KLQotICAgICAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNvbHZlSW1wb3J0cyhTY2hlbWFSZXNvdXJjZVtdIHJlc291cmNlcykKLSAgICB7Ci0gICAgICAgIExpbmtlZExpc3QgcXVldWVPZlJlc291cmNlcyA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QocmVzb3VyY2VzKSk7Ci0gICAgICAgIExpbmtlZExpc3QgcXVldWVPZkxvY2F0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgU2V0IHNlZW5SZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIG5leHRSZXNvdXJjZTsKLQotICAgICAgICAgICAgLy8gZmV0Y2ggbmV4dCByZXNvdXJjZS4KLSAgICAgICAgICAgIGlmICghcXVldWVPZlJlc291cmNlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZWl0aGVyIG9mZiB0aGUgaW5pdGlhbCBxdWV1ZQotICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlxdWV1ZU9mUmVzb3VyY2VzLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghcXVldWVPZkxvY2F0b3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvciBvZmYgdGhlIGxpc3Qgb2YgbG9jYXRvcnMKLSAgICAgICAgICAgICAgICBTY2hlbWFMb2NhdG9yIGxvY2F0b3IgPSAoU2NoZW1hTG9jYXRvcilxdWV1ZU9mTG9jYXRvcnMucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBsb29rdXBSZXNvdXJjZShsb2NhdG9yLm5hbWVzcGFjZSwgbG9jYXRvci5zY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRSZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBubyBtb3JlLCB0aGVuIHRlcm1pbmF0ZSBsb29wCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRyYWNrIGFuZCBza2lwIGR1cGxpY2F0ZXMKLSAgICAgICAgICAgIGlmIChzZWVuUmVzb3VyY2VzLmNvbnRhaW5zKG5leHRSZXNvdXJjZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBzZWVuUmVzb3VyY2VzLmFkZChuZXh0UmVzb3VyY2UpOwotCi0gICAgICAgICAgICAvLyBnZXQgcmVzb3VyY2UgY29udGVudHMKLSAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBuZXh0UmVzb3VyY2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFjdHVhbCBuYW1lc3BhY2UKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgYWN0dWFsVGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0KLSAgICAgICAgICAgIC8vIHJlcG9ydCBhY3R1YWwgbmFtZXNwYWNlCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2UgPSBuZXh0UmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAhYWN0dWFsVGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhleHBlY3RlZFRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0QWN0dWFsTmFtZXNwYWNlKG5leHRSZXNvdXJjZSwgYWN0dWFsVGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGdvIHRocm91Z2ggYW5kIHJlY29yZCBhbGwgdGhlIGltcG9ydHMKLSAgICAgICAgICAgIEltcG9ydFtdIHNjaGVtYUltcG9ydHMgPSBzY2hlbWEuZ2V0SW1wb3J0QXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hSW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBxdWV1ZU9mTG9jYXRvcnMuYWRkKG5ldyBTY2hlbWFMb2NhdG9yKHNjaGVtYUltcG9ydHNbaV0uZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCA/ICIiIDogc2NoZW1hSW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSwgc2NoZW1hSW1wb3J0c1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFuZCByZWNvcmQgYWxsIHRoZSBpbmNsdWRlcyB0b28KLSAgICAgICAgICAgIEluY2x1ZGVbXSBzY2hlbWFJbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hSW5jbHVkZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcXVldWVPZkxvY2F0b3JzLmFkZChuZXcgU2NoZW1hTG9jYXRvcihudWxsLCBzY2hlbWFJbmNsdWRlc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY2hlbWFMb2NhdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgU2NoZW1hTG9jYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgdGhpcy5zY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUxvY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc2NoZW1hTG9jYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ODIzNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlc291cmNlTWFuYWdlciBleHRlbmRzIEJhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1haW50YWlucyBcInhzZG93bmxvYWQueG1sXCIsIGFuIGluZGV4IG9mIGxvY2FsbHkgZG93bmxvYWRlZCAueHNkIGZpbGVzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBzZG93bmxvYWQgWy1kaXIgZGlyZWN0b3J5XSBbLXJlZnJlc2hdIFstcmVjdXJzZV0gWy1zeW5jXSBbdXJsL2ZpbGUuLi5dIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVUkxzIHRoYXQgYXJlIHNwZWNpZmllZCBhcmUgZG93bmxvYWRlZCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IGNhY2hlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gYWRkaXRpb246Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRpciBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIHhzZG93bmxvYWQueG1sIGZpbGUgKGRlZmF1bHQgLikuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXN5bmMgc3luY2hyb25pemVzIHRoZSBpbmRleCB0byBhbnkgbG9jYWwgLnhzZCBmaWxlcyBpbiB0aGUgdHJlZS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtcmVjdXJzZSByZWN1cnNpdmVseSBkb3dubG9hZHMgaW1wb3J0ZWQgYW5kIGluY2x1ZGVkIC54c2QgZmlsZXMuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXJlZnJlc2ggcmVkb3dubG9hZHMgYWxsIGluZGV4ZWQgLnhzZCBmaWxlcy4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWYgbm8gZmlsZXMgb3IgVVJMcyBhcmUgc3BlY2lmaWVkLCBhbGwgaW5kZXhlZCBmaWxlcyBhcmUgcmVsZXZhbnQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFNldCBvcHRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgb3B0cy5hZGQoImRpciIpOwotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBvcHRzKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzeW5jID0gKGNsLmdldE9wdCgic3luYyIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIHJlZnJlc2ggPSAoY2wuZ2V0T3B0KCJyZWZyZXNoIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gaW1wb3J0cyA9IChjbC5nZXRPcHQoInJlY3Vyc2UiKSAhPSBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRpciA9IGNsLmdldE9wdCgiZGlyIik7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGRpciA9ICIuIjsKLSAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShkaXIpOwotCi0gICAgICAgIFNjaGVtYVJlc291cmNlTWFuYWdlciBtZ3I7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZ3IgPSBuZXcgU2NoZW1hUmVzb3VyY2VNYW5hZ2VyKGRpcmVjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgdXJpTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9va3NMaWtlVVJMKGFyZ3NbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVyaUxpc3QuYWRkKGFyZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgRmlsZShkaXJlY3RvcnksIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCBmaWxlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmlsZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWlzSW5EaXJlY3RvcnkoZmlsZSwgZGlyZWN0b3J5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGUgbm90IHdpdGhpbiBkaXJlY3Rvcnk6ICIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGRpcmVjdG9yaWVzCi0gICAgICAgIGZpbGVMaXN0ID0gY29sbGVjdFhTREZpbGVzKChGaWxlW10pZmlsZUxpc3QudG9BcnJheShuZXcgRmlsZVswXSkpOwotCi0gICAgICAgIFN0cmluZ1tdIHVyaXMgPSAoU3RyaW5nW10pdXJpTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBGaWxlW10gZmlsZXMgPSAoRmlsZVtdKWZpbGVMaXN0LnRvQXJyYXkobmV3IEZpbGVbMF0pOwotICAgICAgICBTdHJpbmdbXSBmaWxlbmFtZXMgPSByZWxhdGl2ZUZpbGVuYW1lcyhmaWxlcywgZGlyZWN0b3J5KTsKLQotICAgICAgICBpZiAodXJpcy5sZW5ndGggKyBmaWxlbmFtZXMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbWdyLnByb2Nlc3ModXJpcywgZmlsZW5hbWVzLCBzeW5jLCByZWZyZXNoLCBpbXBvcnRzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1nci5wcm9jZXNzQWxsKHN5bmMsIHJlZnJlc2gsIGltcG9ydHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWdyLndyaXRlQ2FjaGUoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb29rc0xpa2VVUkwoU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdHIuc3RhcnRzV2l0aCgiaHR0cDoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiaHR0cHM6IikgfHwgc3RyLnN0YXJ0c1dpdGgoImZ0cDoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiZmlsZToiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVsYXRpdmVGaWxlbmFtZShGaWxlIGZpbGUsIEZpbGUgZGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmVxdWFscyhkaXJlY3RvcnkpKQotICAgICAgICAgICAgcmV0dXJuICIuIjsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGRpcmVjdG9yeSkgKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSByZWxhdGl2ZUZpbGVuYW1lcyhGaWxlW10gZmlsZXMsIEZpbGUgZGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tmaWxlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSByZWxhdGl2ZUZpbGVuYW1lKGZpbGVzW2ldLCBkaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luRGlyZWN0b3J5KEZpbGUgZmlsZSwgRmlsZSBkaXIpCi0gICAgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoZmlsZS5lcXVhbHMoZGlyKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gaXNJbkRpcmVjdG9yeShmaWxlLmdldFBhcmVudEZpbGUoKSwgZGlyKTsKLSAgICB9Ci0KLQotCi0KLQotICAgIHB1YmxpYyBTY2hlbWFSZXNvdXJjZU1hbmFnZXIoRmlsZSBkaXJlY3RvcnkpCi0gICAgewotICAgICAgICBfZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIF9kaXJlY3Rvcnk7Ci0KLQotICAgIC8vIFNPTUUgTUVUSE9EUyBUTyBPVkVSUklERSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBtZXNzYWdlcyB0byBTeXN0ZW0ub3V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdhcm5pbmcoU3RyaW5nIG1zZykKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXhpc3RzLiAgVGhlIGZpbGVuYW1lcwotICAgICAqIGFyZSBvZiB0aGUgZm9ybSAiL2Zvby9iYXIvemVlLnhzZCIgYW5kIHNob3VsZCBiZSBjb25zdHJ1ZWQKLSAgICAgKiBhcyByb290ZWQgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKG5ldyBGaWxlKF9kaXJlY3RvcnksIGZpbGVuYW1lKSkuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gZmlsZW5hbWUgYXMgYW4gSW5wdXRTdHJlYW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGlucHV0U3RyZWFtRm9yRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gZW50aXJlIGZpbGUgaW4gb25lIHN0ZXAuICBBbiBJbnB1dFN0cmVhbSBpcyBwYXNzZWQgYW5kCi0gICAgICogY29waWVkIHRvIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfZGlyZWN0b3J5LCBmaWxlbmFtZSk7Ci0KLSAgICAgICAgRmlsZSBwYXJlbnQgPSB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpCi0gICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGlucHV0LCBvdXRwdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBmaWxlLiAgU29tZXRpbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgYSBuZXcgZmlsZQotICAgICAqIHdlIG5vdGljZSB0aGF0IGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiBleGlzdGluZyBmaWxlIGFuZAotICAgICAqIHdlIGRlbGV0ZSBpdC4gV2UgbmV2ZXIgZGVsZXRlIGEgZmlsZSB0aGF0IHdhcyBnaXZlbiB0byB1cwotICAgICAqIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgbmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgWFNEIGZpbGVzbmFtZXMgaW4gdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFsbFhTREZpbGVuYW1lcygpCi0gICAgewotICAgICAgICBGaWxlW10gYWxsRmlsZXMgPSAoRmlsZVtdKWNvbGxlY3RYU0RGaWxlcyhuZXcgRmlsZVtdIHsgX2RpcmVjdG9yeSB9KS50b0FycmF5KG5ldyBGaWxlWzBdKTsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWVzKGFsbEZpbGVzLCBfZGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgcmVjdXJzaXZlIGZpbGUgZmlsdGVyIHRvIGRvIHRoZSBhYm92ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RYU0RGaWxlcyhGaWxlW10gZGlycykKLSAgICB7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gZGlyc1tpXTsKLSAgICAgICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGRBbGwoY29sbGVjdFhTREZpbGVzKAotICAgICAgICAgICAgICAgICAgICBmLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmlzRmlsZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzZCIpOyB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1R5cGVIaWVyYXJjaHlQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTM2MzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVHlwZUhpZXJhcmNoeVByaW50ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2wuYXJncygpLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50cyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdHlwZXMgZGVmaW5lZCBpbiBhIHNjaGVtYS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHhzZHRyZWUgWy1ub2Fub25dIFstbm9wdnJdIFstbm91cGFdIFstbGljZW5zZV0gZmlsZTEueHNkIGZpbGUyLnhzZCAuLi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBub2Fub24gPSAoY2wuZ2V0T3B0KCJub2Fub24iKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub3B2ciA9IChjbC5nZXRPcHQoIm5vcHZyIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm91cGEgPSAoY2wuZ2V0T3B0KCJub3VwYSIpICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgRmlsZVtdIHNjaGVtYUZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN0ZXAgMTogbG9hZCBhbGwgdGhlIGZpbGVzCi0gICAgICAgIExpc3Qgc2RvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNkb2NzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVzW2ldLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHNjaGVtYUZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hcyA9IChYbWxPYmplY3RbXSlzZG9jcy50b0FycmF5KG5ldyBYbWxPYmplY3RbMF0pOwotICAgICAgICAKLSAgICAgICAgLy8gc3RlcCAyOiBjb21waWxlIGFsbCB0aGUgc2NoZW1hcwotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW07Ci0gICAgICAgIENvbGxlY3Rpb24gY29tcEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgWG1sT3B0aW9ucyBzY2hlbWFPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGNvbXBFcnJvcnMpOwotICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKLSAgICAgICAgaWYgKG5vcHZyKQotICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlTm9QdnJSdWxlKCk7Ci0gICAgICAgIGlmIChub3VwYSkKLSAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vVXBhUnVsZSgpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVTeXN0ZW0gPSBYbWxCZWFucy5jb21waWxlWHNkKHNjaGVtYXMsIFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCksIHNjaGVtYU9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTY2hlbWEgaW52YWxpZCIpOwotICAgICAgICAgICAgaWYgKGNvbXBFcnJvcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlbHNlIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBFcnJvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaS5uZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzdGVwIDM6IGdvIHRocm91Z2ggYWxsIHRoZSB0eXBlcywgYW5kIG5vdGUgdGhlaXIgYmFzZSB0eXBlcyBhbmQgbmFtZXNwYWNlcwotICAgICAgICBNYXAgcHJlZml4ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcmVmaXhlcy5wdXQoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsICJ4bWwiKTsKLSAgICAgICAgcHJlZml4ZXMucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4cyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhtbG5zOnhzPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGEgbWFwIG9mIChiYXNlIFNjaGVtYVR5cGUgLT4gQ29sbGVjdGlvbiBvZiBkaXJlY3RseSBkZXJ2aWVkIHR5cGVzKQotICAgICAgICBNYXAgY2hpbGRUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBicmVhZHRoZmlyc3QgdHJhdmVyc2FsIG9mIHRoZSB0eXBlIGNvbnRhaW5tZW50IHRyZWUKLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmRvY3VtZW50VHlwZXMoKSkpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHJlY3Vyc2UgdGhyb3VnaCBuZXN0ZWQgYW5vbnltb3VzIHR5cGVzIGFzIHdlbGwKLSAgICAgICAgICAgIGlmICghbm9hbm9uKQotICAgICAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIGRvY3VtZW50IHR5cGVzLCBhdHRyaWJ1dGUgdHlwZXMsIG9yIGNoYXNpbmcgdGhlIGJhc2UgdHlwZSBvZiBhbnlUeXBlCi0gICAgICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSB8fCBzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSB8fCBzVHlwZSA9PSBYbWxPYmplY3QudHlwZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYXNzaWduIGEgcHJlZml4IHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhpcyB0eXBlIGlmIG5lZWRlZAotICAgICAgICAgICAgbm90ZU5hbWVzcGFjZShwcmVmaXhlcywgc1R5cGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBlbnRlciB0aGlzIHR5cGUgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgaXRzIGJhc2UgdHlwZQotICAgICAgICAgICAgQ29sbGVjdGlvbiBjaGlsZHJlbiA9IChDb2xsZWN0aW9uKWNoaWxkVHlwZXMuZ2V0KHNUeXBlLmdldEJhc2VUeXBlKCkpOwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRUeXBlcy5wdXQoc1R5cGUuZ2V0QmFzZVR5cGUoKSwgY2hpbGRyZW4pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIGEgYnVpbHRpbiB0eXBlIGlzIHNlZW4sIGFkZCBpdCB0b28gKHRvIGdldCBhIGNvbXBsZXRlIHRyZWUgdXAgdG8gYW55VHlwZSkKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuZ2V0QmFzZVR5cGUoKS5pc0J1aWx0aW5UeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGQoc1R5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGlsZHJlbi5hZGQoc1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzdGVwIDQ6IHByaW50IHRoZSB0cmVlLCBzdGFydGluZyBmcm9tIHhzOmFueVR5cGUgKGkuZS4sIFhtbE9iamVjdC50eXBlKQotICAgICAgICBMaXN0IHR5cGVzVG9QcmludCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHlwZXNUb1ByaW50LmFkZChYbWxPYmplY3QudHlwZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzcGFjZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlICghdHlwZXNUb1ByaW50LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IChTY2hlbWFUeXBlKXR5cGVzVG9QcmludC5yZW1vdmUodHlwZXNUb1ByaW50LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3BhY2VzLnNldExlbmd0aChNYXRoLm1heCgwLCBzcGFjZXMubGVuZ3RoKCkgLSAyKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNwYWNlcyArICIrLSIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSwgcHJlZml4ZXMpICsgbm90ZXMoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNoaWxkcmVuID0gKENvbGxlY3Rpb24pY2hpbGRUeXBlcy5nZXQoc1R5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcGFjZXMuYXBwZW5kKHR5cGVzVG9QcmludC5zaXplKCkgPT0gMCB8fCB0eXBlc1RvUHJpbnQuZ2V0KHR5cGVzVG9QcmludC5zaXplKCkgLSAxKSA9PSBudWxsID8gIiAgIiA6ICJ8ICIpOwotICAgICAgICAgICAgICAgICAgICB0eXBlc1RvUHJpbnQuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB0eXBlc1RvUHJpbnQuYWRkQWxsKGNoaWxkcmVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vdGVzKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuaXNCdWlsdGluVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuICIgKGJ1aWx0aW4pIjsKLSAgICAgICAgCi0gICAgICAgIGlmIChzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIChsaXN0KSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiAodW5pb24pIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIgKGVudW1lcmF0aW9uKSI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRDb250ZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiAobWl4ZWQpIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiAoY29tcGxleCkiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBub3RlTmFtZXNwYWNlKE1hcCBwcmVmaXhlcywgU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBRTmFtZUhlbHBlci5uYW1lc3BhY2Uoc1R5cGUpOwotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikgfHwgcHJlZml4ZXMuY29udGFpbnNLZXkobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiYXNlID0gUU5hbWVIZWxwZXIuc3VnZ2VzdFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYmFzZTsKLSAgICAgICAgZm9yIChpbnQgbiA9IDA7IHByZWZpeGVzLmNvbnRhaW5zVmFsdWUocmVzdWx0KTsgbiArPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBiYXNlICsgbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJlZml4ZXMucHV0KG5hbWVzcGFjZSwgcmVzdWx0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4bWxuczoiICsgcmVzdWx0ICsgIj1cIiIgKyBuYW1lc3BhY2UgKyAiXCIiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMThmYTEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRmlsZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLS8qKgotICogTW9kZWxlZCBhZnRlciBBbnQncyBqYXZhYyBhbmQgemlwIHRhc2tzLgotICoKLSAqIFNjaGVtYSBmaWxlcyB0byBwcm9jZXNzLCBvciBkaXJlY3RvcmllcyBvZiBzY2hlbWEgZmlsZXMsIGFyZSBzZXQgd2l0aCB0aGUgJ3NjaGVtYScKLSAqIGF0dHJpYnV0ZSwgYW5kIGNhbiBiZSBmaWx0ZXJlZCB3aXRoICdpbmNsdWRlcycgYW5kICdleGNsdWRlcycuCi0gKiBBbHRlcm5hdGl2ZWx5LCBvbmUgb3IgbW9yZSBuZXN0ZWQgJmx0O2ZpbGVzZXQmZ3Q7IGVsZW1lbnRzIGNhbiBzcGVjaWZ5IHRoZSAKLSAqIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgWE1MQmVhbi4KLSAqIFRoZSBpbmNsdWRlIHNldCBjYW4gYWxzbyBkZWZpbmUgLmphdmEgZmlsZXMgdGhhdCBzaG91bGQgYmUgYnVpbHQgYXMgd2VsbC4gIAotICogU2VlIHRoZSBGaWxlU2V0IGRvY3VtZW50YXRpb24gYXQgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQvbWFudWFsL2luZGV4Lmh0bWwKLSAqIGZvciBpbnN0cnVjdGlvbnMgb24gRmlsZVNldHMgaWYgeW91IGFyZSB1bmZhbWlsaWFyIHdpdGggdGhlaXIgdXNhZ2UuCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTEJlYW4gZXh0ZW5kcyBNYXRjaGluZ1Rhc2sKLXsKLSAgICBwcml2YXRlIEFycmF5TGlzdCAgIHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBQYXRoICAgICAgICBjbGFzc3BhdGg7Ci0gICAgCi0gICAgcHJpdmF0ZSBGaWxlICAgICAgICBkZXN0ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2dlbmRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZ2VuZGlyOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgcXVpZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgc3Jjb25seSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmsgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWUgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUphdmFSdW50aW1lID0gZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICB0eXBlc3lzdGVtbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtlZEV4ZWN1dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlJbml0aWFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU1heGltdW1TaXplOwotICAgIAotICAgIHByaXZhdGUgTGlzdCAgICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgSGFzaE1hcCAgICAgX2V4dFJvdXRlciA9IG5ldyBIYXNoTWFwKDUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRCA9ICIueHNkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETCA9ICIud3NkbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBVkEgPSAiLmphdmEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RDT05GSUcgPSAiLnhzZGNvbmZpZyI7Ci0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8qIFZBTElEQVRJT04gKi8KLSAgICAgICAgLy9yZXF1aXJlZAotICAgICAgICBpZiAoc2NoZW1hcy5zaXplKCkgPT0gMAotICAgICAgICAgICAgJiYgc2NoZW1hID09IG51bGwKLSAgICAgICAgICAgICYmIGZpbGVzZXQuZ2V0RGlyKHByb2plY3QpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlICdzY2hlbWEnIG9yICdkaXInIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBmaWxlc2V0IGlzIHJlcXVpcmVkLiI7Ci0gICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF9leHRSb3V0ZXIucHV0KFhTRCwgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgIF9leHRSb3V0ZXIucHV0KFdTREwsIG5ldyBIYXNoU2V0KCkpOwotICAgICAgICBfZXh0Um91dGVyLnB1dChKQVZBLCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgX2V4dFJvdXRlci5wdXQoWFNEQ09ORklHLCBuZXcgSGFzaFNldCgpKTsKLQotICAgICAgICBGaWxlIHRoZUJhc2VkaXIgPSBzY2hlbWE7Ci0KLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZVNjYW5uZXIgc2Nhbm5lciA9IGdldERpcmVjdG9yeVNjYW5uZXIoc2NoZW1hKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXRocyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXRocyhwYXRocywgc2Nhbm5lci5nZXRCYXNlZGlyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoZUJhc2VkaXIgPSBzY2hlbWEuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXRocyhuZXcgU3RyaW5nW10geyBzY2hlbWEuZ2V0TmFtZSgpIH0sIHRoZUJhc2VkaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZmlsZXNldC5nZXREaXIocHJvamVjdCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHNjaGVtYXMuYWRkKGZpbGVzZXQpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3Igc2kgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChzaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgc2kubmV4dCgpOwotICAgICAgICAgICAgRmlsZVNjYW5uZXIgc2Nhbm5lciA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICBGaWxlIGJhc2VkaXIgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NQYXRocyhwYXRocywgYmFzZWRpcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgeHNkTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KFhTRCk7Ci0gICAgICAgIFNldCB3c2RsTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KFdTREwpOwotICAgICAgICAKLSAgICAgICAgaWYgKHhzZExpc3Quc2l6ZSgpICsgd3NkbExpc3Quc2l6ZSgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGZpbmQgYW55IHhzZCBvciB3c2RsIGZpbGVzIHRvIHByb2Nlc3MuIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL29wdGlvbmFsCi0gICAgICAgIFNldCBqYXZhTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KEpBVkEpOwotICAgICAgICBTZXQgeHNkY29uZmlnTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KFhTRENPTkZJRyk7Ci0KLSAgICAgICAgaWYgKHNyY2dlbmRpciA9PSBudWxsICYmIHNyY29ubHkpCi0gICAgICAgICAgICBzcmNnZW5kaXIgPSBjbGFzc2dlbmRpcjsKLQotICAgICAgICBpZiAoZGVzdGZpbGUgPT0gbnVsbCAmJiBjbGFzc2dlbmRpciA9PSBudWxsICYmICEgc3Jjb25seSkKLSAgICAgICAgICAgIGRlc3RmaWxlID0gbmV3IEZpbGUoInhtbHR5cGVzLmphciIpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgcXVpZXQgPSBmYWxzZTsKLQotICAgICAgICAvKiBFWEVDVVRJT04gKi8KLQotICAgICAgICBGaWxlW10geHNkQXJyYXkgPSAoRmlsZVtdKSB4c2RMaXN0LnRvQXJyYXkobmV3IEZpbGVbeHNkTGlzdC5zaXplKCldKTsKLSAgICAgICAgRmlsZVtdIHdzZGxBcnJheSA9IChGaWxlW10pIHdzZGxMaXN0LnRvQXJyYXkobmV3IEZpbGVbd3NkbExpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIEZpbGVbXSBqYXZhQXJyYXkgPSAoRmlsZVtdKSBqYXZhTGlzdC50b0FycmF5KG5ldyBGaWxlW2phdmFMaXN0LnNpemUoKV0pOwotICAgICAgICBGaWxlW10geHNkY29uZmlnQXJyYXkgPSAoRmlsZVtdKSB4c2Rjb25maWdMaXN0LnRvQXJyYXkobmV3IEZpbGVbeHNkY29uZmlnTGlzdC5zaXplKCldKTsKLSAgICAgICAgRXJyb3JMb2dnZXIgZXJyID0gbmV3IEVycm9yTG9nZ2VyKHZlcmJvc2UpOwotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wIGRpcmVjdG9yeQotICAgICAgICAgICAgRmlsZSB0bXBkaXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKHNyY2dlbmRpciA9PSBudWxsIHx8IGNsYXNzZ2VuZGlyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVUZW1wRGlyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjZ2VuZGlyID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3JjZ2VuZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVEaXIodG1wZGlyLCAic3JjIik7Ci0gICAgICAgICAgICBpZiAoY2xhc3NnZW5kaXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjbGFzc2dlbmRpciA9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY3JlYXRlRGlyKHRtcGRpciwgImNsYXNzZXMiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdXNlIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGlmIHVzZXIgZGlkbid0IHByb3ZpZGUgYW55Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIC8vIHByZXBlbmQgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb24gdGhlIGNsYXNzcGF0aAotICAgICAgICAgICAgUGF0aC5QYXRoRWxlbWVudCBwYXRoRWxlbWVudCA9IGNsYXNzcGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpOwotICAgICAgICAgICAgcGF0aEVsZW1lbnQuc2V0TG9jYXRpb24oY2xhc3NnZW5kaXIpOwotICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gY2xhc3NwYXRoLmxpc3QoKTsKLSAgICAgICAgICAgIEZpbGVbXSBjcCA9IG5ldyBGaWxlW3BhdGhzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGNwW2ldID0gbmV3IEZpbGUocGF0aHNbaV0pOwotICAgICAgICAKLSAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBzb3VyY2UKLSAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRCYXNlRGlyKHRoZUJhc2VkaXIpOwotICAgICAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKHhzZEFycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRXc2RsRmlsZXMod3NkbEFycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRKYXZhRmlsZXMoamF2YUFycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDb25maWdGaWxlcyh4c2Rjb25maWdBcnJheSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Q2xhc3NwYXRoKGNwKTsKLSAgICAgICAgICAgIC8vcGFyYW1zLnNldE91dHB1dEphcihkZXN0ZmlsZSk7IC8vIGFsd2F5cyB1c2UgdGhlIGphciB0YXNrIGJlbG93Ci0gICAgICAgICAgICBwYXJhbXMuc2V0TmFtZSh0eXBlc3lzdGVtbmFtZSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2dlbmRpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2dlbmRpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Tm9qYXZhYyh0cnVlKTsgLy8gYWx3YXlzIGNvbXBpbGUgdXNpbmcgamF2YWMgdGFzayBiZWxvdwotICAgICAgICAgICAgcGFyYW1zLnNldERlYnVnKGRlYnVnKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRWZXJib3NlKHZlcmJvc2UpOwotICAgICAgICAgICAgcGFyYW1zLnNldFF1aWV0KHF1aWV0KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXREb3dubG9hZChkb3dubG9hZCk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRFcnJvckxpc3RlbmVyKGVycik7Ci0gICAgICAgICAgICBzdWNjZXNzID0gU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiAhc3Jjb25seSkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHNvdXJjZQotICAgICAgICAgICAgICAgIEphdmFjIGphdmFjID0gbmV3IEphdmFjKCk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBqYXZhYy5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBqYXZhYy5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGlsZXIgIT0gbnVsbCkgamF2YWMuc2V0Q29tcGlsZXIoY29tcGlsZXIpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldERlYnVnKGRlYnVnKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVidWdMZXZlbCAhPSBudWxsKSBqYXZhYy5zZXREZWJ1Z0xldmVsKGRlYnVnTGV2ZWwpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldERlc3RkaXIoY2xhc3NnZW5kaXIpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEV4ZWN1dGFibGUoZm9ya2VkRXhlY3V0YWJsZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0RmFpbG9uZXJyb3IoZmFpbG9uZXJyb3IpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEZvcmsoZm9yayk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0SW5jbHVkZWFudHJ1bnRpbWUoaW5jbHVkZUFudFJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEluY2x1ZGVqYXZhcnVudGltZShpbmNsdWRlSmF2YVJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihuZXcgUGF0aChwcm9qZWN0LCBzcmNnZW5kaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICBpZiAobWVtb3J5SW5pdGlhbFNpemUgIT0gbnVsbCkgamF2YWMuc2V0TWVtb3J5SW5pdGlhbFNpemUobWVtb3J5SW5pdGlhbFNpemUpOwotICAgICAgICAgICAgICAgIGlmIChtZW1vcnlNYXhpbXVtU2l6ZSAhPSBudWxsKSBqYXZhYy5zZXRNZW1vcnlNYXhpbXVtU2l6ZShtZW1vcnlNYXhpbXVtU2l6ZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0T3B0aW1pemUob3B0aW1pemUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQotICAgICAgICAgICAgICAgICAgICBsb2coIlRpbWUgdG8gY29tcGlsZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXN0ZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gamFyIHRoZSBjb21waWxlZCBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIEphciBqYXIgPSBuZXcgSmFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGphci5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBqYXIuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGphci5zZXRCYXNlZGlyKGNsYXNzZ2VuZGlyKTsKLSAgICAgICAgICAgICAgICAgICAgamFyLnNldERlc3RGaWxlKGRlc3RmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgamFyLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0bXBkaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNjaGVtYUNvZGVHZW5lcmF0b3IudHJ5SGFyZFRvRGVsZXRlKHRtcGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2ludGVycnVwdGVkIG1lYW5zIGNhbmNlbAotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nIHNjaGVtYXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOwotICAgICAgICAgICAgbG9nKHN3LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzICYmIGZhaWxvbmVycm9yKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCk7IC8vc3RvcCB0aGUgYnVpbGQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhdGhzKFN0cmluZ1tdIHBhdGhzLCBGaWxlIGJhc2VEaXIpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZG90ID0gcGF0aHNbaV0ubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChkb3QgPiAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyBwb3NzRXh0ID0gcGF0aC5zdWJzdHJpbmcoZG90KS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIFNldCBzZXQgPSAoU2V0KSBfZXh0Um91dGVyLmdldChwb3NzRXh0KTsKLQotICAgICAgICAgICAgICAgIGlmIChzZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChuZXcgRmlsZShiYXNlRGlyLCBwYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgZmlsZXNldCkKLSAgICB7Ci0gICAgICAgIHNjaGVtYXMuYWRkKGZpbGVzZXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy9HZXR0ZXIvU2V0dGVycwotICAgIHB1YmxpYyBGaWxlIGdldFNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEgZmlsZSBvciBhIGRpcmVjdG9yeSBvZiBmaWxlcy4KLSAgICAgKiBJdCBpcyBvcHRpb25hbCBvbmx5IGlmIG9uZSBvciBtb3JlICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50cyBhcmUgbmVzdGVkIGluIHRoaXMKLSAgICAgKiB0YXNrLgotICAgICAqIEBwYXJhbSBzY2hlbWEgUmVxdWlyZWQsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcyBuZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKEZpbGUgc2NoZW1hKQotICAgIHsKLSAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzcGF0aCB0byB1c2UgaWYgc2NoZW1hcyBpbiB0aGUgZmlsZXNldCBpbXBvcnQgZGVmaW5pdGlvbnMgdGhhdCBhcmUKLSAgICAgKiBzdXBwbGllZCBieSBvdGhlciBjb21waWxlZCB4bWwgYmVhbnMgSkFSIGZpbGVzLCBvciBpZiAuamF2YSBmaWxlcyBhcmUgaW4gdGhlCi0gICAgICogc2NoZW1hIGZpbGVzZXQuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoICE9IG51bGwpCi0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aHJlZiBPcHRpb25hbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIGNsYXNzcGF0aHJlZikKLSAgICB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAKLSAgICAgICAgY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKS5zZXRSZWZpZChjbGFzc3BhdGhyZWYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0ZmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzdGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBjcmVhdGVkLiAgRm9yIGluc3RhbmNlLCAibXlYTUxCZWFuLmphciIKLSAgICAgKiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIGphciB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICogT3B0aW9uYWwsIGRlZmF1bHRzIHRvICJ4bWx0eXBlcy5qYXIiLgotICAgICAqIEBwYXJhbSBkZXN0ZmlsZSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGZpbGUoRmlsZSBkZXN0ZmlsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzdGZpbGUgPSBkZXN0ZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRTcmNnZW5kaXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNyY2dlbmRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSAuamF2YSBmaWxlcyBpbnRvLiAgT3B0aW9uYWwsIGRlZmF1bHRzIHRvCi0gICAgICogYSB0ZW1wIGRpci4KLSAgICAgKiBAcGFyYW0gc3JjZ2VuZGlyIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRTcmNnZW5kaXIoRmlsZSBzcmNnZW5kaXIpCi0gICAgewotICAgICAgICB0aGlzLnNyY2dlbmRpciA9IHNyY2dlbmRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRDbGFzc2dlbmRpcigpCi0gICAgewotICAgICAgICByZXR1cm4gY2xhc3NnZW5kaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmNsYXNzIGZpbGVzIGludG8uICBPcHRpb25hbCwgZGVmYXVsdHMgdG8KLSAgICAgKiBhIHRlbXAgZGlyLgotICAgICAqIEBwYXJhbSBjbGFzc2dlbmRpciBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NnZW5kaXIoRmlsZSBjbGFzc2dlbmRpcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xhc3NnZW5kaXIgPSBjbGFzc2dlbmRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KLSAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS41Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3dubG9hZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIFVSTHMgZm9yIGltcG9ydHMKLSAgICAgKiBhbmQgaW5jbHVkZXMuICBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyBhbmQgaW5jbHVkZXMKLSAgICAgKiBtdXN0IGJlIGNvcGllZCBsb2NhbGx5LgotICAgICAqIEBwYXJhbSBkb3dubG9hZCBPcHRpb25hbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZChib29sZWFuIGRvd25sb2FkKQotICAgIHsKLSAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBvcHRpbWl6ZSkgewotICAgICAgICB0aGlzLm9wdGltaXplID0gb3B0aW1pemU7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIG9wdGltaXplIGZsYWcuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpbWl6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byB0cnVlLgotICAgICAqIEBwYXJhbSB2ZXJib3NlIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWlldCgpCi0gICAgewotICAgICAgICByZXR1cm4gcXVpZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgKiBAcGFyYW0gcXVpZXQgT3B0aW9uYWwuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpCi0gICAgewotICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVidWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBkZWJ1Z0xldmVsLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgZGVidWdMZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlYnVnTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiBkZWJ1Z0xldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEtleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgLWcgY29tbWFuZC1saW5lIHN3aXRjaC4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IG1vZGVybgotICAgICAqIGFuZCBjbGFzc2ljKHZlciA+PSAxLjIpLiBMZWdhbCB2YWx1ZXMgYXJlIG5vbmUgb3IgYQotICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IGxpbmVzLCB2YXJzLAotICAgICAqIGFuZCBzb3VyY2UuIElmIGRlYnVnbGV2ZWwgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgOm5vbmUKLSAgICAgKiB3aWxsIGJlIGFwcGVuZGVkIHRvIC1nLiBJZiBkZWJ1ZyBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gZGVidWdMZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKFN0cmluZyAgdikgewotICAgICAgICB0aGlzLmRlYnVnTGV2ZWwgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGRlYnVnZ2luZyBzeW1ib2xzLgotICAgICAqIEBwYXJhbSBkZWJ1ZyBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlLCBmb3JrcyB0aGUgamF2YWMgY29tcGlsZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZiAidHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiBmKSB7Ci0gICAgICAgIGZvcmsgPSBmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLgotICAgICAqCi0gICAgICogPHA+SWdub3JlZCB1bmxlc3MgZm9yayBpcyB0cnVlIG9yIGV4dEphdmFjIGhhcyBiZWVuIHNwZWNpZmllZAotICAgICAqIGFzIHRoZSBjb21waWxlci48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZm9ya0V4ZWMpIHsKLSAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSA9IGZvcmtFeGVjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZvcmtlZEV4ZWN1dGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcmNvbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzcmNvbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLiAgT3B0aW9uYWwsCi0gICAgICogZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgKiBAcGFyYW0gc3Jjb25seSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0U3Jjb25seShib29sZWFuIHNyY29ubHkpCi0gICAgewotICAgICAgICB0aGlzLnNyY29ubHkgPSBzcmNvbmx5OwotICAgIH0KLSAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVzeXN0ZW1uYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlc3lzdGVtbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb3IgbW9yZSBTY2hlbWFDb21waWxlciBleHRlbnNpb25zIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZSAmbHQ7ZXh0ZW5zaW9uPiBzdWJlbGVtZW50LgotICAgICAqICBTY2hlbWEgQ29tcGlsZXIgZXh0ZW5zaW9ucyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGNvbS54YmVhbi50b28uU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5zaW9uIGNyZWF0ZUV4dGVuc2lvbigpIHsKLSAgICAgICAgRXh0ZW5zaW9uIGUgPSBuZXcgRXh0ZW5zaW9uKCk7Ci0gICAgICAgIGV4dGVuc2lvbnMuYWRkKGUpOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHRoZSBUeXBlU3lzdGVtSG9sZGVyIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgKiBnZW5lcmF0ZWQgaW4uIE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgdW5zcGVjaWZpZWQuICBOb25lIG9mCi0gICAgICogdGhlIHhtbCBiZWFucyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgcGFja2FnZS4KLSAgICAgKiA8QlI+PEJSPlVzZSAueHNkY29uZmlnIGZpbGVzIHRvIG1vZGlmeSB4bWwgYmVhbiBwYWNrYWdlIG9yIGNsYXNzIG5hbWVzLgotICAgICAqIEBwYXJhbSB0eXBlc3lzdGVtbmFtZSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZXN5c3RlbW5hbWUoU3RyaW5nIHR5cGVzeXN0ZW1uYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy50eXBlc3lzdGVtbmFtZSA9IHR5cGVzeXN0ZW1uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbG9uZXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhaWxvbmVycm9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGFudCB0YXJnZXQgd2lsbCBjb250aW51ZSBpZiB0aGUgWE1MQmVhbgotICAgICAqIGNyZWF0aW9uIGVuY291bnRlcnMgYSBidWlsZCBlcnJvci4gIERlZmF1bHRzIHRvIHRydWUuICBPcHRpb25hbC4KLSAgICAgKiBAcGFyYW0gZmFpbG9uZXJyb3IgT3B0aW9uYWwuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbG9uZXJyb3IpCi0gICAgewotICAgICAgICB0aGlzLmZhaWxvbmVycm9yID0gZmFpbG9uZXJyb3I7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlQW50UnVudGltZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZUFudFJ1bnRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUFudFJ1bnRpbWUoYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZUFudFJ1bnRpbWUgPSBpbmNsdWRlQW50UnVudGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVKYXZhUnVudGltZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZUphdmFSdW50aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVKYXZhUnVudGltZShib29sZWFuIGluY2x1ZGVKYXZhUnVudGltZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZUphdmFSdW50aW1lID0gaW5jbHVkZUphdmFSdW50aW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5pdGlhbCBtZW1vcnkgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBqYXZhYyBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5SW5pdGlhbFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1lbW9yeUluaXRpYWxTaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeUluaXRpYWxTaXplKFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubWVtb3J5SW5pdGlhbFNpemUgPSBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1heGltdW0gbWVtb3J5IHNpemUgb2YgdGhlIHVuZGVybHlpbmcgamF2YWMgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lbW9yeU1heGltdW1TaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlNYXhpbXVtU2l6ZShTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUpCi0gICAgewotICAgICAgICB0aGlzLm1lbW9yeU1heGltdW1TaXplID0gbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJJIHVyaUZyb21GaWxlKEZpbGUgZikKLSAgICB7Ci0gICAgICAgIGlmIChmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGYuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBEb24ndCBzcGl0IG91dCBhbiBleGNlcHRpb24gaGVyZSBiZWNhdXNlIG9uIFdpbmRvd3MgeW91J2xsIGdldCBvbmUKLSAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlbmFtZSBpcyAiYXV4IiwgImxwdDEiLCBldGMuIEl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5Ci0gICAgICAgICAgICAvLyB0byBkZWFsIHdpdGggdGhvc2UgY2FzZXMgY29ycmVjdGx5LCB1c3VhbGx5IGJ5IGNhbGxpbmcgRmlsZVN2Yy5pbnZhbGlkUGF0aENoZWNrKCkKLSAgICAgICAgICAgIC8vIE1lc3NhZ2VTdmMuZ2V0KCkubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgcmV0dXJuIGYuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBFcnJvckxvZ2dlciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9ub2lzeTsKLSAgICAgICAgcHJpdmF0ZSBVUkkgX2Jhc2VVUkk7Ci0KLSAgICAgICAgcHVibGljIEVycm9yTG9nZ2VyKGJvb2xlYW4gbm9pc3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ub2lzeSA9IG5vaXN5OwotICAgICAgICAgICAgX2Jhc2VVUkkgPSB1cmlGcm9tRmlsZShwcm9qZWN0LmdldEJhc2VEaXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gKFhtbEVycm9yKW87Ci0gICAgICAgICAgICAgICAgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnIuZ2V0U2V2ZXJpdHkoKSA9PSBYbWxFcnJvci5TRVZFUklUWV9XQVJOSU5HKQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoX25vaXN5KQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuWFNUQ0hhcm5lc3MuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmFmYzliLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotcHVibGljIGNsYXNzIFhNTEJlYW5YU1RDSGFybmVzcyBpbXBsZW1lbnRzIFhTVENUZXN0ZXIuSGFybmVzcwotewotICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RDYXNlKFhTVENUZXN0ZXIuVGVzdENhc2VSZXN1bHQgcmVzdWx0KQotICAgIHsKLSAgICAgICAgWFNUQ1Rlc3Rlci5UZXN0Q2FzZSB0ZXN0Q2FzZSA9IHJlc3VsdC5nZXRUZXN0Q2FzZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGNhc2UgIiArIHRlc3RDYXNlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYm9vbGVhbiBzY2hlbWFWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGluc3RhbmNlVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzdGVwIDEsIGxvYWQgc2NoZW1hIGZpbGUgZXRjLgotICAgICAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IHNjaGVtYSA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykuc2V0TG9hZExpbmVOdW1iZXJzKCkpOwotICAgICAgICAgICAgICAgIFhtbE9iamVjdCBzY2hlbWEyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hMiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHRlc3RDYXNlLmdldFJlc291cmNlRmlsZSgpLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hcyA9IHNjaGVtYTIgPT0gbnVsbCA/IG5ldyBYbWxPYmplY3RbXSB7IHNjaGVtYSB9IDogbmV3IFhtbE9iamVjdFtdIHsgc2NoZW1hLCBzY2hlbWEyIH07Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0gPSBYbWxCZWFucy5jb21waWxlWHNkKHNjaGVtYXMsIFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCksIG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpKTsKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBYbWxCZWFucy50eXBlTG9hZGVyVW5pb24obmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IHN5c3RlbSwgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBYbWxFeGNlcHRpb24pIHx8IGVycm9ycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q3Jhc2godHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRTdk1lc3NhZ2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdy50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQuYWRkU3ZNZXNzYWdlcyhlcnJvcnMpOwotICAgICAgICAgICAgcmVzdWx0LnNldFN2QWN0dWFsKHNjaGVtYVZhbGlkKTsKLSAgICAgICAgICAgIGVycm9ycy5jbGVhcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHN0ZXAgMiwgbG9hZCBpbnN0YW5jZSBmaWxlIGFuZCB2YWxpZGF0ZQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IGluc3RhbmNlID0gbG9hZGVyLnBhcnNlKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLCBudWxsLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS52YWxpZGF0ZShuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKSkpCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikgfHwgZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDcmFzaCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEl2TWVzc2FnZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN3LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkSXZNZXNzYWdlcyhlcnJvcnMpOwotICAgICAgICAgICAgcmVzdWx0LnNldEl2QWN0dWFsKGluc3RhbmNlVmFsaWQpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQuc3VjY2VlZGVkKCkgPyAiU3VjY2Vzcy4iOiAiRmFpbHVyZS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyZDY4Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YU1RDVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGNvbS5iZWEueDIwMDMueDA1LnhtbGJlYW4ubHRnZm10LlRlc3RzRG9jdW1lbnQ7Ci1pbXBvcnQgY29tLmJlYS54MjAwMy54MDUueG1sYmVhbi5sdGdmbXQuRmlsZURlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLXB1YmxpYyBjbGFzcyBYU1RDVGVzdGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIAotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotICAgICAgICBib29sZWFuIHNob3dwYXNzID0gKGNsLmdldE9wdCgic2hvd3Bhc3MiKSAhPSBudWxsKTsKLSAgICAgICAgRmlsZVtdIGFsbEZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBsdGdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSGFybmVzcyBoYXJuZXNzID0gbmV3IFhNTEJlYW5YU1RDSGFybmVzcygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFsbEZpbGVzW2ldLmdldE5hbWUoKS5pbmRleE9mKCJMVEciKSA+PSAwKQotICAgICAgICAgICAgICAgIGx0Z0ZpbGVzLmFkZChhbGxGaWxlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpbGUgcmVzdWx0c0ZpbGUgPSBuZXcgRmlsZSgib3V0Lmh0bWwiKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKHJlc3VsdHNGaWxlKSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8aHRtbD4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjxzdHlsZT50ZCB7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrfSB4bXAge3doaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsfSA8L3N0eWxlPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPGJvZHk+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjxzY3JpcHQgbGFuZ3VhZ2U9J0phdmFTY3JpcHQnIHR5cGU9J3RleHQvamF2YXNjcmlwdCc+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCJ2YXIgdzsiKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oImZ1bmN0aW9uIG9wZW5XaW5kb3coc2NoZW1hLCBpbnN0YW5jZSkgeyIpOwotCSAgICB3cml0ZXIucHJpbnRsbigiICBpZiAodyA9PSBudWxsKSB7Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgdyA9IHdpbmRvdy5vcGVuKCdhYm91dDpibGFuaycsICd4c3RjJyk7Iik7Ci0JICAgIHdyaXRlci5wcmludGxuKCIgIH0iKTsKLQkgICAgd3JpdGVyLnByaW50bG4oIiAgaWYgKHcuY2xvc2VkKSB7Iik7Ci0JCXdyaXRlci5wcmludGxuKCIgICAgdyA9IHdpbmRvdy5vcGVuKCdhYm91dDpibGFuaycsICd4c3RjJyk7Iik7Ci0JICAgIHdyaXRlci5wcmludGxuKCIgIH0iKTsKLQkgICAgd3JpdGVyLnByaW50bG4oIiAgdy5kb2N1bWVudC5vcGVuKCk7Iik7Ci0JICAgIHdyaXRlci5wcmludGxuKCIgIHcuZG9jdW1lbnQud3JpdGUoXCI8ZnJhbWVzZXQgcm93cz0qLCo+PGZyYW1lIHNyYz0nXCIgKyBzY2hlbWEgKyBcIic+PGZyYW1lIHNyYz0nXCIgKyBpbnN0YW5jZSArIFwiJz48L2ZyYW1lc2V0PlwiKTsiKTsKLQkgICAgd3JpdGVyLnByaW50bG4oIiAgdy5kb2N1bWVudC5jbG9zZSgpOyIpOwotCSAgICB3cml0ZXIucHJpbnRsbigiICB3LmZvY3VzKCk7Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCJ9Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8L3NjcmlwdD4iKTsKLQotICAgICAgICB3cml0ZXIucHJpbnRsbigiPGgxPlhNTCBTY2hlbWEgVGVzdCBDb2xsZWN0aW9uIFJlc3VsdHM8L2gxPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPHA+UnVuIG9uICIgKyAobmV3IFhtbENhbGVuZGFyKG5ldyBEYXRlKCkpKSArICI8L3A+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8dGFibGUgc3R5bGU9J2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrJyBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8dHI+PHRkIHdpZHRoPTc1JT5EZXNjcmlwdGlvbjwvdGQ+PHRkIHdpZHRoPTEyLjUlPnNjaCB2PC90ZD48dGQgd2lkdGg9MTIuNSU+aW5zIHY8L3RkPjwvdHI+Iik7Ci0gICAgICAgIGludCBmYWlsdXJlcyA9IDA7Ci0gICAgICAgIGludCBjYXNlcyA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGx0Z0ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgbHRnRmlsZSA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIHRlc3QgY2FzZXMgaW4gIiArIGx0Z0ZpbGUpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBsdGdFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBUZXN0Q2FzZVtdIHRlc3RDYXNlcyA9IHBhcnNlTFRHRmlsZShsdGdGaWxlLCBsdGdFcnJvcnMpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaWYgKHRlc3RDYXNlcyAhPSBudWxsKSBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RDYXNlcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZVJlc3VsdCByZXN1bHQgPSBuZXcgVGVzdENhc2VSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQudGVzdENhc2UgPSB0ZXN0Q2FzZXNbal07Ci0gICAgICAgICAgICAgICAgaGFybmVzcy5ydW5UZXN0Q2FzZShyZXN1bHQpOwotICAgICAgICAgICAgICAgIGNhc2VzICs9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2VlZGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzICs9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNob3dwYXNzKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zIGJnY29sb3I9c2t5Ymx1ZT4iICsgbHRnRmlsZSArICI8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgICBpZiAoIWx0Z0Vycm9ycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQ+RXJyb3JzIHdpdGhpbiB0aGUgTFRHIGZpbGU6Iik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx4bXA+Iik7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gbHRnRXJyb3JzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKGoubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC94bXA+Iik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvdGQ+PC90cj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zIGJnY29sb3I9Z3JlZW4+Tm90aGluZyB0byByZXBvcnQ8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gcmVzdWx0cy5pdGVyYXRvcigpOyBqLmhhc05leHQoKSA7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bW1hcml6ZVJlc3VsdEFzSFRNTFRhYmxlUm93cygoVGVzdENhc2VSZXN1bHQpai5uZXh0KCksIHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zPlN1bW1hcnk6ICIgKyBmYWlsdXJlcyArICIgZmFpbHVyZXMgb3V0IG9mICIgKyBjYXNlcyArICIgY2FzZXMgcnVuLjwvdGQ+PC90cj4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAKLSAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHJ1biB0ZXN0czogIiArICgoZG91YmxlKShmaW5pc2ggLSBzdGFydCkgLyAxMDAwLjApICsgIiBzZWNvbmRzIiApOwotICAgICAgICAKLSAgICAgICAgLy8gTGF1bmNoIHJlc3VsdHMKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigid2luZG93cyIpID49IDApCi0gICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJjbWQgL2Mgc3RhcnQgaWV4cGxvcmUgXCIiICsgcmVzdWx0c0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRzIG91dHB1dCB0byAiICsgcmVzdWx0c0ZpbGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYXNlCi0gICAgewotICAgICAgICBwcml2YXRlIEZpbGUgbHRnRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG9yaWdpbjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgRmlsZSBzY2hlbWFGaWxlOwotICAgICAgICBwcml2YXRlIEZpbGUgaW5zdGFuY2VGaWxlOwotICAgICAgICBwcml2YXRlIEZpbGUgcmVzb3VyY2VGaWxlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc3ZFeHBlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl2RXhwZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBydkV4cGVjdGVkOwotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEx0Z0ZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbHRnRmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0U2NoZW1hRmlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWFGaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0SW5zdGFuY2VGaWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlRmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldFJlc291cmNlRmlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N2RXhwZWN0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3ZFeHBlY3RlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSXZFeHBlY3RlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdkV4cGVjdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSdkV4cGVjdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJ2RXhwZWN0ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2FzZVJlc3VsdAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBUZXN0Q2FzZSB0ZXN0Q2FzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHN2QWN0dWFsOwotICAgICAgICBwcml2YXRlIENvbGxlY3Rpb24gc3ZNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl2QWN0dWFsOwotICAgICAgICBwcml2YXRlIENvbGxlY3Rpb24gaXZNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNyYXNoOwotCi0gICAgICAgIHB1YmxpYyBUZXN0Q2FzZSBnZXRUZXN0Q2FzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0Q2FzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3ZBY3R1YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3ZBY3R1YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdkFjdHVhbChib29sZWFuIHN2QWN0dWFsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnN2QWN0dWFsID0gc3ZBY3R1YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0l2QWN0dWFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl2QWN0dWFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXZBY3R1YWwoYm9vbGVhbiBpdkFjdHVhbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pdkFjdHVhbCA9IGl2QWN0dWFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0U3ZNZXNzYWdlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHN2TWVzc2FnZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkU3ZNZXNzYWdlcyhDb2xsZWN0aW9uIHN2TWVzc2FnZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3ZNZXNzYWdlcy5hZGRBbGwoc3ZNZXNzYWdlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRJdk1lc3NhZ2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oaXZNZXNzYWdlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRJdk1lc3NhZ2VzKENvbGxlY3Rpb24gaXZNZXNzYWdlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pdk1lc3NhZ2VzLmFkZEFsbChpdk1lc3NhZ2VzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3Jhc2goYm9vbGVhbiBjcmFzaCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jcmFzaCA9IGNyYXNoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NyYXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyYXNoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdWNjZWVkZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIWNyYXNoICYmIChpc0l2QWN0dWFsKCkgPT0gdGVzdENhc2UuaXNJdkV4cGVjdGVkKCkpICYmIChpc1N2QWN0dWFsKCkgPT0gdGVzdENhc2UuaXNTdkV4cGVjdGVkKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEhhcm5lc3MKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RDYXNlKFRlc3RDYXNlUmVzdWx0IHJlc3VsdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VIVE1MTGluayhGaWxlIGZpbGUsIGJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICImbmJzcDsiOwotICAgICAgICBVUkkgdXJpID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgdXJpICsgIlwiIHRhcmdldD1fYmxhbms+IiArIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpICsgIjwvYT4iOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIGxlYWRpbmdTcGFjZSA9IFBhdHRlcm4uY29tcGlsZSgiXlxccysiLCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUhUTUxEZXNjcmlwdGlvbihUZXN0Q2FzZSB0ZXN0Q2FzZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCI8YSBjbGFzcz1ub2xpbmUgaHJlZj0namF2YXNjcmlwdDpvcGVuV2luZG93KFwiIik7Ci0gICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJvdXQ6Tm8gc2NoZW1hIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcXFxcXCIpKTsKLQotICAgICAgICBzYi5hcHBlbmQoIlwiLCBcIiIpOwotICAgICAgICBpZiAodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJvdXQ6Tm8gaW5zdGFuY2UiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2IuYXBwZW5kKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFxcXFxcXFwiKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiXCIpJz48eG1wPiIpOwotICAgICAgICBzYi5hcHBlbmQobGVhZGluZ1NwYWNlLm1hdGNoZXIodGVzdENhc2UuZ2V0RGVzY3JpcHRpb24oKSkucmVwbGFjZUFsbCgiIikgKyAiKCIgKyB0ZXN0Q2FzZS5nZXRJZCgpICsgIikiKTsKLSAgICAgICAgc2IuYXBwZW5kKCI8L3htcD48L2E+Iik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3VtbWFyaXplUmVzdWx0QXNIVE1MVGFibGVSb3dzKFRlc3RDYXNlUmVzdWx0IHJlc3VsdCwgUHJpbnRXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgVGVzdENhc2UgdGVzdENhc2UgPSByZXN1bHQuZ2V0VGVzdENhc2UoKTsKLSAgICAgICAgYm9vbGVhbiBzUmlnaHQgPSB0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCB8fCB0ZXN0Q2FzZS5pc1N2RXhwZWN0ZWQoKSA9PSByZXN1bHQuaXNTdkFjdHVhbCgpOwotICAgICAgICBib29sZWFuIGlSaWdodCA9IHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpID09IG51bGwgfHwgdGVzdENhc2UuaXNJdkV4cGVjdGVkKCkgPT0gcmVzdWx0LmlzSXZBY3R1YWwoKTsKLSAgICAgICAgCi0gICAgICAgIG91dC5wcmludGxuKHJlc3VsdC5pc0NyYXNoKCkgPyAiPHRyIGJnY29sb3I9YmxhY2sgY29sb3I9d2hpdGU+IiA6ICI8dHI+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCI8dGQgdmFsaWduPXRvcD4iICsgbWFrZUhUTUxEZXNjcmlwdGlvbih0ZXN0Q2FzZSkgKyAiPC90ZD4iKTsKLSAgICAgICAgU3RyaW5nIHNMaW5rczsKLSAgICAgICAgaWYgKHRlc3RDYXNlLmdldFJlc291cmNlRmlsZSgpID09IG51bGwpCi0gICAgICAgICAgICBzTGlua3MgPSBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpLCByZXN1bHQuaXNTdkFjdHVhbCgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc0xpbmtzID0gbWFrZUhUTUxMaW5rKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgcmVzdWx0LmlzU3ZBY3R1YWwoKSkgKyAiPGJyPiIgKyBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCksIHJlc3VsdC5pc1N2QWN0dWFsKCkpOwotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50bG4oKHNSaWdodCA/ICI8dGQgdmFsaWduPXRvcD4iIDogcmVzdWx0LmlzU3ZBY3R1YWwoKSA/ICI8dGQgYmdjb2xvcj1vcmFuZ2UgdmFsaWduPXRvcD4iIDogIjx0ZCBiZ2NvbG9yPXJlZCB2YWxpZ249dG9wPiIpICsgc0xpbmtzICsgIjwvdGQ+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKChpUmlnaHQgPyAiPHRkIHZhbGlnbj10b3A+IiA6IHJlc3VsdC5pc0l2QWN0dWFsKCkgPyAiPHRkIGJnY29sb3I9b3JhbmdlIHZhbGlnbj10b3A+IiA6ICI8dGQgYmdjb2xvcj1yZWQgdmFsaWduPXRvcD4iKSArIG1ha2VIVE1MTGluayh0ZXN0Q2FzZS5nZXRJbnN0YW5jZUZpbGUoKSwgcmVzdWx0LmlzSXZBY3R1YWwoKSkgKyAiPC90ZD4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+Iik7Ci0gICAgICAgIGlmICghcmVzdWx0LmdldEl2TWVzc2FnZXMoKS5pc0VtcHR5KCkgfHwgIXJlc3VsdC5nZXRTdk1lc3NhZ2VzKCkuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZWVkZWQoKSkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyPjx0ZCBjb2xzcGFuPTMgYmdjb2xvcj15ZWxsb3c+PHhtcD4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyPjx0ZCBjb2xzcGFuPTM+PHhtcD4iKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHJlc3VsdC5nZXRTdk1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihqLm5leHQoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSByZXN1bHQuZ2V0SXZNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oai5uZXh0KCkpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIjwveG1wPjwvdHI+PC90ZD4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3RDYXNlW10gcGFyc2VMVEdGaWxlKEZpbGUgbHRnRmlsZSwgQ29sbGVjdGlvbiBvdXRlckVycm9ycykKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT3B0aW9ucyBsdGdPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGx0Z09wdGlvbnMuc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgiIiwgImh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzA1L3htbGJlYW4vbHRnZm10IikpOwotICAgICAgICAgICAgbHRnT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGVycm9ycyk7Ci0gICAgICAgICAgICBsdGdPcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgVGVzdHNEb2N1bWVudCBkb2MgPSBUZXN0c0RvY3VtZW50LkZhY3RvcnkucGFyc2UobHRnRmlsZSwgbHRnT3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoIWRvYy52YWxpZGF0ZShsdGdPcHRpb25zKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJEb2N1bWVudCAiICsgbHRnRmlsZSArICIgbm90IHZhbGlkLiIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb20uYmVhLngyMDAzLngwNS54bWxiZWFuLmx0Z2ZtdC5UZXN0Q2FzZVtdIHRlc3RDYXNlcyA9IGRvYy5nZXRUZXN0cygpLmdldFRlc3RBcnJheSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdENhc2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlIG5ld0Nhc2UgPSBuZXcgVGVzdENhc2UoKTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLmx0Z0ZpbGUgPSBsdGdGaWxlOwotICAgICAgICAgICAgICAgIG5ld0Nhc2UuaWQgPSB0ZXN0Q2FzZXNbaV0uZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLm9yaWdpbiA9IHRlc3RDYXNlc1tpXS5nZXRPcmlnaW4oKTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLmRlc2NyaXB0aW9uID0gdGVzdENhc2VzW2ldLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgRmlsZURlc2NbXSBmaWxlZGVzY3MgPSB0ZXN0Q2FzZXNbaV0uZ2V0RmlsZXMoKS5nZXRGaWxlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICB0ZXN0Q2FzZXNbaV0uZ2V0T3JpZ2luKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlZGVzY3MubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyID0gZmlsZWRlc2NzW2pdLmdldEZvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlZGVzY3Nbal0uZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSB0aGVGaWxlID0gbmV3IEZpbGUobHRnRmlsZS5nZXRQYXJlbnRGaWxlKCksIGRpciArICIvIiArIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGVGaWxlLmV4aXN0cygpIHx8ICF0aGVGaWxlLmlzRmlsZSgpIHx8ICF0aGVGaWxlLmNhblJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiQ2FuJ3QgcmVhZCBmaWxlICIgKyB0aGVGaWxlLCBmaWxlZGVzY3Nbal0pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmlsZWRlc2NzW2pdLmdldFJvbGUoKS5pbnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX0lOU1RBTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXNlLmluc3RhbmNlRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNb3JlIHRoYW4gb25lIGluc3RhbmNlIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLmluc3RhbmNlRmlsZSA9IHRoZUZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5pdkV4cGVjdGVkID0gZmlsZWRlc2NzW2pdLmdldFZhbGlkaXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX1NDSEVNQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FzZS5zY2hlbWFGaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1vcmUgdGhhbiBvbmUgc2NoZW1hIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnNjaGVtYUZpbGUgPSB0aGVGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2Uuc3ZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWxlRGVzYy5Sb2xlLklOVF9SRVNPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FzZS5yZXNvdXJjZUZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTW9yZSB0aGFuIG9uZSByZXNvdXJjZSBmaWxlIHNwZWljaWZlZCAtIGlnbm9yaW5nIGFsbCBidXQgbGFzdCIsIGZpbGVkZXNjc1tqXSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5yZXNvdXJjZUZpbGUgPSB0aGVGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2UucnZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oWG1sRXJyb3IuZm9yT2JqZWN0KCJVbmV4cGVjdGVkIGZpbGUgcm9sZSIsIGZpbGVkZXNjc1tqXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3Q2FzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKFRlc3RDYXNlW10pcmVzdWx0LnRvQXJyYXkobmV3IFRlc3RDYXNlW3Jlc3VsdC5zaXplKCldKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlcnJvcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlbHNlIGZvciAoSXRlcmF0b3IgaSA9IGVycm9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChpLm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWHNiRHVtcGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOTY5Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5IZXhCaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYc2JEdW1wZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkdW1wKG5ldyBGaWxlKGFyZ3NbaV0pLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChGaWxlIGZpbGUsIGJvb2xlYW4gZm9yY2UpCi0gICAgewotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygKLSAgICAgICAgICAgICAgICBuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpIHx8IGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54c2IiKTsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXAoZmlsZXNbaV0sIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGR1bXBaaXAoZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54c2IiKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZHVtcChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCAiICAiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wWmlwKEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB6aXBGaWxlLmVudHJpZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueHNiIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZW50cnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcCh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSwgIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICB7Ci0gICAgICAgIGR1bXAoaW5wdXQsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIGluZGVudCkKLSAgICB7Ci0gICAgICAgIFhzYkR1bXBlciBkdW1wZXIgPSBuZXcgWHNiRHVtcGVyKGlucHV0LCBpbmRlbnQpOwotICAgICAgICBkdW1wZXIuZHVtcEFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgWHNiRHVtcGVyKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGluZGVudCkKLSAgICB7Ci0gICAgICAgIF9pbnB1dCA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgX2luZGVudCA9IGluZGVudDsKLSAgICB9Ci0KLSAgICB2b2lkIGZsdXNoKCkgeyBTeXN0ZW0ub3V0LmZsdXNoKCk7IH0KLSAgICB2b2lkIGVtaXQoU3RyaW5nIHN0cikgeyBTeXN0ZW0ub3V0LnByaW50bG4oX2luZGVudCArIHN0cik7IGZsdXNoKCk7IH0KLSAgICB2b2lkIGVtaXQoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigpOyBmbHVzaCgpOyB9Ci0gICAgdm9pZCBlcnJvcihFeGNlcHRpb24gZSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsgZmx1c2goKTsgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsgZTIuaW5pdENhdXNlKCBlICk7IHRocm93IGUyOyB9Ci0gICAgdm9pZCBlcnJvcihTdHJpbmcgc3RyKSB7IFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOyBmbHVzaCgpOyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBzdHIgKTsgdGhyb3cgZTI7IH0KLSAgICBwcml2YXRlIFN0cmluZyBfaW5kZW50OwotICAgIHZvaWQgaW5kZW50KCkgeyBfaW5kZW50ICs9ICIgICI7IH0KLSAgICB2b2lkIG91dGRlbnQoKSB7IF9pbmRlbnQgPSBfaW5kZW50LnN1YnN0cmluZygwLCBfaW5kZW50Lmxlbmd0aCgpIC0gMik7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQkFCRSA9IDB4REE3QUJBQkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfVkVSU0lPTiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfVkVSU0lPTiA9IDE4OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BSU5ERVggPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQVRZUEUgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BUE9JTlRFUiA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVAgPSA3OwotCi0gICAgc3RhdGljIFN0cmluZyBmaWxldHlwZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJTkRFWDogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFJTkRFWCI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVRZUEU6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BVFlQRSI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQ6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BRUxFTUVOVCI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURTogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEUiOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQVBPSU5URVIiOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVAiOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUDogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBGSUxFVFlQRSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfU0tJUFBBQkxFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklYRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9OSUxMQUJMRSA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLRVhUID0gMTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLUkVTVCA9IDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9CTE9DS1NVQlNUID0gNjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0FCU1RSQUNUID0gMTI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTEVYVCA9IDI1NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklOQUxSRVNUID0gNTEyOwotCi0gICAgc3RhdGljIFN0cmluZyBwYXJ0aWNsZWZsYWdzU3RyaW5nKGludCBmbGFncykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfU0tJUFBBQkxFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfU0tJUFBBQkxFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfRklYRUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9GSVhFRCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX05JTExBQkxFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfTklMTEFCTEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9CTE9DS0VYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0JMT0NLRVhUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tSRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQkxPQ0tSRVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tTVUJTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0JMT0NLU1VCU1QgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9BQlNUUkFDVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0FCU1RSQUNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfRklOQUxFWFQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9GSU5BTEVYVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX0ZJTkFMUkVTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0ZJTkFMUkVTVCB8ICIpOwotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHJlc3VsdC5hcHBlbmQoIjAgfCAiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0lTQVRUUiA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBQVJSQVkgPSA4OwotCi0gICAgc3RhdGljIFN0cmluZyBwcm9wZXJ0eWZsYWdzU3RyaW5nKGludCBmbGFncykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BST1BfSVNBVFRSKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BST1BfSVNBVFRSIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTikgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9KQVZBQVJSQVkpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUFJPUF9KQVZBQVJSQVkgfCAiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAwKSByZXN1bHQuYXBwZW5kKCIwIHwgIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX05PTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0dMT0JBTCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTE9DQUxBVFRSID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEVMVCA9IDM7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNvbnRhaW5lcmZpZWxkVHlwZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBGSUVMRF9OT05FOiByZXR1cm4gIkZJRUxEX05PTkUiOwotICAgICAgICAgICAgY2FzZSBGSUVMRF9HTE9CQUw6IHJldHVybiAiRklFTERfR0xPQkFMIjsKLSAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxBVFRSOiByZXR1cm4gIkZJRUxEX0xPQ0FMQVRUUiI7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMRUxUOiByZXR1cm4gIkZJRUxEX0xPQ0FMRUxUIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGNvbnRhaW5lciBmaWVsZCB0eXBlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHR5cGUgZmxhZ3MKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0lNUExFX1RZUEUgICAgID0gMHgxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NVTUVOVF9UWVBFICAgPSAweDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX09SREVSRUQgICAgICAgICA9IDB4NDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQk9VTkRFRCAgICAgICAgID0gMHg4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5JVEUgICAgICAgICAgPSAweDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OVU1FUklDICAgICAgICAgPSAweDIwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVFJJTkdFTlVNICAgICAgPSAweDQwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTklPTl9PRl9MSVNUUyAgPSAweDgwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNfUEFUVEVSTiAgICAgPSAweDEwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJfU0VOU0lUSVZFID0gMHgyMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1RPVEFMX09SREVSICAgICA9IDB4NDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QSUxFRCAgICAgICAgPSAweDgwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQkxPQ0tfRVhUICAgICAgID0gMHgxMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19SRVNUICAgICAgPSAweDIwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0VYVCAgICAgICA9IDB4NDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfUkVTVCAgICAgID0gMHg4MDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9VTklPTiAgICAgPSAweDEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9MSVNUICAgICAgPSAweDIwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BQlNUUkFDVCAgICAgICAgPSAweDQwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVFRSSUJVVEVfVFlQRSAgPSAweDgwMDAwOwotCi0gICAgc3RhdGljIFN0cmluZyB0eXBlZmxhZ3NTdHJpbmcoaW50IGZsYWdzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfU0lNUExFX1RZUEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfU0lNUExFX1RZUEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRE9DVU1FTlRfVFlQRSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19ET0NVTUVOVF9UWVBFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FUVFJJQlVURV9UWVBFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0FUVFJJQlVURV9UWVBFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX09SREVSRUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfT1JERVJFRCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19CT1VOREVEKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0JPVU5ERUQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOSVRFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTklURSB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19OVU1FUklDKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX05VTUVSSUMgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfU1RSSU5HRU5VTSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19TVFJJTkdFTlVNIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1VOSU9OX09GX0xJU1RTKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1VOSU9OX09GX0xJU1RTIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0hBU19QQVRURVJOKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0hBU19QQVRURVJOIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1RPVEFMX09SREVSKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1RPVEFMX09SREVSIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NPTVBJTEVEKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0NPTVBJTEVEIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0JMT0NLX0VYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19CTE9DS19FWFQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQkxPQ0tfUkVTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19CTE9DS19SRVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0ZJTkFMX0VYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19GSU5BTF9FWFQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfUkVTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19GSU5BTF9SRVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0ZJTkFMX1VOSU9OKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTkFMX1VOSU9OIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0ZJTkFMX0xJU1QpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfRklOQUxfTElTVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BQlNUUkFDVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19BQlNUUkFDVCB8ICIpOwotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHJlc3VsdC5hcHBlbmQoIjAgfCAiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wQWxsKCkKLSAgICB7Ci0gICAgICAgIGludCBmaWxldHlwZSA9IGR1bXBIZWFkZXIoKTsKLSAgICAgICAgc3dpdGNoIChmaWxldHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJTkRFWDoKLSAgICAgICAgICAgICAgICBkdW1wSW5kZXhEYXRhKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFUWVBFOgotICAgICAgICAgICAgICAgIGR1bXBUeXBlRmlsZURhdGEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBkdW1wUGFydGljbGVEYXRhKHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgZHVtcEF0dHJpYnV0ZURhdGEodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVBPSU5URVI6Ci0gICAgICAgICAgICAgICAgZHVtcFBvaW50ZXJEYXRhKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6Ci0gICAgICAgICAgICAgICAgZHVtcE1vZGVsR3JvdXBEYXRhKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOgotICAgICAgICAgICAgICAgIGR1bXBBdHRyaWJ1dGVHcm91cERhdGEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZWFkRW5kKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBoZXgzMlN0cmluZyhpbnQgaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZHVtcEhlYWRlcigpCi0gICAgewotICAgICAgICBpbnQgbWFnaWMgPSByZWFkSW50KCk7Ci0gICAgICAgIGVtaXQoIk1hZ2ljIGNvb2tpZTogIiArIGhleDMyU3RyaW5nKG1hZ2ljKSk7Ci0KLSAgICAgICAgaWYgKG1hZ2ljICE9IERBVEFfQkFCRSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiV3JvbmcgbWFnaWMgY29va2llLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBfbWFqb3J2ZXIgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgX21pbm9ydmVyID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE4LCAwKSkKLSAgICAgICAgICAgIF9yZWxlYXNlbm8gPSByZWFkU2hvcnQoKTsKLQotICAgICAgICBlbWl0KCJNYWpvciB2ZXJzaW9uOiAiICsgX21ham9ydmVyKTsKLSAgICAgICAgZW1pdCgiTWlub3IgdmVyc2lvbjogIiArIF9taW5vcnZlcik7Ci0gICAgICAgIGVtaXQoIlJlbGVhc2UgbnVtYmVyOiAiICsgX3JlbGVhc2Vubyk7Ci0KLSAgICAgICAgaWYgKF9tYWpvcnZlciAhPSBNQUpPUl9WRVJTSU9OIHx8IF9taW5vcnZlciA+IE1JTk9SX1ZFUlNJT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIkluY29tcGF0aWJsZSB2ZXJzaW9uLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYWN0dWFsZmlsZXR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdCgiRmlsZXR5cGU6ICIgKyBmaWxldHlwZVN0cmluZyhhY3R1YWxmaWxldHlwZSkpOwotCi0gICAgICAgIF9zdHJpbmdQb29sID0gbmV3IFN0cmluZ1Bvb2woKTsKLSAgICAgICAgX3N0cmluZ1Bvb2wucmVhZEZyb20oX2lucHV0KTsKLQotICAgICAgICByZXR1cm4gYWN0dWFsZmlsZXR5cGU7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUG9pbnRlckRhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiVHlwZSBzeXN0ZW06ICIgKyByZWFkU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXBJbmRleERhdGEoKQotICAgIHsKLSAgICAgICAgLy8gaGFzIGEgaGFuZGxlIHBvb2wgKGNvdW50LCBoYW5kbGUvdHlwZSwgaGFuZGxlL3R5cGUuLi4pCi0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoIkhhbmRsZSBwb29sICgiICsgc2l6ZSArICIpOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBzaG9ydCBjb2RlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KGhhbmRsZSArICIgKCIgKyBmaWxldHlwZVN0cmluZyhjb2RlKSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiR2xvYmFsIGVsZW1lbnRzIik7Ci0KLSAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCBhdHRyaWJ1dGVzCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiR2xvYmFsIGF0dHJpYnV0ZXMiKTsKLQotICAgICAgICAvLyBhdHRyIGdyb3VwcyBhbmQgbW9kZWwgZ3JvdXBzCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiTW9kZWwgZ3JvdXBzIik7Ci0gICAgICAgIGR1bXBRTmFtZU1hcCgiQXR0cmlidXRlIGdyb3VwcyIpOwotCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiSWRlbnRpdHkgY29uc3RyYWludHMiKTsKLQotICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIHR5cGVzCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiR2xvYmFsIHR5cGVzIik7Ci0KLSAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGRvY3VtZW50IHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50Ci0gICAgICAgIGR1bXBRTmFtZU1hcCgiRG9jdW1lbnQgdHlwZXMiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHFuYW1lIG1hcCBvZiBhdHRyaWJ1dGUgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGF0dHJpYnV0ZQotICAgICAgICBkdW1wUU5hbWVNYXAoIkF0dHJpYnV0ZSB0eXBlcyIpOwotCi0gICAgICAgIC8vIGFsbCB0aGUgdHlwZXMgaW5kZXhlZCBieSBjbGFzc25hbWUKLSAgICAgICAgZHVtcENsYXNzbmFtZUluZGV4KCJBbGwgdHlwZXMgYnkgY2xhc3NuYW1lIik7Ci0KLSAgICAgICAgLy8gYWxsIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgIGR1bXBTdHJpbmdBcnJheSgiRGVmaW5lZCBuYW1lc3BhY2VzIik7Ci0gICAgICAgIAotICAgICAgICAvLyB2ZXJzaW9uIDE1IHN0dWZmIGZvciByZWRlZmluZXMKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTUsIDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBkdW1wUU5hbWVNYXAoIlJlZGVmaW5lZCBnbG9iYWwgdHlwZXMiKTsKLSAgICAgICAgICAgIGR1bXBRTmFtZU1hcCgiUmVkZmluZWQgbW9kZWwgZ3JvdXBzIik7Ci0gICAgICAgICAgICBkdW1wUU5hbWVNYXAoIlJlZGZpbmVkIGF0dHJpYnV0ZSBncm91cHMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWRFbmQoKTsKLSAgICB9Ci0KLQotICAgIGNsYXNzIFN0cmluZ1Bvb2wKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBpbnRzVG9TdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIE1hcCBzdHJpbmdzVG9JbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBTdHJpbmdQb29sKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50c1RvU3RyaW5ncy5hZGQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc3RyaW5nRm9yQ29kZShpbnQgY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWludHNUb1N0cmluZ3MuZ2V0KGNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvZGVGb3JTdHJpbmcoU3RyaW5nIHN0cikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcilzdHJpbmdzVG9JbnRzLmdldChzdHIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnRlZ2VyKGludHNUb1N0cmluZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChzdHIpOwotICAgICAgICAgICAgICAgIHN0cmluZ3NUb0ludHMucHV0KHN0ciwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVhZEZyb20oRGF0YUlucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW50c1RvU3RyaW5ncy5zaXplKCkgIT0gMSB8fCBzdHJpbmdzVG9JbnRzLnNpemUoKSAhPSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJTdHJpbmcgcG9vbCAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnB1dC5yZWFkVVRGKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gY29kZUZvclN0cmluZyhzdHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KGNvZGUgKyAiID0gXCIiICsgc3RyICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFjdGl2ZSB3aGlsZSBsb2FkaW5nIG9uZSB0eXBlLgotICAgIERhdGFJbnB1dFN0cmVhbSBfaW5wdXQ7Ci0gICAgU3RyaW5nUG9vbCBfc3RyaW5nUG9vbDsKLQotICAgIHNob3J0IHJlYWRTaG9ydCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCByZWFkSW50KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRJbnQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyByZWFkU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nUG9vbC5zdHJpbmdGb3JDb2RlKHJlYWRTaG9ydCgpKTsKLSAgICB9Ci0KLSAgICBRTmFtZSByZWFkUU5hbWUoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgaWYgKGxvY2FsbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbG5hbWUpOwotICAgIH0KLQotICAgIFN0cmluZyByZWFkSGFuZGxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlYWRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkSGFuZGxlKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBxbmFtZVN0cmluZyhRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIobnVsbCkiOwotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBxbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBxbmFtZVNldFN0cmluZyhRTmFtZVNldCBzZXQpCi0gICAgewotICAgICAgICByZXR1cm4gc2V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUU5hbWVNYXAoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSArICIgPSAiICsgcmVhZEhhbmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXRkZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wVHlwZUFycmF5KFN0cmluZyBmaWVsZG5hbWUpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KGZpZWxkbmFtZSArICIgKCIgKyBzaXplICsgIik6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdChpICsgIiA9ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXRkZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wQ2xhc3NuYW1lSW5kZXgoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KHJlYWRTdHJpbmcoKSArICIgPSAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFN0cmluZ0FycmF5KFN0cmluZyBmaWVsZG5hbWUpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KGZpZWxkbmFtZSArICIgKCIgKyBzaXplICsgIik6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdChyZWFkU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlYWRFbmQoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnB1dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBvaCwgd2VsbC4KLSAgICAgICAgfQotICAgICAgICBfaW5wdXQgPSBudWxsOwotICAgICAgICBfc3RyaW5nUG9vbCA9IG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwYXJ0aWNsZVR5cGVTdHJpbmcoaW50IHNwdCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoc3B0KQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDogcmV0dXJuICJBTEwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6IHJldHVybiAiQ0hPSUNFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDogcmV0dXJuICJFTEVNRU5UIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6IHJldHVybiAiU0VRVUVOQ0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDogcmV0dXJuICJXSUxEQ0FSRCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBwYXJ0aWNsZSB0eXBlICgiICsgc3B0ICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBiaWdJbnRlZ2VyU3RyaW5nKEJpZ0ludGVnZXIgYmlnaW50KQotICAgIHsKLSAgICAgICAgaWYgKGJpZ2ludCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIobnVsbCkiOwotICAgICAgICByZXR1cm4gYmlnaW50LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyB3Y3Byb2Nlc3NTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU1RSSUNUOiByZXR1cm4gIlNUUklDVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNLSVA6IHJldHVybiAiU0tJUCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkxBWDogcmV0dXJuICJMQVgiOwotICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gIk5PVF9XSUxEQ0FSRCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBwcm9jZXNzIHR5cGUgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUGFydGljbGVEYXRhKGJvb2xlYW4gZ2xvYmFsKQotICAgIHsKLSAgICAgICAgc2hvcnQgcGFydGljbGVUeXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQocGFydGljbGVUeXBlU3RyaW5nKHBhcnRpY2xlVHlwZSkgKyAiOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgc2hvcnQgcGFydGljbGVGbGFncyA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KCJGbGFnczogIiArIHBhcnRpY2xlZmxhZ3NTdHJpbmcocGFydGljbGVGbGFncykpOwotCi0gICAgICAgIGVtaXQoIk1pbk9jY3VyczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotICAgICAgICBlbWl0KCJNYXhPY2N1cnM6ICIgKyBiaWdJbnRlZ2VyU3RyaW5nKHJlYWRCaWdJbnRlZ2VyKCkpKTsKLQotICAgICAgICBlbWl0KCJUcmFuc2l0aW9uOiAiICsgcW5hbWVTZXRTdHJpbmcocmVhZFFOYW1lU2V0KCkpKTsKLQotICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBlbWl0KCJXaWxkY2FyZCBzZXQ6ICIgKyBxbmFtZVNldFN0cmluZyhyZWFkUU5hbWVTZXQoKSkpOwotICAgICAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHByb2Nlc3M6ICIgKyB3Y3Byb2Nlc3NTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICAgICAgICAgIGVtaXQoIlR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJEZWZhdWx0OiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNiwgMCkpCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkRlZmF1bHQgdmFsdWU6ICIgKyByZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiV3NkbEFycmF5VHlwZTogIiArIFNPQVBBcnJheVR5cGVTdHJpbmcocmVhZFNPQVBBcnJheVR5cGUoKSkpOwotICAgICAgICAgICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNywgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCJTdWJzdGl0dXRpb24gZ3JvdXAgaGVhZCAiICsgcmVhZEhhbmRsZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBzaG9ydCBzdWJzdEdyb3VwQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiU3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMgKCIgKyBzdWJzdEdyb3VwQ291bnQgKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdEdyb3VwQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiSWRlbnRpdHkgY29uc3RyYWludHMgKCIgKyBjb3VudCArICIpOiIpOwotICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQocmVhZEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkZpbGVuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgZHVtcFBhcnRpY2xlQXJyYXkoIlBhcnRpY2xlIGNoaWxkcmVuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZXJyb3IoIlVucmVjb2duaXplZCBzY2hlbWEgcGFydGljbGUgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBQYXJ0aWNsZUFycmF5KFN0cmluZyBmaWVsZG5hbWUpCi0gICAgewotICAgICAgICBpbnQgY291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdChmaWVsZG5hbWUgKyAiKCIgKyBjb3VudCArICIpOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgZHVtcFBhcnRpY2xlRGF0YShmYWxzZSk7Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNvbXBsZXhWYXJpZXR5U3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVDogcmV0dXJuICJFTVBUWV9DT05URU5UIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDogcmV0dXJuICJTSU1QTEVfQ09OVEVOVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UOiByZXR1cm4gIkVMRU1FTlRfQ09OVEVOVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDogcmV0dXJuICJNSVhFRF9DT05URU5UIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGNvbXBsZXggdmFyaWV0eSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHNpbXBsZVZhcmlldHlTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6IHJldHVybiAiQVRPTUlDIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOiByZXR1cm4gIkxJU1QiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOiByZXR1cm4gIlVOSU9OIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHNpbXBsZSB2YXJpZXR5ICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBmYWNldENvZGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEg6IHJldHVybiAiRkFDRVRfTEVOR1RIIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIOiByZXR1cm4gIkZBQ0VUX01JTl9MRU5HVEgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6IHJldHVybiAiRkFDRVRfTUFYX0xFTkdUSCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRTogcmV0dXJuICJGQUNFVF9NSU5fRVhDTFVTSVZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOiByZXR1cm4gIkZBQ0VUX01JTl9JTkNMVVNJVkUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6IHJldHVybiAiRkFDRVRfTUFYX0lOQ0xVU0lWRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRTogcmV0dXJuICJGQUNFVF9NQVhfRVhDTFVTSVZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFM6IHJldHVybiAiRkFDRVRfVE9UQUxfRElHSVRTIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFM6IHJldHVybiAiRkFDRVRfRlJBQ1RJT05fRElHSVRTIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGZhY2V0IGNvZGUgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHdoaXRlc3BhY2VDb2RlU3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U6IHJldHVybiAiV1NfQ09MTEFQU0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOiByZXR1cm4gIldTX1BSRVNFUlZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19SRVBMQUNFOiByZXR1cm4gIldTX1JFUExBQ0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOiByZXR1cm4gIldTX1VOU1BFQ0lGSUVEIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHdoaXRlc3BhY2UgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgZGVyaXZhdGlvblR5cGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5EVF9OT1RfREVSSVZFRDogcmV0dXJuICJEVF9OT1RfREVSSVZFRCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT046IHJldHVybiAiRFRfUkVTVFJJQ1RJT04iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTjogcmV0dXJuICJEVF9FWFRFTlNJT04iOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZGVyaXZhdGlvbiBjb2RlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcFR5cGVGaWxlRGF0YSgpCi0gICAgewotICAgICAgICBlbWl0KCJOYW1lOiAiICsgcW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpKTsKLSAgICAgICAgZW1pdCgiT3V0ZXIgdHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICBlbWl0KCJEZXB0aDogIiArIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgZW1pdCgiQmFzZSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIGVtaXQoIkRlcml2YXRpb24gdHlwZTogIiArIGRlcml2YXRpb25UeXBlU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIAotICAgICAgICBlbWl0KCJDb250YWluZXIgZmllbGQ6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBpbnQgY29udGFpbmVyZmllbGR0eXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoIlJlZnR5cGU6ICIgKyBjb250YWluZXJmaWVsZFR5cGVTdHJpbmcoY29udGFpbmVyZmllbGR0eXBlKSk7Ci0gICAgICAgIHN3aXRjaCAoY29udGFpbmVyZmllbGR0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0dMT0JBTDoKLSAgICAgICAgICAgICAgICBlbWl0KCJIYW5kbGU6ICIgKyByZWFkSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEFUVFI6Ci0gICAgICAgICAgICAgICAgZW1pdCgiSW5kZXg6ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMRUxUOgotICAgICAgICAgICAgICAgIGVtaXQoIkluZGV4OiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgZW1pdCgiSmF2YSBjbGFzcyBuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiSmF2YSBpbXBsIGNsYXNzIG5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotCi0gICAgICAgIGR1bXBUeXBlQXJyYXkoIkFub255bW91cyB0eXBlcyIpOwotCi0gICAgICAgIGVtaXQoIkFub255bW91cyB1bmlvbiBtZW1iZXIgb3JkaW5hbDogIiArIHJlYWRTaG9ydCgpKTsKLQotICAgICAgICBpbnQgZmxhZ3M7Ci0gICAgICAgIGZsYWdzID0gcmVhZEludCgpOwotICAgICAgICBlbWl0KCJGbGFnczogIiArIHR5cGVmbGFnc1N0cmluZyhmbGFncykpOwotICAgICAgICBib29sZWFuIGlzQ29tcGxleFR5cGUgPSAoKGZsYWdzICYgRkxBR19TSU1QTEVfVFlQRSkgPT0gMCk7Ci0KLSAgICAgICAgc2hvcnQgY29tcGxleFZhcmlldHkgPSBTY2hlbWFUeXBlLk5PVF9DT01QTEVYX1RZUEU7Ci0gICAgICAgIGlmIChpc0NvbXBsZXhUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wbGV4VmFyaWV0eSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiQ29tcGxleCB2YXJpZXR5OiAiICsgY29tcGxleFZhcmlldHlTdHJpbmcoY29tcGxleFZhcmlldHkpKTsKLQotICAgICAgICAgICAgc2hvcnQgYXR0ckNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KCJBdHRyaWJ1dGUgbW9kZWwgKCIgKyBhdHRyQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICBkdW1wQXR0cmlidXRlRGF0YShmYWxzZSk7Ci0KLSAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHNldDogIiArIHFuYW1lU2V0U3RyaW5nKHJlYWRRTmFtZVNldCgpKSk7Ci0gICAgICAgICAgICBlbWl0KCJXaWxkY2FyZCBwcm9jZXNzOiAiICsgd2Nwcm9jZXNzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBQcm9wZXJ0eSBUYWJsZQotICAgICAgICAgICAgc2hvcnQgYXR0clByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiQXR0cmlidXRlIHByb3BlcnRpZXMgKCIgKyBhdHRyUHJvcENvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0clByb3BDb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXBQcm9wZXJ0eURhdGEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dGRlbnQoKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCJJc0FsbDogIiArIHJlYWRTaG9ydCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgbW9kZWwgdHJlZQotICAgICAgICAgICAgICAgIGR1bXBQYXJ0aWNsZUFycmF5KCJDb250ZW50IG1vZGVsIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBFbGVtZW50IFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICAgICAgc2hvcnQgZWxlbVByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIGVtaXQoIkVsZW1lbnQgcHJvcGVydGllcyAoIiArIGVsZW1Qcm9wQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1Qcm9wQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBQcm9wZXJ0eURhdGEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0NvbXBsZXhUeXBlIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IHNpbXBsZVZhcmlldHkgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIlNpbXBsZSB0eXBlIHZhcmlldHk6ICIgKyBzaW1wbGVWYXJpZXR5U3RyaW5nKHNpbXBsZVZhcmlldHkpKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc1N0cmluZ0VudW0gPSAoKGZsYWdzICYgRkxBR19TVFJJTkdFTlVNKSAhPSAwKTsKLQotICAgICAgICAgICAgc2hvcnQgZmFjZXRDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiRmFjZXRzICgiICsgZmFjZXRDb3VudCArICIpOiIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0Q291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KGZhY2V0Q29kZVN0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICAgICAgICAgIGVtaXQoIlZhbHVlOiAiICsgcmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIGVtaXQoIkZpeGVkOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBlbWl0KCJXaGl0ZXNwYWNlIHJ1bGU6ICIgKyB3aGl0ZXNwYWNlQ29kZVN0cmluZyhyZWFkU2hvcnQoKSkpOwotCi0gICAgICAgICAgICBzaG9ydCBwYXR0ZXJuQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIlBhdHRlcm5zICgiICsgcGF0dGVybkNvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdChyZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBzaG9ydCBlbnVtQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIkVudW1lcmF0aW9uIHZhbHVlcyAoIiArIGVudW1Db3VudCArICIpOiIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQocmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBlbWl0KCJCYXNlIGVudW0gdHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICAgICAgaWYgKGlzU3RyaW5nRW51bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaG9ydCBzZUNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiU3RyaW5nIGVudW0gZW50cmllcyAoIiArIHNlQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIlwiIiArIHJlYWRTdHJpbmcoKSArICJcIiAtPiAiICsgcmVhZFNob3J0KCkgKyAiID0gIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChzaW1wbGVWYXJpZXR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIlByaW1pdGl2ZSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkRlY2ltYWwgc2l6ZTogIiArIHJlYWRJbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkxpc3QgaXRlbSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICBkdW1wVHlwZUFycmF5KCJVbmlvbiBtZW1iZXJzIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVua25vd24gc2ltcGxlIHR5cGUgdmFyaWV0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgiRmlsZW5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgYXR0cnVzZUNvZGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw6IHJldHVybiAiT1BUSU9OQUwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRDogcmV0dXJuICJSRVFVSVJFRCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQ6IHJldHVybiAiUFJPSElCSVRFRCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biB1c2UgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBBdHRyaWJ1dGVEYXRhKGJvb2xlYW4gZ2xvYmFsKQotICAgIHsKLSAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIlR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgZW1pdCgiVXNlOiAiICsgYXR0cnVzZUNvZGVTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgZW1pdCgiRGVmYXVsdDogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKLSAgICAgICAgICAgIGVtaXQoIkRlZmF1bHQgdmFsdWU6ICIgKyByZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgIGVtaXQoIkZpeGVkOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBlbWl0KCJXc2RsQXJyYXlUeXBlOiAiICsgU09BUEFycmF5VHlwZVN0cmluZyhyZWFkU09BUEFycmF5VHlwZSgpKSk7Ci0gICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICBlbWl0KCJGaWxlbmFtZTogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBwcmV0dHlPcHRpb25zID0KLSAgICAgICAgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKTsKLSAgICAKLSAgICB2b2lkIGR1bXBYbWwoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS54bWxUZXh0KCBwcmV0dHlPcHRpb25zICkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiB4ICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCggIiEhISEhISBCQUQgWE1MICEhISEhIiApOwotICAgICAgICAgICAgZW1pdCggeG1sICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBkdW1wTW9kZWxHcm91cERhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIlRhcmdldCBuYW1lc3BhY2U6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICBlbWl0KCJDaGFtZWxlb246ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE1LCAwKSkKLSAgICAgICAgICAgIGVtaXQoIlJlZGVmaW5lOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBlbWl0KCJNb2RlbCBHcm91cCBYbWw6ICIpOwotICAgICAgICBkdW1wWG1sKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wQXR0cmlidXRlR3JvdXBEYXRhKCkKLSAgICB7Ci0gICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICBlbWl0KCJUYXJnZXQgbmFtZXNwYWNlOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiQ2hhbWVsZW9uOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNSwgMCkpCi0gICAgICAgICAgICBlbWl0KCJSZWRlZmluZTogIiArIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgZW1pdCgiQXR0cmlidXRlIEdyb3VwIFhtbDogIik7Ci0gICAgICAgIGR1bXBYbWwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGFsd2F5c1N0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFk6IHJldHVybiAiQ09OU0lTVEVOVExZIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuTkVWRVI6IHJldHVybiAiTkVWRVIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRTogcmV0dXJuICJWQVJJQUJMRSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBmcmVxdWVuY3kgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGp0Y1N0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOiByZXR1cm4gIlhNTF9PQkpFQ1QiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46IHJldHVybiAiSkFWQV9CT09MRUFOIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDogcmV0dXJuICJKQVZBX0ZMT0FUIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6IHJldHVybiAiSkFWQV9ET1VCTEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6IHJldHVybiAiSkFWQV9CWVRFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDogcmV0dXJuICJKQVZBX1NIT1JUIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6IHJldHVybiAiSkFWQV9JTlQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6IHJldHVybiAiSkFWQV9MT05HIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOiByZXR1cm4gIkpBVkFfQklHX0RFQ0lNQUwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOiByZXR1cm4gIkpBVkFfQklHX0lOVEVHRVIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzogcmV0dXJuICJKQVZBX1NUUklORyI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWTogcmV0dXJuICJKQVZBX0JZVEVfQVJSQVkiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOiByZXR1cm4gIkpBVkFfR0RBVEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjogcmV0dXJuICJKQVZBX0dEVVJBVElPTiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURTogcmV0dXJuICJKQVZBX0RBVEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOiByZXR1cm4gIkpBVkFfUU5BTUUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOiByZXR1cm4gIkpBVkFfQ0FMRU5EQVIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6IHJldHVybiAiSkFWQV9MSVNUIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06IHJldHVybiAiSkFWQV9FTlVNIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6IHJldHVybiAiSkFWQV9PQkpFQ1QiOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBqYXZhIHR5cGUgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBQcm9wZXJ0eURhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiUHJvcGVydHkiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICBlbWl0KCJUeXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIGludCBwcm9wZmxhZ3MgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdCgiRmxhZ3M6ICIgKyBwcm9wZXJ0eWZsYWdzU3RyaW5nKHByb3BmbGFncykpOwotICAgICAgICBlbWl0KCJDb250YWluZXIgdHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICBlbWl0KCJNaW4gb2NjdXJhbmNlczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotICAgICAgICBlbWl0KCJNYXggb2NjdXJhbmNlczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotICAgICAgICBlbWl0KCJOaWxsYWJsZTogIiArIGFsd2F5c1N0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICBlbWl0KCJEZWZhdWx0OiAiICsgYWx3YXlzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIGVtaXQoIkZpeGVkOiAiICsgYWx3YXlzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIGVtaXQoIkRlZmF1bHQgdGV4dDogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgIGVtaXQoIkphdmEgcHJvcCBuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiSmF2YSB0eXBlIGNvZGU6ICIgKyBqdGNTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgZW1pdCgiVHlwZSBmb3IgamF2YSBzaWduYXR1cmU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgZW1pdCgiSmF2YSBzZXR0ZXIgZGVsaW1pdGVyOiAiICsgcW5hbWVTZXRTdHJpbmcocmVhZFFOYW1lU2V0KCkpKTsKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTYsIDApKQotICAgICAgICAgICAgZW1pdCgiRGVmYXVsdCB2YWx1ZTogIiArIHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLSAgICAgICAgaWYgKCgocHJvcGZsYWdzICYgRkxBR19QUk9QX0lTQVRUUikgPT0gMCkgJiYgYXRMZWFzdCgyLCAxNywgMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIkFjY2VwdGVkIHN1YnN0aXR1dGlvbnMgKCIgKyBzaXplICsgIik6Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzaXplIDsgaSsrKQotICAgICAgICAgICAgICAgIGVtaXQoIiAgQWNjZXB0ZWQgbmFtZSAiICsgcmVhZFFOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIFN0cmluZyByZWFkWG1sVmFsdWVPYmplY3QoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSByZWFkVHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgCi0gICAgICAgIGludCBidGMgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHZhbHVlID0gIm5pbCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHZhbHVlID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RyaW5nKEhleEJpbi5lbmNvZGUocmVhZEJ5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDE5KQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJTZXF1ZW5jZSgwLCAxNikgKyAiLi4uIjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IFFOYW1lSGVscGVyLnByZXR0eShyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IERvdWJsZS50b1N0cmluZyhyZWFkRG91YmxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZSArICIgKCIgKyB0eXBlICsgIjogIiArIGJ0YyArIikiOwotICAgIH0KLQotICAgIGRvdWJsZSByZWFkRG91YmxlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWREb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMC4wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIFNPQVBBcnJheVR5cGVTdHJpbmcoU09BUEFycmF5VHlwZSB0KQotICAgIHsKLSAgICAgICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5wcmV0dHkodC5nZXRRTmFtZSgpKSArIHQuc29hcDExRGltZW5zaW9uU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU09BUEFycmF5VHlwZSByZWFkU09BUEFycmF5VHlwZSgpCi0gICAgewotICAgICAgICBRTmFtZSBxTmFtZSA9IHJlYWRRTmFtZSgpOwotICAgICAgICBTdHJpbmcgZGltZW5zaW9ucyA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgaWYgKHFOYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQQXJyYXlUeXBlKHFOYW1lLCBkaW1lbnNpb25zKTsKLSAgICB9Ci0KLSAgICBRTmFtZVNldCByZWFkUU5hbWVTZXQoKQotICAgIHsKLSAgICAgICAgc2hvcnQgZmxhZyA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgIFNldCB1cmlTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBzaG9ydCB1cmlDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaUNvdW50OyBpKyspCi0gICAgICAgICAgICB1cmlTZXQuYWRkKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgU2V0IHFuYW1lU2V0MSA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHNob3J0IHFuY291bnQxID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDE7IGkrKykKLSAgICAgICAgICAgIHFuYW1lU2V0MS5hZGQocmVhZFFOYW1lKCkpOwotCi0gICAgICAgIFNldCBxbmFtZVNldDIgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBzaG9ydCBxbmNvdW50MiA9IHJlYWRTaG9ydCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuY291bnQyOyBpKyspCi0gICAgICAgICAgICBxbmFtZVNldDIuYWRkKHJlYWRRTmFtZSgpKTsKLQotICAgICAgICBpZiAoZmxhZyA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHModXJpU2V0LCBudWxsLCBxbmFtZVNldDEsIHFuYW1lU2V0Mik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKG51bGwsIHVyaVNldCwgcW5hbWVTZXQyLCBxbmFtZVNldDEpOwotICAgIH0KLQotICAgIGJ5dGVbXSByZWFkQnl0ZUFycmF5KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG9ydCBsZW4gPSBfaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuXTsKLSAgICAgICAgICAgIF9pbnB1dC5yZWFkRnVsbHkocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yKGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBCaWdJbnRlZ2VyIHJlYWRCaWdJbnRlZ2VyKCkKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSByZWFkQnl0ZUFycmF5KCk7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDEgJiYgcmVzdWx0WzBdID09IDEpCi0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihyZXN1bHQpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBieXRlW10gU0lOR0xFX1pFUk9fQllURSA9IG5ldyBieXRlW10geyAoYnl0ZSkwIH07Ci0KLSAgICBwcml2YXRlIGludCBfbWFqb3J2ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgX21pbm9ydmVyOwotICAgIHByaXZhdGUgaW50IF9yZWxlYXNlbm87Ci0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGF0TGVhc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCi0gICAgewotICAgICAgICBpZiAoX21ham9ydmVyID4gbWFqb3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKF9tYWpvcnZlciA8IG1ham9ydmVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gKF9yZWxlYXNlbm8gPj0gcmVsZWFzZW5vKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdE1vc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCi0gICAgewotICAgICAgICBpZiAoX21ham9ydmVyID4gbWFqb3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChfbWFqb3J2ZXIgPCBtYWpvcnZlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChfbWlub3J2ZXIgPCBtaW5vcnZlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gKF9yZWxlYXNlbm8gPD0gcmVsZWFzZW5vKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YSBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZGQ1MS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvU2NoZW1hQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudC5Db25maWc7Ci1pbXBvcnQgY29tLmJlYS54MjAwMi54MDkueGJlYW4uY29uZmlnLk5zY29uZmlnOwotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5RbmFtZWNvbmZpZzsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvbmZpZwotewotICAgIHByaXZhdGUgTWFwIF9wYWNrYWdlTWFwOwotICAgIHByaXZhdGUgTWFwIF9wcmVmaXhNYXA7Ci0gICAgcHJpdmF0ZSBNYXAgX3N1ZmZpeE1hcDsKLSAgICBwcml2YXRlIE1hcCBfcW5hbWVNYXA7Ci0KLSAgICBwcml2YXRlIFNjaGVtYUNvbmZpZygpCi0gICAgewotICAgICAgICBfcGFja2FnZU1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3ByZWZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3FuYW1lTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYUNvbmZpZyBmb3JDb25maWdEb2N1bWVudHMoQ29uZmlnW10gY29uZmlncykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hQ29uZmlnKGNvbmZpZ3MpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYUNvbmZpZyhDb25maWdbXSBjb25maWdzKQotICAgIHsKLSAgICAgICAgX3BhY2thZ2VNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBfcHJlZml4TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIF9xbmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ29uZmlnIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0gICAgICAgICAgICBOc2NvbmZpZ1tdIG5zYSA9IGNvbmZpZy5nZXROYW1lc3BhY2VBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuc2EubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkTmFtZXNwYWNlU2V0dGluZyhuc2Fbal0uZ2V0VXJpKCksIG5zYVtqXS5nZXRQYWNrYWdlKCksIF9wYWNrYWdlTWFwKTsKLSAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFByZWZpeCgpLCBfcHJlZml4TWFwKTsKLSAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFN1ZmZpeCgpLCBfc3VmZml4TWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUW5hbWVjb25maWdbXSBxbmMgPSBjb25maWcuZ2V0UW5hbWVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBxbmMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3FuYW1lTWFwLnB1dChxbmNbal0uZ2V0TmFtZSgpLCBxbmNbal0uZ2V0SmF2YW5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY29yZE5hbWVzcGFjZVNldHRpbmcoT2JqZWN0IGtleSwgU3RyaW5nIHZhbHVlLCBNYXAgcmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGVsc2UgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LnB1dCgiIiwgdmFsdWUpOwotICAgICAgICBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcgJiYgIiMjYW55Ii5lcXVhbHMoa2V5KSkKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoTGlzdClrZXkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCIjI2xvY2FsIi5lcXVhbHModXJpKSkKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gIiI7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dCh1cmksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBsb29rdXAoTWFwIG1hcCwgU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZyltYXAuZ2V0KHVyaSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKW1hcC5nZXQoIiMjYW55Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBQYWNrYWdlRm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gbG9va3VwKF9wYWNrYWdlTWFwLCB1cmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4Rm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gbG9va3VwKF9wcmVmaXhNYXAsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBTdWZmaXhGb3JOYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsb29rdXAoX3N1ZmZpeE1hcCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cEphdmFuYW1lRm9yUU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylfcW5hbWVNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMvdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMvdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWVmNjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3V0aWxzL05lc3RlZFRocm93YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMudXRpbHM7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBOZXN0ZWRFeGNlcHRpb24sIE5lc3RlZEVycm9yLCBhbmQKLSAqIE5lc3RlZFJ1bnRpbWVFeGNlcHRpb24gbGFyZ2VseSBzbyBVdGlsIGNhbiBwcm92aWRlIGEgc3RhbmRhcmQKLSAqIGltcGxlbWVudGF0aW9uIG9mIHRvU3RyaW5nKCkgYW5kIHByaW50U3RhY2tUcmFjZSgpCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIEpESyAxLjQgc3R5bGUgbmVzdGVkIHRocm93YWJsZXMgd2hlcmUgcG9zc2libGUuCi0gKgotICogQGF1dGhvciBXZWJMb2dpYwotICovCi0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBOZXN0ZWRUaHJvd2FibGUgewotCi0gIC8qKiBHZXQgdGhlIG5lc3RlZCBUaHJvd2FibGUuICovCi0gIFRocm93YWJsZSBnZXROZXN0ZWQoKTsKLQotICAvKiogQ2FsbCBzdXBlci50b1N0cmluZygpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLwotICBTdHJpbmcgc3VwZXJUb1N0cmluZygpOwotCi0gIC8qKiBDYWxsIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLwotICB2b2lkIHN1cGVyUHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHBzKTsKLQotICAvKiogQ2FsbCBzdXBlci5wcmludFN0YWNrVHJhY2UoKS4gW0tsdWRnZSBidXQgbmVjZXNzYXJ5Ll0gKi8KLSAgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBwbyk7Ci0KLSAgc3RhdGljIGNsYXNzIFV0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIGl0cyBuZXN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE5lc3RlZFRocm93YWJsZSBudCkgewotICAgICAgVGhyb3dhYmxlIG5lc3RlZCA9IG50LmdldE5lc3RlZCgpOwotICAgICAgaWYgKG5lc3RlZCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBudC5zdXBlclRvU3RyaW5nKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnQuc3VwZXJUb1N0cmluZygpICsgIiAtIHdpdGggbmVzdGVkIGV4Y2VwdGlvbjoiICsKLSAgICAgICAgICBFT0wgKyAiWyIgKyBuZXN0ZWRUb1N0cmluZyhuZXN0ZWQpICsgIl0iOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuZXN0ZWRUb1N0cmluZyhUaHJvd2FibGUgbmVzdGVkKSB7Ci0gICAgICBpZiAobmVzdGVkIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSA9IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBuZXN0ZWQ7Ci0gICAgICAgIHJldHVybiBuZXN0ZWQudG9TdHJpbmcoKSArICIgLSB3aXRoIHRhcmdldCBleGNlcHRpb246IiArCi0gICAgICAgICAgRU9MICsgIlsiICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkgKwotICAgICAgICAgICJdIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXN0ZWQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YWNrVHJhY2UoTmVzdGVkVGhyb3dhYmxlIG50LCBQcmludFN0cmVhbSBzKSB7Ci0gICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7Ci0gICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKLSAgICAgICAgbmVzdGVkLnByaW50U3RhY2tUcmFjZShzKTsKLSAgICAgICAgcy5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0gbmVzdGVkIHdpdGhpbjogLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICB9Ci0gICAgICBudC5zdXBlclByaW50U3RhY2tUcmFjZShzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3ICAgICAgICAgICAgICAgICBQcmludFdyaXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YWNrVHJhY2UoTmVzdGVkVGhyb3dhYmxlIG50LCBQcmludFdyaXRlciB3KSB7Ci0gICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7Ci0gICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKLSAgICAgICAgbmVzdGVkLnByaW50U3RhY2tUcmFjZSh3KTsKLSAgICAgICAgdy5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0gbmVzdGVkIHdpdGhpbjogLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICB9Ci0gICAgICBudC5zdXBlclByaW50U3RhY2tUcmFjZSh3KTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQXR0cmlidXRlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3NzQxNS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdHRyaWJ1dGUKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKLSAqLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGUgewotICAvKioKLSAgICogR2V0IHRoZSBYTUxOYW1lIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4KLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAgICovCi0gIHB1YmxpYyBYTUxOYW1lIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB0eXBlIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYXR0cmlidXRlIHR5cGUgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlCi0gICAqLwotICBwdWJsaWMgWE1MTmFtZSBnZXRTY2hlbWFUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQXR0cmlidXRlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhMzVhMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyBtZXRob2RzIGZvciBpdGVyYXRpbmcgb3ZlciBhdHRyaWJ1dGVzLgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKLSovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlSXRlcmF0b3IgewotICAvKioKLSAgICogR2V0IHRoZSBuZXh0IEF0dHJpYnV0ZSBvbiB0aGUgc3RyZWFtCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgbmV4dCgpOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGF0dHJpYnV0ZXMgb24gdGhlIHN0cmVhbQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RyZWFtIHdpdGhvdXQgc2hpZnRpbmcgaXQKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgcGVlaygpOwotCi0KLSAgLyoqCi0gICAqIFNraXAgdGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RyZWFtCi0gICAqLwotICBwdWJsaWMgdm9pZCBza2lwKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMmEzZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9CdWZmZXJlZFhNTElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotLyoqCi0gKiBFeHRlbmRzIHRoZSBYTUxJbnB1dFN0cmVhbSB0byBhbGxvdyBtYXJraW5nIGFuZCByZXNldGluZyBvZiB0aGUgc3RyZWFtLgotICoKLSAqIEBzaW5jZSBYTUxJbnB1dFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5FbmRFbGVtZW50Ci0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqLwotcHVibGljIGludGVyZmFjZSBCdWZmZXJlZFhNTElucHV0U3RyZWFtIGV4dGVuZHMgWE1MSW5wdXRTdHJlYW0gewotICAvKioKLSAgICogU2V0cyB0aGUgbWFya3MgYSBwb2ludCB0byByZXR1cm4gdG8gaW4gdGhlIHN0cmVhbSwKLSAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgbWFyay4KLSAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBCdWZmZXJlZFN0cmVhbXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIG1hcmsoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUmVzZXRzIHRoZSBzdHJlYW0gdG8gdGhlIHByZXZpb3VzIG1hcmsuCi0gICAqIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcms7Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhbmdlUHJlZml4TWFwcGluZy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhbmdlUHJlZml4TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY1NDkzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0NoYW5nZVByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBjaGFuZ2VkIGZyb20KLSAqIE9sZE5hbWVzcGFjZU5hbWUgdG8gdGhlIE5ld05hbWVzcGFjZU5hbWUKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0UHJlZml4TWFwcGluZwotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmcKLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VQcmVmaXhNYXBwaW5nIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKgotICAgKiByZXR1cm5zIHRoZSB1cmkgdGhhdCB0aGUgcHJlZml4IHdhcyBib3VuZCB0bwotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgdXJpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE9sZE5hbWVzcGFjZVVyaSgpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBuZXcgdXJpIHRoYXQgdGhlIHByZWZpeCBpcyBib3VuZCB0bwotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgdXJpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5ld05hbWVzcGFjZVVyaSgpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBwcmVmaXggdGhhdCBpcyBib3VuZAotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhcmFjdGVyRGF0YS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhcmFjdGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNiZDhiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0NoYXJhY3RlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIGNoYXJhY3RlciBkYXRhCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhcmFjdGVyRGF0YSBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyoqCi0gICAqIEdldCB0aGUgY29udGVudCBvZiB0aGlzIGVsZW1lbnQsCi0gICAqIHJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBoYXMgbm8gY29udGVudAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGNvbnRlbnQgYW5kIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCgpOwotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Db21tZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2M2ZTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIEEgbWFya2VyIGludGVyZmFjZSBmb3IgY29tbWVudCBkYXRhCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLQotcHVibGljIGludGVyZmFjZSBDb21tZW50IGV4dGVuZHMgQ2hhcmFjdGVyRGF0YSB7Ci0gIC8qKgotICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgotICAgKi8KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VsZW1lbnRGaWx0ZXIuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljZWE1Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICoKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBmaWx0ZXIgb24gZWxlbWVudHMKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRGaWx0ZXIgewotICAvKioKLSAgICogdGVzdHMgd2hldGhlciB0aGlzIGV2ZW50IGlzIHBhcnQgb2YgdGhpcyBzdHJlYW0gCi0gICAqLwotICBib29sZWFuIGFjY2VwdChYTUxFdmVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbmREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiN2QwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciB0aGUgZW5kIG9mIGEgZG9jdW1lbnQKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0qLwotcHVibGljIGludGVyZmFjZSBFbmREb2N1bWVudCBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyoqCi0gICAqIE5vIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuCi0gICAqLwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWZlNDk4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIHRoZSBlbmQgZWxlbWVudCBldmVudC4KLSAqIFRoZSBuYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgZ2V0TmFtZSBtZXRob2Qgb2YKLSAqIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQgaW50ZXJmYWNlLgotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSovCi1wdWJsaWMgaW50ZXJmYWNlIEVuZEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLiAgCi0gICAqLwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kUHJlZml4TWFwcGluZy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kUHJlZml4TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjUzZDRmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZFByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBnb25lIG91dCBvZiBzY29wZQotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW5kUHJlZml4TWFwcGluZyBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHByZWZpeCB0aGF0IGhhcyBnb25lIG91dCBvZiBzY29wZQotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW50aXR5UmVmZXJlbmNlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmMjExZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbnRpdHlSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIEVudGl0eSBEZWNsYXJhdGlvbnMKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50aXR5IHdhcyBza2lwcGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBza2lwcGVkKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Mb2NhdGlvbi5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1MTgxNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGRvY3VtZW50IGxvY2F0aW9uIG9mIHRoZSBldmVudC4gIFRoaXMgaXMgbm90Ci0gKiByZXF1aXJlZCB0byBiZSBleGFjdCBhbmQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LgotICogCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2NhdGlvbiB7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlcgotICAgKgotICAgKiBAcmV0dXJuIGludGVnZXIgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlcgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKTsgCi0gIC8qCi0gICAqIHJldHVybnMgdGhlIGN1cnJlbnQgbGluZQotICAgKgotICAgKiBAcmV0dXJuIGludGVnZXIgdmFsdWUgb2YgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIHB1YmxpYyBJRAotICAgKgotICAgKiBAcmV0dXJuIHB1YmxpYyBJRCBvciBudWxsIGlmIG5vdCBzZXQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKTsgCi0gIC8qCi0gICAqIHJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgc3lzdGVtIElECi0gICAqCi0gICAqIEByZXR1cm4gc3lzdGVtIElEIG9yIG51bGwgaWYgbm90IHNldAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3ZDQ2Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKgotICAgKiB0aGUgdGFyZ2V0IHNlY3Rpb24gb2YgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLSAgICoKLSAgICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBQSSBvciBudWxsCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpOwotICAvKgotICAgKiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgUEkncyBkYXRhIG9yIG51bGwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1JlZmVyZW5jZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjY3ZTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIGltcGxlbWVudGVkIHRvIGFsbG93IHJlc29sdXRpb24gb2YgcmVmZXJlbmNlcwotICogb24gYSBzdHJlYW0uICAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VSZXNvbHZlciB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB4bWwgcG9pbnRlZCB0byBieSB0aGlzIGlkcmVmIGFzIGFuIFhNTElucHV0U3RyZWFtCi0gICAqIEBwYXJhbSBpZHJlZgotICAgKi8KLSAgWE1MSW5wdXRTdHJlYW0gcmVzb2x2ZShTdHJpbmcgaWRyZWYpCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGlkcmVmCi0gICAqIEBwYXJhbSBpZHJlZgotICAgKi8KLSAgU3RyaW5nIGdldElkKFN0cmluZyBpZHJlZik7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TcGFjZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiNWMxNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFRoaXMgZWxlbWVudCByZXR1cm5zIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBhbGxvdyBzZXBhcmF0ZQotICogaGFuZGxpbmcgYnkgdGhlIGFwcGxpY2F0aW9uCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBTcGFjZSBleHRlbmRzIENoYXJhY3RlckRhdGEgewotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgaWdub3JhYmxlIHdoaXRlc3BhY2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlnbm9yYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnREb2N1bWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdkMTYzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1N0YXJ0RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBzdGFydCBkb2N1bWVudCBldmVudAotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXJ0RG9jdW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qIAotICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIHN0cmVhbQotICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gaWQsIGRlZmF1bHRzIHRvICIiCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCk7Ci0gIC8qIAotICAgKiBSZXR1cm5zIHRoZSBlbmNvZGluZyBzdHlsZSBvZiB0aGlzIFhNTCBzdHJlYW0KLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLCBkZWZhdWx0cyB0byAiVVRGLTgiCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7Ci0gIC8qIAotICAgKiBSZXR1cm5zIGlmIHRoaXMgWE1MIGlzIHN0YW5kYWxvbmUKLSAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiBYTUwsIGRlZmF1bHRzIHRvICJ5ZXMiCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKTsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgWE1MIG9mIHRoaXMgWE1MIHN0cmVhbQotICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIFhNTCwgZGVmYXVsdHMgdG8gIjEuMCIKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnRFbGVtZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwNzYxMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0vKioKLSAqIFRoZSBTdGFydEVsZW1lbnQgaW50ZXJmYWNlIHByb3ZpZGVzIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBhYm91dAotICogc3RhcnQgZWxlbWVudHMKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBTdGFydEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIGFuIEF0dHJpYnV0ZUl0ZXJhdG9yIG9mIG5vbi1uYW1lc3BhY2UgZGVjbGFyZWQgYXR0cmlidXRlcwotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldEF0dHJpYnV0ZXMoKTsKLSAgLyoqCi0gICAqIFJldHVybnMgYW4gQXR0cmlidXRlSXRlcmF0b3Igb2YgbmFtZXNwYWNlcyBkZWNsYXJlZCBpbiB0aGlzIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXROYW1lc3BhY2VzKCk7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBkZWNsYXJlZCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2VzCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSByZWZlcnJlZCB0byBieSB0aGlzIG5hbWUKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlOYW1lKFhNTE5hbWUgbmFtZSk7Ci0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSB0aGF0IHRoZSBwcmVmaXggaXMgYm91bmQgdG8gaW4gdGhlCi0gICAqIGNvbnRleHQgb2YgdGhpcyBlbGVtZW50LiAgUmV0dXJucyBudWxsIGlmIAotICAgKiB0aGUgcHJlZml4IGlzIG5vdCBib3VuZCBpbiB0aGlzIGNvbnRleHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKFN0cmluZyBwcmVmaXgpOwotICAvKioKLSAgICogR2V0cyBhIGphdmEudXRpbC5NYXAgZnJvbSBwcmVmaXhlcyB0byBVUklzIGluIHNjb3BlIGZvciB0aGlzCi0gICAqIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZU1hcCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnRQcmVmaXhNYXBwaW5nLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MTliZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBiZWd1biBzY29wZQotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kUHJlZml4TWFwcGluZwotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmcKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXJ0UHJlZml4TWFwcGluZyBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHVyaSBvZiB0aGUgcHJlZml4IHRoYXQgaXMgaW4gc2NvcGUgZm9yIHRoZSBmb2xsb3dpbmcgCi0gICAqIGVsZW1lbnQKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHVyaQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKTsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHByZWZpeCB0aGF0IGlzIG5vdyBpbiBzY29wZQotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MRXZlbnQuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1hNTEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMTdjOTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBlbGVtZW50IGludGVyZmFjZSBmb3IgaGFuZGxpbmcgbWFya3VwIGV2ZW50cy4KLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5FbmRFbGVtZW50Ci0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydERvY3VtZW50Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYW4gWE1MRXZlbnQKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlQ9MHgwMDAwMDAwMTsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFN0YXJ0RWxlbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UPTB4MDAwMDAwMDI7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYW4gRW5kRWxlbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRWxlbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlQ9MHgwMDAwMDAwNDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OPTB4MDAwMDAwMDg7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBDaGFyYWN0ZXJEYXRhIEV2ZW50Ci0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSQUNURVJfREFUQT0weDAwMDAwMDEwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgQ29tbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ29tbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVD0weDAwMDAwMDIwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3BhY2UKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlNwYWNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRT0weDAwMDAwMDQwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgTnVsbEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfRUxFTUVOVD0weDAwMDAwMDgwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3RhcnREb2N1bWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRE9DVU1FTlQ9MHgwMDAwMDEwMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhbiBFbmREb2N1bWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9ET0NVTUVOVD0weDAwMDAwMjAwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3RhcnRQcmVmaXhNYXBwaW5nCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydFByZWZpeE1hcHBpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1BSRUZJWF9NQVBQSU5HPTB4MDAwMDA0MDA7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBFbmRQcmVmaXhNYXBwaW5nCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5FbmRQcmVmaXhNYXBwaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfUFJFRklYX01BUFBJTkc9MHgwMDAwMDgwMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIENoYW5nZVByZWZpeE1hcHBpbmcKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9QUkVGSVhfTUFQUElORz0weDAwMDAxMDAwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGFuIEVudGl0eVJlZmVyZW5jZSAKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkVudGl0eVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFRkVSRU5DRT0weDAwMDAyMDAwOwotICAvKioKLSAgICogR2V0IHRoZSBldmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAqIHJldHVybnMgYW4gaW50ZWdlciBzbyB0aGF0IHN3aXRjaCBzdGF0ZW1lbnRzCi0gICAqIGNhbiBiZSB3cml0dGVuIG9uIHRoZSByZXN1bHQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpOwotICAvKioKLSAgICogR2V0IHRoZSBldmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAqIHJldHVybnMgYW4gaW50ZWdlciBzbyB0aGF0IHN3aXRjaCBzdGF0ZW1lbnRzCi0gICAqIGNhbiBiZSB3cml0dGVuIG9uIHRoZSByZXN1bHQKLSAgICovCi0gIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUoKTsKLSAgLyoqCi0gICAqIEdldCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSB0eXBlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFzU3RyaW5nKCk7Ci0gIC8qKgotICAgKiBHZXQgdGhlIFhNTE5hbWUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZQotICAgKi8KLSAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGlzIEVsZW1lbnQgaGFzIGEgbmFtZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgRWxlbWVudAotICAgKi8KLSAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzIHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc0VudGl0eVJlZmVyZW5jZSgpOwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0UHJlZml4TWFwcGluZygpOwotICBwdWJsaWMgYm9vbGVhbiBpc0VuZFByZWZpeE1hcHBpbmcoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VQcmVmaXhNYXBwaW5nKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRGF0YSgpOwotICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzTnVsbCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RG9jdW1lbnQoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNFbmREb2N1bWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1hNTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZWE2ZmUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICoKLSAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCBpbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIFhNTCBFdmVudHMKLSAqIGluIGFuIFhNTCBkb2N1bWVudC4KLSAqCi0gKiA8cD4gRGlmZmVyZW5jZSBmcm9tIFNBWCA8L3A+Ci0gKiA8cD4gQW4gZXZlbnQgc3RyZWFtIGNhbiBiZSB0aG91Z2h0IG9mIGVuY2Fwc3VsYXRpbmcgU0FYCi0gKiBldmVudHMuIEl0IGFwcGxpZXMgYW4gaXRlcmF0b3IvcHVsbCBtZXRhcGhvciB0byB0aGUgcGFyc2VyIAotICogYWxsb3dpbmcgcHJvY2VkdXJhbCwgc3RyZWFtLWJhc2VkLCBoYW5kbGluZyBvZiBpbnB1dCBYTUwgcmF0aGVyIHRoYW4KLSAqIGhhdmluZyB0byB3cml0ZSBjaGFpbmVkIGV2ZW50IGhhbmRsZXJzIHRvIGhhbmRsZSBjb21wbGV4IFhNTAotICogZG9jdW1lbnRzLgotICogPHA+IERpZmZlcmVuY2UgZnJvbSBET00gPC9wPgotICogPHA+VGhlIHB1bGwgbWV0YXBob3IgYWxsb3dzIHNpbmdsZS1wYXNzLCBzdHJlYW0tYmFzZWQgIHBhcnNpbmcgb2YgdGhlIGRvY3VtZW50IHJhdGhlcgotICogdGhhbiB0cmVlIGJhc2VkIG1hbmlwdWxhdGlvbi48L3A+Ci0gKgotICogQHNpbmNlIFhNTElucHV0U3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50Ci0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRWxlbWVudAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lCi0gKi8KLQotLy8gUkVWSUVXIHBkYXBrdXNAYmVhLmNvbSAyMDAyLVNlcC0xMyAtLSB3aGlsZSBJIGxpa2UgdGhlIGNvbnZlbmllbmNlCi0vLyBvZiBtYW55IG9mIHRoZXNlIG1ldGhvZHMsIGl0IHN0cmlrZXMgbWUgdGhhdCBtYW55IG9mIHRoZXNlIG1ldGhvZHMKLS8vIGNvdWxkIGltcGxlbWVudGVkIGFzIHN0YXRpYyBtZXRob2RzIGluIGEgdXRpbGl0eSBjbGFzcy4gIHRoZSBkb3duCi0vLyBzaWRlIHRvIGhhdmluZyB0aGVtIGluIHRoaXMgYmFzZSBpbnRlcmZhY2UgaXMgdGhhdCBpdCBtYWtlcyB0aGUKLS8vIGNvbnRyYWN0IGZvciBpbXBsZW1lbnRlcnMgdW5uZWNlc3NhcmlseSBzdGVhcCBhbmQgcmVzdWx0cyBpbgotLy8gZHVwbGljYXRlZCBjb2RlIGluIG1ldGhvZHMgdGhhdCBjYW4ndCBleHRlbmQgb25lIG9mIHRoZSBjb21tb24gYmFzZQotLy8gY2xhc3Nlcy4gIAotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTElucHV0U3RyZWFtIHsKLSAgLyoqCi0gICAqIEdldCB0aGUgbmV4dCBYTUxFdmVudCBvbiB0aGUgc3RyZWFtCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIFhNTEV2ZW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRvIHB1bGwgb2YgdGhlIHN0cmVhbQotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogU2tpcCB0aGUgbmV4dCBzdHJlYW0gZXZlbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNraXAoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogU2tpcHMgdGhlIGVudGlyZSBuZXh0IHN0YXJ0IHRhZyAvIGVuZCB0YWcgcGFpci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNraXBFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIENoZWNrIHRoZSBuZXh0IFhNTEV2ZW50IHdpdGhvdXQgcmVhZGluZyBpdCBmcm9tIHRoZSBzdHJlYW0uCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGUgc3RyZWFtIGlzIGF0IEVPRiBvciBoYXMgbm8gbW9yZSBYTUxFdmVudHMuCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIFhNTEV2ZW50IHBlZWsoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgbmV4dCBYTUxFdmVudCBvZiB0aGlzIHR5cGUuICBUaGUgbWV0aG9kCi0gICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGNvbnRhaW5zIGFub3RoZXIgWE1MRXZlbnQgb2YgdGhpcyB0eXBlCi0gICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIEBwYXJhbSBldmVudFR5cGUgQW4gaW50ZWdlciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBlbGVtZW50IHR5cGUuCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2tpcChpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgbmFtZS4gIFRoZSBtZXRob2QKLSAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY29udGFpbnMgYW5vdGhlciBlbGVtZW50IHdpdGggdGhpcyBuYW1lCi0gICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuICBTa2lwIGlzIGEgZm9yd2FyZCBvcGVyYXRvciBvbmx5LiAgSXQgZG9lcwotICAgKiBub3QgbG9vayBiYWNrd2FyZCBpbiB0aGUgc3RyZWFtLgotICAgKiBAcGFyYW0gbmFtZSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIFhNTCBuYW1lLgotICAgKiBJZiB0aGUgWE1MTmFtZS5nZXROYW1lU3BhY2VOYW1lKCkgbWV0aG9kIG9uIHRoZSBYTUxOYW1lIGFyZ3VtZW50IHJldHVybnMKLSAgICogbnVsbCB0aGUgWE1MTmFtZSB3aWxsIG1hdGNoIGp1c3QgdGhlIGxvY2FsIG5hbWUuICBQcmVmaXhlcyBhcmUKLSAgICogbm90IGNoZWNrZWQgZm9yIGVxdWFsaXR5LgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2tpcChYTUxOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0gIC8qKgotICAgKiBQb3NpdGlvbiB0aGUgc3RyZWFtIGF0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBuYW1lIGFuZCB0aGlzIHR5cGUuCi0gICAqIFRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY29udGFpbnMgYW5vdGhlciBlbGVtZW50IAotICAgKiB3aXRoIHRoaXMgbmFtZSBvZiB0aGlzIHR5cGUgYW5kIGZhbHNlIG90aGVyd2lzZS4gIAotICAgKiBAcGFyYW0gbmFtZSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIFhNTCBuYW1lLgotICAgKiBJZiB0aGUgWE1MTmFtZS5nZXROYW1lU3BhY2VOYW1lKCkgbWV0aG9kIG9uIHRoZSBYTUxOYW1lIGFyZ3VtZW50IHJldHVybnMKLSAgICogbnVsbCB0aGUgWE1MTmFtZSB3aWxsIG1hdGNoIGp1c3QgdGhlIGxvY2FsIG5hbWUuICBQcmVmaXhlcyBhcmUKLSAgICogbm90IGNoZWNrZWQgZm9yIGVxdWFsaXR5LgotICAgKiBAcGFyYW0gZXZlbnRUeXBlIEFuIGludGVnZXIgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZWxlbWVudCB0eXBlLgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNraXAoWE1MTmFtZSBuYW1lLCBpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogZ2V0U3ViU3RyZWFtKCkgcmV0dXJucyBhIHN0cmVhbSB3aGljaCBwb2ludHMgdG8gdGhlIGVudGlyZSBuZXh0IGVsZW1lbnQgaW4gdGhlCi0gICAqIGN1cnJlbnQgc3RyZWFtLiAgRm9yIGV4YW1wbGU6IHRha2UgYSBkb2N1bWVudCB0aGF0IGhhcyBhIHJvb3Qgbm9kZSBBLCB3aGVyZSB0aGUgY2hpbGRyZW4KLSAgICogb2YgQSBhcmUgQiwgQywgYW5kIEQuIElmIHRoZSBzdHJlYW0gaXMgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgb2YgQSwgZ2V0U3ViU3RyZWFtKCkgd2lsbCByZXR1cm4gCi0gICAqIEEsIEIsIEMgYW5kIEQgaW5jbHVkaW5nIHRoZSBzdGFydCBlbGVtZW50IG9mIEEgYW5kIHRoZSBlbmQgZWxlbWVudCBvZiBBLiAgVGhlIHBvc2l0aW9uIG9mIHRoZSBwYXJlbnQKLSAgICogc3RyZWFtIGlzIG5vdCBjaGFuZ2VkIGFuZCB0aGUgZXZlbnRzIHJlYWQgYnkgdGhlIHN1YnN0cmVhbSBhcmUgd3JpdHRlbiBiYWNrIHRvIGl0cyBwYXJlbnQuICAgCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gZ2V0U3ViU3RyZWFtKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIENsb3NlcyB0aGlzIGlucHV0IHN0cmVhbSBhbmQgcmVsZWFzZXMgYW55IHN5c3RlbSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSByZXNvbHZlciB0aGF0IHdhcyBzZXQgZm9yIHRoaXMgc3RyZWFtLAotICAgKiByZXR1cm5zIG51bGwgaWYgbm8gUmVmZXJlbmNlUmVzb2x2ZXIgaGFzIGJlZW4gc2V0LgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uUmVmZXJlbmNlUmVzb2x2ZXIKLSAgICovCi0gIHB1YmxpYyBSZWZlcmVuY2VSZXNvbHZlciBnZXRSZWZlcmVuY2VSZXNvbHZlcigpOwotICAvKioKLSAgICogUHJvdmlkZXMgYSB3YXkgdG8gc2V0IHRoZSBSZWZlcmVuY2VSZXNvbHZlciBvZiB0aGUgc3RyZWFtLAotICAgKiB0aGlzIGlzIG1vc3RseSBuZWVkZWQgZm9yIGhhbmRsZSByZWZlcmVuY2VzIHRvIG90aGVyIHBhcnRzIG9mIHRoZQotICAgKiBkb2N1bWVudC4KLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlJlZmVyZW5jZVJlc29sdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VSZXNvbHZlcihSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlcik7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjIzNGM2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1hNTE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFF1YWxpZmllZCBOYW1lIG9mIGFuIFhNTCBldmVudC4KLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxOYW1lIHsKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgdXJpIG9mIHRoZSBwcmVmaXggb2YgdGhpcyBuYW1lCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHVyaSwgCi0gICAqIGVtcHR5IHN0cmluZyBpZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgYm91bmQgdG8gZW1wdHkgc3RyaW5nIAotICAgKiBvciBudWxsIGlmIHRoZSBuYW1lIGRvZXMgbm90IGhhdmUgYSBuYW1lc3BhY2UKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIGxvY2FsbmFtZSBvZiB0aGUgeG1sIG5hbWUKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGxvY2FsbmFtZSwgY2Fubm90IGJlIG51bGwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCk7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIHByZWZpeCBvZiB0aGUgeG1sIG5hbWUKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHByZWZpeCBvZiB0aGUgeG1sIG5hbWUgb3IgbnVsbAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKTsKLQotICAvKgotICAgKiByZXR1cm5zIHRoZSBwcmVmaXggb2YgdGhlIHhtbCBuYW1lICsgJzonICsgdGhlIGxvY2FsIG5hbWUKLSAgICogaWYgdGhlIHByZWZpeCBpcyBub3QgbnVsbAotICAgKiByZXR1cm5zIHRoZSBsb2NhbCBuYW1lIG90aGVyd2lzZQotICAgKiAKLSAgICogQHJldHVybiB0aGUgcHJlZml4IHBsdXMgdGhlIGxvY2FsIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MU3RyZWFtRXhjZXB0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9YTUxTdHJlYW1FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4MGRmMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9YTUxTdHJlYW1FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IHdlYmxvZ2ljLnV0aWxzLk5lc3RlZFRocm93YWJsZTsKLQotLyoqCi0gKiBUaGUgYmFzZSBleGNlcHRpb24gZm9yIHVuZXhwZWN0ZWQgaW5wdXQgZHVyaW5nIFhNTCBoYW5kbGluZwotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTFN0cmVhbUV4Y2VwdGlvbiAKLSAgZXh0ZW5kcyBJT0V4Y2VwdGlvbiAKLSAgaW1wbGVtZW50cyBOZXN0ZWRUaHJvd2FibGUgCi17Ci0gIHByb3RlY3RlZCBUaHJvd2FibGUgdGg7Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbigpIHt9Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7IAotICAgIHN1cGVyKG1zZyk7IAotICB9Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbihUaHJvd2FibGUgdGgpIHsKLSAgICB0aGlzLnRoID0gdGg7Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgWE1MU3RyZWFtRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0aCkgewotICAgIHN1cGVyKG1zZyk7Ci0gICAgdGhpcy50aCA9IHRoOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5lc3RlZCBleGNlcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gICAgICAgICAgICAgICAgIE5lc3RlZCBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0TmVzdGVkRXhjZXB0aW9uKCkgewotICAgIHJldHVybiBnZXROZXN0ZWQoKTsKLSAgfQotCi0gIC8vdHJ5IHRvIGRvIHNvbWV0aW5nIHVzZWZ1bAotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgU3RyaW5nIG1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQotICAgIGlmIChtc2cgPT0gbnVsbCAmJiB0aCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gdGguZ2V0TWVzc2FnZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbXNnOwotICAgIH0KLSAgfQotCi0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gTmVzdGVkVGhyb3dhYmxlIGltcGxlbWVudGF0aW9uLgotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXN0ZWQgVGhyb3dhYmxlLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBOZXN0ZWQgZXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgVGhyb3dhYmxlIGdldE5lc3RlZCgpIHsKLSAgICByZXR1cm4gdGg7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHN1cGVyVG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBwcykgewotICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShwcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBwdykgewotICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gIH0KLQotICAvLyBFbmQgTmVzdGVkVGhyb3dhYmxlIGltcGxlbWVudGF0aW9uLgotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFuZCBpdHMgbmVzdGVkIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gTmVzdGVkVGhyb3dhYmxlLlV0aWwudG9TdHJpbmcodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnRzIHRoZSBzdGFjayB0cmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24gYW5kCi0gICAqIGl0cyBuZXN0ZWQgZXhjZXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7IAotICAgIE5lc3RlZFRocm93YWJsZS5VdGlsLnByaW50U3RhY2tUcmFjZSh0aGlzLCBzKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICogaXRzIG5lc3RlZCBleGNlcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHcpIHsgCi0gICAgTmVzdGVkVGhyb3dhYmxlLlV0aWwucHJpbnRTdGFja1RyYWNlKHRoaXMsIHcpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uIGFuZAotICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLgotICAgKgotICAgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLSAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vZXZlbnRzL0VsZW1lbnRUeXBlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkNjBmOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbS5ldmVudHM7Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudFR5cGVOYW1lcyB7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoaW50IHZhbCkgeyAKLSAgICBzd2l0Y2godmFsKSB7Ci0gICAgY2FzZSBYTUxFdmVudC5YTUxfRVZFTlQ6IHJldHVybiAoIlhNTF9FVkVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfRUxFTUVOVDogcmV0dXJuICgiU1RBUlRfRUxFTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuRU5EX0VMRU1FTlQ6IHJldHVybiAoIkVORF9FTEVNRU5UIik7Ci0gICAgY2FzZSBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOiByZXR1cm4gKCJQUk9DRVNTSU5HX0lOU1RSVUNUSU9OIik7Ci0gICAgY2FzZSBYTUxFdmVudC5DSEFSQUNURVJfREFUQTogcmV0dXJuICgiQ0hBUkFDVEVSX0RBVEEiKTsKLSAgICBjYXNlIFhNTEV2ZW50LkNPTU1FTlQ6IHJldHVybiAoIkNPTU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlNQQUNFOiByZXR1cm4gKCJTUEFDRSIpOwotICAgIGNhc2UgWE1MRXZlbnQuTlVMTF9FTEVNRU5UOiByZXR1cm4gKCJOVUxMX0VMRU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UOiByZXR1cm4gKCJTVEFSVF9ET0NVTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuRU5EX0RPQ1VNRU5UOiByZXR1cm4gKCJFTkRfRE9DVU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HOiByZXR1cm4gKCJTVEFSVF9QUkVGSVhfTUFQUElORyIpOwotICAgIGNhc2UgWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HOiByZXR1cm4gKCJDSEFOR0VfUFJFRklYX01BUFBJTkciKTsKLSAgICBjYXNlIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORzogcmV0dXJuICgiRU5EX1BSRUZJWF9NQVBQSU5HIik7Ci0gICAgY2FzZSBYTUxFdmVudC5FTlRJVFlfUkVGRVJFTkNFOiByZXR1cm4gKCJFTlRJVFlfUkVGRVJFTkNFIik7Ci0gICAgZGVmYXVsdDogcmV0dXJuICIiOwotICAgIH0KLSAgfQotICBwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlKFN0cmluZyB2YWwpIHsKLSAgICBpZiAodmFsLmVxdWFscygiWE1MX0VWRU5UIikpIAotICAgICAgcmV0dXJuIFhNTEV2ZW50LlhNTF9FVkVOVDsKLSAgICBpZiAodmFsLmVxdWFscyAoIlNUQVJUX0VMRU1FTlQiKSkgcmV0dXJuIAotICAgICAgICBYTUxFdmVudC5TVEFSVF9FTEVNRU5UOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkVORF9FTEVNRU5UIikpIHJldHVybiBYTUxFdmVudC5FTkRfRUxFTUVOVDsKLSAgICBpZiAodmFsLmVxdWFscyAoIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkNIQVJBQ1RFUl9EQVRBIikpCi0gICAgICByZXR1cm4gWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEE7IAotICAgIGlmICh2YWwuZXF1YWxzICgiQ09NTUVOVCIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LkNPTU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiU1BBQ0UiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5TUEFDRTsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJOVUxMX0VMRU1FTlQiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5OVUxMX0VMRU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiU1RBUlRfRE9DVU1FTlQiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVDsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJFTkRfRE9DVU1FTlQiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5FTkRfRE9DVU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiU1RBUlRfUFJFRklYX01BUFBJTkciKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORzsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJDSEFOR0VfUFJFRklYX01BUFBJTkciKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkc7Ci0gICAgaWYgKHZhbC5lcXVhbHMgKCJFTlRJVFlfUkVGRVJFTkNFIikpCi0gICAgICByZXR1cm4gWE1MRXZlbnQuRU5USVRZX1JFRkVSRU5DRTsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJFTkRfUFJFRklYX01BUFBJTkciKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkc7Ci0KLSAgICByZXR1cm4gWE1MRXZlbnQuTlVMTF9FTEVNRU5UOwotICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJhMzZkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXhpcyIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBqYXZheC54bWwubmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIDxjb2RlPlFOYW1lPC9jb2RlPiBjbGFzcyByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiBhIHF1YWxpZmllZCBuYW1lCi0gKiBhcyBzcGVjaWZpZWQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIj5YTUwKLSAqIFNjaGVtYSBQYXJ0MjogRGF0YXR5cGVzIHNwZWNpZmljYXRpb248L2E+LgotICogPHA+Ci0gKiBUaGUgdmFsdWUgb2YgYSBRTmFtZSBjb250YWlucyBhIDxiPm5hbWVzcGFjZVVSSTwvYj4sIGEgPGI+bG9jYWxQYXJ0PC9iPiBhbmQgYSA8Yj5wcmVmaXg8L2I+LgotICogVGhlIGxvY2FsUGFydCBwcm92aWRlcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuIFRoZQotICogbmFtZXNwYWNlVVJJIGlzIGEgVVJJIHJlZmVyZW5jZSBpZGVudGlmeWluZyB0aGUgbmFtZXNwYWNlLgotICoKLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgUU5hbWUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIGNvbW1lbnQvc2hhcmVkIGVtcHR5IHN0cmluZyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlbXB0eVN0cmluZyA9ICIiLmludGVybigpOwotCi0gICAgLyoqIEZpZWxkIG5hbWVzcGFjZVVSSSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotICAgIC8qKiBGaWVsZCBsb2NhbFBhcnQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbFBhcnQ7Ci0KLSAgICAvKiogRmllbGQgcHJlZml4ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBRTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQgTG9jYWwgcGFydCBvZiB0aGUgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIGxvY2FsUGFydCkgewotICAgICAgICB0aGlzKGVtcHR5U3RyaW5nLCBsb2NhbFBhcnQsIGVtcHR5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0KSB7Ci0gICAgICAgIHRoaXMobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQsIGVtcHR5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgotICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IG9mIHRoZSBRTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IGVtcHR5U3RyaW5nCi0gICAgICAgICAgICAgICAgOiBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7Ci0gICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsb2NhbCBwYXJ0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBwcmVmaXgiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4LmludGVybigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgTmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBOYW1lc3BhY2UgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgTG9jYWwgcGFydCBmb3IgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBMb2NhbCBwYXJ0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgUHJlZml4IGZvciB0aGlzIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotICAgICAgICByZXR1cm4gKChuYW1lc3BhY2VVUkkgPT0gZW1wdHlTdHJpbmcpCi0gICAgICAgICAgICAgICAgPyBsb2NhbFBhcnQKLSAgICAgICAgICAgICAgICA6ICd7JyArIG5hbWVzcGFjZVVSSSArICd9JyArIGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhpcyBRTmFtZSBmb3IgZXF1YWxpdHkgd2l0aCBhbm90aGVyIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBhIFFOYW1lIG9yIGlzIG51bGwgdGhlbiB0aGlzIG1ldGhvZAotICAgICAqIHJldHVybnMgPHR0PmZhbHNlPC90dD4uCi0gICAgICogPHA+Ci0gICAgICogRm9yIHR3byBRTmFtZXMgdG8gYmUgY29uc2lkZXJlZCBlcXVhbCByZXF1aXJlcyB0aGF0IGJvdGgKLSAgICAgKiBsb2NhbFBhcnQgYW5kIG5hbWVzcGFjZVVSSSBtdXN0IGJlIGVxdWFsLiBUaGlzIG1ldGhvZCB1c2VzCi0gICAgICogPGNvZGU+U3RyaW5nLmVxdWFsczwvY29kZT4gdG8gY2hlY2sgZXF1YWxpdHkgb2YgbG9jYWxQYXJ0Ci0gICAgICogYW5kIG5hbWVzcGFjZVVSSS4gQW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBRTmFtZSBpcyByZXF1aXJlZAotICAgICAqIHRvIHNhdGlzZnkgdGhpcyBlcXVhbGl0eSBjb250cmFjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzYXRpc2ZpZXMgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlIDxjb2RlPk9iamVjdC5lcXVhbHM8L2NvZGU+IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgaWRlbnRpY2FsIHRvIHRoaXMKLSAgICAgKiAgICAgIFFOYW1lOiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0KLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFFOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgPT0gKChRTmFtZSkgb2JqKS5uYW1lc3BhY2VVUkkpCi0gICAgICAgICAgICAgICAgJiYgKGxvY2FsUGFydCA9PSAoKFFOYW1lKSBvYmopLmxvY2FsUGFydCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIG11c3QgYmUgaW4gdGhlIGZvcm0gcmV0dXJuZWQgYnkgdGhlIFFOYW1lLnRvU3RyaW5nKCkKLSAgICAgKiBtZXRob2QsIGkuZS4gIntuYW1lc3BhY2VVUkl9bG9jYWxQYXJ0Iiwgd2l0aCB0aGUgIntuYW1lc3BhY2VVUkl9IgotICAgICAqIHBhcnQgYmVpbmcgb3B0aW9uYWwuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lc24ndCBkbyBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIFFOYW1lLgotICAgICAqIEluIHBhcnRpY3VsYXIsIGl0IGRvZXNuJ3QgY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZSBVUkkKLSAgICAgKiBpcyBhIGxlZ2FsIFVSSSAocGVyIFJGQyAyMzk2IGFuZCBSRkMgMjczMiksIG5vciB0aGF0IHRoZSByZXN1bHRpbmcKLSAgICAgKiBsb2NhbCBwYXJ0IGlzIGEgbGVnYWwgTkNOYW1lIHBlciB0aGUgWE1MIE5hbWVzcGFjZXMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBRTmFtZQotICAgICAqIEByZXR1cm4gUU5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSB2YWx1ZU9mKFN0cmluZyBzKSB7Ci0KLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsaXRlcmFsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocy5jaGFyQXQoMCkgPT0gJ3snKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IHMuaW5kZXhPZignfScpOwotCi0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA9PSBzLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHMuc3Vic3RyaW5nKDEsIGkpLCBzLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgUU5hbWUgb2JqZWN0LiBUaGUgaGFzaCBjb2RlCi0gICAgICogaXMgYmFzZWQgb24gYm90aCB0aGUgbG9jYWxQYXJ0IGFuZCBuYW1lc3BhY2VVUkkgcGFydHMgb2YgdGhlCi0gICAgICogUU5hbWUuIFRoaXMgbWV0aG9kIHNhdGlzZmllcyB0aGUgIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlCi0gICAgICogPGNvZGU+T2JqZWN0Lmhhc2hDb2RlPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIFFuYW1lIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkuaGFzaENvZGUoKSBeIGxvY2FsUGFydC5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGRlc2VyaWFsaXphdGlvbiBwcm9wZXJseSBpbnRlcm5zIHRoZSByZXN1bHRzLgotICAgICAqIEBwYXJhbSBpbiB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gdG8gYmUgcmVhZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotICAgICAgICBuYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7Ci0gICAgICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYzBiMi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRmlsdGVyWG1sT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBIEZpbHRlclhtbE9iamVjdCBkZWxlZ2F0ZXMgdG8gc29tZSBvdGhlciBYbWxPYmplY3QsIHdoaWNoIGl0IGNhbiB1c2UgYXMKLSAqIGl0cyBiYXNpYyBzb3VyY2Ugb2YgZGF0YSwgcG9zc2libHkgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGFsb25nIHRoZSB3YXkgb3IKLSAqIHByb3ZpZGluZyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuIFRoZSBjbGFzcyBGaWx0ZXJYbWxPYmplY3QgaXRzZWxmCi0gKiBzaW1wbHkgb3ZlcnJpZGVzIGFsbCBtZXRob2RzIG9mIFhtbE9iamVjdCB3aXRoIHZlcnNpb25zIHRoYXQgcGFzcyBhbGwKLSAqIHJlcXVlc3RzIHRvIHRoZSB1bmRlcmx5aW5nIFhtbE9iamVjdC4gU3ViY2xhc3NlcyBvZiBGaWx0ZXJYbWxPYmplY3QgbWF5Ci0gKiBmdXJ0aGVyIG92ZXJyaWRlIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhbmQgbWF5IGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsCi0gKiBtZXRob2RzIGFuZCBmaWVsZHMuCi0gKiA8cD4KLSAqIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0aGF0IEZpbHRlclhtbE9CamVjdCBoYXMgbm8gc3RvcmFnZSAoaS5lLiwgbm8KLSAqIG5vbi10cmFuc2llbnQgZmllbGRzKSwgYmVjYXVzZSBzdWJjbGFzc2VzIG1heSBiZSBzZXJpYWxpemFibGUgYW5kCi0gKiBhZGRpbmcgc3RvcmFnZSB3b3VsZCBicmVhayB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuCi0gKi8gCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyWG1sT2JqZWN0IGltcGxlbWVudHMgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZQotewotICAgIC8qKgotICAgICAqIFRoaXMgYWJzdHJhY3QgbWV0aG9kIGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgWG1sT2JqZWN0LgotICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHN1cHBseSBvciBjb21wdXRlIHRoZSB3cmFwcGVkIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBFdmVyeSBvdGhlciBtZXRob2Qgb2YgdGhpcyBjbGFzcyBkZWxlZ2F0ZXMgdG8gdGhlIG9iamVjdCByZXR1cm5lZAotICAgICAqIGZyb20gdGhpcyBtZXRob2QuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgb2JqZWN0IGltcGxlbWVudHMgYWxsIHRoZQotICAgICAqIG1ldGhvZHMgb2YgYm90aCBYbWxPYmplY3QgYW5kIFNpbXBsZVZhbHVlLgotICAgICAqLyAKLSAgICBwdWJsaWMgYWJzdHJhY3QgWG1sT2JqZWN0IHVuZGVybHlpbmdYbWxPYmplY3QoKTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zY2hlbWFUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkudmFsaWRhdGUob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGgoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNlbGVjdFBhdGgocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGgoU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2VsZWN0UGF0aChwYXRoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5KFN0cmluZyBxdWVyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuZXhlY1F1ZXJ5KHF1ZXJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5KFN0cmluZyBxdWVyeSwgWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5leGVjUXVlcnkocXVlcnksIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIG5ld1R5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmNoYW5nZVR5cGUobmV3VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5pc05pbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbCgpCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2V0TmlsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5pc0ltbXV0YWJsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3Qgc2V0KFhtbE9iamVjdCBzcmNPYmopCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNldChzcmNPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY29weSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmNvcHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWx1ZUVxdWFscyhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWx1ZUVxdWFscyhvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdmFsdWVIYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnZhbHVlSGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb21wYXJlVG8ob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVWYWx1ZShYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb21wYXJlVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5tb25pdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5kb2N1bWVudFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvcigpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkueG1sVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdSZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3RG9tTm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZShjaCwgbGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKHcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld1hNTElucHV0U3RyZWFtKG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnhtbFRleHQob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3SW5wdXRTdHJlYW0ob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdSZWFkZXIob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0RvbU5vZGUob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUoY2gsIGxoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGZpbGUsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUob3MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZSh3LCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5pbnN0YW5jZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc3RyaW5nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5ieXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5sb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5iaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYnl0ZUFycmF5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5lbnVtVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmNhbGVuZGFyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBkYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5kYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdEYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ0R1cmF0aW9uVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnFOYW1lVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBsaXN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5saXN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkueGxpc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5vYmplY3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChib29sZWFuIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChieXRlIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoaW50IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChsb25nIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KGZsb2F0IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChkb3VibGUgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQodik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KGJ5dGVbXSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChDYWxlbmRhciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KERhdGUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoUU5hbWUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChMaXN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCb29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCeXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0SW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRMb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0RG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBnZXRFbnVtVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRFbnVtVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldENhbGVuZGFyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXREYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEdEYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFFOYW1lVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRMaXN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4Z2V0TGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkueGdldExpc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRPYmplY3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0U3RyaW5nVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJvb2xlYW5WYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJ5dGVWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0U2hvcnRWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRJbnRWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldExvbmdWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0QmlnSW50ZWdlclZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJpZ0RlY2ltYWxWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRGbG9hdFZhbHVlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlKGRvdWJsZSB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldERvdWJsZVZhbHVlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0Qnl0ZUFycmF5VmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtVmFsdWUoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0RW51bVZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0Q2FsZW5kYXJWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVWYWx1ZShEYXRlIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXREYXRlVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRHRGF0ZVZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R0R1cmF0aW9uVmFsdWUoR0R1cmF0aW9uIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRHRHVyYXRpb25WYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldFFOYW1lVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0TGlzdFZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRPYmplY3RWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdFNldChPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLm9iamVjdFNldChvYmopOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTBiY2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIFNjaGVtYS1jb21wYXRpYmxlIEdyZWdvcmlhbiBkYXRlLgotICogPHA+Ci0gKiBUaGVyZSBhcmUgbWFueSBkYXRlIHR5cGVzIGluIFhNTCBTY2hlbWEsIGFuZCB0aGlzIHR5cGUKLSAqIHJlcHJlc2VudHMgdGhlIG5hdHVyYWwgdW5pb24gb2YgYWxsIHRob3NlIHR5cGVzLiAgQSBHRGF0ZQotICogY2FuIGhvbGQgYW55IHN1YnNldCBvZiBkYXRlIGZpZWxkcyAoWWVhciwgTW9udGgsIERheSwgVGltZSwKLSAqIFRpbWV6b25lLCBvciBzb21lIGNvbWJpbmF0aW9uKS4gV2hlcmV2ZXIgdGhlIHNwZWNpZmljYXRpb24KLSAqIHByb3ZpZGVzIGd1aWRhbmNlLCB0aGUgZ3VpZGVsaW5lcyBpbiB0aGUKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8iPlhNTCBTY2hlbWEgMS4wIHNwZWNpZmljYXRpb248L2E+Ci0gKiAocGx1cyA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNS94bWxzY2hlbWEtZXJyYXRhIj5wdWJsaXNoZWQgZXJyYXRhPC9hPikgYXJlIGZvbGxvd2VkLgotICogPHA+Ci0gKiBJbnN0YW5jZXMgbWF5IHNlcGFyYXRlbHkgaGF2ZSB2YWx1ZXMgb3Igbm8gdmFsdWVzIGZvcgotICogdGhlIHllYXIsIG1vbnRoLCBkYXktb2YtbW9udGgsIGFuZCB0aW1lLW9mLWRheS4gTm90IGFsbAotICogb3BlcmF0aW9ucyBhcmUgbWVhbmluZ2Z1bCBvbiBhbGwgY29tYmluYXRpb25zLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR0RhdGUgaW1wbGVtZW50cyBHRGF0ZVNwZWNpZmljYXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLy8gZm9yIGZhc3QgZXF1YWxpdHkgY29tcGFyaXNvbiwgaGFzaGluZywgYW5kIHNlcmlhbGl6YXRpb24KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgX2Nhbm9uaWNhbFN0cmluZzsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgX3N0cmluZzsKLQotICAgIHByaXZhdGUgaW50IF9iaXRzOwotICAgIHByaXZhdGUgaW50IF9DWTsKLSAgICBwcml2YXRlIGludCBfTTsKLSAgICBwcml2YXRlIGludCBfRDsKLSAgICBwcml2YXRlIGludCBfaDsKLSAgICBwcml2YXRlIGludCBfbTsKLSAgICBwcml2YXRlIGludCBfczsKLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2ZzOwotICAgIHByaXZhdGUgaW50IF90enNpZ247Ci0gICAgcHJpdmF0ZSBpbnQgX3R6aDsKLSAgICBwcml2YXRlIGludCBfdHptOwotICAgIAotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgX3plcm8gPSBCaWdEZWNpbWFsLnZhbHVlT2YoMCk7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBfb25lID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGEgbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoQ2hhclNlcXVlbmNlIHN0cmluZykKLSAgICB7Ci0gICAgICAgIC8vIGZpcnN0IHRyaW0gWE1MIHdoaXRlc3BhY2UKLSAgICAgICAgaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgaXNTcGFjZShzdHJpbmcuY2hhckF0KGxlbiAtIDEpKSkKLSAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICB3aGlsZSAoc3RhcnQgPCBsZW4gJiYgaXNTcGFjZShzdHJpbmcuY2hhckF0KHN0YXJ0KSkpCi0gICAgICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgIC8vIHBpY2sgb3B0aW9uYWwgdGltZXpvbmUgb2ZmIHRoZSBlbmQKLSAgICAgICAgaWYgKGxlbiAtIHN0YXJ0ID49IDEgJiYgc3RyaW5nLmNoYXJBdChsZW4gLSAxKSA9PSAnWicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKLSAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGxlbiAtIHN0YXJ0ID49IDYpCi0gICAgICAgIHRpbWV6b25lOiB7Ci0gICAgICAgICAgICBpbnQgdHpzaWduOwotICAgICAgICAgICAgaW50IHR6aG91cjsKLSAgICAgICAgICAgIGludCB0em1pbnV0ZTsKLQotICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQobGVuIC0gMykgIT0gJzonKQotICAgICAgICAgICAgICAgIGJyZWFrIHRpbWV6b25lOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZy5jaGFyQXQobGVuIC0gNikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICAgICAgICAgIHR6c2lnbiA9IC0xOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcrJzoKLSAgICAgICAgICAgICAgICAgICAgdHpzaWduID0gMTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgdGltZXpvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHR6aG91ciA9IHR3b0RpZ2l0KHN0cmluZywgbGVuIC0gNSk7Ci0gICAgICAgICAgICB0em1pbnV0ZSA9IHR3b0RpZ2l0KHN0cmluZywgbGVuIC0gMik7Ci0gICAgICAgICAgICBpZiAodHpob3VyID4gMTQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIGhvdXIgbXVzdCBiZSB0d28gZGlnaXRzIGJldHdlZW4gLTE0IGFuZCArMTQiKTsKLSAgICAgICAgICAgIGlmICh0em1pbnV0ZSA+IDU5KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBtaW51dGUgbXVzdCBiZSB0d28gZGlnaXRzIGJldHdlZW4gMDAgYW5kIDU5Iik7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRVpPTkU7Ci0gICAgICAgICAgICBfdHpzaWduID0gdHpzaWduOwotICAgICAgICAgICAgX3R6aCA9IHR6aG91cjsKLSAgICAgICAgICAgIF90em0gPSB0em1pbnV0ZTsKLSAgICAgICAgICAgIGxlbiAtPSA2OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGljayBkYXRlIGZpZWxkcyBvZmYgdGhlIGJlZ2lubmluZyBpZiBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHRpbWUKLSAgICAgICAgaWYgKHN0YXJ0IDwgbGVuICYmIChzdGFydCArIDIgPj0gbGVuIHx8IHN0cmluZy5jaGFyQXQoc3RhcnQgKyAyKSAhPSAnOicpKQotICAgICAgICBzY2FuZGF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gcGFyc2UgeWVhciBzaWduCi0gICAgICAgICAgICBib29sZWFuIG5lZ3llYXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzdGFydCA8IGxlbiAmJiBzdHJpbmcuY2hhckF0KHN0YXJ0KSA9PSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmVneWVhciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2NhbiB5ZWFyIGRpZ2l0cwotICAgICAgICAgICAgaW50IHZhbHVlID0gMDsKLSAgICAgICAgICAgIGludCBkaWdpdHMgPSAtc3RhcnQ7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaCA9IHN0YXJ0IDwgbGVuID8gc3RyaW5nLmNoYXJBdChzdGFydCkgOiAnXDAnOwotICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdChjaCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIGRpZ2l0VmFsKGNoKTsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlnaXRzICs9IHN0YXJ0OwotICAgICAgICAgICAgaWYgKGRpZ2l0cyA+IDYpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieWVhciB0b28gbG9uZyAodXAgdG8gNiBkaWdpdHMpIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChkaWdpdHMgPj0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKLSAgICAgICAgICAgICAgICBfQ1kgPSAgbmVneWVhciA/IC12YWx1ZSA6IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZGlnaXRzID4gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5ZWFyIG11c3QgYmUgZm91ciBkaWdpdHMgKG1heSBwYWQgd2l0aCB6ZXJvZXMsIGUuZy4sIDA1NjApIik7Ci0KLSAgICAgICAgICAgIC8vIGh5cGhlbiBpbnRyb2R1Y2VzIGEgbW9udGgKLSAgICAgICAgICAgIGlmIChjaCAhPSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZ3llYXIgJiYgIWhhc1llYXIoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBhIHNpbmdsZSBtaW51cwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbmRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgICAgICAvLyB0d28tZGlnaXQgbW9udGgKLSAgICAgICAgICAgIGlmIChsZW4gLSBzdGFydCA+PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdHdvRGlnaXQoc3RyaW5nLCBzdGFydCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7Ci0gICAgICAgICAgICAgICAgICAgIF9NID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoeXBoZW4gaW50cm9kdWNlcyBhIGRheQotICAgICAgICAgICAgY2ggPSBzdGFydCA8IGxlbiA/IHN0cmluZy5jaGFyQXQoc3RhcnQpIDogJ1wwJzsKLSAgICAgICAgICAgIGlmIChjaCAhPSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNNb250aCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIG1pbnVzIGFmdGVyIGEgeWVhcgotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbmRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgICAgICAvLyB0d28tZGlnaXQgZGF5Ci0gICAgICAgICAgICBpZiAobGVuIC0gc3RhcnQgPj0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDMxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsKLSAgICAgICAgICAgICAgICAgICAgX0QgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaGFzRGF5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZXJyb3IgaW4gdGhlIG9yaWdpbmFsIHNjaGVtYSBzcGVjIHBlcm1pdHMgYW4gZXh0cmEgJy0nIGhlcmUKLSAgICAgICAgICAgICAgICBpZiAoaGFzTW9udGgoKSAmJiAhaGFzWWVhcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSBzdGFydCA8IGxlbiA/IHN0cmluZy5jaGFyQXQoc3RhcnQpIDogJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICctJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW5kYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gbWludXMgYWZ0ZXIgYSBtb250aAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGltZQotICAgICAgICBpZiAoc3RhcnQgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoYXNZZWFyKCkgfHwgaGFzTW9udGgoKSB8fCBoYXNEYXkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmNoYXJBdChzdGFydCkgIT0gJ1QnKQotICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGUgYW5kIHRpbWUgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgJ1QnIik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxlbiA8IHN0YXJ0ICsgOCB8fCBzdHJpbmcuY2hhckF0KHN0YXJ0ICsgMikgIT0gJzonIHx8IHN0cmluZy5jaGFyQXQoc3RhcnQgKyA1KSAhPSAnOicpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBpbnQgaCA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGggPj0gMjQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaG91ciBtdXN0IGJlIGJldHdlZW4gMDAgYW5kIDIzIik7Ci0gICAgICAgICAgICBpbnQgbSA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQgKyAzKTsKLSAgICAgICAgICAgIGlmIChtID49IDYwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbnV0ZSBtdXN0IGJlIGJldHdlZW4gMDAgYW5kIDU5Iik7Ci0gICAgICAgICAgICBpbnQgcyA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQgKyA2KTsKLSAgICAgICAgICAgIGlmIChzID49IDYwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlY29uZCBtdXN0IGJlIGJldHdlZW4gMDAgYW5kIDU5Iik7Ci0KLSAgICAgICAgICAgIHN0YXJ0ICs9IDg7Ci0KLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBfemVybzsKLSAgICAgICAgICAgIGlmIChzdGFydCA8IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmNoYXJBdChzdGFydCkgIT0gJy4nKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICsgMSA8IGxlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0RpZ2l0KHN0cmluZy5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnMgPSBuZXcgQmlnRGVjaW1hbChzdHJpbmcuc3ViU2VxdWVuY2Uoc3RhcnQsIGxlbikudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FOwotICAgICAgICAgICAgX2ggPSBoOwotICAgICAgICAgICAgX20gPSBtOwotICAgICAgICAgICAgX3MgPSBzOwotICAgICAgICAgICAgX2ZzID0gZnM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZGF0ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwgbW9udGgsIGRheSwKLSAgICAgKiBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kcywgaW4KLSAgICAgKiBhbiB1bnNwZWNpZmllZCB0aW1lem9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgYnkgbm90IHNwZWNpZnlpbmcgdGhlIHRpbWV6b25lIHRoZSBHRGF0ZQotICAgICAqIGJlY29tZXMgcGFydGlhbGx5IHVub3JkZXJlZCB3aXRoIHJlc3BlY3QgdG8gdGltZXMgdGhhdAotICAgICAqIGRvIGhhdmUgYSBzcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IF96ZXJvIDogZnJhY3Rpb247Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBhYnNvbHV0ZSBHRGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwKLSAgICAgKiBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsIGZyYWN0aW9uYWwKLSAgICAgKiBzZWNvbmRzLCBhbmQgaW4gdGhlIHRpbWV6b25lIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGEgdGltZSBvciBkYXRlIHRoYXQgaXNuJ3QgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUsCi0gICAgICogdGhlbiB1c2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdGltZXpvbmUgYXJndW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSgKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uLAotICAgICAgICAgICAgaW50IHR6U2lnbiwKLSAgICAgICAgICAgIGludCB0ekhvdXIsCi0gICAgICAgICAgICBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19USU1FWk9ORSB8IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IF96ZXJvIDogZnJhY3Rpb247Ci0gICAgICAgIF90enNpZ24gPSB0elNpZ247Ci0gICAgICAgIF90emggPSB0ekhvdXI7Ci0gICAgICAgIF90em0gPSB0ek1pbnV0ZTsKLQotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGUgYmFzZWQgb24gYSBqYXZhLnV0aWwuRGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIGRlZmF1bHQgdGltZXpvbmUgaXMgdXNlZCBhcyB0aGUgdGltZXpvbmUuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIGlmIGVhc3Rlcm4gZGF5bGlnaHQgdGltZSBpcyBpbiBlZmZlY3QgYXQgdGhlIGdpdmVuCi0gICAgICogZGF0ZSwgdGhlIHRpbWV6b25lIG9uIHRoZSBlYXN0IGNvYXN0IG9mIHRoZSB1bml0ZWQgc3RhdGVzCi0gICAgICogdHJhbnNsYXRlcyB0byBHTVQtMDU6MDAgKEVTVCkgKyAxOjAwIChEVCBvZmZzZXQpID09IEdNVC0wNDowMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgLy8gcmVxdWlyZXMgc29tZSBkYXRlIG1hdGgsIHNvIGN0b3IgbGl2ZXMgb24gR0RhdGVCdWlsZGVyCi0gICAgICAgIHRoaXMobmV3IEdEYXRlQnVpbGRlcihkYXRlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGEgamF2YS51dGlsLkNhbGVuZGFyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjYWxlbmRhciBkb2VzIG5vdCBoYXZlIHNvbWUgZmllbGRzIHNldCwgdGhlIHNhbWUgYWJzZW5jZQotICAgICAqIG9mIGluZm9ybWF0aW9uIGlzIHJlZmxlY3RlZCBpbiB0aGUgR0RhdGUuICBOb3RlIHRoYXQKLSAgICAgKiBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIgZmlsbHMgaW4gYWxsIGZpZWxkcyBhcyBzb29uIGFzIGFueQotICAgICAqIGFyZSBmZXRjaGVkLCBzbyBjb25zdHJ1Y3RpbmcgYSBHRGF0ZSB3aXRoIHRoZSBzYW1lIGNhbGVuZGFyIG9iamVjdAotICAgICAqIHR3aWNlIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgR0RhdGUgYmVjYXVzZSBvZiBhIGNoYW5nZWQgY2FsZW5kYXIuCi0gICAgICogTm90ZSB0aGF0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ2FsZW5kYXIgaXMgc3RhYmxlIGlmIHlvdSByZS1nZXQgYSBzZXQgZmllbGQsCi0gICAgICogc28gaXQgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZShDYWxlbmRhciBjYWxlbmRhcikKLSAgICB7Ci0gICAgICAgIC8vIHdlIG11c3Qgc2NyYXBlIHRoZSAiaXNTZXQiIGluZm9ybWF0aW9uIG91dCBiZWZvcmUgYWNjZXNzaW5nIGFueXRoaW5nCi0gICAgICAgIGJvb2xlYW4gaXNTZXRZZWFyID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuWUVBUik7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXRFcmEgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5FUkEpOwotICAgICAgICBib29sZWFuIGlzU2V0TW9udGggPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXREYXkgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOwotICAgICAgICBib29sZWFuIGlzU2V0SG91ck9mRGF5ID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOwotICAgICAgICBib29sZWFuIGlzU2V0SG91ciA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkhPVVIpOwotICAgICAgICBib29sZWFuIGlzU2V0QW1QbSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkFNX1BNKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldE1pbnV0ZSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLk1JTlVURSk7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXRTZWNvbmQgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5TRUNPTkQpOwotICAgICAgICBib29sZWFuIGlzU2V0TWlsbGlzID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpOwotICAgICAgICBib29sZWFuIGlzU2V0Wm9uZSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldERzdCA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpOwotCi0gICAgICAgIGlmIChpc1NldFllYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB5ID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICAgICAgaWYgKGlzU2V0RXJhICYmIGNhbGVuZGFyIGluc3RhbmNlb2YgR3JlZ29yaWFuQ2FsZW5kYXIpCi0gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5FUkEpID09IEdyZWdvcmlhbkNhbGVuZGFyLkJDKQotICAgICAgICAgICAgICAgICAgICB5ID0gMSAtIHk7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKLSAgICAgICAgICAgIF9DWSA9IHk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzU2V0TW9udGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19NT05USDsKLSAgICAgICAgICAgIF9NID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDE7IC8vICEhbm90ZQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1NldERheSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsKLSAgICAgICAgICAgIF9EID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBnb3RUaW1lID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IGggPSAwOwotICAgICAgICBpbnQgbSA9IDA7Ci0gICAgICAgIGludCBzID0gMDsKLSAgICAgICAgQmlnRGVjaW1hbCBmcyA9IF96ZXJvOwotCi0gICAgICAgIGlmIChpc1NldEhvdXJPZkRheSkKLSAgICAgICAgewotICAgICAgICAgICAgaCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1NldEhvdXIgJiYgaXNTZXRBbVBtKQotICAgICAgICB7Ci0gICAgICAgICAgICBoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVIpICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKSAqIDEyOwotICAgICAgICAgICAgZ290VGltZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTZXRNaW51dGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG0gPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKLSAgICAgICAgICAgIGdvdFRpbWUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU2V0U2Vjb25kKQotICAgICAgICB7Ci0gICAgICAgICAgICBzID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlNFQ09ORCk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NldE1pbGxpcykKLSAgICAgICAgewotICAgICAgICAgICAgZnMgPSBCaWdEZWNpbWFsLnZhbHVlT2YoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSwgMyk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnb3RUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgICAgIF9oID0gaDsKLSAgICAgICAgICAgIF9tID0gbTsKLSAgICAgICAgICAgIF9zID0gczsKLSAgICAgICAgICAgIF9mcyA9IGZzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU2V0Wm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCk7Ci0gICAgICAgICAgICBpZiAoaXNTZXREc3QpCi0gICAgICAgICAgICAgICAgem9uZU9mZnNldEluTWlsbGlzZWNvbmRzICs9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKLQotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOwotICAgICAgICAgICAgaWYgKHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90enNpZ24gPSAwOwotICAgICAgICAgICAgICAgIF90emggPSAwOwotICAgICAgICAgICAgICAgIF90em0gPSAwOwotICAgICAgICAgICAgICAgIFRpbWVab25lIHpvbmUgPSBjYWxlbmRhci5nZXRUaW1lWm9uZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IHpvbmUuZ2V0SUQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDMpIHN3aXRjaCAoaWQuY2hhckF0KDMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6IF90enNpZ24gPSAxOyBicmVhazsgICAvLyBHTVQrMDA6MDAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6IF90enNpZ24gPSAtMTsgYnJlYWs7ICAvLyBHTVQtMDA6MDAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3R6c2lnbiA9ICh6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPCAwID8gLTEgOiArMSk7Ci0gICAgICAgICAgICAgICAgem9uZU9mZnNldEluTWlsbGlzZWNvbmRzID0gem9uZU9mZnNldEluTWlsbGlzZWNvbmRzICogX3R6c2lnbjsKLSAgICAgICAgICAgICAgICBfdHpoID0gem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIC8gMzYwMDAwMDsKLSAgICAgICAgICAgICAgICBfdHptID0gKHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyAtIF90emggKiAzNjAwMDAwKSAvIDYwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGFub3RoZXIgR0RhdGVTcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZ2RhdGUpCi0gICAgewotICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOwotICAgICAgICAgICAgX3R6c2lnbiA9IGdkYXRlLmdldFRpbWVab25lU2lnbigpOwotICAgICAgICAgICAgX3R6aCA9IGdkYXRlLmdldFRpbWVab25lSG91cigpOwotICAgICAgICAgICAgX3R6bSA9IGdkYXRlLmdldFRpbWVab25lTWludXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgICAgIF9oID0gZ2RhdGUuZ2V0SG91cigpOwotICAgICAgICAgICAgX20gPSBnZGF0ZS5nZXRNaW51dGUoKTsKLSAgICAgICAgICAgIF9zID0gZ2RhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgICAgICBfZnMgPSBnZGF0ZS5nZXRGcmFjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc0RheSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfREFZOwotICAgICAgICAgICAgX0QgPSBnZGF0ZS5nZXREYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNNb250aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7Ci0gICAgICAgICAgICBfTSA9IGdkYXRlLmdldE1vbnRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2RhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKLSAgICAgICAgICAgIF9DWSA9IGdkYXRlLmdldFllYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEaWdpdChjaGFyIGNoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoY2hhcikoY2ggLSAnMCcpIDw9ICc5JyAtICcwJyk7IC8vIGNoYXIgaXMgdW5zaWduZWQKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgZGlnaXRWYWwoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY2ggLSAnMCcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0d29EaWdpdChDaGFyU2VxdWVuY2Ugc3RyLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBjaGFyIGNoMSA9IHN0ci5jaGFyQXQoaW5kZXgpOwotICAgICAgICBjaGFyIGNoMiA9IHN0ci5jaGFyQXQoaW5kZXggKyAxKTsKLSAgICAgICAgaWYgKCFpc0RpZ2l0KGNoMSkgfHwgIWlzRGlnaXQoY2gyKSkKLSAgICAgICAgICAgIHJldHVybiAxMDA7IC8vIG5vdCB0d28gZGlnaXRzCi0gICAgICAgIHJldHVybiBkaWdpdFZhbChjaDEpICogMTAgKyBkaWdpdFZhbChjaDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZTogYWxsIEdEYXRlIGluc3RhbmNlcyBhcmUgaW1tdXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb21iaW5hdGlvbiBvZiBmbGFncyBpbmRpY2F0aW5nIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIGNvbnRhaW5lZCBieSB0aGlzIEdEYXRlLiAgVGhlIGZpdmUgZmxhZ3MgYXJlCi0gICAgICogSEFTX1RJTUVaT05FLCBIQVNfWUVBUiwgSEFTX01PTlRILCBIQVNfREFZLCBhbmQgSEFTX1RJTUUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRGbGFncygpCi0gICAgewotICAgICAgICByZXR1cm4gX2JpdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWV6b25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1RpbWVab25lKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FWk9ORSkgIT0gMCk7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB5ZWFyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1llYXIoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1lFQVIpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgbW9udGgtb2YteWVhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb250aCgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfTU9OVEgpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgZGF5LW9mLW1vbnRoLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RheSgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfREFZKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWUtb2YtZGF5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1RpbWUoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1RJTUUpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgZnVsbCBkYXRlICh5ZWFyLCBtb250aCwgZGF5KQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RhdGUoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgKEhBU19EQVkgfCBIQVNfTU9OVEggfCBIQVNfWUVBUikpID09IChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgeWVhci4gU2hvdWxkIGJlIGEgZm91ci1kaWdpdCB5ZWFyIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gX0NZOyAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhci4gSmFudWFyeSBpcyAxLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TW9udGgoKQotICAgICAgICB7IHJldHVybiBfTTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aC4gVGhlIGZpcnN0IGRheSBvZiBlYWNoIG1vbnRoIGlzIDEuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXREYXkoKQotICAgICAgICB7IHJldHVybiBfRDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkuIE1pZG5pZ2h0IGlzIDAsIGFuZCAxMVBNIGlzIDIzLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SG91cigpCi0gICAgICAgIHsgcmV0dXJuIF9oOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ci4gUmFuZ2UgZnJvbSAwIHRvIDU5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFNlY29uZCgpCi0gICAgICAgIHsgcmV0dXJuIF9zOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX2ZzOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgc2lnbi4gRm9yIHRpbWUgem9uZXMgZWFzdCBvZiBHTVQsCi0gICAgICogdGhpcyBpcyBwb3NpdGl2ZTsgZm9yIHRpbWUgem9uZXMgd2VzdCwgdGhpcyBpcyBuZWdhdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lU2lnbigpCi0gICAgICAgIHsgcmV0dXJuIF90enNpZ247IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBob3VyLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVIb3VyKCkKLSAgICAgICAgeyByZXR1cm4gX3R6aDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIG1pbnV0ZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGFsd2F5cyBwb3NpdGl2ZTogZm9yIHRoZSBzaWduLCBsb29rIGF0Ci0gICAgICogZ2V0VGltZVpvbmVTaWduKCkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZU1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF90em07IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdW5kZWQgbWlsbGlzZWNvbmQgdmFsdWUuIFJhbmdlIGZyb20gMCB0byA5OTkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbGxpc2Vjb25kKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gX2ZzLnNldFNjYWxlKDMsIEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9VUCkudW5zY2FsZWRWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFNwZWNpZmljIG1vbWVudHMgb3IKLSAgICAgKiB0aW1lcy1vZi1kYXkgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUgYXJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgKiBVVEMgdGltZSB0byBwcm9kdWNlIGEgY2Fub25pY2FsIHN0cmluZyBmb3JtIGZvciB0aGVtLgotICAgICAqIE90aGVyIHJlY3VycmluZyB0aW1lIHNwZWNpZmljYXRpb25zIGtlZXAgdGhlaXIgdGltZXpvbmUKLSAgICAgKiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNhbm9uaWNhbFN0cmluZygpCi0gICAgewotICAgICAgICBlbnN1cmVDYW5vbmljYWxTdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIF9jYW5vbmljYWxTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIEdEYXRlIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgZ3JlZ29yaWFuIGRhdGUgdmFsdWUKLSAgICAgKiBpbiBYTUwgc2NoZW1hLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5pc1ZhbGlkR0RhdGUodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSnVsaWFuIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIEdyZWdvcmlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SnVsaWFuRGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gR0RhdGVCdWlsZGVyLmp1bGlhbkRhdGVGb3JHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYW4ge0BsaW5rIFhtbENhbGVuZGFyfS4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcn0KLSAgICAgKiB3aGljaCBpcyBzbGlnaHRseSBjdXN0b21pemVkIHRvIG1hdGNoIFhNTCBzY2hlbWEgZGF0ZSBydWxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFhtbENhbGVuZGFyfSBoYXMgb25seSB0aG9zZSB0aW1lIGFuZCBkYXRlIGZpZWxkcwotICAgICAqIHNldCB0aGF0IGFyZSByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlIG9iamVjdC4gIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKLSAgICAgKiB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb250cmFjdCB3b3JrcywgYW55IGluZm9ybWF0aW9uIGluIHRoZSBpc1NldCgpIHZhbmlzaGVzCi0gICAgICogYXMgc29vbiBhcyB5b3UgdmlldyBhbnkgdW5zZXQgZmllbGQgdXNpbmcgZ2V0KCkgbWV0aG9kcy4KLSAgICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hpY2ggZGF0ZSBmaWVsZHMKLSAgICAgKiBhcmUgc2V0LCB5b3UgbXVzdCBjYWxsIGlzU2V0KCkgZmlyc3QgYmVmb3JlIGdldCgpLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxDYWxlbmRhciBnZXRDYWxlbmRhcigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFhtbENhbGVuZGFyKHRoaXMpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGEgamF2YS51dGlsLkRhdGUKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuZGF0ZUZvckdEYXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmlzb24gdG8gYW5vdGhlciBHRGF0ZS4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKLSAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQotICAgICAqIDwvdWw+Ci0gICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cwotICAgICAqIG9mIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGVzcGVjKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5jb21wYXJlR0RhdGUodGhpcywgZGF0ZXNwZWMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ1aWx0aW4gdHlwZSBjb2RlIGZvciB0aGUgc2hhcGUgb2YgdGhlIGluZm9ybWF0aW9uCi0gICAgICogY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UsIG9yIDAgaWYgdGhlCi0gICAgICogaW5zdGFuY2UgZG9lc24ndCBjb250YWluIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYQotICAgICAqIFNjaGVtYSB0eXBlLgotICAgICAqIDxwPiAKLSAgICAgKiBWYWx1ZSB3aWxsIGJlIGVxdWFsIHRvCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX05PVF9CVUlMVElOfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEhfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURV9USU1FfSwgb3IKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfVElNRX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRCdWlsdGluVHlwZUNvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5idGNGb3JGbGFncyhfYml0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGR1cmF0aW9uIHRvIHRoaXMgR0RhdGUsIGFuZCByZXR1cm5zIGEgbmV3IEdEYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSBhZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIEdEYXRlQnVpbGRlciBidWlsZGVyID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKLSAgICAgICAgYnVpbGRlci5hZGRHRHVyYXRpb24oZHVyYXRpb24pOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b0dEYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGR1cmF0aW9uIHRvIHRoaXMgR0RhdGUsIGFuZCByZXR1cm5zIGEgbmV3IEdEYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSBzdWJ0cmFjdChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgR0RhdGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgICAgICBidWlsZGVyLnN1YnRyYWN0R0R1cmF0aW9uKGR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9HRGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdEYXRlIGlzIGFuIGltbXV0YWJsZSBjbGFzcywgYW5kIGVxdWFsaXR5IGlzIGNvbXB1dGVkIGJhc2VkCi0gICAgICogb24gaXRzIGNhbm9uaWNhbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBHRGF0ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBfY2Fub25pY2FsU3RyaW5nLmVxdWFscygoKEdEYXRlKW9iaikuY2Fub25pY2FsU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIHRoaXMgR0RhdGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICBlbnN1cmVDYW5vbmljYWxTdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIF9jYW5vbmljYWxTdHJpbmcuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gU3BlY2lmaWMgbW9tZW50cyBvcgotICAgICAqIHRpbWVzLW9mLWRheSBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSBhcmUgbm9ybWFsaXplZCB0bwotICAgICAqIFVUQyB0aW1lIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgc3RyaW5nIGZvcm0gZm9yIHRoZW0uCi0gICAgICogT3RoZXIgcmVjdXJyaW5nIHRpbWUgc3BlY2lmaWNhdGlvbnMga2VlcCB0aGVpciB0aW1lem9uZQotICAgICAqIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVDYW5vbmljYWxTdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9jYW5vbmljYWxTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBib29sZWFuIG5lZWROb3JtYWxpemUgPQotICAgICAgICAgICAgKGhhc1RpbWVab25lKCkgJiYgZ2V0VGltZVpvbmVTaWduKCkgIT0gMCAmJiBoYXNUaW1lKCkgJiYKLSAgICAgICAgICAgICgoaGFzRGF5KCkgPT0gaGFzTW9udGgoKSAmJiBoYXNEYXkoKSA9PSBoYXNZZWFyKCkpKSk7Ci0KLSAgICAgICAgaWYgKCFuZWVkTm9ybWFsaXplICYmIGdldEZyYWN0aW9uKCkgIT0gbnVsbCAmJiBnZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGJpID0gZ2V0RnJhY3Rpb24oKS51bnNjYWxlZFZhbHVlKCk7Ci0gICAgICAgICAgICBuZWVkTm9ybWFsaXplID0gKGJpLm1vZChHRGF0ZUJ1aWxkZXIuVEVOKS5zaWdudW0oKSA9PSAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSkKLSAgICAgICAgICAgIF9jYW5vbmljYWxTdHJpbmcgPSB0b1N0cmluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdEYXRlQnVpbGRlciBnZGIgPSBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgX2Nhbm9uaWNhbFN0cmluZyA9IGdkYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hdHVyYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBUaGlzIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBhdmFpbGFibGUsIGluY2x1ZGluZyB0aW1lem9uZS4gRm9yIHR5cGVzIHRoYXQgY29ycmVzcG9uZAotICAgICAqIHRvIGRlZmluZWQgc2NoZW1hIHR5cGVzIChzY2hlbWFCdWlsdGluVHlwZUNvZGUoKSA+IDApLAotICAgICAqIHRoaXMgcHJvdmlkZXMgdGhlIG5hdHVyYWwgbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGJvdGggdGltZSBhbmQgdGltZXpvbmUgYXJlIHNwZWNpZmllZCwgdGhpcyBzdHJpbmcgaXMgbm90Ci0gICAgICogdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgdGhlIHRpbWV6b25lIGlzIFVUQyAoWikKLSAgICAgKiAoc2luY2UgdGhlIHNhbWUgbW9tZW50IGluIHRpbWUgY2FuIGJlIGV4cHJlc3NlZCBpbiBkaWZmZXJlbnQKLSAgICAgKiB0aW1lem9uZXMpLiBUbyBnZXQgYSBjYW5vbmljYWwgc3RyaW5nLCB1c2UgdGhlIGNhbm9uaWNhbFN0cmluZygpCi0gICAgICogbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9zdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIF9zdHJpbmcgPSBmb3JtYXRHRGF0ZSh0aGlzKTsKLSAgICAgICAgcmV0dXJuIF9zdHJpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIF90ZW5zRGlnaXQgPQotICAgIHsKLSAgICAgICAgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLAotICAgICAgICAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLCAnMScsCi0gICAgICAgICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsICcyJywKLSAgICAgICAgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywgJzMnLAotICAgICAgICAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsCi0gICAgICAgICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsICc1JywKLSAgICAgICAgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywgJzYnLAotICAgICAgICAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLCAnNycsCi0gICAgICAgICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsICc4JywKLSAgICAgICAgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywgJzknLAotICAgIH07Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIF9vbmVzRGlnaXQgPQotICAgIHsKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX3BhZFR3b0FwcGVuZChjaGFyW10gYiwgaW50IGksIGludCBuKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KG4gPj0gMCAmJiBuIDwgMTAwKTsKLSAgICAgICAgYltpXSA9IF90ZW5zRGlnaXRbbl07Ci0gICAgICAgIGJbaSArIDFdID0gX29uZXNEaWdpdFtuXTsKLSAgICAgICAgcmV0dXJuIGkgKyAyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfcGFkRm91ckFwcGVuZChjaGFyW10gYiwgaW50IGksIGludCBuKQotICAgIHsKLSAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBiW2krK10gPSAnLSc7Ci0gICAgICAgICAgICBuID0gLW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG4gPj0gMTAwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gSW50ZWdlci50b1N0cmluZyhuKTsKLSAgICAgICAgICAgIHMuZ2V0Q2hhcnMoMCwgcy5sZW5ndGgoKSwgYiwgaSk7Ci0gICAgICAgICAgICByZXR1cm4gaSArIHMubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHEgPSBuIC8gMTAwOwotICAgICAgICBpbnQgciA9IG4gLSBxICogMTAwOwotICAgICAgICBiW2ldID0gX3RlbnNEaWdpdFtxXTsKLSAgICAgICAgYltpICsgMV0gPSBfb25lc0RpZ2l0W3FdOwotICAgICAgICBiW2kgKyAyXSA9IF90ZW5zRGlnaXRbcl07Ci0gICAgICAgIGJbaSArIDNdID0gX29uZXNEaWdpdFtyXTsKLSAgICAgICAgcmV0dXJuIGkgKyA0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSBHTVRaT05FID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVab25lW10gTUlOVVNaT05FID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAwOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDI6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAzOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDU6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA2OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDg6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA5OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTE6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTEyOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTQ6MDAiKSwKLSAgICAgICAgICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmVbXSBQTFVTWk9ORSA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDE6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzAyOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDQ6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA1OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDc6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA4OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswOTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTA6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzExOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxMjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTM6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzE0OjAwIiksCi0gICAgICAgICAgICB9OwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgVGltZVpvbmUgdGltZVpvbmVGb3JHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIC8vIHVzZSBhIGNhY2hlZCB0aW1lem9uZSBpZiBpbnRlZ3JhbDsgb3RoZXJ3aXNlIG1ha2UgYSBuZXcgb25lLgotICAgICAgICBpZiAoIWRhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgICAgIHJldHVybiBUaW1lWm9uZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIGlmIChkYXRlLmdldFRpbWVab25lU2lnbigpID09IDApCi0gICAgICAgICAgICByZXR1cm4gR01UWk9ORTsKLSAgICAgICAgaWYgKGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPD0gMTQgJiYgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA+PSAwKQotICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPCAwID8gTUlOVVNaT05FW2RhdGUuZ2V0VGltZVpvbmVIb3VyKCldIDogUExVU1pPTkVbZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKV07Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gemIgPSBuZXcgY2hhcls5XTsKLSAgICAgICAgemJbMF0gPSAnRyc7Ci0gICAgICAgIHpiWzFdID0gJ00nOwotICAgICAgICB6YlsyXSA9ICdUJzsKLSAgICAgICAgemJbM10gPSAoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA8IDApID8gJy0nIDogJysnOwotICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA0LCBkYXRlLmdldFRpbWVab25lSG91cigpKTsKLSAgICAgICAgemJbNl0gPSAnOic7Ci0gICAgICAgIEdEYXRlLl9wYWRUd29BcHBlbmQoemIsIDcsIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgIHJldHVybiBUaW1lWm9uZS5nZXRUaW1lWm9uZShuZXcgU3RyaW5nKHpiKSk7Ci0gICAgfQotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBmb3JtYXRHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gc3BlYykKLSAgICB7Ci0gICAgICAgIC8vIFdlJ3ZlIHVzZWQgYSBjaGFyW10gcmF0aGVyIHRoYW4gYSBTdHJpbmdCdWZmZXIgZm9yIGEgNHggc3BlZWR1cAotICAgICAgICAvLyAtWVkoMTApWVktTU0tRERUSEg6TU06U1MuRkZGRkZGK1pIOlpNCi0gICAgICAgIC8vIDEgKyAxMCAgICsgMysgMysgMysgMysgMysxICsgcyArIDMrIDMgPSAzMyArIHMKLSAgICAgICAgQmlnRGVjaW1hbCBmcyA9IHNwZWMuZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgY2hhcltdIG1lc3NhZ2UgPSBuZXcgY2hhclszMyArIChmcyA9PSBudWxsID8gMCA6IGZzLnNjYWxlKCkpXTsKLSAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgIGlmIChzcGVjLmhhc1llYXIoKSB8fCBzcGVjLmhhc01vbnRoKCkgfHwgc3BlYy5oYXNEYXkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZG15OiB7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWMuaGFzWWVhcigpKQotICAgICAgICAgICAgICAgICAgICBpID0gX3BhZEZvdXJBcHBlbmQobWVzc2FnZSwgMCwgc3BlYy5nZXRZZWFyKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJy0nOwotCi0gICAgICAgICAgICAgICAgaWYgKCEoc3BlYy5oYXNNb250aCgpIHx8IHNwZWMuaGFzRGF5KCkpKQotICAgICAgICAgICAgICAgICAgICBicmVhayBkbXk7Ci0KLSAgICAgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnLSc7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWMuaGFzTW9udGgoKSkKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9wYWRUd29BcHBlbmQobWVzc2FnZSwgaSwgc3BlYy5nZXRNb250aCgpKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3BlYy5oYXNEYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG15OwotCi0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJy0nOwotICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0RGF5KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrIGRteTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcGVjLmhhc1RpbWUoKSkKLSAgICAgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnVCc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3BlYy5oYXNUaW1lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0SG91cigpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICc6JzsKLSAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0TWludXRlKCkpOwotICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJzonOwotICAgICAgICAgICAgaSA9IF9wYWRUd29BcHBlbmQobWVzc2FnZSwgaSwgc3BlYy5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBpZiAoZnMgIT0gX3plcm8pIC8vIChvcHRpbWl6YXRpb24gfjMlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBmcmFjID0gc3BlYy5nZXRGcmFjdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaW50IHBvaW50ID0gZnJhYy5pbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvaW50ID49IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmFjLmdldENoYXJzKHBvaW50LCBmcmFjLmxlbmd0aCgpLCBtZXNzYWdlLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaSArPSBmcmFjLmxlbmd0aCgpIC0gcG9pbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNwZWMuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNwZWMuZ2V0VGltZVpvbmVTaWduKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnWic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gc3BlYy5nZXRUaW1lWm9uZVNpZ24oKSA+IDAgPyAnKycgOiAnLSc7Ci0gICAgICAgICAgICAgICAgaSA9IF9wYWRUd29BcHBlbmQobWVzc2FnZSwgaSwgc3BlYy5nZXRUaW1lWm9uZUhvdXIoKSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJzonOwotICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSAoMCwgaSwgbWVzc2FnZSkgY3RvciBpbnN0ZWFkCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG1lc3NhZ2UsIDAsIGkpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGNmMDkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIFVzZWQgdG8gYnVpbGQge0BsaW5rIEdEYXRlIEdEYXRlc30uCi0gKiA8cD4KLSAqIExpa2UgR0RhdGUsIGEgR0RhdGVCdWlsZGVyIHJlcHJlc2VudHMgYW4gR3JlZ29yaWFuIERhdGUsIFRpbWUsCi0gKiBhbmQgVGltZXpvbmUsIG9yIHN1YnNldCBvZiBpbmZvcm1hdGlvbiAoWWVhciwgTW9udGgsIERheSwKLSAqIFRpbWUsIFRpbWV6b25lLCBvciBzb21lIGNvbWJpbmF0aW9uKS4gV2hlcmV2ZXIgaXQgcHJvdmlkZXMKLSAqIGd1aWRhbmNlLCB0aGUgWE1MIFNjaGVtYSAxLjAgc3BlY2lmaWNhdGlvbiAocGx1cyBwdWJsaXNoZWQKLSAqIGVycmF0YSkgaXMgZm9sbG93ZWQuCi0gKiA8cD4KLSAqIEluc3RhbmNlcyBtYXkgc2VwYXJhdGVseSBzZXQgb3IgY2xlYXIgdGhlIHllYXIsIG1vbnRoLAotICogZGF5LW9mLW1vbnRoLCBhbmQgdGltZS1vZi1kYXkuIE5vdCBhbGwgb3BlcmF0aW9ucyBhcmUKLSAqIG1lYW5pbmdmdWwgb24gYWxsIGNvbWJpbmF0aW9ucy4gSW4gcGFydGljdWxhciwgdGltZXpvbmUKLSAqIG5vcm1hbGl6YXRpb24gaXMgb25seSBwb3NzaWJsZSBpZiB0aGVyZSBpcyBhIHRpbWUsIG9yCi0gKiBhIHRpbWUgdG9nZXRoZXIgd2l0aCBhIGZ1bGwgZGF0ZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdEYXRlQnVpbGRlciBpbXBsZW1lbnRzIEdEYXRlU3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGludCBfYml0czsKLSAgICBwcml2YXRlIGludCBfQ1k7Ci0gICAgcHJpdmF0ZSBpbnQgX007Ci0gICAgcHJpdmF0ZSBpbnQgX0Q7Ci0gICAgcHJpdmF0ZSBpbnQgX2g7Ci0gICAgcHJpdmF0ZSBpbnQgX207Ci0gICAgcHJpdmF0ZSBpbnQgX3M7Ci0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKLSAgICBwcml2YXRlIGludCBfdHpzaWduOwotICAgIHByaXZhdGUgaW50IF90emg7Ci0gICAgcHJpdmF0ZSBpbnQgX3R6bTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgc3BlY2lmeWluZyBubyBkYXRlIG9yIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFub3RoZXIgR0RhdGVCdWlsZGVyIHdpdGggdGhlIHNhbWUgdmFsdWUKLSAgICAgKiBhcyB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIEdEYXRlIGZyb20gdGhpcyBHRGF0ZUJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlIHRvR0RhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1dHMgYSBHRGF0ZUJ1aWxkZXIgYnkgY29weWluZyBhbm90aGVyIEdEYXRlU3BlY2lmaWNhaXRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKEdEYXRlU3BlY2lmaWNhdGlvbiBnZGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmIChnZGF0ZS5oYXNUaW1lWm9uZSgpKQotICAgICAgICAgICAgc2V0VGltZVpvbmUoZ2RhdGUuZ2V0VGltZVpvbmVTaWduKCksIGdkYXRlLmdldFRpbWVab25lSG91cigpLCBnZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKTsKLQotICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZSgpKQotICAgICAgICAgICAgc2V0VGltZShnZGF0ZS5nZXRIb3VyKCksIGdkYXRlLmdldE1pbnV0ZSgpLCBnZGF0ZS5nZXRTZWNvbmQoKSwgZ2RhdGUuZ2V0RnJhY3Rpb24oKSk7Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc0RheSgpKQotICAgICAgICAgICAgc2V0RGF5KGdkYXRlLmdldERheSgpKTsKLQotICAgICAgICBpZiAoZ2RhdGUuaGFzTW9udGgoKSkKLSAgICAgICAgICAgIHNldE1vbnRoKGdkYXRlLmdldE1vbnRoKCkpOwotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNZZWFyKCkpCi0gICAgICAgICAgICBzZXRZZWFyKGdkYXRlLmdldFllYXIoKSk7Ci0gICAgfQotCi0gICAgLy8gRm9ybXM6Ci0KLSAgICAvLyBEYXRlIHBhcnQ6Ci0gICAgLy8gWWVhcjogICAgICAgKC0/XGR7NCx9KQotICAgIC8vIFllYXJNb250aDogICgtP1xkezQsfSktKFxkezJ9KQotICAgIC8vIERhdGU6ICAgICAgICgtP1xkezQsfSktKFxkezJ9KS0oXGR7Mn0pCi0gICAgLy8gTW9udGg6ICAgICAgLS0oXGR7Mn0pKC0tKT8gICAgICAgICAgICAgIC8vZXJyYXRhIFItNDgKLSAgICAvLyBNb250aERheTogICAtLShcZHsyfSktKFxkezJ9KQotICAgIC8vIERheTogICAgICAgIC0tLShcZHsyfSkKLQotICAgIC8vIFRpbWUgcGFydDoKLSAgICAvLyBUaW1lOiAgICAgICAoXGR7Mn0pOihcZHsyfSk6KFxkezJ9KSguXGQqKT8KLQotICAgIC8vIFRpbWV6b25lIHBhcnQ6Ci0gICAgLy8gVFo6ICAgICAgICAgKFopfChbKy1dXGR7Mn0pOihcZHsyfSkKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgZnJvbSBhIGxleGljYWwKLSAgICAgKiByZXByZXNlbnRhdGlvbi4gVGhlIGxleGljYWwgc3BhY2UgY29udGFpbnMgdGhlCi0gICAgICogdW5pb24gb2YgdGhlIGxleGljYWwgc3BhY2VzIG9mIGFsbCB0aGUgc2NoZW1hCi0gICAgICogZGF0ZS90aW1lIHR5cGVzIChleGNlcHQgZm9yIGR1cmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKENoYXJTZXF1ZW5jZSBzdHJpbmcpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZShzdHJpbmcpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoQ2FsZW5kYXIgY2FsZW5kYXIpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZShjYWxlbmRhcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCi0gICAgICogYW4gdW5zcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IGJ5IG5vdCBzcGVjaWZ5aW5nIHRoZSB0aW1lem9uZSB0aGUgR0RhdGVCdWlsZGVyCi0gICAgICogYmVjb21lcyBwYXJ0aWFsbHkgdW5vcmRlcmVkIHdpdGggcmVzcGVjdCB0byB0aW1lc3RoYXQgZG8gaGF2ZSBhCi0gICAgICogc3BlY2lmaWVkIHRpbWV6b25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB5ZWFyIFRoZSB5ZWFyCi0gICAgICogQHBhcmFtIG1vbnRoIFRoZSBtb250aCwgZnJvbSAxLTEyCi0gICAgICogQHBhcmFtIGRheSBUaGUgZGF5IG9mIG1vbnRoLCBmcm9tIDEtMzEKLSAgICAgKiBAcGFyYW0gaG91ciBUaGUgaG91ciBvZiBkYXksIGZyb20gMC0yMwotICAgICAqIEBwYXJhbSBtaW51dGUgVGhlIG1pbnV0ZSBvZiBob3VyLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgb2YgbWludXRlLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIG9mIHNlY29uZCwgMC4wIHRvIDAuOTk5Li4uIChtYXkgYmUgbnVsbCkgCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlQnVpbGRlcigKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKLQotICAgICAgICBfQ1kgPSB5ZWFyOwotICAgICAgICBfTSA9IG1vbnRoOwotICAgICAgICBfRCA9IGRheTsKLSAgICAgICAgX2ggPSBob3VyOwotICAgICAgICBfbSA9IG1pbnV0ZTsKLSAgICAgICAgX3MgPSBzZWNvbmQ7Ci0gICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOwotCi0gICAgICAgIGlmICghaXNWYWxpZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYWJzb2x1dGUgR0RhdGVCdWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLAotICAgICAqIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbAotICAgICAqIHNlY29uZHMsIGFuZCBpbiB0aGUgdGltZXpvbmUgc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB5b3UgY2FuIHJlZXhwcmVzcyB0aGUgR0RhdGVCdWlsZGVyIGluIGFueSB0aW1lem9uZSB1c2luZwotICAgICAqIG5vcm1hbGl6ZVRvVGltZVpvbmUoKS4gVGhlIG5vcm1hbGl6ZSgpIG1ldGhvZCBub3JtYWxpemVzIHRvIFVUQy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGEgdGltZSBvciBkYXRlIHRoYXQgaXNuJ3QgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUsCi0gICAgICogdGhlbiB1c2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdGltZXpvbmUgYXJndW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHllYXIgdGhlIHllYXIKLSAgICAgKiBAcGFyYW0gbW9udGggdGhlIG1vbnRoLCBmcm9tIDEtMTIKLSAgICAgKiBAcGFyYW0gZGF5IHRoZSBkYXkgb2YgbW9udGgsIGZyb20gMS0zMQotICAgICAqIEBwYXJhbSBob3VyIHRoZSBob3VyIG9mIGRheSwgZnJvbSAwLTIzCi0gICAgICogQHBhcmFtIG1pbnV0ZSB0aGUgbWludXRlIG9mIGhvdXIsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBvZiBtaW51dGUsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aGUgZnJhY3Rpb24gb2Ygc2Vjb25kLCAwLjAgdG8gMC45OTkuLi4gKG1heSBiZSBudWxsKQotICAgICAqIEBwYXJhbSB0elNpZ24gdGhlIHRpbWV6b25lIG9mZnNldCBzaWduLCBlaXRoZXIgKzEsIDAsIG9yIC0xCi0gICAgICogQHBhcmFtIHR6SG91ciB0aGUgdGltZXpvbmUgb2Zmc2V0IGhvdXIKLSAgICAgKiBAcGFyYW0gdHpNaW51dGUgdGhlIHRpbWV6b25lIG9mZnNldCBtaW51dGUgCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlQnVpbGRlcigKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uLAotICAgICAgICAgICAgaW50IHR6U2lnbiwKLSAgICAgICAgICAgIGludCB0ekhvdXIsCi0gICAgICAgICAgICBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19USU1FWk9ORSB8IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0gICAgICAgIF90enNpZ24gPSB0elNpZ247Ci0gICAgICAgIF90emggPSB0ekhvdXI7Ci0gICAgICAgIF90em0gPSB0ek1pbnV0ZTsKLQotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGVCdWlsZGVyIGJhc2VkIG9uIGEgamF2YS51dGlsLkRhdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGN1cnJlbnQgb2Zmc2V0IG9mIHRoZSBkZWZhdWx0IHRpbWV6b25lIGlzIHVzZWQgYXMgdGhlIHRpbWV6b25lLgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCBpZiBlYXN0ZXJuIGRheWxpZ2h0IHRpbWUgaXMgaW4gZWZmZWN0IGF0IHRoZSBnaXZlbgotICAgICAqIGRhdGUsIHRoZSB0aW1lem9uZSBvbiB0aGUgZWFzdCBjb2FzdCBvZiB0aGUgdW5pdGVkIHN0YXRlcwotICAgICAqIHRyYW5zbGF0ZXMgdG8gR01ULTA1OjAwIChFU1QpICsgMTowMCAoRFQgb2Zmc2V0KSA9PSBHTVQtMDQ6MDAuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGUgb2JqZWN0IHRvIGNvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKERhdGUgZGF0ZSkKLSAgICB7Ci0gICAgICAgIHNldERhdGUoZGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29tYmluYXRpb24gb2YgZmxhZ3MgaW5kaWNhdGluZyB0aGUgaW5mb3JtYXRpb24KLSAgICAgKiBjb250YWluZWQgYnkgdGhpcyBHRGF0ZS4gIFRoZSBmaXZlIGZsYWdzIGFyZQotICAgICAqIEhBU19USU1FWk9ORSwgSEFTX1lFQVIsIEhBU19NT05USCwgSEFTX0RBWSwgYW5kIEhBU19USU1FLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iaXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lem9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lWm9uZSgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfVElNRVpPTkUpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgeWVhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19ZRUFSKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9udGgoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX01PTlRIKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXkoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX0RBWSkgIT0gMCk7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lLW9mLWRheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRlKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKSA9PSAoSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSKSk7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0WWVhcigpCi0gICAgICAgIHsgcmV0dXJuIF9DWTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vbnRoLW9mLXllYXIuIEphbnVhcnkgaXMgMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9tOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTZWNvbmQoKQotICAgICAgICB7IHJldHVybiBfczsgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX2ZzOyB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdW5kZWQgbWlsbGlzZWNvbmQgdmFsdWUuIFJhbmdlIGZyb20gMCB0byA5OTkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbGxpc2Vjb25kKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZnMgPT0gbnVsbCB8fCBfZnMgPT0gR0RhdGUuX3plcm8pCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIF9mcy5zZXRTY2FsZSgzLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApLnVuc2NhbGVkVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBzaWduLiBGb3IgdGltZSB6b25lcyBlYXN0IG9mIEdNVCwKLSAgICAgKiB0aGlzIGlzIHBvc2l0aXZlOyBmb3IgdGltZSB6b25lcyB3ZXN0LCB0aGlzIGlzIG5lZ2F0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVTaWduKCkKLSAgICAgICAgeyByZXR1cm4gX3R6c2lnbjsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIGhvdXIuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVIb3VyKCkKLSAgICAgICAgeyByZXR1cm4gX3R6aDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIG1pbnV0ZXMuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKQotICAgICAgICB7IHJldHVybiBfdHptOyB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB5ZWFyLiBTaG91bGQgYmUgYSBmb3VyLWRpZ2l0IHllYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0geWVhciB0aGUgeWVhcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICBpZiAoeWVhciA8IC00NzEyIHx8IHllYXIgPiA5OTk5OTkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5ZWFyIG91dCBvZiByYW5nZSIpOwotICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsgX0NZID0geWVhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtb250aC1vZi15ZWFyLiBKYW51YXJ5IGlzIDEuCi0gICAgICogQHBhcmFtIG1vbnRoIHRoZSBtb250aCwgZnJvbSAxLTEyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9udGgoaW50IG1vbnRoKQotICAgIHsKLSAgICAgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibW9udGggb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIF9iaXRzIHw9IEhBU19NT05USDsgX00gPSBtb250aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqIEBwYXJhbSBkYXkgdGhlIGRheSBvZiBtb250aCwgZnJvbSAxLTMxCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF5KGludCBkYXkpCi0gICAgewotICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiAzMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRheSBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsgX0QgPSBkYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZS4gSG91cnMgaW4gdGhlIGRheSByYW5nZSBmcm9tIDAgdG8gMjM7Ci0gICAgICogbWludXRlcyBhbmQgc2Vjb25kcyByYW5nZSBmcm9tIDAgdG8gNTk7IGFuZCBmcmFjdGlvbmFsCi0gICAgICogc2Vjb25kcyByYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKiBUaGUgZnJhY3Rpb24gY2FuIGJlIG51bGwgYW5kIGlzIGFzc3VtZWQgdG8gYmUgemVyby4KLSAgICAgKiBAcGFyYW0gaG91ciB0aGUgaG91ciBvZiBkYXksIGZyb20gMC0yMwotICAgICAqIEBwYXJhbSBtaW51dGUgdGhlIG1pbnV0ZSBvZiBob3VyLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgb2YgbWludXRlLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGhlIGZyYWN0aW9uIG9mIHNlY29uZCwgMC4wIHRvIDAuOTk5Li4uIChtYXkgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhvdXIgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIGlmIChtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWludXRlIG91dCBvZiByYW5nZSIpOwotICAgICAgICBpZiAoc2Vjb25kIDwgMCB8fCBzZWNvbmQgPiA1OSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlY29uZCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgaWYgKGZyYWN0aW9uICE9IG51bGwgJiYgKGZyYWN0aW9uLnNpZ251bSgpIDwgMCB8fCBmcmFjdGlvbi5jb21wYXJlVG8oR0RhdGUuX29uZSkgPiAxKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyYWN0aW9uIG91dCBvZiByYW5nZSIpOwotICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgX2ggPSBob3VyOwotICAgICAgICBfbSA9IG1pbnV0ZTsKLSAgICAgICAgX3MgPSBzZWNvbmQ7Ci0gICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgem9uZSB3aXRob3V0IGNoYW5naW5nIHRoZSBvdGhlciB0aW1lCi0gICAgICogZmllbGRzLiBJZiB5b3Ugd2l0aCB0byBhZGp1c3Qgb3RoZXIgdGltZSBmaWVsZHMgdG8gZXhwcmVzcwotICAgICAqIHRoZSBzYW1lIGFjdHVhbCBtb21lbnQgaW4gdGltZSBpbiBhIGRpZmZlcmVudCB0aW1lIHpvbmUsCi0gICAgICogdXNlIG5vcm1hbGl6ZVRvVGltZVpvbmUuCi0gICAgICogPHA+Ci0gICAgICogVGltZXpvbmVzIG11c3QgYmUgYmV0d2VlbiAtMTQ6MDAgYW5kICsxNDowMC4gU2lnbgotICAgICAqIG11c3QgYmUgLTEgb3IgMSAob3IgMCBmb3IgVVRDIG9ubHkpLCBhbmQgdGhlIG9mZnNldCBob3VycwotICAgICAqIGFuZCBtaW51dGUgYXJndW1lbnRzIG11c3QgYmUgbm9ubmVnYXRpdmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR6U2lnbiB0aGUgdGltZXpvbmUgb2Zmc2V0IHNpZ24sIGVpdGhlciArMSwgMCwgb3IgLTEKLSAgICAgKiBAcGFyYW0gdHpIb3VyIHRoZSB0aW1lem9uZSBvZmZzZXQgaG91cgotICAgICAqIEBwYXJhbSB0ek1pbnV0ZSB0aGUgdGltZXpvbmUgb2Zmc2V0IG1pbnV0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZShpbnQgdHpTaWduLCBpbnQgdHpIb3VyLCBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBpZiAoISgodHpTaWduID09IDAgJiYgdHpIb3VyID09IDAgJiYgdHpNaW51dGUgPT0gMCkgfHwKLSAgICAgICAgICAgICAgKCh0elNpZ24gPT0gLTEgfHwgdHpTaWduID09IDEpICYmCi0gICAgICAgICAgICAgICAodHpIb3VyID49IDAgJiYgdHpNaW51dGUgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICh0ekhvdXIgPT0gMTQgJiYgdHpNaW51dGUgPT0gMCB8fCB0ekhvdXIgPCAxNCAmJiB0ek1pbnV0ZSA8IDYwKSkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIG91dCBvZiByYW5nZSAoLTE0OjAwIHRvICsxNDowMCkuICgiICsKLSAgICAgICAgICAgICAgICAodHpTaWduPDAgPyAiLSIgOiAiKyIpICsgdHpIb3VyICsgIjoiICsgdHpNaW51dGUgKyAiKSIpOwotCi0gICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKLSAgICAgICAgX3R6c2lnbiA9IHR6U2lnbjsKLSAgICAgICAgX3R6aCA9IHR6SG91cjsKLSAgICAgICAgX3R6bSA9IHR6TWludXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lIHpvbmUgYmFzZWQgb24gYSBudW1iZXIgb2Ygb2Zmc2V0IG1pbnV0ZXMgcmF0aGVyCi0gICAgICogdGhhbiBzaWduL2hvdXIvbWludXRlOyBmb3IgZXhhbXBsZSwgc2V0VGltZVpvbmUoLTYwKSBpcyB0aGUKLSAgICAgKiBzYW1lIGFzIHNldFRpbWVab25lKC0xLCAxLCAwKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZShpbnQgdHpUb3RhbE1pbnV0ZXMpCi0gICAgewotICAgICAgICBpZiAodHpUb3RhbE1pbnV0ZXMgPCAtMTQgKiA2MCB8fCB0elRvdGFsTWludXRlcyA+IDE0ICogNjApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgb3V0IG9mIHJhbmdlICgtODQwIHRvIDg0MCBtaW51dGVzKS4gKCIgKyB0elRvdGFsTWludXRlcyArICIpIik7Ci0gICAgICAgIAotICAgICAgICBpbnQgdHpTaWduID0gdHpUb3RhbE1pbnV0ZXMgPCAwID8gLTEgOiB0elRvdGFsTWludXRlcyA+IDAgPyAxIDogMDsKLSAgICAgICAgdHpUb3RhbE1pbnV0ZXMgKj0gdHpTaWduOwotICAgICAgICBpbnQgdHpIID0gdHpUb3RhbE1pbnV0ZXMgLyA2MDsKLSAgICAgICAgaW50IHR6TSA9IHR6VG90YWxNaW51dGVzIC0gdHpIICogNjA7Ci0gICAgICAgIAotICAgICAgICBzZXRUaW1lWm9uZSh0elNpZ24sIHR6SCwgdHpNKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHllYXIuIEFmdGVyIGNsZWFyaW5nLCBoYXNZZWFyIHJldHVybnMgZmFsc2UgYW5kIHRoZQotICAgICAqIHZhbHVlIG9mIGdldFllYXIgaXMgdW5kZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyWWVhcigpCi0gICAgICAgIHsgX2JpdHMgJj0gfkhBU19ZRUFSOyBfQ1kgPSAwOyAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBtb250aC1vZi15ZWFyLiBBZnRlciBjbGVhcmluZy4gaGFzTW9udGggcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0TW9udGggaXMgdW5kZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyTW9udGgoKQotICAgICAgICB7IF9iaXRzICY9IH5IQVNfTU9OVEg7IF9NID0gMDsgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgZGF5LW9mLW1vbnRoLiBBZnRlciBjbGVhcmluZy4gaGFzRGF5IHJldHVybnMgZmFsc2UgYW5kCi0gICAgICogdGhlIHZhbHVlIG9mIGdldERheSBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJEYXkoKQotICAgICAgICB7IF9iaXRzICY9IH5IQVNfREFZOyBfRCA9IDA7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHRpbWUtb2YtZGF5LgotICAgICAqIEFmdGVyIGNsZWFyaW5nLiBoYXNUaW1lIHJldHVybnMgZmFsc2UgYW5kCi0gICAgICogdGhlIHZhbHVlIG9mIGdldFRpbWUgaXMgdW5kZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyVGltZSgpCi0gICAgewotICAgICAgICBfYml0cyAmPSB+SEFTX1RJTUU7Ci0gICAgICAgIF9oID0gMDsKLSAgICAgICAgX20gPSAwOwotICAgICAgICBfcyA9IDA7Ci0gICAgICAgIF9mcyA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSB0aW1lem9uZS4gQWZ0ZXIgY2xlYXJpbmcuIGhhc1RpbWVab25lIHJldHVybnMgZmFsc2UgYW5kCi0gICAgICogdGhlIHZhbHVlIG9mIGdldFRpbWVab25lSG91ciBhbmQgZ2V0VGltZVpvbmVNaW51dGUgYXJlIHVuZGVmaW5lZC4KLSAgICAgKiBEb2VzIG5vdCBjaGFuZ2UgdGhlIG90aGVyIHRpbWUgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyVGltZVpvbmUoKQotICAgIHsKLSAgICAgICAgX2JpdHMgJj0gfkhBU19USU1FWk9ORTsKLSAgICAgICAgX3R6c2lnbiA9IDA7Ci0gICAgICAgIF90emggPSAwOwotICAgICAgICBfdHptID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIGFsbCBkYXRlIGZpZWxkcyBsaWUgd2l0aGluIHRoZWlyIGxlZ2FsIHJhbmdlcy4gIEEgR0RhdGVCdWlsZGVyCi0gICAgICogY2FuIGJlIGludmFsaWQsIGZvciBleGFtcGxlLCBpZiB5b3UgY2hhbmdlIHRoZSBtb250aCB0byBGZWJydWFyeQotICAgICAqIGFuZCB0aGUgZGF5LW9mLW1vbnRoIGlzIDMxLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzVmFsaWRHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmIChkYXRlLmhhc01vbnRoKCkgJiYgKGRhdGUuZ2V0TW9udGgoKSA8IDEgfHwgZGF0ZS5nZXRNb250aCgpID4gMTIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChkYXRlLmhhc0RheSgpICYmIChkYXRlLmdldERheSgpIDwgMSB8fCBkYXRlLmdldERheSgpID4gMzEgfHwKLSAgICAgICAgICAgIGRhdGUuZ2V0RGF5KCkgPiAyOCAmJiBkYXRlLmhhc01vbnRoKCkgJiYKLSAgICAgICAgICAgICAgICAoZGF0ZS5oYXNZZWFyKCkgPyBkYXRlLmdldERheSgpID4gX21heERheUluTW9udGhGb3IoZGF0ZS5nZXRZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUuZ2V0RGF5KCkgPiBfbWF4RGF5SW5Nb250aChkYXRlLmdldE1vbnRoKCkpKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGRhdGUuaGFzVGltZSgpICYmIChkYXRlLmdldEhvdXIoKSA8IDAgfHwgZGF0ZS5nZXRIb3VyKCkgPiAyMyB8fAotICAgICAgICAgICAgZGF0ZS5nZXRNaW51dGUoKSA8IDAgfHwgZGF0ZS5nZXRNaW51dGUoKSA+IDU5IHx8Ci0gICAgICAgICAgICBkYXRlLmdldFNlY29uZCgpIDwgMCB8fCBkYXRlLmdldFNlY29uZCgpID4gNTkgfHwKLSAgICAgICAgICAgIGRhdGUuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA8IDAgfHwgZGF0ZS5nZXRGcmFjdGlvbigpLmNvbXBhcmVUbyhHRGF0ZS5fb25lKSA+PSAwKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lWm9uZSgpICYmCi0gICAgICAgICAgICAoISgoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPT0gMCAmJiBkYXRlLmdldFRpbWVab25lTWludXRlKCkgPT0gMCkgfHwKLSAgICAgICAgICAgICAgKChkYXRlLmdldFRpbWVab25lU2lnbigpID09IC0xIHx8IGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gKzEpICYmCi0gICAgICAgICAgICAgICAgLy8gTkI6IGFsbG93ICswMDowMCBhbmQgLTAwOjAwCi0gICAgICAgICAgICAgICAgLy8gKGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPT0gMCAmJiBkYXRlLmdldFRpbWVab25lTWludXRlKCkgPiAwIHx8IGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPiAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA+PSAwKSAmJgotICAgICAgICAgICAgICAgKGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPj0gMCAmJiBkYXRlLmdldFRpbWVab25lTWludXRlKCkgPj0gMCkgJiYKLSAgICAgICAgICAgICAgIChkYXRlLmdldFRpbWVab25lSG91cigpID09IDE0ICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA9PSAwIHx8IGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPCAxNCAmJiBkYXRlLmdldFRpbWVab25lTWludXRlKCkgPCA2MCkpKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gZXZlcnl0aW5nIGxvb2tzIGtvc2hlcgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZXMgdGhlIGluc3RhbmNlLCBlbnN1cmluZyBkYXRlIGFuZCB0aW1lIGZpZWxkcyBhcmUgd2l0aGluCi0gICAgICogdGhlaXIgbm9ybWFsIHJhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBubyB0aW1lem9uZSBvciBubyB0aW1lIGlzIHNwZWNpZmllZCwgb3IgaWYgYSBwYXJ0aWFsIGRhdGUgaXMgc3BlY2lmaWVkLCB0aGlzCi0gICAgICogbWV0aG9kIGRvZXMgbm90aGluZywgYW5kIGxlYXZlcyB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24gYXMtaXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgYSB0aW1lIG9yIHRpbWUgYW5kIGRhdGUgaXMgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCBub3JtYWxpemVzIHRoZSB0aW1lem9uZQotICAgICAqIHRvIFVUQy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICAgIHsKLSAgICAgICAgLy8gRGF0ZVRpbWUgb3IgVGltZSwgd2l0aCBUaW1lWm9uZTogbm9ybWFsaXplIHRvIFVUQy4KLSAgICAgICAgLy8gSW4gdGhlIHByb2Nlc3MgYWxsIHRoZSBmaWVsZHMgd2lsbCBiZSBub3JtYWxpemVkLgotICAgICAgICBpZiAoaGFzRGF5KCkgPT0gaGFzTW9udGgoKSAmJiBoYXNEYXkoKSA9PSBoYXNZZWFyKCkgJiYKLSAgICAgICAgICAgIGhhc1RpbWVab25lKCkgJiYgaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBub3JtYWxpemVUb1RpbWVab25lKDAsIDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm8gdGltZXpvbmUsIG9yIGluY29tcGxldGUgZGF0ZS4KLSAgICAgICAgICAgIGxvbmcgY2FycnkgPSAwOwotCi0gICAgICAgICAgICBpZiAoaGFzVGltZSgpKQotICAgICAgICAgICAgICAgIGNhcnJ5ID0gX25vcm1hbGl6ZVRpbWUoKTsKLQotICAgICAgICAgICAgaWYgKGhhc0RheSgpKQotICAgICAgICAgICAgICAgIF9EICs9IGNhcnJ5OwotCi0gICAgICAgICAgICBpZiAoaGFzRGF0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ub3JtYWxpemVEYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoYXNNb250aCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHdpdGggaW5jb21wbGV0ZSBkYXRlcywganVzdCBtb250aHMgY2FuIGJlIG5vcm1hbGl6ZWQ6Ci0gICAgICAgICAgICAgICAgLy8gZGF5cyBzdGF5IGRlbm9ybWFsaXplZC4KLSAgICAgICAgICAgICAgICBpZiAoX00gPCAxIHx8IF9NID4gMTIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IF9NOwotICAgICAgICAgICAgICAgICAgICBfTSA9IF9tb2R1bG8odGVtcCwgMSwgMTMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzWWVhcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgX0NZID0gX0NZICsgKGludClfZlF1b3RpZW50KHRlbXAsIDEsIDEzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBmcmFjdGlvbmFsIHNlY29uZHMKLSAgICAgICAgaWYgKGhhc1RpbWUoKSAmJiBfZnMgIT0gbnVsbCAmJiBfZnMuc2NhbGUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfZnMuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBfZnMgPSBHRGF0ZS5femVybzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGJpID0gX2ZzLnVuc2NhbGVkVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gYmkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpbnQgbGFzdHplcm87Ci0gICAgICAgICAgICAgICAgZm9yIChsYXN0emVybyA9IHN0ci5sZW5ndGgoKTsgbGFzdHplcm8gPiAwOyBsYXN0emVybyAtPSAxKQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyLmNoYXJBdChsYXN0emVybyAtIDEpICE9ICcwJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChsYXN0emVybyA8IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgX2ZzID0gX2ZzLnNldFNjYWxlKF9mcy5zY2FsZSgpIC0gc3RyLmxlbmd0aCgpICsgbGFzdHplcm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHRpbWUgYW5kIHRpbWV6b25lIGFyZSBrbm93biwgdGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgdGltZXpvbmUgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIFVUQyBvZmZzZXQsIGFsdGVyaW5nIG1pbnV0ZXMsIGhvdXJzLCBkYXksIG1vbnRoLCBhbmQgeWVhciBhcwotICAgICAqIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYWN0dWFsIGRlc2NyaWJlZCBtb21lbnQgaW4gdGltZSBpcyB0aGUgc2FtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyBhbiBlcnJvciB0byBvcGVyYXRlIG9uIGluc3RhbmNlcyB3aXRob3V0IGEgdGltZSBvciB0aW1lem9uZSwgb3IKLSAgICAgKiB3aXRoIGEgcGFydGlhbGx5IHNwZWNpZmllZCBkYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0elNpZ24gdGhlIHRpbWV6b25lIG9mZnNldCBzaWduLCBlaXRoZXIgKzEsIDAsIG9yIC0xCi0gICAgICogQHBhcmFtIHR6SG91ciB0aGUgdGltZXpvbmUgb2Zmc2V0IGhvdXIKLSAgICAgKiBAcGFyYW0gdHpNaW51dGUgdGhlIHRpbWV6b25lIG9mZnNldCBtaW51dGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm9ybWFsaXplVG9UaW1lWm9uZShpbnQgdHpTaWduLCBpbnQgdHpIb3VyLCBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBpZiAoISgodHpTaWduID09IDAgJiYgdHpIb3VyID09IDAgJiYgdHpNaW51dGUgPT0gMCkgfHwKLSAgICAgICAgICAgICAgKCh0elNpZ24gPT0gLTEgfHwgdHpTaWduID09IDEpICYmCi0gICAgICAgICAgICAgICAodHpIb3VyID49IDAgJiYgdHpNaW51dGUgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICh0ekhvdXIgPT0gMTQgJiYgdHpNaW51dGUgPT0gMCB8fCB0ekhvdXIgPCAxNCAmJiB0ek1pbnV0ZSA8IDYwKSkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIG11c3QgYmUgYmV0d2VlbiAtMTQ6MDAgYW5kICsxNDowMCIpOwotCi0gICAgICAgIGlmICghaGFzVGltZVpvbmUoKSB8fCAhaGFzVGltZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IG5vcm1hbGl6ZSB0aW1lIHpvbmUgd2l0aG91dCBib3RoIHRpbWUgYW5kIHRpbWV6b25lIik7Ci0KLSAgICAgICAgaWYgKCEoaGFzRGF5KCkgPT0gaGFzTW9udGgoKSAmJiBoYXNEYXkoKSA9PSBoYXNZZWFyKCkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGRvIGRhdGUgbWF0aCB3aXRob3V0IGEgY29tcGxldGUgZGF0ZSIpOwotCi0gICAgICAgIGludCBoc2hpZnQgPSB0elNpZ24gKiB0ekhvdXIgLSBfdHpzaWduICogX3R6aDsKLSAgICAgICAgaW50IG1zaGlmdCA9IHR6U2lnbiAqIHR6TWludXRlIC0gX3R6c2lnbiAqIF90em07Ci0KLSAgICAgICAgX3R6c2lnbiA9IHR6U2lnbjsKLSAgICAgICAgX3R6aCA9IHR6SG91cjsKLSAgICAgICAgX3R6bSA9IHR6TWludXRlOwotICAgICAgICBhZGREdXJhdGlvbigxLCAwLCAwLCAwLCBoc2hpZnQsIG1zaGlmdCwgMCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0byBhIHRpbWUgem9uZSBzcGVjaWZpZWQgYnkgYSBudW1iZXIgb2Ygb2Zmc2V0IG1pbnV0ZXMgcmF0aGVyCi0gICAgICogdGhhbiBzaWduL2hvdXIvbWludXRlOyBmb3IgZXhhbXBsZSwgbm9ybWFsaXplVG9UaW1lWm9uZSgtNjApIGlzIHRoZQotICAgICAqIHNhbWUgYXMgbm9ybWFsaXplVG9UaW1lWm9uZSgtMSwgMSwgMCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm9ybWFsaXplVG9UaW1lWm9uZShpbnQgdHpUb3RhbE1pbnV0ZXMpCi0gICAgewotICAgICAgICBpZiAodHpUb3RhbE1pbnV0ZXMgPCAtMTQgKiA2MCB8fCB0elRvdGFsTWludXRlcyA+IDE0ICogNjApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgb3V0IG9mIHJhbmdlICgtODQwIHRvIDg0MCBtaW51dGVzKS4gKCIgKyB0elRvdGFsTWludXRlcyArICIpIik7Ci0gICAgICAgIAotICAgICAgICBpbnQgdHpTaWduID0gdHpUb3RhbE1pbnV0ZXMgPCAwID8gLTEgOiB0elRvdGFsTWludXRlcyA+IDAgPyAxIDogMDsKLSAgICAgICAgdHpUb3RhbE1pbnV0ZXMgKj0gdHpTaWduOwotICAgICAgICBpbnQgdHpIID0gdHpUb3RhbE1pbnV0ZXMgLyA2MDsKLSAgICAgICAgaW50IHR6TSA9IHR6VG90YWxNaW51dGVzIC0gdHpIICogNjA7Ci0gICAgICAgIAotICAgICAgICBub3JtYWxpemVUb1RpbWVab25lKHR6U2lnbiwgdHpILCB0ek0pOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGdpdmVuIGR1cmF0aW9uIHRvIHRoZSBkYXRlL3RpbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbiB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGFkZER1cmF0aW9uKGR1cmF0aW9uLmdldFNpZ24oKSwgZHVyYXRpb24uZ2V0WWVhcigpLCBkdXJhdGlvbi5nZXRNb250aCgpLCBkdXJhdGlvbi5nZXREYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24uZ2V0SG91cigpLCBkdXJhdGlvbi5nZXRNaW51dGUoKSwgZHVyYXRpb24uZ2V0U2Vjb25kKCksIGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YnRyYWN0cyBhIGdpdmVuIGR1cmF0aW9uIGZyb20gdGhlIGRhdGUvdGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIGR1cmF0aW9uIHRvIHN1YnRyYWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3VidHJhY3RHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGFkZER1cmF0aW9uKC1kdXJhdGlvbi5nZXRTaWduKCksIGR1cmF0aW9uLmdldFllYXIoKSwgZHVyYXRpb24uZ2V0TW9udGgoKSwgZHVyYXRpb24uZ2V0RGF5KCksCi0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLmdldEhvdXIoKSwgZHVyYXRpb24uZ2V0TWludXRlKCksIGR1cmF0aW9uLmdldFNlY29uZCgpLCBkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZXMgdGhlIGRhdGUgYnkgY2Fycnlpbmcgb3ZlciB0byB0aGUgeWVhciBhbnkgbW9udGhzIG91dHNpZGUgMS4uMTIKLSAgICAgKiBhbmQgY2Fycnlpbmcgb3ZlciB0byB0aGUgbW9udGggYW55IGRheXMgb3V0c2lkZSAxLi4oZGF5cy1pbi1tb250aCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9ub3JtYWxpemVEYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfTSA8IDEgfHwgX00gPiAxMiB8fCBfRCA8IDEgfHwgX0QgPiBfbWF4RGF5SW5Nb250aEZvcihfQ1ksIF9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZml4IG1vbnRocyBmaXJzdAotICAgICAgICAgICAgaW50IHRlbXAgPSBfTTsKLSAgICAgICAgICAgIF9NID0gX21vZHVsbyh0ZW1wLCAxLCAxMyk7Ci0gICAgICAgICAgICBfQ1kgPSBfQ1kgKyAoaW50KV9mUXVvdGllbnQodGVtcCwgMSwgMTMpOwotCi0gICAgICAgICAgICAvLyB0aGVuIHB1bGwgZGF5cyBvdXQKLSAgICAgICAgICAgIGludCBleHRyYWRheXMgPSBfRCAtIDE7Ci0gICAgICAgICAgICBfRCA9IDE7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gdXNlIHRoZSBqdWxpYW4gZGF0ZSBmdW5jdGlvbiB0byBmaXgKLSAgICAgICAgICAgIHNldEp1bGlhbkRhdGUoZ2V0SnVsaWFuRGF0ZSgpICsgZXh0cmFkYXlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZXMgdGltZSBzbyB0aGF0IGZyYWN0aW9ucyBhcmUgMC4uMShleGMpLCBzZWNvbmRzL21pbnV0ZXMgMC4uNTksCi0gICAgICogYW5kIGhvdXJzIDAuLjI0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyB0byBjYXJyeSBvdmVyIGZyb20gbm9ybWFsaXppbmcKLSAgICAgKiBhd2F5IG1vcmUgdGhhbiAyNCBob3Vycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgX25vcm1hbGl6ZVRpbWUoKQotICAgIHsKLSAgICAgICAgbG9uZyBjYXJyeSA9IDA7Ci0gICAgICAgIGxvbmcgdGVtcDsKLQotICAgICAgICAvLyBmcmFjdGlvbnMKLSAgICAgICAgaWYgKF9mcyAhPSBudWxsICYmIChfZnMuc2lnbnVtKCkgPCAwIHx8IF9mcy5jb21wYXJlVG8oR0RhdGUuX29uZSkgPj0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmRjYXJyeSA9IF9mcy5zZXRTY2FsZSgwLCBCaWdEZWNpbWFsLlJPVU5EX0ZMT09SKTsKLSAgICAgICAgICAgIF9mcyA9IF9mcy5zdWJ0cmFjdChiZGNhcnJ5KTsKLSAgICAgICAgICAgIGNhcnJ5ID0gYmRjYXJyeS5sb25nVmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYXJyeSAhPSAwIHx8IF9zIDwgMCB8fCBfcyA+IDU5IHx8IF9tIDwgMCB8fCBfbSA+IDUwIHx8IF9oIDwgMCB8fCBfaCA+IDIzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZWNvbmRzCi0gICAgICAgICAgICB0ZW1wID0gX3MgKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCA2MCk7Ci0gICAgICAgICAgICBfcyA9IF9tb2QodGVtcCwgNjAsIGNhcnJ5KTsKLQotICAgICAgICAgICAgLy8gbWludXRlcwotICAgICAgICAgICAgdGVtcCA9IF9tICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgNjApOwotICAgICAgICAgICAgX20gPSBfbW9kKHRlbXAsIDYwLCBjYXJyeSk7Ci0KLSAgICAgICAgICAgIC8vIGhvdXJzCi0gICAgICAgICAgICB0ZW1wID0gX2ggKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCAyNCk7Ci0gICAgICAgICAgICBfaCA9IF9tb2QodGVtcCwgMjQsIGNhcnJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYXJyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZ2l2ZW4gZHVyYXRpb24gdG8gdGhlIGRhdGUvdGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2lnbiArMSB0byBhZGQsIC0xIHRvIHN1YnRyYWN0Ci0gICAgICogQHBhcmFtIHllYXIgdGhlIG51bWJlciBvZiB5ZWFycyB0byBhZGQKLSAgICAgKiBAcGFyYW0gbW9udGggdGhlIG51bWJlciBvZiBtb250aHMgdG8gYWRkCi0gICAgICogQHBhcmFtIGRheSB0aGUgbnVtYmVyIG9mIGRheXMgdG8gYWRkCi0gICAgICogQHBhcmFtIGhvdXIgdGhlIG51bWJlciBvZiBob3VycyB0byBhZGQKLSAgICAgKiBAcGFyYW0gbWludXRlIHRoZSBudW1iZXIgb2YgbWludXRlcyB0byBhZGQKLSAgICAgKiBAcGFyYW0gc2Vjb25kIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBhZGQKLSAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGhlIG51bWJlciBvZiBmcmFjdGlvbmFsIHNlY29uZHMgdG8gYWRkIChtYXkgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREdXJhdGlvbihpbnQgc2lnbiwgaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgQmlnRGVjaW1hbCBmcmFjdGlvbikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gdGltZW1hdGggPSBob3VyICE9IDAgfHwgbWludXRlICE9IDAgfHwgc2Vjb25kICE9IDAgfHwgZnJhY3Rpb24gIT0gbnVsbCAmJiBmcmFjdGlvbi5zaWdudW0oKSAhPSAwOwotICAgICAgICBpZiAodGltZW1hdGggJiYgIWhhc1RpbWUoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBkbyB0aW1lIG1hdGggd2l0aG91dCBhIGNvbXBsZXRlIHRpbWUiKTsKLSAgICAgICAgYm9vbGVhbiBkYXRlbWF0aCA9IGhhc0RheSgpICYmIChkYXkgIT0gMCB8fCB0aW1lbWF0aCk7Ci0gICAgICAgIGlmIChkYXRlbWF0aCAmJiAhaGFzRGF0ZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGRvIGRhdGUgbWF0aCB3aXRob3V0IGEgY29tcGxldGUgZGF0ZSIpOwotCi0gICAgICAgIGludCB0ZW1wOwotCi0gICAgICAgIC8vIG1vbnRocyArIHllYXJzIGFyZSBlYXN5Ci0gICAgICAgIGlmIChtb250aCAhPSAwIHx8IHllYXIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgX0QgdG8gYmUgcGVnZ2VkIGJlZm9yZSBjaGFuZ2luZyBtb250aAotICAgICAgICAgICAgaWYgKGhhc0RheSgpKQotICAgICAgICAgICAgICAgIF9ub3JtYWxpemVEYXRlKCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBtb250aHMgYW5kIHllYXJzCi0gICAgICAgICAgICB0ZW1wID0gX00gKyBzaWduICogbW9udGg7Ci0gICAgICAgICAgICBfTSA9IF9tb2R1bG8odGVtcCwgMSwgMTMpOwotICAgICAgICAgICAgX0NZID0gX0NZICsgc2lnbiAqIHllYXIgKyAoaW50KV9mUXVvdGllbnQodGVtcCwgMSwgMTMpOwotCi0gICAgICAgICAgICAvLyBJbiBuZXcgbW9udGgsIGRheSBtYXkgbmVlZCB0byBiZSBwZWdnZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgICAgIGlmIChoYXNEYXkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoX0QgPj0gMSk7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IF9tYXhEYXlJbk1vbnRoRm9yKF9DWSwgX00pOwotICAgICAgICAgICAgICAgIGlmIChfRCA+IHRlbXApCi0gICAgICAgICAgICAgICAgICAgIF9EID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgY2FycnkgPSAwOwotCi0gICAgICAgIGlmICh0aW1lbWF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZnJhY3Rpb25zCi0gICAgICAgICAgICBpZiAoZnJhY3Rpb24gIT0gbnVsbCAmJiBmcmFjdGlvbi5zaWdudW0oKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZnMuc2lnbnVtKCkgPT0gMCAmJiBzaWduID09IDEpCi0gICAgICAgICAgICAgICAgICAgIF9mcyA9IGZyYWN0aW9uOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX2ZzID0gKHNpZ24gPT0gMSkgPyBfZnMuYWRkKGZyYWN0aW9uKSA6IF9mcy5zdWJ0cmFjdChmcmFjdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzCi0gICAgICAgICAgICBfcyArPSBzaWduICogc2Vjb25kOwotICAgICAgICAgICAgX20gKz0gc2lnbiAqIG1pbnV0ZTsKLSAgICAgICAgICAgIF9oICs9IHNpZ24gKiBob3VyOwotCi0gICAgICAgICAgICAvLyBub3JtYWxpemUgdGltZQotICAgICAgICAgICAgY2FycnkgPSBfbm9ybWFsaXplVGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGVtYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkYXlzOiBtYXkgcmVxdWlyZSByZW5vcm1hbGl6YXRpb24KLSAgICAgICAgICAgIF9EICs9IHNpZ24gKiBkYXkgKyBjYXJyeTsKLSAgICAgICAgICAgIF9ub3JtYWxpemVEYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiB7eWVhcixtb250aH0gY29tcHV0ZXMgbWF4aW11bQotICAgICAqIG51bWJlciBvZiBkYXlzIGZvciBnaXZlbiBtb250aAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBfbWF4RGF5SW5Nb250aEZvcihpbnQgeWVhciwgaW50IG1vbnRoKQotICAgIHsKLSAgICAgICAgaWYgKG1vbnRoID09IDQgfHwgbW9udGggPT0gNiB8fCBtb250aCA9PSA5IHx8IG1vbnRoID09IDExKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotCi0gICAgICAgIGlmIChtb250aCA9PSAyKQotICAgICAgICAgICAgcmV0dXJuIChfaXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjgpOwotCi0gICAgICAgIHJldHVybiAzMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiB7eWVhcixtb250aH0gY29tcHV0ZXMgbWF4aW11bQotICAgICAqIG51bWJlciBvZiBkYXlzIGZvciBnaXZlbiBtb250aAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBfbWF4RGF5SW5Nb250aChpbnQgbW9udGgpCi0gICAgewotICAgICAgICBpZiAobW9udGggPT0gNCB8fCBtb250aCA9PSA2IHx8IG1vbnRoID09IDkgfHwgbW9udGggPT0gMTEpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0KLSAgICAgICAgaWYgKG1vbnRoID09IDIpCi0gICAgICAgICAgICByZXR1cm4gMjk7Ci0KLSAgICAgICAgcmV0dXJuIDMxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEp1bGlhbiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBHcmVnb3JpYW4gZGF0ZS4KLSAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCi0gICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEp1bGlhbkRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGp1bGlhbkRhdGVGb3JHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEdyZWdvcmlhbiBkYXRlIGJhc2VkIG9uIHRoZSBnaXZlbiBKdWxpYW4gZGF0ZS4KLSAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCi0gICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ganVsaWFuZGF5IHRoZSBqdWxpYW4gZGF5IG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEp1bGlhbkRhdGUoaW50IGp1bGlhbmRheSkKLSAgICB7Ci0gICAgICAgIGlmIChqdWxpYW5kYXkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0ZSBiZWZvcmUgeWVhciAtNDcxMiIpOwotCi0gICAgICAgIGludCB0ZW1wOwotICAgICAgICBpbnQgcWVwb2M7Ci0KLSAgICAgICAgLy8gZnJvbSBodHRwOi8vYWEudXNuby5uYXZ5Lm1pbC9mYXEvZG9jcy9KRF9Gb3JtdWxhLmh0bWwKLSAgICAgICAgdGVtcCA9IGp1bGlhbmRheSArIDY4NTY5OwotICAgICAgICBxZXBvYyA9IDQgKiB0ZW1wIC8gMTQ2MDk3OwotICAgICAgICB0ZW1wID0gdGVtcCAtICgxNDYwOTcgKiBxZXBvYyArIDMpIC8gNDsKLSAgICAgICAgX0NZID0gNDAwMCAqICh0ZW1wICsgMSkgLyAxNDYxMDAxOwotICAgICAgICB0ZW1wID0gdGVtcCAtIDE0NjEgKiBfQ1kgLyA0ICsgMzE7Ci0gICAgICAgIF9NID0gODAgKiB0ZW1wIC8gMjQ0NzsKLSAgICAgICAgX0QgPSB0ZW1wIC0gMjQ0NyAqIF9NIC8gODA7Ci0gICAgICAgIHRlbXAgPSBfTSAvIDExOwotICAgICAgICBfTSA9IF9NICsgMiAtIDEyICogdGVtcDsKLSAgICAgICAgX0NZID0gMTAwICogKHFlcG9jIC0gNDkpICsgX0NZICsgdGVtcDsKLQotICAgICAgICBfYml0cyB8PSBIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVI7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRpbWUgYW5kIGRhdGUgYmFzZWQgb24gYSBqYXZhLnV0aWwuRGF0ZSBpbnN0YW5jZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdGltZXpvbmUgb2Zmc2V0IHVzZWQgaXMgYmFzZWQgb24gdGhlIGRlZmF1bHQgVGltZVpvbmUuIChUaGUKLSAgICAgKiBkZWZhdWx0IFRpbWVab25lIGlzIGNvbnN1bHRlZCB0byBpbmNvcnBvcmF0ZSBkYXlsaWdodCBzYXZpbmdzIG9mZnNldHMKLSAgICAgKiBpZiBhcHBsaWNhYmxlIGZvciB0aGUgY3VycmVudCBkYXRlIGFzIHdlbGwgYXMgdGhlIGJhc2UgdGltZXpvbmUgb2Zmc2V0LikKLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBub3JtYWxpemUgdGhlIHRpbWV6b25lLCBlLmcuLCB0byBVVEMsIGZvbGxvdyB0aGlzIHdpdGgKLSAgICAgKiBhIGNhbGwgdG8gbm9ybWFsaXplVG9UaW1lWm9uZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0ZSB0aGUgRGF0ZSBvYmplY3QgdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgLy8gRGVmYXVsdCB0aW1lem9uZQotICAgICAgICBUaW1lWm9uZSBkdHogPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIGludCBvZmZzZXQgPSBkdHouZ2V0T2Zmc2V0KGRhdGUuZ2V0VGltZSgpKTsKLSAgICAgICAgaW50IG9mZnNldHNpZ24gPSAxOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgb2Zmc2V0c2lnbiA9IC0xOwotICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBpbnQgb2Zmc2V0bWluID0gb2Zmc2V0IC8gKDEwMDAgKiA2MCk7Ci0gICAgICAgIGludCBvZmZzZXRociA9IG9mZnNldG1pbiAvIDYwOwotICAgICAgICBvZmZzZXRtaW4gPSBvZmZzZXRtaW4gLSBvZmZzZXRociAqIDYwOwotCi0gICAgICAgIHNldFRpbWVab25lKG9mZnNldHNpZ24sIG9mZnNldGhyLCBvZmZzZXRtaW4pOwotICAgICAgICAKLSAgICAgICAgLy8gcGFyYW5vaWE6IHR6LmdldE9mZnNldCBjYW4gcmV0dXJuIGZyYWN0aW9ucyBvZiBtaW51dGVzLCBidXQgd2UgbXVzdCByb3VuZAotICAgICAgICBpbnQgcm91bmRlZG9mZnNldCA9IG9mZnNldHNpZ24gKiAob2Zmc2V0aHIgKiA2MCArIG9mZnNldG1pbikgKiA2MCAqIDEwMDA7Ci0KLSAgICAgICAgLy8gbWlkbmlnaHQKLSAgICAgICAgc2V0VGltZSgwLCAwLCAwLCBHRGF0ZS5femVybyk7Ci0KLSAgICAgICAgLy8gU2V0IHRvIEphbnVhcnkgMSwgMTk3MC4KLSAgICAgICAgLy8gc2V0SnVsaWFuRGF0ZSgyNDQwNTg4KTsKLSAgICAgICAgX2JpdHMgfD0gSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSOwotICAgICAgICBfQ1kgPSAxOTcwOwotICAgICAgICBfTSA9IDE7Ci0gICAgICAgIF9EID0gMTsKLQotICAgICAgICAvLyBBZGQgYSBkdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgYWRkR0R1cmF0aW9uKG5ldyBHRHVyYXRpb24oMSwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLnZhbHVlT2YoZGF0ZS5nZXRUaW1lKCkgKyByb3VuZGVkb2Zmc2V0LCAzKSkpOwotCi0gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogc3MuMDAwIC0+IHNzCi0gICAgICAgIGlmIChfZnMuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIF9mcyA9IEdEYXRlLl96ZXJvOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBHRGF0ZVNwZWNpZmljYXRpb24sIGNvbXBsZXRlbHkgcmVwbGFjaW5nIHRoZSBjdXJyZW50Ci0gICAgICogaW5mb3JtYXRpb24gaW4gdGhpcyBHRGF0ZUJ1aWxkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGdkYXRlIHRoZSBHRGF0ZVNwZWNpZmljYXRpb24gdG8gY29weQotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZ2RhdGUpCi0gICAgewotICAgICAgICBfYml0cyA9IGdkYXRlLmdldEZsYWdzKCkgJiAoSEFTX1RJTUVaT05FIHwgSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUpOwotICAgICAgICBfQ1kgPSBnZGF0ZS5nZXRZZWFyKCk7Ci0gICAgICAgIF9NID0gZ2RhdGUuZ2V0TW9udGgoKTsKLSAgICAgICAgX0QgPSBnZGF0ZS5nZXREYXkoKTsKLSAgICAgICAgX2ggPSBnZGF0ZS5nZXRIb3VyKCk7Ci0gICAgICAgIF9tID0gZ2RhdGUuZ2V0TWludXRlKCk7Ci0gICAgICAgIF9zID0gZ2RhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgIF9mcyA9IGdkYXRlLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgIF90enNpZ24gPSBnZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKTsKLSAgICAgICAgX3R6aCA9IGdkYXRlLmdldFRpbWVab25lSG91cigpOwotICAgICAgICBfdHptID0gZ2RhdGUuZ2V0VGltZVpvbmVNaW51dGUoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGltZSBhcyBhbiB7QGxpbmsgWG1sQ2FsZW5kYXJ9LgotICAgICAqIDxwPgotICAgICAqIHtAbGluayBYbWxDYWxlbmRhcn0gaXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyfQotICAgICAqIHdoaWNoIGlzIHNsaWdodGx5IGN1c3RvbWl6ZWQgdG8gbWF0Y2ggWE1MIHNjaGVtYSBkYXRlIHJ1bGVzLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGhhcyBvbmx5IHRob3NlIHRpbWUgYW5kIGRhdGUgZmllbGRzCi0gICAgICogc2V0IHRoYXQgYXJlIHJlZmxlY3RlZCBpbiB0aGUgR0RhdGUgb2JqZWN0LiAgQmVjYXVzZSBvZiB0aGUgd2F5IHRoZQotICAgICAqIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnRyYWN0IHdvcmtzLCBhbnkgaW5mb3JtYXRpb24gaW4gdGhlIGlzU2V0KCkgdmFuaXNoZXMKLSAgICAgKiBhcyBzb29uIGFzIHlvdSB2aWV3IGFueSB1bnNldCBmaWVsZCB1c2luZyBnZXQoKSBtZXRob2RzLgotICAgICAqIFRoaXMgbWVhbnMgdGhhdCBpZiBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB3aGljaCBkYXRlIGZpZWxkcwotICAgICAqIGFyZSBzZXQsIHlvdSBtdXN0IGNhbGwgaXNTZXQoKSBmaXJzdCBiZWZvcmUgZ2V0KCkuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyIGdldENhbGVuZGFyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sQ2FsZW5kYXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGEgamF2YS51dGlsLkRhdGUKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkYXRlRm9yR0RhdGUodGhpcyk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGp1bGlhbkRhdGVGb3JHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmICghZGF0ZS5oYXNEYXRlKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgZG8gZGF0ZSBtYXRoIHdpdGhvdXQgYSBjb21wbGV0ZSBkYXRlIik7Ci0KLSAgICAgICAgLy8gZnJvbSBodHRwOi8vYWEudXNuby5uYXZ5Lm1pbC9mYXEvZG9jcy9KRF9Gb3JtdWxhLmh0bWwKLSAgICAgICAgaW50IHJlc3VsdCA9IGRhdGUuZ2V0RGF5KCktMzIwNzUrMTQ2MSooZGF0ZS5nZXRZZWFyKCkrNDgwMCsoZGF0ZS5nZXRNb250aCgpLTE0KS8xMikvNCsKLSAgICAgICAgICAgIDM2NyooZGF0ZS5nZXRNb250aCgpLTItKGRhdGUuZ2V0TW9udGgoKS0xNCkvMTIqMTIpLzEyLTMqKChkYXRlLmdldFllYXIoKSs0OTAwKyhkYXRlLmdldE1vbnRoKCktMTQpLzEyKS8xMDApLzQ7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRlIHRvbyBmYXIgaW4gdGhlIHBhc3QgKHllYXIgYWxsb3dlZCB0byAtNDcxMikiKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIERhdGUgZGF0ZUZvckdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgbG9uZyBqRGF0ZSA9IGp1bGlhbkRhdGVGb3JHRGF0ZShkYXRlKTsKLSAgICAgICAgbG9uZyB0bzE5NzBEYXRlID0gakRhdGUgLSAyNDQwNTg4OwotICAgICAgICBsb25nIHRvMTk3ME1zID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIHRvMTk3MERhdGU7Ci0KLSAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRNaWxsaXNlY29uZCgpOwotICAgICAgICB0bzE5NzBNcyArPSBkYXRlLmdldFNlY29uZCgpICogMTAwMDsKLSAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRNaW51dGUoKSAqIDYwICogMTAwMDsKLSAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRIb3VyKCkgKiA2MCAqIDYwICogMTAwMDsKLSAgICAgICAgaWYgKGRhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdG8xOTcwTXMgLT0gKGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSAqIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkpICogNjAgKiAxMDAwOwotICAgICAgICAgICAgdG8xOTcwTXMgLT0gKGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgKiBkYXRlLmdldFRpbWVab25lU2lnbigpKSAqIDYwICogNjAgKiAxMDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgVGltZVpvbmUgZGVmID0gVGltZVpvbmUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IGRlZi5nZXRPZmZzZXQodG8xOTcwTXMpOwotICAgICAgICAgICAgdG8xOTcwTXMgLT0gb2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRvMTk3ME1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGZvciBsZWFwIHllYXJzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gX2lzTGVhcFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICAvLyBCVUdCVUc6IEp1bGlhbiBjYWxlbmRhcj8KLSAgICAgICAgcmV0dXJuICgoeWVhciAlIDQgPT0gMCkgJiYgKCh5ZWFyICUgMTAwICE9IDApIHx8ICh5ZWFyICUgNDAwID09IDApKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZlF1b3RpZW50KGEsIGIpID0gdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEvYgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgX2ZRdW90aWVudChsb25nIGEsIGludCBiKQotICAgIHsKLSAgICAgICAgaWYgKChhIDwgMCkgPT0gKGIgPCAwKSkKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLQotICAgICAgICByZXR1cm4gLSgoYiAtIGEgLSAxKSAvIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZHVsbyhhLCBiKSA9IGEgLSBmUXVvdGllbnQoYSxiKSpiCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9tb2QobG9uZyBhLCBpbnQgYiwgbG9uZyBxdW90aWVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KShhIC0gcXVvdGllbnQqYikgOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZHVsbyhhIC0gbG93LCBoaWdoIC0gbG93KSArIGxvdwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfbW9kdWxvKGxvbmcgdGVtcCwgaW50IGxvdywgaW50IGhpZ2gpCi0gICAgewotICAgICAgICBsb25nIGEgPSB0ZW1wIC0gbG93OwotICAgICAgICBpbnQgYiA9IGhpZ2ggLSBsb3c7Ci0gICAgICAgIHJldHVybiAoX21vZChhLCBiLCBfZlF1b3RpZW50KGEsIGIpKSArIGxvdykgOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1b3RpZW50KGEgLSBsb3csIGhpZ2ggLSBsb3cpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBfZlF1b3RpZW50KGxvbmcgdGVtcCwgaW50IGxvdywgaW50IGhpZ2gpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZRdW90aWVudCh0ZW1wIC0gbG93LCBoaWdoIC0gbG93KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRvIHRoZSBmaXJzdCBwb3NzaWJsZSBtb21lbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbgotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9zZXRUb0ZpcnN0TW9tZW50KCkKLSAgICB7Ci0gICAgICAgIC8vIDE1ODQgd2FzIHRoZSBmaXJzdCBsZWFwIHllYXIgZHVyaW5nIHdoaWNoIHRoZSBHcmVnb3JpYW4KLSAgICAgICAgLy8gY2FsZW5kYXIgd2FzIGluIHVzZTogc2VlbXMgbGlrZSB0aGUgbW9zdCByZWFzb25hYmxlICJmaXJzdCIKLSAgICAgICAgLy8geWVhciB0byB1c2UgaW4gYWJzZW5jZSBvZiBhIHllYXIuCi0KLSAgICAgICAgaWYgKCFoYXNZZWFyKCkpCi0gICAgICAgICAgICBzZXRZZWFyKDE1ODQpOwotCi0gICAgICAgIGlmICghaGFzTW9udGgoKSkKLSAgICAgICAgICAgIHNldE1vbnRoKDEpOwotCi0gICAgICAgIGlmICghaGFzRGF5KCkpCi0gICAgICAgICAgICBzZXREYXkoMSk7Ci0KLSAgICAgICAgaWYgKCFoYXNUaW1lKCkpCi0gICAgICAgICAgICBzZXRUaW1lKDAsIDAsIDAsIEdEYXRlLl96ZXJvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0RhdGUuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5SZXR1cm5zIC0xIGlmIHRoaXMgPCBkYXRlLiAobGVzcy10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDAgaWYgdGhpcyA9PSBkYXRlLiAoZXF1YWwpCi0gICAgICogPGxpPlJldHVybnMgMSBpZiB0aGlzID4gZGF0ZS4gKGdyZWF0ZXItdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAyIGlmIHRoaXMgPD4gZGF0ZS4gKGluY29tcGFyYWJsZSkKLSAgICAgKiA8L3VsPgotICAgICAqIFR3byBpbnN0YW5jZXMgYXJlIGluY29tcGFyYWJsZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IGFtb3VudHMKLSAgICAgKiBvZiBpbmZvcm1hdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0ZXNwZWMgdGhlIGRhdGUgdG8gY29tcGFyZSBhZ2FpbnN0Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG9HRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZXNwZWMpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZUdEYXRlKHRoaXMsIGRhdGVzcGVjKTsKLSAgICB9Ci0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBjb21wYXJlR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIHRkYXRlLCBHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZXNwZWMpCi0gICAgewotICAgICAgICAvLyBzYW1lIGFtb3VudCBvZiBpbmZvcm1hdGlvbjogbG9va3MgZ29vZAotICAgICAgICBpbnQgYml0ZGlmZiA9IHRkYXRlLmdldEZsYWdzKCkgXiBkYXRlc3BlYy5nZXRGbGFncygpOwotCi0gICAgICAgIGVhc3k6IGlmICgoYml0ZGlmZiAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRSB8IEhBU19USU1FWk9ORSkpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBvdGhlciBkYXRlIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgICAgICAgIC8vIG91ciB0aW1lem9uZSwgbWFrZSBhIGNsb25lIGFuZCBkbyBzbyBpZiBwb3NzaWJsZQotICAgICAgICAgICAgaWYgKHRkYXRlLmhhc1RpbWVab25lKCkgJiYKLSAgICAgICAgICAgICAgICAoZGF0ZXNwZWMuZ2V0VGltZVpvbmVIb3VyKCkgIT0gdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgfHwKLSAgICAgICAgICAgICAgICAgZGF0ZXNwZWMuZ2V0VGltZVpvbmVNaW51dGUoKSAhPSB0ZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpIHx8Ci0gICAgICAgICAgICAgICAgIGRhdGVzcGVjLmdldFRpbWVab25lU2lnbigpICE9IHRkYXRlLmdldFRpbWVab25lU2lnbigpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRlc3BlYyA9IG5ldyBHRGF0ZUJ1aWxkZXIoZGF0ZXNwZWMpOwotCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gdGRhdGUuZ2V0RmxhZ3MoKSAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkpOwotICAgICAgICAgICAgICAgIGlmIChmbGFncyAhPSAwICYmIGZsYWdzICE9IChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkpIHx8ICF0ZGF0ZS5oYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGVzZSBjYXNlcyB3ZSdsbCBuZWVkIHRvIGZpbGwgaW4gZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICgoR0RhdGVCdWlsZGVyKWRhdGVzcGVjKS5fc2V0VG9GaXJzdE1vbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB0ZGF0ZSA9IG5ldyBHRGF0ZUJ1aWxkZXIodGRhdGUpOwotICAgICAgICAgICAgICAgICAgICAoKEdEYXRlQnVpbGRlcil0ZGF0ZSkuX3NldFRvRmlyc3RNb21lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAoKEdEYXRlQnVpbGRlcilkYXRlc3BlYykubm9ybWFsaXplVG9UaW1lWm9uZSh0ZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSwgdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCksIHRkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb21wYXJlIGJ5IGZpZWxkCi0gICAgICAgICAgICByZXR1cm4gZmllbGR3aXNlQ29tcGFyZSh0ZGF0ZSwgZGF0ZXNwZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGlmZmVyZW50IGFtb3VudHMgb2YgaW5mb3JtYXRpb24gKGV4Y2VwdCB0aW1lem9uZSk6IG5vdCBjb21wYXJhYmxlCi0gICAgICAgIGlmICgoYml0ZGlmZiAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRSkpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICAvLyBUaGUgc2NoZW1hIHNwZWMgc2F5cyB3ZSBzaG91bGQgdHJ5IHRvIGNvbXBhcmUgd2l0aC10aW1lem9uZSBhbmQKLSAgICAgICAgLy8gd2l0aG91dC10aW1lem9uZSBzcGVjaWZpY2F0aW9ucy4uLiBXZWxsLCBPSywgc3VyZSwgaWYgdGhleSBzYXkgc28uCi0KLSAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHRpbWV6b25lIGJ1dCB0aGUgb3RoZXIgZG9lczogcmV2ZXJzZSB0aGUgY2FsbAotICAgICAgICBpZiAoIXRkYXRlLmhhc1RpbWVab25lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlR0RhdGUoZGF0ZXNwZWMsIHRkYXRlKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gMiA/IDIgOiAtcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHRkYXRlIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhIHRpbWV6b25lIGFuZCBkYXRlc3BlYyBub3QuCi0KLSAgICAgICAgLy8gVG8gbXVjayB3aXRoIHRoZSB0aW1lcywgbWFrZSBjbG9uZXMKLSAgICAgICAgR0RhdGVCdWlsZGVyIHBkYXRlID0gbmV3IEdEYXRlQnVpbGRlcih0ZGF0ZSk7Ci0KLSAgICAgICAgLy8gVG8gY292ZXIgdGhlIG9uZSB1bmNvdmVyZWQgY2FzZTogaWYgb25lIGRhdGUgaXMgMDIvMjggYW5kIHRoZQotICAgICAgICAvLyBvdGhlciBkYXRlIGlzIDAzLzAxLCBzaGlmdCBkYXlzIGNsb3NlciBieSBvbmUgdG8gc2ltdWxhdGUgYmVpbmcKLSAgICAgICAgLy8gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCB3aXRoaW4gYSBsZWFwIHllYXIKLSAgICAgICAgaWYgKCh0ZGF0ZS5nZXRGbGFncygpICYgKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSkpID09IChIQVNfTU9OVEggfCBIQVNfREFZKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRkYXRlLmdldERheSgpID09IDI4ICYmIHRkYXRlLmdldE1vbnRoKCkgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0ZXNwZWMuZ2V0RGF5KCkgPT0gMDEgJiYgZGF0ZXNwZWMuZ2V0TW9udGgoKSA9PSAzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGRhdGUuc2V0RGF5KDI5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChkYXRlc3BlYy5nZXREYXkoKSA9PSAyOCAmJiBkYXRlc3BlYy5nZXRNb250aCgpID09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRkYXRlLmdldERheSgpID09IDAxICYmIHRkYXRlLmdldE1vbnRoKCkgPT0gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBkYXRlLnNldE1vbnRoKDAyKTsKLSAgICAgICAgICAgICAgICAgICAgcGRhdGUuc2V0RGF5KDI5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3IgdGltZXNwYW5zLCBjb21wYXJlIGJ5IGZpcnN0IGluc3RhbnQgb2YgdGltZQotICAgICAgICAvLyBwb3NzaWJsZS4gVGhlcmVmb3JlLCBmaWxsIGluIE1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE1ODQgKGEgbGVhcCB5ZWFyKQotICAgICAgICAvLyBpbiBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLgotICAgICAgICBwZGF0ZS5fc2V0VG9GaXJzdE1vbWVudCgpOwotCi0gICAgICAgIC8vIFAgPCBRIGlmIFAgPCAoUSB3aXRoIHRpbWUgem9uZSArMTQ6MDApCi0gICAgICAgIEdEYXRlQnVpbGRlciBxcGx1c2RhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKGRhdGVzcGVjKTsKLSAgICAgICAgcXBsdXNkYXRlLl9zZXRUb0ZpcnN0TW9tZW50KCk7Ci0gICAgICAgIHFwbHVzZGF0ZS5zZXRUaW1lWm9uZSgxLCAxNCwgMCk7Ci0gICAgICAgIHFwbHVzZGF0ZS5ub3JtYWxpemVUb1RpbWVab25lKHRkYXRlLmdldFRpbWVab25lU2lnbigpLCB0ZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSwgdGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgIGlmIChmaWVsZHdpc2VDb21wYXJlKHBkYXRlLCBxcGx1c2RhdGUpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIC8vIFAgPiBRIGlmIFAgPiAoUSB3aXRoIHRpbWUgem9uZSAtMTQ6MDApCi0gICAgICAgIEdEYXRlQnVpbGRlciBxbWludXNkYXRlID0gcXBsdXNkYXRlOwotICAgICAgICBxbWludXNkYXRlLnNldEdEYXRlKGRhdGVzcGVjKTsKLSAgICAgICAgcW1pbnVzZGF0ZS5fc2V0VG9GaXJzdE1vbWVudCgpOwotICAgICAgICBxbWludXNkYXRlLnNldFRpbWVab25lKC0xLCAxNCwgMCk7Ci0gICAgICAgIHFtaW51c2RhdGUubm9ybWFsaXplVG9UaW1lWm9uZSh0ZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSwgdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCksIHRkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICBpZiAoZmllbGR3aXNlQ29tcGFyZShwZGF0ZSwgcW1pbnVzZGF0ZSkgPT0gMSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIC8vIFAgPD4gUSBvdGhlcndpc2UKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyBhIHNpbXBsZSBtb3N0LXNpZ25pZmljYW50LWRpZ2l0LWZpcnN0IGNvbXBhcmlzb24sCi0gICAgICogaWdub3JpbmcgYW55IHRpbWV6b25lIG9yIGhhcy9kb2Vzbid0IGhhdmUgaXNzdWVzLgotICAgICAqIFRoZSBkYXRhIG11c3QgaGF2ZSBiZWVuIGRpZ2VzdGVkIGZpcnN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBmaWVsZHdpc2VDb21wYXJlKEdEYXRlU3BlY2lmaWNhdGlvbiB0ZGF0ZSwgR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCi0gICAgewotICAgICAgICBpZiAodGRhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgQ1kgPSBkYXRlLmdldFllYXIoKTsKLSAgICAgICAgICAgIGludCBUQ1kgPSB0ZGF0ZS5nZXRZZWFyKCk7Ci0gICAgICAgICAgICBpZiAoVENZIDwgQ1kpIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChUQ1kgPiBDWSkgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRkYXRlLmhhc01vbnRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBNID0gZGF0ZS5nZXRNb250aCgpOwotICAgICAgICAgICAgaW50IFRNID0gdGRhdGUuZ2V0TW9udGgoKTsKLSAgICAgICAgICAgIGlmIChUTSA8IE0pIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChUTSA+IE0pIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZGF0ZS5oYXNEYXkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IEQgPSBkYXRlLmdldERheSgpOwotICAgICAgICAgICAgaW50IFREID0gdGRhdGUuZ2V0RGF5KCk7Ci0gICAgICAgICAgICBpZiAoVEQgPCBEKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAoVEQgPiBEKSByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGRhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaCA9IGRhdGUuZ2V0SG91cigpOwotICAgICAgICAgICAgaW50IHRoID0gdGRhdGUuZ2V0SG91cigpOwotICAgICAgICAgICAgaWYgKHRoIDwgaCkgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKHRoID4gaCkgcmV0dXJuIDE7Ci0gICAgICAgICAgICBpbnQgbSA9IGRhdGUuZ2V0TWludXRlKCk7Ci0gICAgICAgICAgICBpbnQgdG0gPSB0ZGF0ZS5nZXRNaW51dGUoKTsKLSAgICAgICAgICAgIGlmICh0bSA8IG0pIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmICh0bSA+IG0pIHJldHVybiAxOwotICAgICAgICAgICAgaW50IHMgPSBkYXRlLmdldFNlY29uZCgpOwotICAgICAgICAgICAgaW50IHRzID0gdGRhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgICAgICBpZiAodHMgPCBzKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAodHMgPiBzKSByZXR1cm4gMTsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBkYXRlLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIHRmcyA9IHRkYXRlLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodGZzID09IG51bGwgJiYgZnMgPT0gbnVsbCkgcmV0dXJuIDA7Ci0gICAgICAgICAgICByZXR1cm4gKHRmcyA9PSBudWxsID8gR0RhdGUuX3plcm8gOiB0ZnMpLmNvbXBhcmVUbyhmcyA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWlsdGluIHR5cGUgY29kZSBmb3IgdGhlIHNoYXBlIG9mIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlLCBvciAwIGlmIHRoZQotICAgICAqIGluc3RhbmNlIGRvZXNuJ3QgY29udGFpbiBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEKLSAgICAgKiBTY2hlbWEgdHlwZS4KLSAgICAgKiA8cD4gCi0gICAgICogVmFsdWUgd2lsbCBiZSBlcXVhbCB0bwotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19OT1RfQlVJTFRJTn0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUn0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUl9NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEVfVElNRX0sIG9yCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX1RJTUV9LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBidGNGb3JGbGFncyhfYml0cyk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGJ0Y0ZvckZsYWdzKGludCBmbGFncykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZmxhZ3MgJiAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX1lFQVI7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSIHwgSEFTX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg7Ci0gICAgICAgICAgICBjYXNlIEhBU19NT05USDoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19NT05USDsKLSAgICAgICAgICAgIGNhc2UgSEFTX01PTlRIIHwgSEFTX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk7Ci0gICAgICAgICAgICBjYXNlIEhBU19EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0dfREFZOwotICAgICAgICAgICAgY2FzZSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0RBVEU7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU7Ci0gICAgICAgICAgICBjYXNlIEhBU19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19USU1FOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGZpZWxkcyBpbiB0aGlzIEdEYXRlQnVpbGRlciB0aGF0IGFyZSBub3QgYXBwbGljYWJsZQotICAgICAqIGZvciB0aGUgZ2l2ZW4gU2NoZW1hVHlwZSBkYXRlIGNvZGUuICBUaGUgY29kZSBzaG91bGQgYmUKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEhfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURV9USU1FfSwgb3IKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfVElNRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVDb2RlIHRoZSB0eXBlIGNvZGUgdG8gYXBwbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsdGluVHlwZUNvZGUoaW50IHR5cGVDb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh0eXBlQ29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgLy9IQVNfWUVBUgotICAgICAgICAgICAgICAgIGNsZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICBjbGVhckRheSgpOwotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIC8vSEFTX1lFQVIgfCBIQVNfTU9OVEgKLSAgICAgICAgICAgICAgICBjbGVhckRheSgpOwotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAvL0hBU19NT05USAotICAgICAgICAgICAgICAgIGNsZWFyWWVhcigpOwotICAgICAgICAgICAgICAgIGNsZWFyRGF5KCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgICAgICAvL0hBU19NT05USCB8IEhBU19EQVkKLSAgICAgICAgICAgICAgICBjbGVhclllYXIoKTsKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgIC8vSEFTX0RBWQotICAgICAgICAgICAgICAgIGNsZWFyWWVhcigpOwotICAgICAgICAgICAgICAgIGNsZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgLy9IQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgICAgICAvL0hBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgICAgIC8vSEFTX1RJTUUKLSAgICAgICAgICAgICAgICBjbGVhclllYXIoKTsKLSAgICAgICAgICAgICAgICBjbGVhck1vbnRoKCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJEYXkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvZGVUeXBlIG11c3QgYmUgb25lIG9mIFNjaGVtYVR5cGUgQlRDXyAgREFURSBUSU1FIHJlbGF0ZWQgdHlwZXMuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVEVOID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBTcGVjaWZpYyBtb21lbnRzIG9yCi0gICAgICogdGltZXMtb2YtZGF5IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lIGFyZSBub3JtYWxpemVkIHRvCi0gICAgICogVVRDIHRpbWUgdG8gcHJvZHVjZSBhIGNhbm9uaWNhbCBzdHJpbmcgZm9ybSBmb3IgdGhlbS4KLSAgICAgKiBPdGhlciByZWN1cnJpbmcgdGltZSBzcGVjaWZpY2F0aW9ucyBrZWVwIHRoZWlyIHRpbWV6b25lCi0gICAgICogaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBuZWVkTm9ybWFsaXplID0KLSAgICAgICAgICAgIChoYXNUaW1lWm9uZSgpICYmIGdldFRpbWVab25lU2lnbigpICE9IDAgJiYgaGFzVGltZSgpICYmCi0gICAgICAgICAgICAoKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpKSkpOwotCi0gICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSAmJiBnZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGJpID0gZ2V0RnJhY3Rpb24oKS51bnNjYWxlZFZhbHVlKCk7Ci0gICAgICAgICAgICBuZWVkTm9ybWFsaXplID0gKGJpLm1vZChURU4pLnNpZ251bSgpID09IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFuZWVkTm9ybWFsaXplKQotICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGNkYXRlID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKLSAgICAgICAgY2RhdGUubm9ybWFsaXplKCk7Ci0gICAgICAgIHJldHVybiBjZGF0ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKLSAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBib3RoIHRpbWUgYW5kIHRpbWV6b25lIGFyZSBzcGVjaWZpZWQsIHRoaXMgc3RyaW5nIGlzIG5vdAotICAgICAqIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdW5sZXNzIHRoZSB0aW1lem9uZSBpcyBVVEMgKFopCi0gICAgICogKHNpbmNlIHRoZSBzYW1lIG1vbWVudCBpbiB0aW1lIGNhbiBiZSBleHByZXNzZWQgaW4gZGlmZmVyZW50Ci0gICAgICogdGltZXpvbmVzKS4gVG8gZ2V0IGEgY2Fub25pY2FsIHN0cmluZywgdXNlIHRoZSBjYW5vbmljYWxTdHJpbmcoKQotICAgICAqIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZS5mb3JtYXRHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZVNwZWNpZmljYXRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZVNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkMDc3MS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgU2NoZW1hLWNvbXBhdGlibGUgR3JlZ29yaWFuIGRhdGUuCi0gKiA8cD4KLSAqIEJvdGggdGhlIGltbXV0YWJsZSBHRGF0ZSBhbmQgdGhlIG11dGFibGUgR0RhdGVCdWlsZGVyIGFyZQotICogR0RhdGVTcGVjaWZpY2F0aW9ucy4gIFVzZSB0aGlzIGludGVyZmFjZSB3aGVyZSB5b3Ugd2FudCB0bwotICogYWxsb3cgY2FsbGVycyB0byBwYXNzIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdEYXRlLgotICogCi0gKiBAc2VlIEdEYXRlCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR0RhdGVTcGVjaWZpY2F0aW9uCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGluZGljYXRpbmcgdGhlIGluZm9ybWF0aW9uCi0gICAgICogY29udGFpbmVkIGJ5IHRoaXMgR0RhdGUuICBUaGUgZml2ZSBmbGFncyBhcmUKLSAgICAgKiB7QGxpbmsgI0hBU19USU1FWk9ORX0sIHtAbGluayAjSEFTX1lFQVJ9LCB7QGxpbmsgI0hBU19NT05USH0sCi0gICAgICoge0BsaW5rICNIQVNfREFZfSwgYW5kIHtAbGluayAjSEFTX1RJTUV9LgotICAgICAqLwotICAgIGludCBnZXRGbGFncygpOwotCi0gICAgLyoqIFRpbWV6b25lIGlzIHNwZWNpZmllZC4gU2VlIHtAbGluayAjZ2V0RmxhZ3N9LiAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgSEFTX1RJTUVaT05FID0gMTsKLSAgICAvKiogWWVhciBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19ZRUFSID0gMjsKLSAgICAvKiogTW9udGggb2YgeWVhciBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19NT05USCA9IDQ7Ci0gICAgLyoqIERheSBvZiBtb250aCBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19EQVkgPSA4OwotICAgIC8qKiBUaW1lIG9mIGRheSBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19USU1FID0gMTY7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgR0RhdGUgc3BlY2lmaWNhdGlvbiBpcyBpbW11dGFibGUuIEdEYXRlIHJldHVybnMgdHJ1ZSwKLSAgICAgKiBhbmQgR0RhdGVCdWlsZGVyIHJldHVybnMgZmFsc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIEdEYXRlIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgZ3JlZ29yaWFuIGRhdGUgdmFsdWUKLSAgICAgKiBpbiBYTUwgc2NoZW1hLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWV6b25lLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzVGltZVpvbmUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB5ZWFyLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzWWVhcigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNNb250aCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0RheSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWUtb2YtZGF5LgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzVGltZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0RhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIGludCBnZXRZZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyLiBKYW51YXJ5IGlzIDEuCi0gICAgICovCi0gICAgaW50IGdldE1vbnRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqLwotICAgIGludCBnZXREYXkoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0SG91cigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TWludXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCi0gICAgICovCi0gICAgaW50IGdldFNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIHNpZ24uIEZvciB0aW1lIHpvbmVzIGVhc3Qgb2YgR01ULAotICAgICAqIHRoaXMgaXMgcG9zaXRpdmU7IGZvciB0aW1lIHpvbmVzIHdlc3QsIHRoaXMgaXMgbmVnYXRpdmUuCi0gICAgICovCi0gICAgaW50IGdldFRpbWVab25lU2lnbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIGhvdXIuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIGludCBnZXRUaW1lWm9uZUhvdXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBtaW51dGVzLgotICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKLSAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCi0gICAgICovCi0gICAgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91bmRlZCBtaWxsaXNlY29uZCB2YWx1ZS4gUmFuZ2UgZnJvbSAwIHRvIDk5OQotICAgICAqLwotICAgIGludCBnZXRNaWxsaXNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSnVsaWFuIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIEdyZWdvcmlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqLwotICAgIGludCBnZXRKdWxpYW5EYXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYW4ge0BsaW5rIFhtbENhbGVuZGFyfS4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcn0KLSAgICAgKiB3aGljaCBpcyBzbGlnaHRseSBjdXN0b21pemVkIHRvIG1hdGNoIFhNTCBzY2hlbWEgZGF0ZSBydWxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFhtbENhbGVuZGFyfSBoYXMgb25seSB0aG9zZSB0aW1lIGFuZCBkYXRlIGZpZWxkcwotICAgICAqIHNldCB0aGF0IGFyZSByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlIG9iamVjdC4gIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKLSAgICAgKiB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb250cmFjdCB3b3JrcywgYW55IGluZm9ybWF0aW9uIGluIHRoZSBpc1NldCgpIHZhbmlzaGVzCi0gICAgICogYXMgc29vbiBhcyB5b3UgdmlldyBhbnkgdW5zZXQgZmllbGQgdXNpbmcgZ2V0KCkgbWV0aG9kcy4KLSAgICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hpY2ggZGF0ZSBmaWVsZHMKLSAgICAgKiBhcmUgc2V0LCB5b3UgbXVzdCBjYWxsIGlzU2V0KCkgZmlyc3QgYmVmb3JlIGdldCgpLgotICAgICAqLwotICAgIFhtbENhbGVuZGFyIGdldENhbGVuZGFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBqYXZhLnV0aWwuRGF0ZQotICAgICAqIGluc3RhbmNlLgotICAgICAqLwotICAgIERhdGUgZ2V0RGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEYXRlLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGdkYXRlc3BlYyB0aGUgZGF0ZSB0byBjb21wYXJlIGFnYWluc3QuCi0gICAgICovCi0gICAgaW50IGNvbXBhcmVUb0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBnZGF0ZXNwZWMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIGNvZGUgZm9yIHRoZSBzaGFwZSBvZiB0aGUgaW5mb3JtYXRpb24KLSAgICAgKiBjb250YWluZWQgaW4gdGhpcyBpbnN0YW5jZSwgb3IgMCBpZiB0aGUKLSAgICAgKiBpbnN0YW5jZSBkb2Vzbid0IGNvbnRhaW4gaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byBhCi0gICAgICogU2NoZW1hIHR5cGUuCi0gICAgICogPHA+IAotICAgICAqIFZhbHVlIHdpbGwgYmUgZXF1YWwgdG8KLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfTk9UX0JVSUxUSU59LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJ9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USF9EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEV9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFX1RJTUV9LCBvcgotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19USU1FfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gU3BlY2lmaWMgbW9tZW50cyBvcgotICAgICAqIHRpbWVzLW9mLWRheSBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSBhcmUgbm9ybWFsaXplZCB0bwotICAgICAqIFVUQyB0aW1lIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgc3RyaW5nIGZvcm0gZm9yIHRoZW0uCi0gICAgICogT3RoZXIgcmVjdXJyaW5nIHRpbWUgc3BlY2lmaWNhdGlvbnMga2VlcCB0aGVpciB0aW1lem9uZQotICAgICAqIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKLSAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBXaGVuIGJvdGggdGltZSBhbmQgdGltZXpvbmUgYXJlIHNwZWNpZmllZCwgdGhpcyBzdHJpbmcgaXMgbm90Ci0gICAgICogdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgdGhlIHRpbWV6b25lIGlzIFVUQyAoWikKLSAgICAgKiAoc2luY2UgdGhlIHNhbWUgbW9tZW50IGluIHRpbWUgY2FuIGJlIGV4cHJlc3NlZCBpbiBkaWZmZXJlbnQKLSAgICAgKiB0aW1lem9uZXMpLiBUbyBnZXQgYSBjYW5vbmljYWwgc3RyaW5nLCB1c2UgdGhlIGNhbm9uaWNhbFN0cmluZygpCi0gICAgICogbWV0aG9kLgotICAgICAqLwotICAgIFN0cmluZyB0b1N0cmluZygpOwotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NmU3OWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIFNjaGVtYS1jb21wYXRpYmxlIGR1cmF0aW9uLgotICogPHA+Ci0gKiBBIGR1cmF0aW9uIGlzIG1hZGUgdXAgb2YgYSBudW1iZXIgb2YgeWVhcnMsIG1vbnRocywgZGF5cywgaG91cnMsCi0gKiBtaW51dGVzLCBzZWNvbmRzLCBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMuIFNlZSB0aGUKLSAqIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbgotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiI+c2VjdGlvbiBvbiB4czpkdXJhdGlvbjwvYT4KLSAqIGZvciBkZXRhaWxzIG9uIHRoZSBydWxlcyBmb3IKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24tb3JkZXIiPmNvbXBhcmluZyBkdXJhdGlvbnM8L2E+IGFuZAotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhZGRpbmctZHVyYXRpb25zLXRvLWRhdGVUaW1lcyI+YWRkaW5nIGR1cmF0aW9ucyB0byBkYXRlczwvYT4uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHRHVyYXRpb24gaW1wbGVtZW50cyBHRHVyYXRpb25TcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgaW50IF9zaWduOwotICAgIHByaXZhdGUgaW50IF9DWTsKLSAgICBwcml2YXRlIGludCBfTTsKLSAgICBwcml2YXRlIGludCBfRDsKLSAgICBwcml2YXRlIGludCBfaDsKLSAgICBwcml2YXRlIGludCBfbTsKLSAgICBwcml2YXRlIGludCBfczsKLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2ZzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBHRHVyYXRpb24gcmVwcmVzZW50aW5nIHplcm8gc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIF9zaWduID0gKzE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fTk9USElORyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fWUVBUiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fTU9OVEggPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX0RBWSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fSE9VUiA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fTUlOVVRFID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9TRUNPTkQgPSA2OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiBmcm9tIGEgbGV4aWNhbAotICAgICAqIHJlcHJlc2VudGF0aW9uLiBUaGUgbGV4aWNhbCBzcGFjZSBjb250YWlucyB0aGUKLSAgICAgKiB1bmlvbiBvZiB0aGUgbGV4aWNhbCBzcGFjZXMgb2YgYWxsIHRoZSBzY2hlbWEKLSAgICAgKiBkYXRlL3RpbWUgdHlwZXMgKGV4Y2VwdCBmb3IgZHVyYXRpb24pLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24oQ2hhclNlcXVlbmNlIHN0cikKLSAgICB7Ci0gICAgICAgIC8vIEZvcm06ICAgICAgICAtUG5Zbk1uRFRuSG5NblMKLSAgICAgICAgLy8gKHdoZXJlIGVhY2ggbiBtYXkgYmUgcHJlY2VkZWQgYnkgYSAtIGZvciB1cywgYW5kIHRoZSB3aG9sZSBtYXkgYmUgLSkKLQotICAgICAgICAvLyBmaXJzdCB0cmltIFhNTCB3aGl0ZXNwYWNlCi0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIHdoaWxlIChsZW4gPiAwICYmIEdEYXRlLmlzU3BhY2Uoc3RyLmNoYXJBdChsZW4gLSAxKSkpCi0gICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgd2hpbGUgKHN0YXJ0IDwgbGVuICYmIEdEYXRlLmlzU3BhY2Uoc3RyLmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLQotICAgICAgICBfc2lnbiA9IDE7Ci0gICAgICAgIGJvb2xlYW4gdG1hcmsgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc3RhcnQgPCBsZW4gJiYgc3RyLmNoYXJBdChzdGFydCkgPT0gJy0nKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2lnbiA9IC0xOwotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGFydCA+PSBsZW4gfHwgc3RyLmNoYXJBdChzdGFydCkgIT0gJ1AnKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVyYXRpb24gbXVzdCBiZWdpbiB3aXRoIFAiKTsKLQotICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgIGludCBzZWVuID0gU0VFTl9OT1RISU5HOwotICAgICAgICBfZnMgPSBHRGF0ZS5femVybzsKLQotICAgICAgICBmb3IgKDtzdGFydCA8IGxlbjsgc3RhcnQgKz0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBuZWd2YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnVCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRtYXJrKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXJhdGlvbiBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIG9uZSBUJyIpOwotICAgICAgICAgICAgICAgIGlmIChzZWVuID4gU0VFTl9EQVkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlQgaW4gZHVyYXRpb24gbXVzdCBwcmVjZWRlIHRpbWUgZmllbGRzIik7Ci0gICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fREFZOwotICAgICAgICAgICAgICAgIHRtYXJrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBjaCA9IHN0ci5jaGFyQXQoc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICctJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZWd2YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgICAgIGNoID0gc3RyLmNoYXJBdChzdGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIUdEYXRlLmlzRGlnaXQoY2gpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IEdEYXRlLmRpZ2l0VmFsKGNoKTsKLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICBjaCA9IChzdGFydCA8IGxlbikgPyBzdHIuY2hhckF0KHN0YXJ0KSA6ICdcMCc7Ci0gICAgICAgICAgICAgICAgaWYgKCFHRGF0ZS5pc0RpZ2l0KGNoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgR0RhdGUuZGlnaXRWYWwoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICcuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIGRvIGkgKz0gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBHRGF0ZS5pc0RpZ2l0KGNoID0gc3RyLmNoYXJBdChpKSkpOwotICAgICAgICAgICAgICAgIF9mcyA9IG5ldyBCaWdEZWNpbWFsKHN0ci5zdWJTZXF1ZW5jZShzdGFydCwgaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPj0gbGVuIHx8IGNoICE9ICdTJykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBkdXJhdGlvbiIpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZWd2YWwpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAtdmFsdWU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNlZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX05PVEhJTkc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnWScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX1lFQVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfQ1kgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX1lFQVI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnTScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX01PTlRIOwotICAgICAgICAgICAgICAgICAgICAgICAgX00gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0QnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9EQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfRCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIFNFRU5fREFZOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0gnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRtYXJrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgaW4gZHVyYXRpb24gbXVzdCBmb2xsb3cgVCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fSE9VUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9oID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9IT1VSOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ00nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRtYXJrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgaW4gZHVyYXRpb24gbXVzdCBmb2xsb3cgVCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fTUlOVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgX20gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX01JTlVURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdTJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bWFyaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIGluIGR1cmF0aW9uIG11c3QgZm9sbG93IFQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX1NFQ09ORDsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9zID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cmF0aW9uIG11c3Qgc3BlY2lmeSBZIE0gRCBUIEggTSBTIGluIG9yZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBzaWduLAotICAgICAqIHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwKLSAgICAgKiBmcmFjdGlvbmFsIHNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbigKLSAgICAgICAgICAgIGludCBzaWduLAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBpZiAoc2lnbiAhPSAxICYmIHNpZ24gIT0gLTEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIF9zaWduID0gc2lnbjsKLSAgICAgICAgX0NZID0geWVhcjsKLSAgICAgICAgX00gPSBtb250aDsKLSAgICAgICAgX0QgPSBkYXk7Ci0gICAgICAgIF9oID0gaG91cjsKLSAgICAgICAgX20gPSBtaW51dGU7Ci0gICAgICAgIF9zID0gc2Vjb25kOwotICAgICAgICBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uIGZyb20gYW5vdGhlciBHRHVyYXRpb25TcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBnRHVyYXRpb24pCi0gICAgewotICAgICAgICBfc2lnbiA9IGdEdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9DWSA9IGdEdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIF9NID0gZ0R1cmF0aW9uLmdldE1vbnRoKCk7Ci0gICAgICAgIF9EID0gZ0R1cmF0aW9uLmdldERheSgpOwotICAgICAgICBfaCA9IGdEdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIF9tID0gZ0R1cmF0aW9uLmdldE1pbnV0ZSgpOwotICAgICAgICBfcyA9IGdEdXJhdGlvbi5nZXRTZWNvbmQoKTsKLSAgICAgICAgX2ZzID0gZ0R1cmF0aW9uLmdldEZyYWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFub3RoZXIgR0RhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZQotICAgICAqIGFzIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRHVyYXRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsIEdEdXJhdGlvbiBpbnN0YW5jZXMgcmV0dXJuIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbW11dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2lnbiBvZiB0aGUgZHVyYXRpb246ICsxIGlzIGZvcndhcmRzCi0gICAgICogYW5kIC0xIGlzIGJhY2t3YXJkcyBpbiB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2lnbigpCi0gICAgICAgIHsgcmV0dXJuIF9zaWduOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB5ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFllYXIoKQotICAgICAgICB7IHJldHVybiBfQ1k7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGggY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5IGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2Vjb25kKCkKLSAgICAgICAgeyByZXR1cm4gX3M7IH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9mczsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzCi0gICAgICogb2YgdGhlIGR1cmF0aW9uIGFyZSBub25uZWdhdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmlzVmFsaWREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0R1cmF0aW9uLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmNvbXBhcmVEdXJhdGlvbnModGhpcywgZHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQW55IGNvbXBvbmVudHMgdGhhdCBhcmUgemVybyBhcmUgb21pdHRlZC4gTm90ZSB0aGF0IGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIGludmFsaWQsIGkuZS4sIGl0IGhhcyBuZWdhdGl2ZSBjb21wb25lbnRzLCB0aG9zZSBuZWdhdGl2ZQotICAgICAqIGNvbXBvbmVudHMgYXJlIHNlcmlhbGl6ZWQgb3V0IGhlcmUuIFRvIGNoZWNrIGZvciB2YWxpZGl0eSwgdXNlCi0gICAgICogdGhlIGlzVmFsaWQoKSBtZXRob2Q7IGFuZCB0byBub3JtYWxpemUgbW9zdCBkdXJhdGlvbnMgdG8gYSB2YWxpZAotICAgICAqIGZvcm0gdXNlIHRoZSBub3JtYWxpemUoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5mb3JtYXREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEdEdXJhdGlvbiB3aGljaCBpcyB0aGUgc3VtIG9mIHRoaXMgb25lIGFuZCB0aGUKLSAgICAgKiBzdXBwbGllZCBkdXJhdGlvbi4gIERvZXMgYSBmaWVsZHdpc2UgYWRkaXRpb24sIHdpdGggbm8gbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGFkZChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgaW50IHNpZ24gPSBfc2lnbiAqIGR1cmF0aW9uLmdldFNpZ24oKTsKLSAgICAgICAgcmV0dXJuIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgR0R1cmF0aW9uIHdoaWNoIGlzIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcKLSAgICAgKiB0aGUgc3VwcGxpZWQgZHVyYXRpb24gZnJvbSB0aGlzIG9uZS4gIERvZXMgYSBmaWVsZHdpc2UKLSAgICAgKiBzdWJ0cmFjdGlvbiwgd2l0aCBubyBub3JtYWxpemF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24gc3VidHJhY3QoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGludCBzaWduID0gLV9zaWduICogZHVyYXRpb24uZ2V0U2lnbigpOwotICAgICAgICByZXR1cm4gX2FkZChkdXJhdGlvbiwgc2lnbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHRHVyYXRpb24gX2FkZChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uLCBpbnQgc2lnbikKLSAgICB7Ci0gICAgICAgIEdEdXJhdGlvbiByZXN1bHQgPSBuZXcgR0R1cmF0aW9uKHRoaXMpOwotICAgICAgICByZXN1bHQuX0NZICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIHJlc3VsdC5fTSArPSBzaWduICogZHVyYXRpb24uZ2V0TW9udGgoKTsKLSAgICAgICAgcmVzdWx0Ll9EICs9IHNpZ24gKiBkdXJhdGlvbi5nZXREYXkoKTsKLSAgICAgICAgcmVzdWx0Ll9oICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIHJlc3VsdC5fbSArPSBzaWduICogZHVyYXRpb24uZ2V0TWludXRlKCk7Ci0gICAgICAgIHJlc3VsdC5fcyArPSBzaWduICogZHVyYXRpb24uZ2V0U2Vjb25kKCk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgaWYgKHJlc3VsdC5fZnMuc2lnbnVtKCkgPT0gMCAmJiBzaWduID09IDEpCi0gICAgICAgICAgICByZXN1bHQuX2ZzID0gZHVyYXRpb24uZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0Ll9mcyA9IHNpZ24gPiAwID8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0Ll9mcy5hZGQoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSkgOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQuX2ZzLnN1YnRyYWN0KGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR3byBHRHVyYXRpb25zIGFyZSBlcXVhbCBpZiBhbGwgdGhlaXIgZmllbGRzIGFyZSBlcXVhbC4KLSAgICAgKiBUaGUgZXF1YWxzIGZ1bmN0aW9uIGRvZXMgbm90IGFwcGx5IG5vcm1hbGl6YXRpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBHRHVyYXRpb24pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEdEdXJhdGlvbiBkdXJhdGlvbiA9IChHRHVyYXRpb24pb2JqOwotICAgICAgICByZXR1cm4gKF9zaWduID09IGR1cmF0aW9uLmdldFNpZ24oKSAmJgotICAgICAgICAgICAgICAgIF9DWSA9PSBkdXJhdGlvbi5nZXRZZWFyKCkgJiYKLSAgICAgICAgICAgICAgICBfTSA9PSBkdXJhdGlvbi5nZXRNb250aCgpICYmCi0gICAgICAgICAgICAgICAgX0QgPT0gZHVyYXRpb24uZ2V0RGF5KCkgJiYKLSAgICAgICAgICAgICAgICBfaCA9PSBkdXJhdGlvbi5nZXRIb3VyKCkgJiYKLSAgICAgICAgICAgICAgICBfbSA9PSBkdXJhdGlvbi5nZXRNaW51dGUoKSAmJgotICAgICAgICAgICAgICAgIF9zID09IGR1cmF0aW9uLmdldFNlY29uZCgpICYmCi0gICAgICAgICAgICAgICAgX2ZzLmVxdWFscyhkdXJhdGlvbi5nZXRGcmFjdGlvbigpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9zICsKLSAgICAgICAgICAgICAgICBfbSAqICg2MCArIDcpICsKLSAgICAgICAgICAgICAgICBfaCAqICg2MCAqIDYwICsgNykgKwotICAgICAgICAgICAgICAgIF9EICogKDYwICogNjAgKiAyNCArIDcpICsKLSAgICAgICAgICAgICAgICBfTSAqICg2MCAqIDYwICogMjQgKiAzMSArIDcpICsKLSAgICAgICAgICAgICAgICBfQ1kgKig2MCAqIDYwICogMjQgKiAzNzIgKyA3KSArCi0gICAgICAgICAgICAgICAgX3NpZ24gKiAxMTkxNzA0OSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbkJ1aWxkZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMGM2ODcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBHRHVyYXRpb24gR0R1cmF0aW9uc30uCi0gKi8gCi1wdWJsaWMgY2xhc3MgR0R1cmF0aW9uQnVpbGRlciBpbXBsZW1lbnRzIEdEdXJhdGlvblNwZWNpZmljYXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgX3NpZ247Ci0gICAgcHJpdmF0ZSBpbnQgX0NZOwotICAgIHByaXZhdGUgaW50IF9NOwotICAgIHByaXZhdGUgaW50IF9EOwotICAgIHByaXZhdGUgaW50IF9oOwotICAgIHByaXZhdGUgaW50IF9tOwotICAgIHByaXZhdGUgaW50IF9zOwotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBfZnM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IEdEdXJhdGlvbkJ1aWxkZXIgcmVwcmVzZW50aW5nIHplcm8gc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uQnVpbGRlcigpCi0gICAgewotICAgICAgICBfc2lnbiA9ICsxOwotICAgICAgICBfZnMgPSBHRGF0ZS5femVybzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uIGZyb20gYSBsZXhpY2FsCi0gICAgICogcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbkJ1aWxkZXIoU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRHVyYXRpb24ocykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRHVyYXRpb25CdWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCBzaWduLAotICAgICAqIHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwKLSAgICAgKiBmcmFjdGlvbmFsIHNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbkJ1aWxkZXIoCi0gICAgICAgICAgICBpbnQgc2lnbiwKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKHNpZ24gIT0gMSAmJiBzaWduICE9IC0xKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfc2lnbiA9IHNpZ247Ci0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbkJ1aWxkZXIgZnJvbSBhbm90aGVyIEdEdXJhdGlvbkJ1aWxkZXJTcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb25CdWlsZGVyKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZ0R1cmF0aW9uKQotICAgIHsKLSAgICAgICAgX3NpZ24gPSBnRHVyYXRpb24uZ2V0U2lnbigpOwotICAgICAgICBfQ1kgPSBnRHVyYXRpb24uZ2V0WWVhcigpOwotICAgICAgICBfTSA9IGdEdXJhdGlvbi5nZXRNb250aCgpOwotICAgICAgICBfRCA9IGdEdXJhdGlvbi5nZXREYXkoKTsKLSAgICAgICAgX2ggPSBnRHVyYXRpb24uZ2V0SG91cigpOwotICAgICAgICBfbSA9IGdEdXJhdGlvbi5nZXRNaW51dGUoKTsKLSAgICAgICAgX3MgPSBnRHVyYXRpb24uZ2V0U2Vjb25kKCk7Ci0gICAgICAgIF9mcyA9IGdEdXJhdGlvbi5nZXRGcmFjdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbm90aGVyIEdEdXJhdGlvbkJ1aWxkZXIgd2l0aCB0aGUgc2FtZSB2YWx1ZQotICAgICAqIGFzIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRHVyYXRpb25CdWlsZGVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIEdEdXJhdGlvbiBmcm9tIHRoaXMgR0R1cmF0aW9uQnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uIHRvR0R1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0R1cmF0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdG8gdGhpcyBkdXJhdGlvbi4gIERvZXMgYSBmaWVsZHdpc2UgYWRkLCB3aXRoIG5vCi0gICAgICogbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGludCBzaWduID0gX3NpZ24gKiBkdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YnRyYWN0cyBmcm9tIHRoaXMgZHVyYXRpb24uICBEb2VzIGEgZmllbGR3aXNlIHN1YnRyYWN0aW9uLAotICAgICAqIHdpdGggbm8gbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdWJ0cmFjdEdEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgaW50IHNpZ24gPSAtX3NpZ24gKiBkdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBfYWRkKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24sIGludCBzaWduKQotICAgIHsKLSAgICAgICAgX0NZICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIF9NICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRNb250aCgpOwotICAgICAgICBfRCArPSBzaWduICogZHVyYXRpb24uZ2V0RGF5KCk7Ci0gICAgICAgIF9oICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIF9tICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRNaW51dGUoKTsKLSAgICAgICAgX3MgKz0gc2lnbiAqIGR1cmF0aW9uLmdldFNlY29uZCgpOwotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKF9mcy5zaWdudW0oKSA9PSAwICYmIHNpZ24gPT0gMSkKLSAgICAgICAgICAgIF9mcyA9IGR1cmF0aW9uLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9mcyA9IHNpZ24gPiAwID8KLSAgICAgICAgICAgICAgICAgICAgX2ZzLmFkZChkdXJhdGlvbi5nZXRGcmFjdGlvbigpKSA6Ci0gICAgICAgICAgICAgICAgICAgIF9mcy5zdWJ0cmFjdChkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaWduLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNpZ24oaW50IHNpZ24pCi0gICAgewotICAgICAgICBpZiAoc2lnbiAhPSAxICYmIHNpZ24gIT0gLTEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIF9zaWduID0gc2lnbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB5ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRZZWFyKGludCB5ZWFyKQotICAgICAgICB7IF9DWSA9IHllYXI7IH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1vbnRoIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb250aChpbnQgbW9udGgpCi0gICAgICAgIHsgX00gPSBtb250aDsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF5IGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXkoaW50IGRheSkKLSAgICAgICAgeyBfRCA9IGRheTsgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhvdXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvdXIoaW50IGhvdXIpCi0gICAgICAgIHsgX2ggPSBob3VyOyAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWludXRlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW51dGUoaW50IG1pbnV0ZSkKLSAgICAgICAgeyBfbSA9IG1pbnV0ZTsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2Vjb25kIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWNvbmQoaW50IHNlY29uZCkKLSAgICAgICAgeyBfcyA9IHNlY29uZDsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbihCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgICAgICB7IF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgR0R1cmF0aW9uIGluc3RhbmNlcyByZXR1cm4gdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBkdXJhdGlvbjogKzEgaXMgZm9yd2FyZHMKLSAgICAgKiBhbmQgLTEgaXMgYmFja3dhcmRzIGluIHRpbWUuCi0gICAgICogVGhpcyB2YWx1ZSBkb2VzIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZQotICAgICAqIHRydWUgZGlyZWN0aW9uIG9mIHRoZSBkdXJhdGlvbiBpZiB0aGUgZHVyYXRpb24KLSAgICAgKiBpcyBub3Qgbm9ybWFsaXplZCBvciBub3Qgbm9ybWFsaXphYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2lnbigpCi0gICAgICAgIHsgcmV0dXJuIF9zaWduOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB5ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFllYXIoKQotICAgICAgICB7IHJldHVybiBfQ1k7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGggY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5IGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2Vjb25kKCkKLSAgICAgICAgeyByZXR1cm4gX3M7IH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9mczsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzCi0gICAgICogb2YgdGhlIGR1cmF0aW9uIGFyZSBub25uZWdhdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmlzVmFsaWREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZSBhIGR1cmF0aW9uIHZhbHVlLiBUaGlzIGVuc3VyZXMgdGhhdCBtb250aHMsCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBmcmFjdGlvbnMgYXJlIHBvc2l0aXZlIGFuZAotICAgICAqIHdpdGhpbiB0aGUgcmFuZ2VzIDAuLjExLCAwLi4yMywgMC4uNTksIGV0Yy4gTmVnYXRpdmUKLSAgICAgKiBkdXJhdGlvbnMgYXJlIGluZGljYXRlZCBieSBhIG5lZ2F0aXZlIHNpZ24gcmF0aGVyCi0gICAgICogdGhhbiBuZWdhdGl2ZSBjb21wb25lbnRzLgotICAgICAqIDxwPgotICAgICAqIE1vc3QgZHVyYXRpb24gc3BlY2lmaWNhdGlvbnMgY2FuIGJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgKiB2YWxpZCBkdXJhdGlvbnMgd2l0aCBhbGwgcG9zaXRpdmUgY29tcG9uZW50cywgYnV0Ci0gICAgICogbm90IGFsbCBvZiB0aGVtIGNhbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgb25seSBzaXR1YXRpb25zIHdoaWNoIGNhbm5vdCBiZSBub3JtYWxpemVkIGFyZQotICAgICAqIHdoZXJlIHRoZSB5ZWFyL21vbnRoIGFuZCB0aGUgZGF5L2hvdXIvbWludXRlL3NlY29uZAotICAgICAqIG9mZnNldHMgYXJlIG9mIG9wcG9zaXRlIHNpZ24uIERheXMgY2Fubm90IGJlIGNhcnJpZWQKLSAgICAgKiBpbnRvIG1vbnRocyBzaW5jZSB0aGUgbGVuZ3RoIG9mIGEgR3JlZ29yaWFuIG1vbnRoIGlzCi0gICAgICogdmFyaWFibGUgZGVwZW5kaW5nIG9uIHdoZW4gdGhlIGR1cmF0aW9uIGlzIGFwcGxpZWQuCi0gICAgICogSW4gdGhlc2UgY2FzZXMsIHRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIGNvbXBvbmVudHMKLSAgICAgKiBzbyB0aGF0ICJkYXkiIGlzIHRoZSBvbmx5IG5lZ2F0aXZlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICAgIHsKLSAgICAgICAgX25vcm1hbGl6ZUltcGwodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZlF1b3RpZW50KGEsIGIpID0gdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEvYgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgX2ZRdW90aWVudChsb25nIGEsIGludCBiKQotICAgIHsKLSAgICAgICAgaWYgKChhIDwgMCkgPT0gKGIgPCAwKSkKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLQotICAgICAgICByZXR1cm4gLSgoYiAtIGEgLSAxKSAvIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZHVsbyhhLCBiKSA9IGEgLSBmUXVvdGllbnQoYSxiKSpiCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9tb2QobG9uZyBhLCBpbnQgYiwgbG9uZyBxdW90aWVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KShhIC0gcXVvdGllbnQqYikgOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBpbXBsZW1lbmF0aW9uIG9mIG5vcm1hbGl6ZS4gVGhlIGZsYWcgaXMKLSAgICAgKiB0byBmYWNpbGl0YXRlIHRoaXMgbWV0aG9kIGNhbGxpbmcgaXRzZWxmIHdpdGhvdXQKLSAgICAgKiBkYW5nZXIgb2YgaW5maW5pdGUgcmVjdXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBfbm9ybWFsaXplSW1wbChib29sZWFuIGFkanVzdFNpZ24pCi0gICAgewotICAgICAgICBsb25nIHRlbXA7Ci0KLSAgICAgICAgLy8gbW9udGhzIHRvIHllYXJzCi0gICAgICAgIGlmIChfTSA8IDAgfHwgX00gPiAxMSkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IF9NOwotICAgICAgICAgICAgbG9uZyB5Y2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDEyKTsKLSAgICAgICAgICAgIF9NID0gX21vZCh0ZW1wLCAxMiwgeWNhcnJ5KTsKLSAgICAgICAgICAgIF9DWSArPSB5Y2Fycnk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGNhcnJ5ID0gMDsKLQotICAgICAgICAvLyBmcmFjdGlvbnMgdG8gc2Vjb25kcwotICAgICAgICBpZiAoX2ZzICE9IG51bGwgJiYgKF9mcy5zaWdudW0oKSA8IDAgfHwgX2ZzLmNvbXBhcmVUbyhHRGF0ZS5fb25lKSA+PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBiZGNhcnJ5ID0gX2ZzLnNldFNjYWxlKDAsIEJpZ0RlY2ltYWwuUk9VTkRfRkxPT1IpOwotICAgICAgICAgICAgX2ZzID0gX2ZzLnN1YnRyYWN0KGJkY2FycnkpOwotICAgICAgICAgICAgY2FycnkgPSBiZGNhcnJ5LmludFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FycnkgIT0gMCB8fCBfcyA8IDAgfHwgX3MgPiA1OSB8fCBfbSA8IDAgfHwgX20gPiA1MCB8fCBfaCA8IDAgfHwgX2ggPiAyMykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2Vjb25kcwotICAgICAgICAgICAgdGVtcCA9IF9zICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgNjApOwotICAgICAgICAgICAgX3MgPSBfbW9kKHRlbXAsIDYwLCBjYXJyeSk7Ci0KLSAgICAgICAgICAgIC8vIG1pbnV0ZXMKLSAgICAgICAgICAgIHRlbXAgPSBfbSArIGNhcnJ5OwotICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDYwKTsKLSAgICAgICAgICAgIF9tID0gX21vZCh0ZW1wLCA2MCwgY2FycnkpOwotCi0gICAgICAgICAgICAvLyBob3VycwotICAgICAgICAgICAgdGVtcCA9IF9oICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgMjQpOwotICAgICAgICAgICAgX2ggPSBfbW9kKHRlbXAsIDI0LCBjYXJyeSk7Ci0gICAgICAgICAgICBfRCArPSBjYXJyeTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfQ1kgPT0gMCAmJiBfTSA9PSAwICYmIF9EID09IDAgJiYgX2ggPT0gMCAmJiBfbSA9PSAwICYmIF9zID09IDAgJiYgKF9mcyA9PSBudWxsIHx8IF9mcy5zaWdudW0oKSA9PSAwKSkKLSAgICAgICAgICAgIF9zaWduID0gMTsKLQotICAgICAgICBpZiAoYWRqdXN0U2lnbiAmJiAoX0QgPCAwIHx8IF9DWSA8IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2lnbiA9IChfRCA8PSAwICYmIChfQ1kgPCAwIHx8IF9DWSA9PSAwICYmIF9NID09IDApKSA/IC1fc2lnbiA6IF9nZXRUb3RhbFNpZ25TbG93bHkoKTsKLSAgICAgICAgICAgIGlmIChzaWduID09IDIpCi0gICAgICAgICAgICAgICAgc2lnbiA9IChfQ1kgPCAwKSA/IC1fc2lnbiA6IF9zaWduOwotICAgICAgICAgICAgaWYgKHNpZ24gPT0gMCkKLSAgICAgICAgICAgICAgICBzaWduID0gMTsKLSAgICAgICAgICAgIGlmIChzaWduICE9IF9zaWduKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zaWduID0gc2lnbjsKLSAgICAgICAgICAgICAgICBfQ1kgPSAtX0NZOwotICAgICAgICAgICAgICAgIF9NID0gLV9NOwotICAgICAgICAgICAgICAgIF9EID0gLV9EOwotICAgICAgICAgICAgICAgIF9oID0gLV9oOwotICAgICAgICAgICAgICAgIF9tID0gLV9tOwotICAgICAgICAgICAgICAgIF9zID0gLV9zOwotICAgICAgICAgICAgICAgIGlmIChfZnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX2ZzID0gX2ZzLm5lZ2F0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX25vcm1hbGl6ZUltcGwoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBib29sZWFuIGlzVmFsaWREdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBpZiAoIShzcGVjLmdldFNpZ24oKSA9PSAxIHx8IHNwZWMuZ2V0U2lnbigpID09IC0xKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gKHNwZWMuZ2V0WWVhcigpID49IDAgJiYgc3BlYy5nZXRNb250aCgpID49IDAgJiYgc3BlYy5nZXREYXkoKSA+PSAwICYmCi0gICAgICAgICAgICAgICAgc3BlYy5nZXRIb3VyKCkgPj0gMCAmJiBzcGVjLmdldE1pbnV0ZSgpID49IDAgICYmIHNwZWMuZ2V0U2Vjb25kKCkgPj0gMCAmJgotICAgICAgICAgICAgICAgIHNwZWMuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA+PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0R1cmF0aW9uLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmNvbXBhcmVEdXJhdGlvbnModGhpcywgZHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQW55IGNvbXBvbmVudHMgdGhhdCBhcmUgemVybyBhcmUgb21pdHRlZC4gTm90ZSB0aGF0IGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIGludmFsaWQsIGkuZS4sIGl0IGhhcyBuZWdhdGl2ZSBjb21wb25lbnRzLCB0aG9zZSBuZWdhdGl2ZQotICAgICAqIGNvbXBvbmVudHMgYXJlIHNlcmlhbGl6ZWQgb3V0IGhlcmUuIFRvIGNoZWNrIGZvciB2YWxpZGl0eSwgdXNlCi0gICAgICogdGhlIGlzVmFsaWQoKSBtZXRob2Q7IGFuZCB0byBub3JtYWxpemUgbW9zdCBkdXJhdGlvbnMgdG8gYSB2YWxpZAotICAgICAqIGZvcm0gdXNlIHRoZSBub3JtYWxpemUoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5mb3JtYXREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgY29tcGFyZUR1cmF0aW9ucyhHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGQxLCBHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGQyKQotICAgIHsKLSAgICAgICAgLy8gZmlyc3QgZG8gYW4gYWxsLWZpZWxkcyBjaGVjawotICAgICAgICBpZiAoZDEuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA9PSAwICYmIGQyLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHMxID0gZDEuZ2V0U2lnbigpOwotICAgICAgICAgICAgaW50IHMyID0gZDIuZ2V0U2lnbigpOwotICAgICAgICAgICAgbG9uZyBtb250aDEgPSBzMSAqICgobG9uZylkMS5nZXRZZWFyKCkgKiAxMiArIGQxLmdldE1vbnRoKCkpOwotICAgICAgICAgICAgbG9uZyBtb250aDIgPSBzMiAqICgobG9uZylkMi5nZXRZZWFyKCkgKiAxMiArIGQyLmdldE1vbnRoKCkpOwotICAgICAgICAgICAgbG9uZyBzZWMxID0gczEgKiAoKCgobG9uZylkMS5nZXREYXkoKSAqIDI0ICsgZDEuZ2V0SG91cigpKSAqIDYwICsgZDEuZ2V0TWludXRlKCkpICogNjAgKyBkMS5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBsb25nIHNlYzIgPSBzMiAqICgoKChsb25nKWQyLmdldERheSgpICogMjQgKyBkMi5nZXRIb3VyKCkpICogNjAgKyBkMi5nZXRNaW51dGUoKSkgKiA2MCArIGQyLmdldFNlY29uZCgpKTsKLSAgICAgICAgICAgIGlmIChtb250aDEgPT0gbW9udGgyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZWMxID09IHNlYzIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGlmIChzZWMxIDwgc2VjMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIGlmIChzZWMxID4gc2VjMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobW9udGgxIDwgbW9udGgyICYmIHNlYzEgLSBzZWMyIDwgMjggKiAyNCAqIDYwICogNjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKG1vbnRoMSA+IG1vbnRoMiAmJiBzZWMyIC0gc2VjMSA8IDI4ICogMjQgKiA2MCAqIDYwKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGFuc3dlciBpc24ndCBvYnZpb3VzLCBzbyB0aGVuIGRvIGEgdG90YWwtc2lnbiBjaGVjawotICAgICAgICBHRHVyYXRpb25CdWlsZGVyIGRpZmYgPSBuZXcgR0R1cmF0aW9uQnVpbGRlcihkMSk7Ci0gICAgICAgIGRpZmYuc3VidHJhY3RHRHVyYXRpb24oZDIpOwotICAgICAgICByZXR1cm4gZGlmZi5fZ2V0VG90YWxTaWduU2xvd2x5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyIHNjaGVtYSBzcGVjLCBjb21wYXJpc29uIG9mIGR1cmF0aW9ucyBpcyBzaW1wbHkgZG9uZQotICAgICAqIGJ5IGNhbGN1bGF0aW5nIGFkZGluZyB0aGUgZHVyYXRpb24gdG8gdGhlc2UgZm91ciBkYXRlcyBhbmQKLSAgICAgKiBjb21wYXJpbmcgdGhlIHJlc3VsdHMuIElmIHRoZSByZXN1bHRzIGFyZSBhbWJpZ3VvdXMsIHRoZQotICAgICAqIGFuc3dlciBpcyAiaW5jb21wYXJhYmxlIi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHRGF0ZVtdIF9jb21wRGF0ZSA9IG5ldyBHRGF0ZVtdCi0gICAgewotICAgICAgICBuZXcgR0RhdGUoMTY5NiwgOSwgMSwgMCwgMCwgMCwgbnVsbCwgMCwgMCwgMCksCi0gICAgICAgIG5ldyBHRGF0ZSgxNjk3LCAyLCAxLCAwLCAwLCAwLCBudWxsLCAwLCAwLCAwKSwKLSAgICAgICAgbmV3IEdEYXRlKDE5MDMsIDMsIDEsIDAsIDAsIDAsIG51bGwsIDAsIDAsIDApLAotICAgICAgICBuZXcgR0RhdGUoMTkwMywgNywgMSwgMCwgMCwgMCwgbnVsbCwgMCwgMCwgMCkKLSAgICB9OwotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIHRvdGFsIHNpZ24gb2YgdGhlIGR1cmF0aW9uLCArMQotICAgICAqIGlmIHRoZSBkdXJhdGlvbiBtb3ZlcyBmb3J3YXJkIGluIHRpbWUsIC0xIGlmIHRoZQotICAgICAqIGR1cmF0aW9uIG1vdmVzIGJhY2t3YXJkcyBpbiB0aW1lLCAwIGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIHplcm8tbGVuZ3RoLCBhbmQgMiBpZiB0aGUgZHVyYXRpb24gbWF5IGJlIHBvc2l0aXZlCi0gICAgICogb3IgbmVnYXRpdmUgZGVwZW5kaW5nIG9uIHRoZSBkYXRlLgotICAgICAqCi0gICAgICogKEZvciBleGFtcGxlLCBvbmUgbW9udGggbWludXMgMzAgZGF5cyBpcyBpbmRldGVybWluYXRlKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBfZ2V0VG90YWxTaWduU2xvd2x5KCkKLSAgICB7Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBpbnQgbmVnID0gMDsKLSAgICAgICAgaW50IHplciA9IDA7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGVuZGRhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbXBEYXRlLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmRkYXRlLnNldEdEYXRlKF9jb21wRGF0ZVtpXSk7Ci0gICAgICAgICAgICBlbmRkYXRlLmFkZEdEdXJhdGlvbih0aGlzKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZW5kZGF0ZS5jb21wYXJlVG9HRGF0ZShfY29tcERhdGVbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICAgICAgICAgIG5lZysrOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIHplcisrOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHBvcysrOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwb3MgPT0gX2NvbXBEYXRlLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiArMTsKLSAgICAgICAgaWYgKG5lZyA9PSBfY29tcERhdGUubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoemVyID09IF9jb21wRGF0ZS5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RyaW5nIGZvcm1hdER1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCi0gICAgewotICAgICAgICAvLyBTaWduK1A6ICAgICAgKC0pP1AKLSAgICAgICAgLy8gWWVhcjogICAgICAgICg/OihcZCspWSk/Ci0gICAgICAgIC8vIE1vbnRoOiAgICAgICAoPzooXGQrKU0pPwotICAgICAgICAvLyBEYXk6ICAgICAgICAgKD86KFxkKylEKT8KLSAgICAgICAgLy8gVGltZTogICAgICAgICg/OihUKQotICAgICAgICAvLyBIb3VyczogICAgICAgICAgKD86KFxkKylIKT8KLSAgICAgICAgLy8gTWludXRlczogICAgICAgICg/OihcZCspTSk/Ci0gICAgICAgIC8vIFNlY29uZHM6ICAgICAgICAoPzooXGQrKD86XC5cZCopP3woPzouXGQrKVMpPwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigzMCk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldFNpZ24oKSA8IDApCi0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnLScpOwotCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdQJyk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldFllYXIoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRZZWFyKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1knKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRNb250aCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldE1vbnRoKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ00nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXREYXkoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXREYXkoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnRCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEhvdXIoKSAhPSAwIHx8IGR1cmF0aW9uLmdldE1pbnV0ZSgpICE9IDAgfHwgZHVyYXRpb24uZ2V0U2Vjb25kKCkgIT0gMCB8fAotICAgICAgICAgICAgIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnVCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEhvdXIoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRIb3VyKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ0gnKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRNaW51dGUoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRNaW51dGUoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnTScpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBzID0gZHVyYXRpb24uZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChkdXJhdGlvbi5nZXRTZWNvbmQoKSAhPSAwKQotICAgICAgICAgICAgICAgIHMgPSBzLmFkZChCaWdEZWNpbWFsLnZhbHVlT2YoZHVyYXRpb24uZ2V0U2Vjb25kKCkpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHMpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1MnKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkdXJhdGlvbi5nZXRTZWNvbmQoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnUycpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPD0gMikKLSAgICAgICAgICAgIC8vIFNwZWNpZnkgemVybyBzZWNvbmRzIGlmIGV2ZXJ5dGhpbmcgd2FzIDAKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJUMFMiKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25TcGVjaWZpY2F0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uU3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZhNDFiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25TcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgU2NoZW1hLWNvbXBhdGlibGUgZHVyYXRpb24uCi0gKiA8cD4KLSAqIEJvdGggdGhlIGltbXV0YWJsZSBHRHVyYXRpb24gYW5kIHRoZSBtdXRhYmxlIEdEdXJhdGlvbkJ1aWxkZXIgYXJlCi0gKiBHRHVyYXRpb25TcGVjaWZpY2F0aW9ucy4gIFVzZSB0aGlzIGludGVyZmFjZSB3aGVyZSB5b3Ugd2FudCB0bwotICogYWxsb3cgY2FsbGVycyB0byBwYXNzIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdEdXJhdGlvbi4KLSAqIAotICogQHNlZSBHRHVyYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBHRHVyYXRpb25TcGVjaWZpY2F0aW9uCi17Ci0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGltbXV0YWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW1tdXRhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBkdXJhdGlvbjogKzEgaXMgZm9yd2FyZHMKLSAgICAgKiBhbmQgLTEgaXMgYmFja3dhcmRzIGluIHRpbWUuCi0gICAgICovCi0gICAgaW50IGdldFNpZ24oKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIgY29tcG9uZW50LgotICAgICAqLwotICAgIGludCBnZXRZZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TW9udGgoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aCBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldERheSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkgY29tcG9uZW50LgotICAgICAqLwotICAgIGludCBnZXRIb3VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ciBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldE1pbnV0ZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vjb25kLW9mLW1pbnV0ZSBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldFNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGNvbXBvbmVudHMKLSAgICAgKiBvZiB0aGUgZHVyYXRpb24gYXJlIG5vbm5lZ2F0aXZlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEdXJhdGlvbi4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKLSAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQotICAgICAqIDwvdWw+Ci0gICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cwotICAgICAqIG9mIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1NDMyMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQSBjYWNoZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wgUU5hbWUgaW5zdGFuY2VzLiAgRWFjaCB0aHJlYWQgaGFzIG9uZS4KLSAqLyAKLXB1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZUNhY2hlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEID0gMC43MGY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotICAgIHByaXZhdGUgaW50IG51bUVudHJpZXMgPSAwOwotICAgIHByaXZhdGUgaW50IHRocmVzaG9sZDsKLSAgICBwcml2YXRlIGludCBoYXNobWFzazsKLSAgICBwcml2YXRlIFFOYW1lW10gdGFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUU5hbWVDYWNoZSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsQ2FwYWNpdHkgYW5kIGxvYWRGYWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gaW5pdGlhbGx5IG1ha2Ugc3BhY2UgZm9yCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgYSBudW1iZXIgdG8gY29udHJvbCB0aGUgZGVuc2l0eSBvZiB0aGUgaGFzaHRhYmxlCi0gICAgICovIAotICAgIHB1YmxpYyBRTmFtZUNhY2hlKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpCi0gICAgewotICAgICAgICBhc3NlcnQgaW5pdGlhbENhcGFjaXR5ID4gMDsKLSAgICAgICAgYXNzZXJ0IGxvYWRGYWN0b3IgPiAwICYmIGxvYWRGYWN0b3IgPCAxOwotCi0gICAgICAgIC8vIEZpbmQgYSBwb3dlciBvZiAyID49IGluaXRpYWxDYXBhY2l0eQotICAgICAgICBpbnQgY2FwYWNpdHkgPSAxNjsKLSAgICAgICAgd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSAKLSAgICAgICAgICAgIGNhcGFjaXR5IDw8PSAxOwotICAgIAotICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotICAgICAgICB0aGlzLmhhc2htYXNrID0gY2FwYWNpdHkgLSAxOwotICAgICAgICB0aHJlc2hvbGQgPSAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotICAgICAgICB0YWJsZSA9IG5ldyBRTmFtZVtjYXBhY2l0eV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFFOYW1lQ2FjaGUgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbENhcGFjaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIGluaXRpYWxseSBtYWtlIHNwYWNlIGZvcgotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWVDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KQotICAgIHsKLSAgICAgICAgdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyBhIFFOYW1lIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZSBhbmQgbG9jYWxuYW1lLgotICAgICAqIENyZWF0ZXMgb25lIGlmIG9uZSBpcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgdGhlIGxvY2FsbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGNhY2hlZCBRTmFtZQotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgICovCi0gICAgICAgIGFzc2VydCBsb2NhbE5hbWUgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gIiI7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gaGFzaCh1cmksIGxvY2FsTmFtZSkgJiBoYXNobWFzazsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFFOYW1lIHEgPSB0YWJsZVtpbmRleF07Ci0gICAgICAgICAgICBpZiAocSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bUVudHJpZXMrKzsKLSAgICAgICAgICAgICAgICBpZiAobnVtRW50cmllcyA+PSB0aHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgICAgIHJlaGFzaCgpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2luZGV4XSA9IG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChlcXVhbHMocSwgdXJpLCBsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBxOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBpbmRleCA9IChpbmRleC0xKSAmIGhhc2htYXNrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaGFzaCgpCi0gICAgewotICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdGFibGUubGVuZ3RoICogMjsKLSAgICAgICAgUU5hbWVbXSBuZXdUYWJsZSA9IG5ldyBRTmFtZVtuZXdMZW5ndGhdOwotICAgICAgICBpbnQgbmV3SGFzaG1hc2sgPSBuZXdMZW5ndGggLSAxOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHRhYmxlLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgcSA9IHRhYmxlW2ldOwotICAgICAgICAgICAgaWYgKHEgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSBoYXNoKHEuZ2V0TmFtZXNwYWNlVVJJKCksIHEuZ2V0TG9jYWxQYXJ0KCkpICYgbmV3SGFzaG1hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG5ld1RhYmxlW25ld0luZGV4XSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCA9IChuZXdJbmRleCAtIDEpICYgbmV3SGFzaG1hc2s7Ci0gICAgICAgICAgICAgICAgbmV3VGFibGVbbmV3SW5kZXhdID0gcTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRhYmxlID0gbmV3VGFibGU7Ci0gICAgICAgIGhhc2htYXNrID0gbmV3SGFzaG1hc2s7Ci0gICAgICAgIHRocmVzaG9sZCA9IChpbnQpKG5ld0xlbmd0aCAqIGxvYWRGYWN0b3IpOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh1cmkuaGFzaENvZGUoKSA8PCA1KSArIGxvY2FsTmFtZS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKFFOYW1lIHEsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gcS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSAmJiBxLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDJjOTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsYXR0aWNlIG9mIGZpbml0ZSBhbmQgaW5maW5pdGUgc2V0cyBvZiBRTmFtZXMuCi0gKiBUaGUgbGF0dGljZSB0aGUgbWluaW1hbCBvbmUgdGhhdCBpcyBjbG9zZWQgdW5kZXIgdW5pb24sIGludGVyc2VjdGlvbiwgYW5kCi0gKiBpbnZlcnNlLCBhbmQgY29udGFpbnMgaW5kaXZpZHVhbCBRTmFtZXMgYXMgd2VsbCBhcyBlbnRpcmUgbmFtZXNwYWNlcy4KLSAqIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSB0d28ga2luZHMgb2YgUU5hbWVTZXRzOgotICogPHVsPgotICogPGxpPkEgUU5hbWVTZXQgY2FuIGNvdmVyIGEgZmluaXRlIHNldCBvZiBuYW1lc3BhY2VzLCBhZGRpdGlvbmFsbHkgaW5jbHVkaW5nIGEgZmluaXRlCi0gKiAgICAgc2V0IG9mIFFOYW1lcyBvdXRzaWRlIHRob3NlIG5hbWVzcGFjZXMsIGFuZCB3aXRoIHRoZSBleGNlcHRpb24gb2YKLSAqICAgICBhIGZpbml0ZSBzZXQgb2YgUU5hbWVzIGV4Y2x1ZGVkIGZyb20gdGhvc2UgbmFtZXNwYWVzOgotICogICA8dWw+Ci0gKiAgIDxsaT5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzID09IHRoZSBzZXQgb2YgZXhjbHVkZWQgUU5hbWVzIGZyb20gY292ZXJlZFVSSXMgbmFtZXNwYWNlcwotICogICA8bGk+ZXhjbHVkZWRVUklzID09IG51bGwKLSAqICAgPGxpPmluY2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIGNvdmVyZWQgbmFtZXNwYWNlIFVSSXMKLSAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGFkZGl0aW9uYWwgUU5hbWVzIG91dHNpZGUgY292ZXJlZFVSSXMgbmFtZXNwYWNlcwotICogICA8L3VsPgotICogPC9saT4KLSAqIDxsaT5BIFFOYW1lU2V0IGNhbiBjb3ZlciBhbGwgbmFtZXNwYWNlcyBleGNlcHQgZm9yIGEgZmluaXRlIG51bWJlciBvZiBleGNsdWRlZCBvbmVzLAotICogICAgIGFkZGl0aW9uYWxseSBpbmNsdWRpbmcgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyB3aXRoaW4gdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXMsCi0gKiAgICAgYW5kIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhIGZpbml0ZSBzZXQgb2YgUU5hbWVzIG91dHNpZGUgdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXM6Ci0gKiAgIDx1bD4KLSAqICAgPGxpPmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMgPT0gdGhlIHNldCBvZiBleGNsdWRlZCBRTmFtZXMgb3V0c2lkZSB1bmNvdmVyZWRVUklzIG5hbWVzcGFjZXMKLSAqICAgPGxpPmV4Y2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIHVuY292ZXJlZCBuYW1lc3BhY2UgVVJJcwotICogICA8bGk+aW5jbHVkZWRVUklzID09IG51bGwKLSAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGFkZGl0aW9uYWwgUU5hbWVzIGZyb20gdW5jb3ZlcmVkVVJJcyBuYW1lc3BhY2VzCi0gKiAgIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogTm90aWNlIHRoYXQgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgZmlyc3QKLSAqIGNhdGVnb3J5IG91dGxpbmVkIGFib3ZlOgotICogPHVsPgotICogPGxpPkEgUW5hbWVTZXQgY2FuIGNvbnRhaW4gYSBmaW5pdGUgbnVtYmVyIG9mIFFOYW1lczoKLSAqICAgPHVsPgotICogICA8bGk+ZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyA9PSBudWxsCi0gKiAgIDxsaT5leGNsdWRlZFVSSXMgPT0gbnVsbAotICogICA8bGk+aW5jbHVkZWRVUklzID09IGVtcHR5IHNldAotICogICA8bGk+aW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcyA9PSBzZXQgb2YgaW5jbHVkZWQgUU5hbWVzCi0gKiAgIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFFOYW1lU2V0IGltcGxlbWVudHMgUU5hbWVTZXRTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfaW52ZXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2luY2x1ZGVkVVJJczsKLSAgICBwcml2YXRlIGZpbmFsIFNldCBfZXhjbHVkZWRRTmFtZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2luY2x1ZGVkUU5hbWVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVtcHR5IFFOYW1lU2V0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgRU1QVFkgPSBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUU5hbWVTZXQgY29udGFpbmluZyBhbGwgUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgQUxMID0gbmV3IFFOYW1lU2V0KENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFFOYW1lU2V0IGNvbnRhaW5pbmcgYWxsIFFOYW1lcyBpbiB0aGUgbG9jYWwgKG5vLSluYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZVNldCBMT0NBTCA9IG5ldyBRTmFtZVNldChudWxsLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIiIpLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUU5hbWVTZXQgY29udGFpbmluZyBhbGwgUU5hbWVzIGV4Y2VwdCBmb3IgdGhvc2UgaW4gdGhlIGxvY2FsIChuby0pbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgTk9OTE9DQUwgPSBuZXcgUU5hbWVTZXQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCIiKSwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBmdW5jdGlvbiB0byBtaW5pbWl6ZSBvYmplY3QgY3JlYXRpb24gd2hlbiBjb3B5aW5nIHNldHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0IG1pblNldENvcHkoU2V0IG9yaWdpbmFsKQotICAgIHsKLSAgICAgICAgaWYgKG9yaWdpbmFsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKG9yaWdpbmFsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0gICAgICAgIGlmIChvcmlnaW5hbC5zaXplKCkgPT0gMSkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob3JpZ2luYWwuaXRlcmF0b3IoKS5uZXh0KCkpOwotICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQob3JpZ2luYWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2V0cyBvZiBleGNsdWRlZCBVUklzLAotICAgICAqIGluY2x1ZGVkIFVSSXMsIGV4Y2x1ZGVkIFFOYW1lcyBpbiBpbmNsdWRlZCBuYW1lc3BhY2VzLCBhbmQgaW5jbHVkZWQKLSAgICAgKiBRTmFtZXMgaW4gZXhjbHVkZWQgbmFtZXNwYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBleGNsdWRlIGZyb20gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBpbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGluY2x1ZGUgaW4gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGluY2x1ZGVkIG5hbWVzcGFjZXMKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gaW5jbHVkZSB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWQgbmFtZXNwYWNlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBmb3JTZXRzKFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykKLSAgICB7Ci0gICAgICAgIGlmICgoZXhjbHVkZWRVUklzICE9IG51bGwpID09IChpbmNsdWRlZFVSSXMgIT0gbnVsbCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKLQotICAgICAgICBpZiAoZXhjbHVkZWRVUklzID09IG51bGwgJiYgaW5jbHVkZWRVUklzLmlzRW1wdHkoKSAmJiBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyA9PSBudWxsICYmIGV4Y2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gQUxMOwotICAgICAgICBpZiAoZXhjbHVkZWRVUklzID09IG51bGwgJiYgaW5jbHVkZWRVUklzLnNpemUoKSA9PSAxICYmIGluY2x1ZGVkVVJJcy5jb250YWlucygiIikgJiYKLSAgICAgICAgICAgIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIExPQ0FMOwotICAgICAgICBpZiAoaW5jbHVkZWRVUklzID09IG51bGwgJiYgZXhjbHVkZWRVUklzLnNpemUoKSA9PSAxICYmIGV4Y2x1ZGVkVVJJcy5jb250YWlucygiIikgJiYKLSAgICAgICAgICAgIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIE5PTkxPQ0FMOwotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQoCi0gICAgICAgICAgICAgICAgbWluU2V0Q29weShleGNsdWRlZFVSSXMpLAotICAgICAgICAgICAgICAgIG1pblNldENvcHkoaW5jbHVkZWRVUklzKSwKLSAgICAgICAgICAgICAgICBtaW5TZXRDb3B5KGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMpLAotICAgICAgICAgICAgICAgIG1pblNldENvcHkoaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgaW5jbHVkZWQgUU5hbWVzCi0gICAgICogCi0gICAgICogQHBhcmFtIGluY2x1ZGVkUU5hbWVzIHRoZSBhcnJheSBvZiBpbmNsdWRlZCBRTmFtZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvckFycmF5KFFOYW1lW10gaW5jbHVkZWRRTmFtZXMpCi0gICAgewotICAgICAgICBpZiAoaW5jbHVkZWRRTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluY2x1ZGVkUU5hbWVzIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVNldChudWxsLCBuZXcgSGFzaFNldCgpLCBudWxsLCBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGluY2x1ZGVkUU5hbWVzKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBnaXZlbgotICAgICAqIFFOYW1lU2V0U3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3BpZWQgUU5hbWVTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvclNwZWNpZmljYXRpb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIFFOYW1lU2V0KQotICAgICAgICAgICAgcmV0dXJuIChRTmFtZVNldClzcGVjOwotICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyhzcGVjLmV4Y2x1ZGVkVVJJcygpLCBzcGVjLmluY2x1ZGVkVVJJcygpLCBzcGVjLmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSwgc3BlYy5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB3aWxkY2FyZCBuYW1lc3BhY2Ugc3RyaW5nLgotICAgICAqIFRoaXMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVUklzLCBwbHVzIHNwZWNpYWwgdG9rZW5zIGFzIHNwZWNpZmllZAotICAgICAqIGluIHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gKCMjYW55LCAjI290aGVyLCAjI3RhcmdldE5hbWVzcGFjZSwgIyNsb2NhbCkuCi0gICAgICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgUU5hbWVTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvcldpbGRjYXJkTmFtZXNwYWNlU3RyaW5nKFN0cmluZyB3aWxkY2FyZCwgU3RyaW5nIHRhcmdldFVSSSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTcGVjaWZpY2F0aW9uKG5ldyBRTmFtZVNldEJ1aWxkZXIod2lsZGNhcmQsIHRhcmdldFVSSSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBzaW5nbGV0b24oUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuYW1lKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgUU5hbWVTZXRCdWlsZGVyIHdob3NlIGNvbnRlbnRzIGFyZSBnaXZlbiBieQotICAgICAqIHRoZSBmb3VyIHNldHMuCi0gICAgICoKLSAgICAgKiBUaGlzIGNvbnN0dWN0b3IgaXMgUFJJVkFURSBiZWNhdXNlIGl0IHVzZXMgdGhlIGdpdmVuCi0gICAgICogc2V0cyBkaXJlY3RseSwgYW5kIGl0IHRydXN0cyBpdHMgY2FsbGVycyB0byBzZXQgb25seSBpbW11dGFibGUgdmFsdWVzLgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgaXMgb25seSBjYWxsZWQgYnkgdGhlIHN0YXRpYyBidWlsZGVyIG1ldGhvZHMgb24KLSAgICAgKiBRTmFtZVNldDogdGhvc2UgbWV0aG9kcyBhcmUgYWxsIGNhcmVmdWwgYXNzaWduIG9ubHkgdW5jaGFuZ2luZyBzZXRzLgotICAgICAqLwotICAgIHByaXZhdGUgUU5hbWVTZXQoU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKQotICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBpbmNsdWRlZFVSSXM7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleGNsdWRlZFVSSXMgIT0gbnVsbCAmJiBpbmNsdWRlZFVSSXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBleGNsdWRlZFVSSXM7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJczsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhbCB4bWwgbmFtZXMgYXJlIGhhc2VkIHVzaW5nICIiIGFzIHRoZSBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5zRnJvbU5hbWUoUU5hbWUgeG1sTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IHhtbE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIHJldHVybiBucyA9PSBudWxsID8gIiIgOiBuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBxbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbiA9IF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShuYW1lKSkgPwotICAgICAgICAgICAgICAgICAgICAgIV9leGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpOwotICAgICAgICByZXR1cm4gX2ludmVydGVkIF4gaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyBhbGwgUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW52ZXJ0ZWQgJiYgX2luY2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgX2luY2x1ZGVkUU5hbWVzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIG5vIFFOYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIF9pbmNsdWRlZFFOYW1lcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBvbmUgYW5kIGFub3RoZXIuCi0gICAgICogQHBhcmFtIHNldCB0aGUgc2V0IHRvIGluc2Vyc2VjdCB3aXRoCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJzZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IGludGVyc2VjdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5yZXN0cmljdChzZXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgotICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byB1bmlvbiB3aXRoCi0gICAgICogQHJldHVybiB0aGUgdW5pb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWVTZXQgdW5pb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIFFOYW1lU2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHRoaXMpOwotICAgICAgICByZXN1bHQuYWRkQWxsKHNldCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9RTmFtZVNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgaW52ZXJzZSBvZiB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWVTZXQgaW52ZXJzZSgpCi0gICAgewotICAgICAgICBpZiAodGhpcyA9PSBFTVBUWSkKLSAgICAgICAgICAgIHJldHVybiBBTEw7Ci0gICAgICAgIGlmICh0aGlzID09IEFMTCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgaWYgKHRoaXMgPT0gTE9DQUwpCi0gICAgICAgICAgICByZXR1cm4gTk9OTE9DQUw7Ci0gICAgICAgIGlmICh0aGlzID09IE5PTkxPQ0FMKQotICAgICAgICAgICAgcmV0dXJuIExPQ0FMOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lU2V0KGluY2x1ZGVkVVJJcygpLCBleGNsdWRlZFVSSXMoKSwgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBhIHN1YnNldCBvZiB0aGlzIG9uZS4KLSAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgdG8gdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRhaW5zIGFsbCBRTmFtZXMgY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgLy8gYS5jb250YWlucyhiKSA9PSBhLmludmVyc2UuaXNEaXNqb2ludChiKQotICAgICAgICBpZiAoIV9pbnZlcnRlZCAmJiBzZXQuZXhjbHVkZWRVUklzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnZlcnNlKCkuaXNEaXNqb2ludChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBkaXNqb2ludCBmcm9tIHRoaXMgb25lLgotICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byB0ZXN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXQgaXMgZGlzam9pbnQgZnJvbSB0aGlzIHNldAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzam9pbnQoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIHJldHVybiBpc0Rpc2pvaW50SW1wbChzZXQsIHRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwodGhpcywgc2V0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGlzam9pbnRJbXBsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQxLCBRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MikKLSAgICB7Ci0gICAgICAgIFNldCBpbmNsdWRlVVJJcyA9IHNldDEuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIFNldCBvdGhlckluY2x1ZGVVUklzID0gc2V0Mi5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZVVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXJJbmNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldCBvdGhlckV4Y2x1ZGVVUklzID0gc2V0Mi5leGNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvdGhlckV4Y2x1ZGVVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0MS5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNldDIuY29udGFpbnMoKFFOYW1lKWkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5jbHVkZVVSSXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDIuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQxLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlcyB0aGF0IGFyZSBmdWxseSBleGNsdWRlZCBmcm9tIHRoZSBzZXQgZXhjZXB0IGZvciBhIGZpbml0ZQotICAgICAqIG51bWJlciBvZiBpbmRpdmlkdWFsIFFOYW1lIGV4Y2VwdGlvbnMuICBSZXR1cm5zIG51bGwgaWYgdGhpcyBzZXQgaXMgaW5maW5pdGUuCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGV4Y2x1ZGVkIG5hbWVzcGFjZSBVUkkgc3RyaW5ncwotICAgICAqLyAKLSAgICBwdWJsaWMgU2V0IGV4Y2x1ZGVkVVJJcygpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKSByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbmNsdWRlZFVSSXMpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lc3BhY2VzIHRoYXQgYXJlIGZ1bGx5IGluY2x1ZGVkIGluIHNldCBleGNlcHQgZm9yIGEgZmluaXRlCi0gICAgICogbnVtYmVyIG9mIGluZGl2aWR1YWwgUU5hbWUgZXhjZXB0aW9ucy4gUmV0dXJucyBudWxsIGlmIHRoaXMgc2V0IGlzIGluZmluaXRlLgotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBpbmNsdWRlZCBuYW1lc3BhY2UgVVJJIHN0cmluZ3MKLSAgICAgKi8gCi0gICAgcHVibGljIFNldCBpbmNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQpIHJldHVybiBfaW5jbHVkZWRVUklzOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBRTmFtZXMgZXhjbHVkZWQgZnJvbSB0aGUgc2V0IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHdpdGhpbgotICAgICAqIGEgbmFtZXNwYWNlIHRoYXQgaXMgb3RoZXJ3aXNlIGZ1bGx5IGluY2x1ZGVkIGluIHRoZSBzZXQuCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGV4Y2x1ZGVkIFFOYW1lcyBmcm9tIHdpdGhpbiBpbmNsdWRlZFVSSSBuYW1lc3BhY2VzCi0gICAgICovIAotICAgIHB1YmxpYyBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbnZlcnRlZCA/IF9pbmNsdWRlZFFOYW1lcyA6IF9leGNsdWRlZFFOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBRTmFtZXMgaW5jbHVkZWQgaW4gdGhlIHNldCBldmVuIHRob3VnaCB0aGV5IGFyZSB3aXRoaW4KLSAgICAgKiBhIG5hbWVzcGFjZSB0aGF0IGlzIG90aGVyd2lzZSBmdWxseSBpbmNsdWRlZCBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBpbmNsdWRlZCBRTmFtZXMgZnJvbSB3aXRoaW4gZXhjbHVkZWRVUkkgbmFtZXNwYWNlcwotICAgICAqLyAKLSAgICBwdWJsaWMgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfZXhjbHVkZWRRTmFtZXMgOiBfaW5jbHVkZWRRTmFtZXMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwcmV0dHlRTmFtZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZywgc3ViamVjdCB0byBjaGFuZ2UuCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIlFOYW1lU2V0Iik7Ci0gICAgICAgIHNiLmFwcGVuZChfaW52ZXJ0ZWQgPyAiLSgiIDogIisoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIrKkAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHByZXR0eVFOYW1lKChRTmFtZSlpLm5leHQoKSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIisiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICAgIHNiLnNldExlbmd0aChpbmRleCk7Ci0gICAgICAgIHNiLmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNWI1N2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBRTmFtZVNldCBRTmFtZVNldHN9LgotICovIAotcHVibGljIGNsYXNzIFFOYW1lU2V0QnVpbGRlciBpbXBsZW1lbnRzIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ludmVydGVkOwotICAgIHByaXZhdGUgU2V0IF9pbmNsdWRlZFVSSXM7Ci0gICAgcHJpdmF0ZSBTZXQgX2V4Y2x1ZGVkUU5hbWVzOwotICAgIHByaXZhdGUgU2V0IF9pbmNsdWRlZFFOYW1lczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoKQotICAgIHsKLSAgICAgICAgX2ludmVydGVkID0gZmFsc2U7Ci0gICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBRTmFtZVNldEJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUgZ2l2ZW4gYnkKLSAgICAgKiBhbm90aGVyIFFOYW1lU2V0U3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gc2V0IHRoZSBRTmFtZVNldFNwZWNpZmljYWl0b24gdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIFNldCBpbmNsdWRlZFVSSXMgPSBzZXQuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlZFVSSXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRVUklzKTsKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgX2luY2x1ZGVkVVJJcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFVSSXMoKSk7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFFOYW1lU2V0QnVpbGRlciB3aG9zZSBpbml0YWwgY29udGVudHMgYXJlIGdpdmVuIGJ5Ci0gICAgICogdGhlIGZvdXIgc2V0cy4gIEV4YWN0bHkgb25lIG9mIGVpdGhlciBleGNsdWRlZFVSSXMgb3IgaW5jbHVkZWRVUklzIG11c3QKLSAgICAgKiBiZSBub24tbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBleGNsdWRlIGZyb20gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBpbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGluY2x1ZGUgaW4gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGluY2x1ZGVkIG5hbWVzcGFjZXMKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gaW5jbHVkZSB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWQgbmFtZXNwYWNlcwotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKQotICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFVSSXMpOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleGNsdWRlZFVSSXMgIT0gbnVsbCAmJiBpbmNsdWRlZFVSSXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFVSSXMpOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBRTmFtZVNldEJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUgZ2l2ZW4KLSAgICAgKiBhcyBhIGxpc3Qgb2YgbmFtZXNwYWNlIFVSSXMsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdCB1c2VkIGJ5IHdpbGRjYXJkcwotICAgICAqIGluIFhTRCBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyIGEgd2lsZGNhcmQgbmFtZXNwYWNlIHNwZWNpZmljYXRpb24gc3RyaW5nIHN1Y2ggYXMgIiMjYW55IiwKLSAgICAgKiAgICAgICAgIiMjb3RoZXIiLCAiIyNsb2NhbCIsICIjI3RhcmdldE5hbWVzcGFjZSIsIG9yIGEgc3BhY2Utc2VwYXJhdGVkCi0gICAgICogICAgICAgIGxpc3Qgb2YgVVJJcy4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0VVJJIHRoZSBjdXJyZW50IHRhcmdldE5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoU3RyaW5nIHN0ciwgU3RyaW5nIHRhcmdldFVSSSkKLSAgICB7Ci0gICAgICAgIHRoaXMoKTsKLQotICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICBzdHIgPSAiIyNhbnkiOwotCi0gICAgICAgIFN0cmluZ1tdIHVyaSA9IHNwbGl0TGlzdChzdHIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFkZHVyaSA9IHVyaVtpXTsKLSAgICAgICAgICAgIGlmIChhZGR1cmkuc3RhcnRzV2l0aCgiIyMiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkdXJpLmVxdWFscygiIyNvdGhlciIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVSSSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgdGVtcCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGROYW1lc3BhY2UodGFyZ2V0VVJJKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGROYW1lc3BhY2UoIiIpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wLmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRBbGwodGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGR1cmkuZXF1YWxzKCIjI2FueSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW52ZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmlbaV0uZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVSSSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBhZGR1cmkgPSB0YXJnZXRVUkk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVyaVtpXS5lcXVhbHMoIiMjbG9jYWwiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHVyaSA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZE5hbWVzcGFjZShhZGR1cmkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvY2FsIHhtbCBuYW1lcyBhcmUgaGFzZWQgdXNpbmcgIiIgYXMgdGhlIG5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnNGcm9tTmFtZShRTmFtZSBRTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICByZXR1cm4gbnMgPT0gbnVsbCA/ICIiIDogbnM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzcGxpdExpc3QoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR0FSUkFZOwotICAgICAgICAgICAgICAgIAotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKCkgJiYgaXNTcGFjZShzLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgaWYgKGkgPj0gcy5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KEVNUFRZX1NUUklOR0FSUkFZKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgcy5sZW5ndGgoKSAmJiAhaXNTcGFjZShzLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgcmVzdWx0LmFkZChzLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbGwgeG1sIG5hbWVzIGZyb20gcW5hbWVzZXQgd2hvc2UgbmFtZXNwYWNlIG1hdGNoZXMgdGhlIHVyaS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1hdGNoaW5nTnMoU3RyaW5nIHVyaSwgU2V0IHFuYW1lc2V0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMobnNGcm9tTmFtZSgoUU5hbWUpaS5uZXh0KCkpKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCB4bWwgbmFtZXMgZnJvbSBxbmFtZXNldCB3aG9zZSBuYW1lc3BhY2UgaXMgaW4gdGhlCi0gICAgICogZmlyc3Qgc2V0IG9mIHVyaXMgYnV0IG5vdCB0aGUgc2Vjb25kLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWF0Y2hpbmdGaXJzdE9ubHkoU2V0IHNldEZpcnN0LCBTZXQgc2V0U2Vjb25kLCBTZXQgcW5hbWVzZXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZXNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuc0Zyb21OYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoc2V0Rmlyc3QuY29udGFpbnMobnMpICYmICFzZXRTZWNvbmQuY29udGFpbnMobnMpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHhtbCBuYW1lcyBmcm9tIHFuYW1lc2V0IHdob3NlIG5hbWVzcGFjZSBpcyBpbiBib3RoCi0gICAgICogc2V0cyBvZiB1cmlzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWF0Y2hpbmdCb3RoKFNldCBzZXRGaXJzdCwgU2V0IHNldFNlY29uZCwgU2V0IHFuYW1lc2V0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5zID0gbnNGcm9tTmFtZSgoUU5hbWUpaS5uZXh0KCkpOwotICAgICAgICAgICAgaWYgKHNldEZpcnN0LmNvbnRhaW5zKG5zKSAmJiBzZXRTZWNvbmQuY29udGFpbnMobnMpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHhtbCBuYW1lcyBmcm9tIHFuYW1lc2V0IHdob3NlIG5hbWVzcGFjZSBpcyBpbiBuZWl0aGVyCi0gICAgICogc2V0IG9mIHVyaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxNYXRjaGluZ05laXRoZXIoU2V0IHNldEZpcnN0LCBTZXQgc2V0U2Vjb25kLCBTZXQgcW5hbWVzZXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZXNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuc0Zyb21OYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoIXNldEZpcnN0LmNvbnRhaW5zKG5zKSAmJiAhc2V0U2Vjb25kLmNvbnRhaW5zKG5zKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyB0aGUgZ2l2ZW4gcW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW4gPSBfaW5jbHVkZWRVUklzLmNvbnRhaW5zKG5zRnJvbU5hbWUobmFtZSkpID8KLSAgICAgICAgICAgICAgICAgICAgICFfZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKTsKLSAgICAgICAgcmV0dXJuIF9pbnZlcnRlZCBeIGluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBNb2RlbFRyYW5zaXRpb25TZXQgY29udGFpbnMgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuc2l6ZSgpID09IDAgJiYgX2luY2x1ZGVkUU5hbWVzLnNpemUoKSA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBNb2RlbFRyYW5zaXRpb25TZXQgY29udGFpbnMgbm8gUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICFfaW52ZXJ0ZWQgJiYgX2luY2x1ZGVkVVJJcy5zaXplKCkgPT0gMCAmJiBfaW5jbHVkZWRRTmFtZXMuc2l6ZSgpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBvbmUgYW5kIGFub3RoZXIuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IGludGVyc2VjdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5yZXN0cmljdChzZXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldCB1bmlvbihRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5hZGRBbGwoc2V0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1FOYW1lU2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnZlcnNlIG9mIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldCBpbnZlcnNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKGluY2x1ZGVkVVJJcygpLCBleGNsdWRlZFVSSXMoKSwgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyBhIHN1YnNldCBvZiB0aGlzIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW52ZXJzZSgpLmlzRGlzam9pbnQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzZXQgaXMgZGlzam9pbnQgZnJvbSB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2pvaW50KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkICYmIHNldC5leGNsdWRlZFVSSXMoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChfaW52ZXJ0ZWQpCi0gICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwoc2V0LCB0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGlzRGlzam9pbnRJbXBsKHRoaXMsIHNldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGlzam9pbnRJbXBsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQxLCBRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MikKLSAgICB7Ci0gICAgICAgIFNldCBpbmNsdWRlVVJJcyA9IHNldDEuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIFNldCBvdGhlckluY2x1ZGVVUklzID0gc2V0Mi5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZVVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXJJbmNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldCBvdGhlckV4Y2x1ZGVVUklzID0gc2V0Mi5leGNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvdGhlckV4Y2x1ZGVVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0MS5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNldDIuY29udGFpbnMoKFFOYW1lKWkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5jbHVkZVVSSXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDIuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQxLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhpcyBRTmFtZVNldEJ1aWxkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgX2luY2x1ZGVkVVJJcy5jbGVhcigpOwotICAgICAgICBfZXhjbHVkZWRRTmFtZXMuY2xlYXIoKTsKLSAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52ZXJ0cyB0aGlzIFFOYW1lU2V0QnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZlcnQoKQotICAgIHsKLSAgICAgICAgX2ludmVydGVkID0gIV9pbnZlcnRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2luZ2xlIFFOYW1lIHRvIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghX2ludmVydGVkKQotICAgICAgICAgICAgYWRkSW1wbChxbmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZUltcGwocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZW50aXJlIG5hbWVzcGFjZSBVUkkgb2YgUU5hbWVzIHRvIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqIFRoZSBlbXB0eSBzdHJpbmcgaXMgdXNlZCB0byBzaWduaWZpeSB0aGUgKGxvY2FsKSBuby1uYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAoIV9pbnZlcnRlZCkKLSAgICAgICAgICAgIGFkZE5hbWVzcGFjZUltcGwodXJpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVtb3ZlTmFtZXNwYWNlSW1wbCh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgUU5hbWVTZXQgdG8gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgcmVtb3ZlQWxsSW1wbChzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFkZEFsbEltcGwoc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIHFuYW1lIGZyb20gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIGFkZEltcGwocW5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVJbXBsKHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGVudGlyZSBuYW1lc3BhY2UgVVJJIGZyb20gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgYWRkTmFtZXNwYWNlSW1wbCh1cmkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVOYW1lc3BhY2VJbXBsKHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgY29udGVudHMgb2YgYSBnaXZlbiBRTmFtZVNldCBmcm9tIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIGFkZEFsbEltcGwoc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVBbGxJbXBsKHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgUU5hbWVTZXRCdWlsZGVyIHRvIGJlIGEgc3Vic2V0IG9mIHRoZQotICAgICAqIGdpdmVuIFFOYW1lU2V0LiBJbiBvdGhlciB3b3JkcywgY29tcHV0ZXMgYW4gaW50ZXJzZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgYWRkQWxsSW1wbChzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZUFsbEltcGwoc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFkZChxbmFtZSkgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSW1wbChRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKG5zRnJvbU5hbWUocW5hbWUpKSkKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcy5yZW1vdmUocW5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMuYWRkKHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhZGQobnMpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZUltcGwoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nTnModXJpLCBfZXhjbHVkZWRRTmFtZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzLmFkZCh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYWRkKHNldCkgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkQWxsSW1wbChTZXQgaW5jbHVkZWRVUklzLCBTZXQgZXhjbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXMsIFNldCBleGNsdWRlZFFOYW1lcykKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZXhjbHVkZSA9IChleGNsdWRlZFVSSXMgIT0gbnVsbCk7Ci0gICAgICAgIFNldCBzcGVjaWFsVVJJcyA9IGV4Y2x1ZGUgPyBleGNsdWRlZFVSSXMgOiBpbmNsdWRlZFVSSXM7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKLSAgICAgICAgICAgIGlmICgoZXhjbHVkZSBeIHNwZWNpYWxVUklzLmNvbnRhaW5zKHVyaSkpICYmICFleGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXhjbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKCFfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkgJiYgIV9pbmNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKCFfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCi0gICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMucmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFleGNsdWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ0ZpcnN0T25seShpbmNsdWRlZFVSSXMsIF9pbmNsdWRlZFVSSXMsIF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzLmFkZEFsbChpbmNsdWRlZFVSSXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOZWl0aGVyKGV4Y2x1ZGVkVVJJcywgX2luY2x1ZGVkVVJJcywgX2luY2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleGNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIV9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkVVJJcy5hZGQodXJpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMucmVtb3ZlKHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXQgdGVtcCA9IF9leGNsdWRlZFFOYW1lczsKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IF9pbmNsdWRlZFFOYW1lczsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IHRlbXA7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSAhX2ludmVydGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgcmVtb3ZlKHFuYW1lKSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVJbXBsKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShxbmFtZSkpKQotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLmFkZChxbmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5yZW1vdmUocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHJlbW92ZShucykgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTmFtZXNwYWNlSW1wbChTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9leGNsdWRlZFFOYW1lcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzLnJlbW92ZSh1cmkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiByZW1vdmUoc2V0KSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVBbGxJbXBsKFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lcywgU2V0IGV4Y2x1ZGVkUU5hbWVzKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBleGNsdWRlID0gKGV4Y2x1ZGVkVVJJcyAhPSBudWxsKTsKLSAgICAgICAgU2V0IHNwZWNpYWxVUklzID0gZXhjbHVkZSA/IGV4Y2x1ZGVkVVJJcyA6IGluY2x1ZGVkVVJJczsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgXiBzcGVjaWFsVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXhjbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSAmJiAhX2V4Y2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5hZGQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhjbHVkZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdGaXJzdE9ubHkoX2luY2x1ZGVkVVJJcywgZXhjbHVkZWRVUklzLCBfZXhjbHVkZWRRTmFtZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdCb3RoKF9pbmNsdWRlZFVSSXMsIGluY2x1ZGVkVVJJcywgX2V4Y2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgXiBzcGVjaWFsVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZXhjbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQpIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2luY2x1ZGVkVVJJcyk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgaW5jbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIGlmICghX2ludmVydGVkKSByZXR1cm4gX2luY2x1ZGVkVVJJczsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2ludmVydGVkID8gX2luY2x1ZGVkUU5hbWVzIDogX2V4Y2x1ZGVkUU5hbWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfZXhjbHVkZWRRTmFtZXMgOiBfaW5jbHVkZWRRTmFtZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHByZXR0eVFOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpICsgIkAiICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzZWZ1bCBmb3IgZGVidWdnaW5nLCBzdWJqZWN0IHRvIGNoYW5nZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiUU5hbWVTZXRCdWlsZGVyIik7Ci0gICAgICAgIHNiLmFwcGVuZChfaW52ZXJ0ZWQgPyAiLSgiIDogIisoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIrKkAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHByZXR0eVFOYW1lKChRTmFtZSlpLm5leHQoKSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIisiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICAgIHNiLnNldExlbmd0aChpbmRleCk7Ci0gICAgICAgIHNiLmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBRTmFtZVNldH0gZXF1aXZhbGVudCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzCi0gICAgICogUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWVTZXQgdG9RTmFtZVNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU3BlY2lmaWNhdGlvbih0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRTcGVjaWZpY2F0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTNmZmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0U3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsYXR0aWNlIG9mIGZpbml0ZSBhbmQgaW5maW5pdGUgc2V0cyBvZiBRTmFtZXMuCi0gKiAKLSAqIEBzZWUgUU5hbWVTZXQKLSAqLwotcHVibGljIGludGVyZmFjZSBRTmFtZVNldFNwZWNpZmljYXRpb24KLXsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqCi0gICAgICogUm91Z2hseSBlcXVpdmFsZW50IHRvOgotICAgICAqICAgIChpbmNsdWRlZFVSSXMoKSA9PSBudWxsID8KLSAgICAgKiAgICAgICAgICAgZXhjbHVkZWRVUklzKCkuY29udGFpbnMobmFtZXNwYWNlKSA6Ci0gICAgICogICAgICAgICAgIGluY2x1ZGVkVVJJcygpLmNvbnRhaW5zKG5hbWVzcGFjZSkKLSAgICAgKiAgICApID8KLSAgICAgKiAgICAgICAgIWV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKS5jb250YWlucyhuYW1lKSA6Ci0gICAgICogICAgICAgICBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuY29udGFpbnMobmFtZSkKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgc2V0IGlzIHRoZSBzZXQgb2YgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBzZXQgaXMgZW1wdHkuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzdWJzZXQgb2YgdGhpcyBzZXQuCi0gICAgICovIAotICAgIGJvb2xlYW4gY29udGFpbnNBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBpcyBkaXNqb2ludCBmcm9tIHRoZSBzcGVjaWZpZWQgc2V0LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEaXNqb2ludChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiB3aXRoIGFub3RoZXIgUU5hbWVTZXQuCi0gICAgICovCi0gICAgUU5hbWVTZXQgaW50ZXJzZWN0KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5pb24gd2l0aCBhbm90aGVyIFFOYW1lU2V0LgotICAgICAqLwotICAgIFFOYW1lU2V0IHVuaW9uKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoaXMgUU5hbWVTZXQuIFRoYXQgaXMgdGhlIFFOYW1lU2V0IHdoaWNoCi0gICAgICogY29udGFpbnMgYWxsIHRoZSBRTmFtZXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIHNldC4gSW4gb3RoZXIgd29yZHMKLSAgICAgKiBmb3Igd2hpY2ggc2V0LmNvbnRhaW5zKG5hbWUpICE9IHNldC5pbnZlcnNlKCkuY29udGFpbnMobmFtZSkgZm9yCi0gICAgICogYWxsIG5hbWVzLgotICAgICAqLwotICAgIFFOYW1lU2V0IGludmVyc2UoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGV4Y2x1ZGVkIGZyb20KLSAgICAgKiB0aGUgc2V0ICh0aGF0IGlzLCBlYWNoIG5hbWVzcGFjZSBVUkkgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGggd2l0aAotICAgICAqIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZSBleGNlcHRpb25zKS4gTnVsbCBpZiB0aGUgc2V0IG9mIG5hbWVzcGFjZVVSSXMKLSAgICAgKiB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCBpcyBpbmZpbml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIChtZWFuaW5nIGFsbW9zdCBhbGwgVVJJcyBleGNsdWRlZCkgaWYgaW5jbHVkZWRVUklzKCkgaXMgbm9uLW51bGw7Ci0gICAgICogbm9uLW51bGwgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIHNldCBhcyBpbnZlcnNlKCkuaW5jbHVkZWRVUklzKCkuCi0gICAgICovCi0gICAgU2V0IGV4Y2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSXMgdGhhdCBhcmUgYWxtb3N0IGNvbXBsZXRlbHkgaW5jbHVkZWQgaW4KLSAgICAgKiB0aGUgc2V0ICh0aGF0IGlzLCBlYWNoIG5hbWVzcGFjZSBVUkkgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGggd2l0aAotICAgICAqIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZSBleGNlcHRpb25zKS4gTnVsbCBpZiB0aGUgc2V0IG9mIG5hbWVzcGFjZVVSSXMKLSAgICAgKiB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCBpcyBpbmZpbml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIChtZWFuaW5nIGFsbW9zdCBhbGwgVVJJcyBpbmNsdWRlZCkgaWYgZXhjbHVkZWRVUklzKCkgaXMgbm9uLW51bGw7Ci0gICAgICogbm9uLW51bGwgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIGFzIGludmVyc2UuZXhjbHVkZWRVUklzKCkuCi0gICAgICovCi0gICAgU2V0IGluY2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgUU5hbWVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNldCB3aXRoaW4gbmFtZXNwYWNlcwotICAgICAqIHRoYXQgYXJlIG90aGVyd2lzZSBpbmNsdWRlZC4gU2hvdWxkIG9ubHkgY29udGFpbiBRTmFtZXMgd2l0aGluIG5hbWVzcGFjZQotICAgICAqIHRoYXQgYXJlIHdpdGhpbiB0aGUgc2V0IGluY2x1ZGVkVVJJcygpIChvciBhbnkgVVJJLCBpZiBpbmNsdWRlZFVSSXMoKQotICAgICAqIGlzIG51bGwsIHdoaWNoIG1lYW5zIHRoYXQgYWxsIFVSSXMgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGluY2x1ZGVkKS4KLSAgICAgKiA8cD4KLSAgICAgKiBOZXZlciBudWxsLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIHNldCBhcyBpbnZlcnNlKCkuaW5jbHVkZWRRTmFtZXMoKS4KLSAgICAgKi8KLSAgICBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgUU5hbWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBzZXQgd2l0aGluIG5hbWVzcGFjZXMKLSAgICAgKiB0aGF0IGFyZSBvdGhlcndpc2UgZXhjbHVkZWQuIFNob3VsZCBvbmx5IGNvbnRhaW4gUU5hbWVzIHdpdGhpbiBuYW1lc3BhY2UKLSAgICAgKiB0aGF0IGFyZSB3aXRoaW4gdGhlIHNldCBleGNsdWRlZFVSSXMoKSAob3IgYW55IFVSSSwgaWYgZXhjbHVkZWRVUklzKCkKLSAgICAgKiBpcyBudWxsLCB3aGljaCBtZWFucyB0aGF0IGFsbCBVUklzIGFyZSBhbG1vc3QgY29tcGxldGVseSBleGNsdWRlZCkuCi0gICAgICogPHA+Ci0gICAgICogTmV2ZXIgbnVsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2FtZSBhcyBpbnZlcnNlKCkuZXhjbHVkZWRRTmFtZXMoKS4KLSAgICAgKi8KLSAgICBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUF0dHJpYnV0ZUdyb3VwLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxMTAwZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGdyb3VwLgotICogPHA+Ci0gKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgaXMgYSBzeW50YWN0aWMgY29uc3RydWN0LCBub3QgYSBwYXJ0Ci0gKiBvZiB0aGUgbG9naWNhbCBtb2RlbC4gRm9yIGV4YW1wbGUsIHR5cGVzIGRlY2xhcmVkIHdpdGhpbiBhbgotICogYXR0cmlidXRlIGdyb3VwIGJlY29tZSBsb2NhbCB0byB0aGUgdHlwZSB0aGF0IHVzZXMgdGhlIGdyb3VwIC0KLSAqIHRoZXkncmUgbm90IGxvY2FsIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaXRzZWxmLiBUaGVyZWZvcmUKLSAqIGluIHRoZSBsb2dpY2FsIG1vZGVsIG9mIGEgc2NoZW1hIHR5cGUgc3lzdGVtLCBhbiBhdHRyaWJ1dGUKLSAqIGdyb3VwIGRvZXNuJ3QgcmVwcmVzZW50IGFueXRoaW5nLiBJdHMgY29udGVudHMgYXJlIG1lcmdlZAotICogaW50byB0aGUgbG9naWNhbCBtb2RlbCBhdCBwYXJzZSB0aW1lLgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZUdyb3VwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQXR0cmlidXRlR3JvdXAgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVAuCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBncm91cC4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGF0dHJpYnV0ZSBncm91cHMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hQXR0cmlidXRlR3JvdXAgYXR0cmlidXRlR3JvdXApCi0gICAgICAgICAgICB7IHN1cGVyKGF0dHJpYnV0ZUdyb3VwKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXApZ2V0Q29tcG9uZW50KCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlTW9kZWwuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjYzMzJkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlIGFsbG93ZWQgb24gYSBjb21wbGV4IHR5cGUuCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVNb2RlbAotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFBdHRyaWJ1dGVNb2RlbAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIG1vZGVsLgotICAgICAqLwotICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICovCi0gICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUU5hbWVTZXQgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgd2lsZGNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBRTmFtZVNldCBnZXRXaWxkY2FyZFNldCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2luZyBjb2RlICh7QGxpbmsgI1NUUklDVH0sIHtAbGluayAjTEFYfSwge0BsaW5rICNTS0lQfSkuCi0gICAgICogUmV0dXJucyAwICh7QGxpbmsgI05PTkV9KSBpZiBubyB3aWxkY2FyZCBzcGVjaWZpZWQuCi0gICAgICovCi0gICAgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpOwotCi0gICAgLyoqIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotICAgIC8qKiBTdHJpY3Qgd2lsZGNhcmQgcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSUNUID0gMTsKLSAgICAvKiogTGF4IHdpbGRjYXJkIHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IExBWCA9IDI7Ci0gICAgLyoqIFNraXAgd2lsZGNhcmQgcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0tJUCA9IDM7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZGRhM2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGdsb2JhbCBTY2hlbWEgQ29tcG9uZW50LiAgVGhhdCBpcywgYSB0eXBlLCBlbGVtZW50LCBhdHRyaWJ1dGUsCi0gKiBtb2RlbCBncm91cCwgYXR0cmlidXRlIGdyb3VwLCBvciBpZGVudGl0eSBjb25zdHJhaW50LgotICogPHA+Ci0gKiBOb3RlIHRoYXQgbm90IGFsbCB0eXBlcywgZWxlbWVudHMsIGFuZCBhdHRyaWJ1dGVzIGFyZSBnbG9iYWw7IGxvY2FsCi0gKiB0eXBlcywgZWxlbWVudCwgYW5kIGF0dHJpYnV0ZXMgZG8gbm90IGFwcGVhciBpbiB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZS4KLSAqIEFsc28gbm90ZSB0aGF0IG90aGVyIGluZm9ybWF0aW9uIGl0ZW1zIHN1Y2ggYXMgcGFydGljbGVzLCBmYWNldHMsIGFuZAotICogc28gb24gYXJlIG5vdCBnbG9iYWxseSBpbmRleGVkLCBzbyBhcmUgbm90IFNjaGVtYUNvbXBvbmVudHMuCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZQotICogQHNlZSBTY2hlbWFHbG9iYWxFbGVtZW50Ci0gKiBAc2VlIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZQotICogQHNlZSBTY2hlbWFBdHRyaWJ1dGVHcm91cAotICogQHNlZSBTY2hlbWFNb2RlbEdyb3VwCi0gKiBAc2VlIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbXBvbmVudAotewotICAgIC8qKiBBIHR5cGUgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBUWVBFID0gMDsKLSAgICAvKiogQW4gZWxlbWVudCBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxOwotICAgIC8qKiBBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAzOwotICAgIC8qKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVAgPSA0OwotICAgIC8qKiBBbiBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb24uICBTZWUge0BsaW5rICNnZXRDb21wb25lbnRUeXBlfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSURFTlRJVFlfQ09OU1RSQUlOVCA9IDU7Ci0gICAgLyoqIEEgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBNT0RFTF9HUk9VUCA9IDY7Ci0gICAgLyoqIEEgbm90YXRpb24gZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTiA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIGNvZGUgZm9yIHRoZSBzY2hlbWEgb2JqZWN0LCBlaXRoZXIge0BsaW5rICNUWVBFfSwKLSAgICAgKiB7QGxpbmsgI0VMRU1FTlR9LCB7QGxpbmsgI0FUVFJJQlVURX0sIHtAbGluayAjQVRUUklCVVRFX0dST1VQfSwKLSAgICAgKiB7QGxpbmsgI01PREVMX0dST1VQfSwge0BsaW5rICNJREVOVElUWV9DT05TVFJBSU5UfSwgb3Ige0BsaW5rICNOT1RBVElPTn0uCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGVzeXN0ZW0gd2l0aGluIHdoaWNoIHRoaXMgY29tcG9uZW50IGRlZmluaXRpb24gcmVzaWRlcwotICAgICAqLwotICAgIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxhenkgcmVmZXJlbmNlIHRvIGEgY29tcG9uZW50LiBVc2VkIGJ5IFNjaGVtYVR5cGVMb2FkZXJzIHRvCi0gICAgICogYXZvaWQgbG9hZGluZyBjb21wb25lbnRzIHVudGlsIHRoZXkgYXJlIGFjdHVhbGx5IG5lZWRlZC4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVmCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgUmVmKFNjaGVtYUNvbXBvbmVudCBzY2hlbWFDb21wb25lbnQpCi0gICAgICAgICAgICB7IF9zY2hlbWFDb21wb25lbnQgPSBzY2hlbWFDb21wb25lbnQ7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgUmVmKFNjaGVtYVR5cGVTeXN0ZW0gc2NoZW1hVHlwZVN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgYXNzZXJ0KGhhbmRsZSAhPSBudWxsKTsgX3NjaGVtYVR5cGVTeXN0ZW0gPSBzY2hlbWFUeXBlU3lzdGVtOyBfaGFuZGxlID0gaGFuZGxlOyB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFDb21wb25lbnQgX3NjaGVtYUNvbXBvbmVudDsKLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF9zY2hlbWFUeXBlU3lzdGVtOwotICAgICAgICBwdWJsaWMgU3RyaW5nIF9oYW5kbGU7Ci0KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZVN5c3RlbTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zY2hlbWFDb21wb25lbnQgPT0gbnVsbCAmJiBfaGFuZGxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX3NjaGVtYUNvbXBvbmVudCA9IF9zY2hlbWFUeXBlU3lzdGVtLnJlc29sdmVIYW5kbGUoX2hhbmRsZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBfc2NoZW1hQ29tcG9uZW50OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nIG9mIHNjaGVtYSBjb21wb25lbnRzLgotICAgICAqLyAKLSAgICBwdWJsaWMgUmVmIGdldENvbXBvbmVudFJlZigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUZpZWxkLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmODUyYy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBlbGVtZW50IG9yIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlI2dldENvbnRhaW5lckZpZWxkCi0gKiBAc2VlIFNjaGVtYUxvY2FsRWxlbWVudAotICogQHNlZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFGaWVsZAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvcm0tdW5xdWFsaWZpZWQtb3ItcXVhbGlmaWVkIG5hbWUuCi0gICAgICovCi0gICAgUU5hbWUgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHVzZSBpcyBhbiBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQXR0cmlidXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG5pbGxhYmxlOyBhbHdheXMgZmFsc2UgZm9yIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgdXNlLgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWluT2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLgotICAgICAqIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhpcyBkZWZhdWx0cyB0byBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLCBvciBudWxsIGlmIGl0Ci0gICAgICogaXMgdW5ib3VuZGVkLgotICAgICAqIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhpcyBkZWZhdWx0cyB0byBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgYXMgcGxhaW4gdGV4dC4gU2VlIHtAbGluayAjaXNEZWZhdWx0fSBhbmQge0BsaW5rICNpc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBhcyBhIHN0cm9uZ2x5LXR5cGVkIHZhbHVlLiAgU2VlIHtAbGluayAjaXNEZWZhdWx0fSBhbmQge0BsaW5rICNpc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBhIGRlZmF1bHQgaXMgc3VwcGxpZWQuIElmIHtAbGluayAjaXNGaXhlZH0sIHRoZW4gaXNEZWZhdWx0IGlzIGFsd2F5cyB0cnVlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEZWZhdWx0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBmaXhlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRml4ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxBdHRyaWJ1dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1NjgwZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZXh0ZW5kcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSwgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSAueHNkIGZpbGUgd2l0aGluIHdoaWNoIHRoaXMgYXR0cmlidXRlIHdhcyBkZWZpbmVkCi0gICAgICovIAotICAgIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBleGNsdWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSZWYgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQuUmVmCi0gICAgewotICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBlbGVtZW50KQotICAgICAgICAgICAgeyBzdXBlcihlbGVtZW50KTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBnZXQoKQotICAgICAgICAgICAgeyByZXR1cm4gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSlnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJ1bnMgYSBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBwb2ludGluZyB0byB0aGlzIGVsZW1lbnQgaXRzZWxmLgotICAgICAqLwotICAgIHB1YmxpYyBSZWYgZ2V0UmVmKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZiMzQ1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZ2xvYmFsIGVsZW1lbnQgZGVmaW5pdGlvbi4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyI2ZpbmRFbGVtZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hR2xvYmFsRWxlbWVudCBleHRlbmRzIFNjaGVtYUxvY2FsRWxlbWVudCwgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSAueHNkIGZpbGUgd2l0aGluIHdoaWNoIHRoaXMgYXR0cmlidXRlIHdhcyBkZWZpbmVkCi0gICAgICovIAotICAgIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgb2YgUU5hbWVzIGZvciBlbGVtZW50cyB0aGF0IGFyZSB0aGUgbWVtYmVycyBvZiB0aGUKLSAgICAgKiBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHdoaWNoIHRoaXMgZWxlbWVudCBpcyB0aGUgaGVhZCwKLSAgICAgKiBub3QgaW5jbHVkaW5nIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBRTmFtZVtdIHN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVsZW1lbnQgdGhhdCBpcyB0aGUgaGVhZCBvZiB0aGlzIGVsZW1lbnQncyBzdWJzdGl0dXRpb24KLSAgICAgKiBncm91cCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBhIG1lbWJlcgotICAgICAqIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLgotICAgICAqLwotICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXAoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdXNpbmcgdGhpcyBlbGVtZW50IGFzIHRoZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uCi0gICAgICogZ3JvdXAgZm9yIGEgc3Vic3RpdHV0aW9uIHZpYSB0eXBlIGV4dGVuc2lvbiBpcyBwcm9oaWJpdGVkLgotICAgICAqIElmIGJvdGggZmluYWxFeHRlbnNpb24gYW5kIGZpbmFsUmVzdHJpY3Rpb24gYXJlIHRydWUsIHRoaXMKLSAgICAgKiBlbGVtZW50IGNhbm5vdCBiZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLgotICAgICAqIFNlbnNpYmxlIG9ubHkgZm9yIGdsb2JhbCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbEV4dGVuc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB1c2luZyB0aGlzIGVsZW1lbnQgYXMgdGhlIGhlYWQgb2YgYSBzdWJzdGl0dXRpb24KLSAgICAgKiBncm91cCBmb3IgYSBzdWJzdGl0dXRpb24gdmlhIHR5cGUgcmVzdHJpY3Rpb24gaXMgcHJvaGliaXRlZC4KLSAgICAgKiBJZiBib3RoIGZpbmFsRXh0ZW5zaW9uIGFuZCBmaW5hbFJlc3RyaWN0aW9uIGFyZSB0cnVlLCB0aGlzCi0gICAgICogZWxlbWVudCBjYW5ub3QgYmUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4KLSAgICAgKiBTZW5zaWJsZSBvbmx5IGZvciBnbG9iYWwgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBhbGxvdyBvbi1kZW1hbmQgbG9hZGluZyBvZiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50LlJlZgotICAgIHsKLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFHbG9iYWxFbGVtZW50IGVsZW1lbnQpCi0gICAgICAgICAgICB7IHN1cGVyKGVsZW1lbnQpOyB9Ci0KLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUdsb2JhbEVsZW1lbnQgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50KWdldENvbXBvbmVudCgpOyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cnVucyBhIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHBvaW50aW5nIHRvIHRoaXMgZWxlbWVudCBpdHNlbGYuCi0gICAgICovCi0gICAgcHVibGljIFJlZiBnZXRSZWYoKTsKLQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2QwNDYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbi4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzZWxlY3RvciB4cGF0aCBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2VsZWN0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIE9iamVjdCBnZXRTZWxlY3RvclBhdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiAoYSBjb3B5IG9mKSB0aGUgeHBhdGhzIGZvciBhbGwgdGhlIGZpZWxkcy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRGaWVsZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIGZpZWxkLgotICAgICAqLwotICAgIE9iamVjdCBnZXRGaWVsZFBhdGgoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHJlYWQtb25seSBjb3B5IG9mIHRoZSBuYW1lc3BhY2UgbWFwLiBUaGlzIGlzIHRoZSAKLSAgICAgKiBzZXQgb2YgcHJlZml4IHRvIFVSSSBtYXBwaW5ncyB0aGF0IHdlcmUgaW4gc2NvcGUgaW4gdGhlCi0gICAgICogc2NoZW1hIGF0IHRoZSBwb2ludCBhdCB3aGljaCB0aGlzIGNvbnN0cmFpbnQgd2FzIGRlY2xhcmVkCi0gICAgICovCi0gICAgTWFwIGdldE5TTWFwKCk7Ci0KLSAgICAvKiogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUta2V5Ij54czprZXk8L2E+IGNvbnN0cmFpbnQuICBTZWUge0BsaW5rICNnZXRDb25zdHJhaW50Q2F0ZWdvcnl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENDX0tFWSA9IDE7Ci0gICAgLyoqIEEgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWtleSI+eHM6a2V5UmVmPC9hPiBjb25zdHJhaW50LiAgU2VlIHtAbGluayAjZ2V0Q29uc3RyYWludENhdGVnb3J5fS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQ19LRVlSRUYgPSAyOwotICAgIC8qKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1rZXkiPnhzOnVuaXF1ZTwvYT4gY29uc3RyYWludC4gIFNlZSB7QGxpbmsgI2dldENvbnN0cmFpbnRDYXRlZ29yeX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0NfVU5JUVVFID0gMzsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY29uc3RyYWludCBjYXRlZ29yeS4gRWl0aGVyIHtAbGluayAjQ0NfS0VZfSwge0BsaW5rICNDQ19LRVlSRUZ9LAotICAgICAqIG9yIHtAbGluayAjQ0NfVU5JUVVFfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q29uc3RyYWludENhdGVnb3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgdGhhdCBhIGtleSByZWYgcmVmZXJzIHRvLiBPbmx5IHZhbGlkIGZvcgotICAgICAqIGtleXJlZnMuCi0gICAgICovCi0gICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGdldFJlZmVyZW5jZWRLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgaWRlbnRpdHkgY29uc3RyYWludHMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKLSAgICAgICAgICAgIHsgc3VwZXIoaWRjKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpZ2V0Q29tcG9uZW50KCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxBdHRyaWJ1dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWEyOTA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsb2NhbCBvciBnbG9iYWwgYXR0cmlidXRlIGRlZmluaXRpb24uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUxvY2FsQXR0cmlidXRlIGV4dGVuZHMgU2NoZW1hRmllbGQKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAbGluayAjUFJPSElCSVRFRH0sIHtAbGluayAjT1BUSU9OQUx9LCBvciB7QGxpbmsgI1JFUVVJUkVEfS4KLSAgICAgKiAoQWN0dWFsbHksIG5ldmVyIHJldHVybnMgUFJPSElCSVRFRCBiZWNhdXNlIHRoZSBzY2hlbWEgc3BlY2lmaWNhaW9uCi0gICAgICogc3RhdGVzIHRoYXQgYSBwcm9oaWJpdGVkIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIG5vIGF0dHJpYnV0ZQotICAgICAqIGF0IGFsbCwgc28gYSBwcm9oaWJpdGVkIGF0dHJpYnV0ZSB3aWxsIG5ldmVyIGJlIHByZXNlbnQgaW4gdGhlIGNvbXBpbGVkCi0gICAgICogbW9kZWwuKQotICAgICAqLwotICAgIGludCBnZXRVc2UoKTsKLQotICAgIC8qKiBBIHByb2hpYml0ZWQgYXR0cmlidXRlLiAgU2VlIHtAbGluayAjZ2V0VXNlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0hJQklURUQgPSAxOwotICAgIC8qKiBBbiBvcHRpb25hbCBhdHRyaWJ1dGUuICBTZWUge0BsaW5rICNnZXRVc2V9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSAyOwotICAgIC8qKiBBIHJlcXVpcmVkIGF0dHJpYnV0ZS4gIFNlZSB7QGxpbmsgI2dldFVzZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDM7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxFbGVtZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDY4ZGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUxvY2FsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsb2NhbCBvciBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9uLgotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFMb2NhbEVsZW1lbnQgZXh0ZW5kcyBTY2hlbWFGaWVsZAotewotICAgIC8qKgotICAgICAqIFRydWUgaWYgZXh0ZW5zaW9uIGlzIGJsb2NrZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpOwotICAgIC8qKgotICAgICAqIFRydWUgaWYgcmVzdHJpY3Rpb24gaXMgYmxvY2tlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKTsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIGVsZW1lbnQgc3Vic3RpdHV0aW9uIGlzIGJsb2NrZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBibG9ja1N1YnN0aXR1dGlvbigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgcHJvaGliaXRlZCBpbiBjb250ZW50LiBPbmx5Ci0gICAgICogc2Vuc2libGUgaWYgdGhpcyBpcyB0aGUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cDsKLSAgICAgKiB0aGVuIG9ubHkgc3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMgY2FuIGFwcGVhci48UD4KLSAgICAgKiAKLSAgICAgKiBBbHRob3VnaCBsb2NhbCBlbGVtZW50cyBjYW5ub3QgYmUgYWJzdHJhY3QsIGlmIGFuIGVsZW1lbnQgCi0gICAgICogdXNlIGlzIGEgcmVmIHRvIGEgZ2xvYmFsIGVsZW1lbnQsIHRoZW4gdGhlIGZsYWcgZnJvbSB0aGUgCi0gICAgICogZ2xvYmFsIGVsZW1lbnQgaXMgY29waWVkIGluIHRvIHRoZSBsb2NhbCBlbGVtZW50IHdoZXJlIHRoZSAKLSAgICAgKiB1c2Ugb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIEtleSwgS2V5UmVmLCBhbmQgVW5pcXVlIGNvbnN0cmFpbnRzCi0gICAgICogb24gdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGdldElkZW50aXR5Q29uc3RyYWludHMoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFNb2RlbEdyb3VwLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QyZDc1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFNb2RlbEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbW9kZWwgZ3JvdXAuCi0gKiA8cD4KLSAqIEEgbW9kZWwgZ3JvdXAgaXMgYSBzeW50YWN0aWMgY29uc3RydWN0LCBub3QgYSBwYXJ0IG9mCi0gKiB0aGUgbG9naWNhbCBtb2RlbC4gRm9yIGV4YW1wbGUsIHR5cGVzIGRlY2xhcmVkIHdpdGhpbiBhCi0gKiBtb2RlbCBncm91cCBiZWNvbWUgbG9jYWwgdG8gdGhlIHR5cGUgdGhhdCB1c2VzIHRoZSBncm91cCAtCi0gKiB0aGV5J3JlIG5vdCBsb2NhbCB0byB0aGUgbW9kZWwgZ3JvdXAgaXRzZWxmLiBUaGVyZWZvcmUgaW4KLSAqIHRoZSBsb2dpY2FsIG1vZGVsIG9mIGEgc2NoZW1hIHR5cGUgc3lzdGVtLCBhIG1vZGVsIGdyb3VwCi0gKiBkb2Vzbid0IHJlcHJlc2VudCBhbnl0aGluZy4gSXRzIGNvbnRlbnRzIGFyZSBtZXJnZWQgaW50bwotICogdGhlIGxvZ2ljYWwgbW9kZWwgYXQgcGFyc2UgdGltZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFNb2RlbEdyb3VwIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBTY2hlbWFDb21wb25lbnQuR1JPVVAuCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBncm91cC4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIG1vZGVsIGdyb3Vwcy4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50LlJlZgotICAgIHsKLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgICAgICAgICB7IHN1cGVyKG1vZGVsR3JvdXApOyB9Ci0KLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5NT0RFTF9HUk9VUDsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFNb2RlbEdyb3VwIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hTW9kZWxHcm91cClnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQYXJ0aWNsZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTg1YTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBTY2hlbWEgcGFydGljbGUgZGVmaW5pdGlvbi4KLSAqIDxwPgotICogVGhlIGNvbnRlbnQgbW9kZWwgb2YgYSBjb21wbGV4IHR5cGUgaXMgYSB0cmVlIG9mIHBhcnRpY2xlcy4gIEVhY2gKLSAqIHBhcnRpY2xlIGlzIGVpdGhlciBhbiB7QGxpbmsgI0FMTH0sIHtAbGluayAjQ0hPSUNFfSwge0BsaW5rICNTRVFVRU5DRX0sCi0gKiB7QGxpbmsgI0VMRU1FTlR9LCBvciB7QGxpbmsgI1dJTERDQVJEfS4KLSAqIEFsbCwgY2hvaWNlIGFuZCBzZXF1ZW5jZSBwYXJ0aWNsZXMgYXJlIGdyb3VwcyB0aGF0IGNhbiBoYXZlIGNoaWxkCi0gKiBwYXJ0aWNsZXM7IGVsZW1lbnRzIGFuZCB3aWxkY2FyZHMgYXJlIGFsd2F5cyBsZWF2ZXMgb2YgdGhlIHBhcnRpY2xlIHRyZWUuCi0gKiA8cD4KLSAqIFRoZSB0cmVlIG9mIHBhcnRpY2xlcyBhdmFpbGFibGUgb24gYSBzY2hlbWEgdHlwZSBpcyBtaW5pbWl6ZWQsIHRoYXQKLSAqIGlzLCBpdCBhbHJlYWR5IGhhcyByZW1vdmVkICJwb2ludGxlc3MiIHBhcnRpY2xlcyBzdWNoIGFzIGVtcHR5Ci0gKiBzZXF1ZW5jZXMsIG5vbnJlcGVhdGluZyBzZXF1ZW5jZXMgd2l0aCBvbmx5IG9uZSBpdGVtLCBhbmQgc28gb24uCi0gKiAoPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QiPlBvaW50bGVzcyBwYXJ0aWNsZXM8L2E+Ci0gKiBhcmUgZGVmaW5lZCBwcmVjaXNlbHkgaW4gdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbi4pCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRDb250ZW50TW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFQYXJ0aWNsZQotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcnRpY2xlIHR5cGUgKHtAbGluayAjQUxMfSwge0BsaW5rICNDSE9JQ0V9LAotICAgICAqIHtAbGluayAjU0VRVUVOQ0V9LCB7QGxpbmsgI0VMRU1FTlR9LCBvciB7QGxpbmsgI1dJTERDQVJEfSkuIAotICAgICAqLyAKLSAgICBpbnQgZ2V0UGFydGljbGVUeXBlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW4gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWNvbnRlbnRNb2RlbCI+eHM6YWxsPC9hPiBncm91cC4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IEFMTCA9IDE7Ci0gICAgLyoqCi0gICAgICogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtY29udGVudE1vZGVsIj54czpjaG9pY2U8L2E+IGdyb3VwLgotICAgICAqIFNlZSB7QGxpbmsgI2dldFBhcnRpY2xlVHlwZX0uCi0gICAgICovIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKLSAgICAvKioKLSAgICAgKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1jb250ZW50TW9kZWwiPnhzOnNlcXVlbmNlPC9hPiBncm91cC4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFID0gMzsKLSAgICAvKioKLSAgICAgKiBBbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtZWxlbWVudCI+eHM6ZWxlbWVudDwvYT4gcGFydGljbGUuCi0gICAgICogVGhpcyBjb2RlIG1lYW5zIHRoZSBwYXJ0aWNsZSBjYW4gYmUgY29lcmNlZCB0byB7QGxpbmsgU2NoZW1hTG9jYWxFbGVtZW50fS4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSA0OwotICAgIC8qKgotICAgICAqIEFuIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1vcGVubmVzcyI+eHM6YW55PC9hPiBwYXJ0aWNsZSwKLSAgICAgKiBhbHNvIGtub3duIGFzIGFuIGVsZW1lbnQgd2lsZGNhcmQuCi0gICAgICogU2VlIHtAbGluayAjZ2V0UGFydGljbGVUeXBlfS4KLSAgICAgKi8gCi0gICAgc3RhdGljIGZpbmFsIGludCBXSUxEQ0FSRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaW5PY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUuCi0gICAgICogSWYgaXQncyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHRoaXMgcmV0dXJucyBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLCBvciBudWxsIGlmIGl0Ci0gICAgICogaXMgdW5ib3VuZGVkLgotICAgICAqIElmIGl0J3Mgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIHJldHVybnMgQmlnSW50ZWdlci5PTkUuCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbk9jY3VycyB2YWx1ZSwgcGVnZ2VkIHRvIGEgMzItYml0IGludCBmb3IKLSAgICAgKiBjb252ZW5pZW5jZSBvZiBhIHZhbGlkYXRpbmcgc3RhdGUgbWFjaGluZSB0aGF0IGRvZXNuJ3QgY291bnQKLSAgICAgKiBoaWdoZXIgdGhhbiBNQVhfSU5UIGFueXdheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlLCBwZWdnZWQgdG8gYSAzMi1iaXQgaW50IGZvcgotICAgICAqIGNvbnZlbmllbmNlIG9mIGEgdmFsaWRhdGluZyBzdGF0ZSBtYWNoaW5lIHRoYXQgZG9lc24ndCBjb3VudAotICAgICAqIGhpZ2hlciB0aGFuIE1BWF9JTlQgYW55d2F5LiBVbmJvdW5kZWQgaXMgZ2l2ZW4gYXMgTUFYX0lOVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludE1heE9jY3VycygpOwotCi0KLSAgICAvKioKLSAgICAgKiBPbmUgaWYgbWluT2NjdXJzID09IG1heE9jY3VycyA9PSAxLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNTaW5nbGV0b24oKTsKLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdG8gc2VxdWVuY2UsIGNob2ljZSwgYW5kIGFsbCBwYXJ0aWNsZXMgb25seTogcmV0dXJucyBhbiBhcnJheQotICAgICAqIG9mIGFsbCB0aGUgcGFydGljbGUgY2hpbGRyZW4gaW4gb3JkZXIuCi0gICAgICovCi0gICAgU2NoZW1hUGFydGljbGVbXSBnZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbm90aGVyIHdheSB0byBhY2Nlc3MgdGhlIHBhcnRpY2xlIGNoaWxkcmVuLgotICAgICAqLwotICAgIFNjaGVtYVBhcnRpY2xlIGdldFBhcnRpY2xlQ2hpbGQoaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBpbnQgY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBwYXJ0aWNsZSBjYW4gc3RhcnQgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudAotICAgICAqICh0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdHJ1Y3R1cmUgb2YgYWxsIGNoaWxkIHBhcnRpY2xlcwotICAgICAqIG9mIGNvdXJzZSkuCi0gICAgICovCi0gICAgYm9vbGVhbiBjYW5TdGFydFdpdGhFbGVtZW50KFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUU5hbWVTZXQgb2YgZWxlbWVudCBuYW1lcyB0aGF0IGNhbiBiZQotICAgICAqIGFjY2VwdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBwYXJ0aWNsZS4KLSAgICAgKi8KLSAgICBRTmFtZVNldCBhY2NlcHRlZFN0YXJ0TmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBwYXJ0aWNsZSBjYW4gYmUgc2tpcHBlZCAodGFraW5nIGludG8gYWNjb3VudAotICAgICAqIGJvdGggdGhlIG1pbk9jdXJzIGFzIHdlbGwgYXMgdGhlIHN0cnVjdHVyZSBvZiBhbGwgdGhlCi0gICAgICogY2hpbGQgcGFydGljbGVzKQotICAgICAqLwotICAgIGJvb2xlYW4gaXNTa2lwcGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciB3aWxkY2FyZHMsIHJldHVybnMgYSBRTmFtZVNldCByZXByZXNlbnRpbmcgdGhlIHdpbGRjYXJkLgotICAgICAqLwotICAgIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd2lsZGNhcmRzLCByZXR1cm5zIHRoZSBwcm9jZXNzaW5nIGNvZGUgKHtAbGluayAjU1RSSUNUfSwge0BsaW5rICNMQVh9LCB7QGxpbmsgI1NLSVB9KS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0V2lsZGNhcmRQcm9jZXNzKCk7Ci0KLSAgICAvKiogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNXaWxkY2FyZF9kZXRhaWxzIj5TdHJpY3Qgd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklDVCA9IDE7Ci0gICAgLyoqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jV2lsZGNhcmRfZGV0YWlscyI+TGF4IHdpbGRjYXJkPC9hPiBwcm9jZXNzaW5nLiBTZWUge0BsaW5rICNnZXRXaWxkY2FyZFByb2Nlc3N9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBMQVggPSAyOwotICAgIC8qKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI1dpbGRjYXJkX2RldGFpbHMiPlNraXAgd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNLSVAgPSAzOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRoZSBRTmFtZSBmb3IgdGhlIGVsZW1lbnQgdXNlLgotICAgICAqIE1heSBiZSB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHJlZmVyZW5jZWQgZWxlbWVudCdzIG5hbWUuCi0gICAgICovCi0gICAgUU5hbWUgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRydWUgaWYgbmlsbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudHMgb25seTogcmV0dXJucyB0aGUgZGVmYXVsdCAob3IgZml4ZWQpIHRleHQgdmFsdWUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudHMgb25seTogcmV0dXJucyB0aGUgZGVmYXVsdCAob3IgZml4ZWQpIHN0cm9uZ2x5LXR5cGVkIHZhbHVlCi0gICAgICovCi0gICAgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiBUcnVlIGlmIGhhcyBkZWZhdWx0LiBJZiBpc0ZpeGVkLCB0aGVuIGlzRGVmYXVsdCBpcyBhbHdheXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVmYXVsdCgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRydWUgaWYgaXMgZml4ZWQgdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ZpeGVkKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hUHJvcGVydHkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNhZWVmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc3VtbWFyeSBvZiBzaW1pbGFyIFNjaGVtYUZpZWxkcyBpbiBhIGNvbXBsZXggdHlwZS4KLSAqIDxwPgotICogSW4gYSBzY2hlbWEgdHlwZSwgZXZlcnkgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBoYXZlIHRoZQotICogc2FtZSB0eXBlLiAgVGhlcmVmb3JlLCBhbGwgdG9nZXRoZXIsIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICogZm9ybSBhIGNvaGVyZW50IGNvbGxlY3Rpb24gb2Ygc2ltaWxhciBlbGVtZW50cy4gIFNpbWlsYXJseSwgYXR0cmlidXRlcwotICogY2FuIG9ubHkgYmUgZGVmaW5lZCBvbmNlLCBzbyBlYWNoIGF0dHJpYnV0ZSBvYnZpb3VzbHkgaXMgYSBjb2hlcmVudAotICogZ3JvdXAgb24gaXRzIG93bi4KLSAqIDxwPgotICogQSBTY2hlbWFQcm9wZXJ0eSByZXByZXNlbnRzIGEgc3VtbWFyeSBvZiB0aGUgdGhlIGVsZW1lbnRzIHdpdGggYQotICogZ2l2ZW4gbmFtZSBvciB0aGUgYXR0cmlidXRlIHdpdGggYSBnaXZlbiBuYW1lLiAgSXQgcmVwcmVzZW50cyB0aGUKLSAqIHN1bW1hcnkgY2FyZGluYWxpdHkgb2YgdGhlIGZpZWxkcywgdGhlIHN1bW1hcnkgZGVmYXVsdCBhbmQgZml4ZWQKLSAqIHZhbHVlcywgYW5kIHNvIG9uLiAgV2hlbiBpbmZlcnJpbmcgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudAotICogb3IgYXR0cmlidXRlLCBpdCBpcyB0eXBpY2FsbHkgZWFzaWVyIHRvIGNvbnN1bHQgdGhlbiBTY2hlbWFQcm9wZXJ0eQotICogdGhhbiB0byBodW50IGZvciB0aGUgZXhhY3QgU2NoZW1hRmllbGQgaW4gdGhlIHBhcnRpY2xlIHRyZWUgb3IKLSAqIGF0dHJpYnV0ZSBtb2RlbC4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlI2dldFByb3BlcnRpZXMKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0RWxlbWVudFByb3BlcnRpZXMKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVQcm9wZXJ0eQotICogQHNlZSBTY2hlbWFUeXBlI2dldEVsZW1lbnRQcm9wZXJ0eQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVByb3BlcnR5Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgd2l0aGluIHdoaWNoIHRoaXMgcHJvcGVydHkgYXBwZWFycwotICAgICAqLyAKLSAgICBTY2hlbWFUeXBlIGdldENvbnRhaW5lclR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQgb3IgYXR0cmlidXRlCi0gICAgICovIAotICAgIFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50IHByb3BlcnRpZXMgdGhlIHNldCBvZiBuYW1lcyB0aGF0IGFyZSBhY2NlcHRlZCBmb3IgdGhpcyBwcm9wZXJ0eQotICAgICAqIGlmIHRoaXMgZWxlbWVudCBpcyB0aGUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4gVGhpcyB3aWxsIGFsd2F5cwotICAgICAqIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGllLCB0aGUgcHJvcGVydHkncyBuYW1lLgotICAgICAqLwotICAgIFFOYW1lW10gYWNjZXB0ZWROYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBKYXZhIG5hbWUgZm9yIHRoaXMgcHJvcGVydHkuICBGb3IgZXhhbXBsZSwgaWYgdGhlIG1ldGhvZCB0bwotICAgICAqIGFjY2VzcyB0aGlzIHByb3BlcnR5IGlzIGNhbGxlZCBnZXRGaXJzdE5hbWUsIHRoZW4gdGhpcyBtZXRob2QKLSAgICAgKiByZXR1cm5zIHRoZSBzdHJpbmcgIkZpcnN0TmFtZSIuICBNYXkgYmUgbnVsbCBpZiB0aGUgc2NoZW1hIHR5cGUKLSAgICAgKiBoYXMgbm90IGJlZW4gY29tcGlsZWQgdG8gSmF2YS4KLSAgICAgKi8gCi0gICAgU3RyaW5nIGdldEphdmFQcm9wZXJ0eU5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGZvciByZWFkLW9ubHkgcHJvcGVydGllcy4KLSAgICAgKi8gCi0gICAgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGZvciBhdHRyaWJ1dGVzLgotICAgICAqLyAKLSAgICBib29sZWFuIGlzQXR0cmlidXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2NoZW1hIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8gCi0gICAgU2NoZW1hVHlwZSBnZXRUeXBlKCk7Ci0KLSAgICAvLyBub3RlIHRoYXQgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgaWYgdGhlIGFycmF5IGdldHRlciBzaG93cyB1cCBmaXJzdCwKLSAgICAvLyB0aGVuIHRoZSBzaW5nZWx0b24gZ2V0dGVyIGlzIG5ldmVyIGFsbG93ZWQgdG8gc2hvdyB1cC4KLQotICAgIC8qKgotICAgICAqIFRoZSBzY2hlbWEgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBKYXZhIGdldHRlciBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKiBBcHBsaWVzIG9ubHkgdG8gdHlwZXMgdGhhdCBoYXZlIGJlZW4gY29kZSBnZW5lcmF0ZWQgdG8gSmF2YTsgbWF5Ci0gICAgICogYmUgYSBiYXNlIHR5cGUgb2YgZ2V0VHlwZSgpLgotICAgICAqLyAKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUoKTsgLy8gSmF2YSBwcm9wZXJ0eSB0eXBlIGJhc2VkIG9uIHRoaXMgYmFzZSB0eXBlCi0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIEphdmEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIHNpbmdsZXRvbi4KLSAgICAgKi8gCi0gICAgYm9vbGVhbiBleHRlbmRzSmF2YVNpbmdsZXRvbigpOyAvLyBoYXMgc2luZ2xldG9uIGdldHRlcgotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYW4gSmF2YSBpc1NldCBtZXRob2QgdGhhdCB0ZXN0cyBmb3IgcHJlc2VuY2UuCi0gICAgICovIAotICAgIGJvb2xlYW4gZXh0ZW5kc0phdmFPcHRpb24oKTsgICAgLy8gaGFzIGlzU2V0IHRlc3RlcgotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBKYXZhIGdldHRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkuCi0gICAgICovIAotICAgIGJvb2xlYW4gZXh0ZW5kc0phdmFBcnJheSgpOyAgICAgLy8gaGFzIGFycmF5IGdldHRlciAoY2FsbGVkIC1BcnJheSwgaWYgc2luZ2xldG9uIGlzIHByZXNlbnQpCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmF0dXJhbCBKYXZhIHR5cGUgZm9yIHRoaXMgcHJvcGVydHkuICBSZXR1cm5zIGVpdGhlcgotICAgICAqIFhNTF9PQkpFQ1QgKGZvciBjb21wbGV4IHR5cGVzKSBvciBvbmUgb2YgdGhlIEpBVkFfKiBjb25zdGFudHMgZGVzY3JpYmVkCi0gICAgICogaW4gdGhpcyBpbnRlcmZhY2UuCi0gICAgICovIAotICAgIGludCBnZXRKYXZhVHlwZUNvZGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZWxlbWVudCBuYW1lcyB3aGljaCBzaG91bGQgYXBwZWFyIHN0cmljdGx5IGFmdGVyIGFsbAotICAgICAqIG9jY3VyZW5jZXMgb2YgdGhlIGVsZW1lbnRzIGRlc2NyaWJlZCBieSB0aGlzIHByb3BlcnR5LiBGb3IgZWxlbWVudCBwcm9wZXJ0aWVzIG9ubHkuCi0gICAgICovIAotICAgIFFOYW1lU2V0IGdldEphdmFTZXR0ZXJEZWxpbWl0ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdW1tYXJpemVkIG1pbmltdW0gb2NjdXJyYW5jZSBudW1iZXIuCi0gICAgICogRm9yIGV4YW1wbGUsIGEgc2VxdWVuY2UgY29udGFpbmluZyBhIG5vbm9wdGlvbmFsIHNpbmdsZXRvbiBlbGVtZW50IHJlcGVhdGVkIHR3aWNlIHdpbGwKLSAgICAgKiByZXN1bHQgaW4gYSBwcm9wZXJ0eSBnZXRNaW5PY2N1cnMoKSBvZiAyLgotICAgICAqLyAKLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdW1tYXJpemVkIG1pbmltdW0gb2NjdXJyYW5jZSBudW1iZXIuCi0gICAgICogRm9yIGV4YW1wbGUsIGEgc2VxdWVuY2UgY29udGFpbmluZyBhIG5vbm9wdGlvbmFsIHNpbmdsZXRvbiBlbGVtZW50IHJlcGVhdGVkIHR3aWNlIHdpbGwKLSAgICAgKiByZXN1bHQgaW4gYSBwcm9wZXJ0eSBnZXRNYXhPY2N1cnMoKSBvZiAyLgotICAgICAqLyAKLSAgICBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI05FVkVSfSwge0BsaW5rICNWQVJJQUJMRX0sIG9yIHtAbGluayAjQ09OU0lTVEVOVExZfSBuaWxsYWJsZSwgZGVwZW5kaW5nIG9uIHRoZQotICAgICAqIG5pbGxhYmlsaXR5IG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHByb3BlcnR5LiAKLSAgICAgKi8KLSAgICBpbnQgaGFzTmlsbGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0BsaW5rICNORVZFUn0sIHtAbGluayAjVkFSSUFCTEV9LCBvciB7QGxpbmsgI0NPTlNJU1RFTlRMWX0gZGVmYXVsdGVkLCBkZXBlbmRpbmcgb24gdGhlCi0gICAgICogZGVmYXVsdHMgcHJlc2VudCBpbiB0aGUgZWxlbWVudHMgaW4gdGhpcyBwcm9wZXJ0eS4gCi0gICAgICovCi0gICAgaW50IGhhc0RlZmF1bHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0BsaW5rICNORVZFUn0sIHtAbGluayAjVkFSSUFCTEV9LCBvciB7QGxpbmsgI0NPTlNJU1RFTlRMWX0gZml4ZWQsIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgKiBmaXhlZCBjb25zdHJhaW50cyBwcmVzZW50IGluIHRoZSBlbGVtZW50cyBpbiB0aGlzIHByb3BlcnR5LiAKLSAgICAgKi8KLSAgICBpbnQgaGFzRml4ZWQoKTsKLQotICAgIC8qKiBBcHBsaWVzIHRvIG5vIGVsZW1lbnRzIGZvciB0aGlzIHByb3BlcnR5LiAgU2VlIHtAbGluayAjaGFzTmlsbGFibGV9LCB7QGxpbmsgI2hhc0RlZmF1bHR9LCB7QGxpbmsgI2hhc0ZpeGVkfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVIgPSAwOwotICAgIC8qKiBBcHBsaWVzIHRvIHNvbWUsIGJ1dCBub3Qgb3RoZXIgZWxlbWVudHMgZm9yIHRoaXMgcHJvcGVydHkuICBTZWUge0BsaW5rICNoYXNOaWxsYWJsZX0sIHtAbGluayAjaGFzRGVmYXVsdH0sIHtAbGluayAjaGFzRml4ZWR9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRSA9IDE7Ci0gICAgLyoqIEFwcGxpZXMgdG8gYWxsIGVsZW1lbnRzIGZvciB0aGlzIHByb3BlcnR5LiAgU2VlIHtAbGluayAjaGFzTmlsbGFibGV9LCB7QGxpbmsgI2hhc0RlZmF1bHR9LCB7QGxpbmsgI2hhc0ZpeGVkfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OU0lTVEVOVExZID0gMjsKLQotICAgIC8qKiBBbiBYTUwgQmVhbiB0eXBlIHRoYXQgaW5oZXJpdHMgZnJvbSB7QGxpbmsgWG1sT2JqZWN0fS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1QgPSAwOwotCi0gICAgLyoqIEphdmEgcHJpbWl0aXZlIHR5cGUgY29kZXMgKGZvciBub24tbnVsbGFibGUgSmF2YSB0eXBlcykgYXJlIGJldHdlZW4gSkFWQV9GSVJTVF9QUklNSVRJVkUgYW5kIEpBVkFfTEFTVF9QUklNSVRJVkUsIGluY2x1c2l2ZS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfRklSU1RfUFJJTUlUSVZFID0gMTsKLQotICAgIC8qKiBBIEphdmEgYm9vbGVhbi4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQk9PTEVBTiA9IDE7Ci0gICAgLyoqIEEgSmF2YSBmbG9hdC4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfRkxPQVQgPSAyOwotICAgIC8qKiBBIEphdmEgZG91YmxlLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9ET1VCTEUgPSAzOwotICAgIC8qKiBBIEphdmEgYnl0ZS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQllURSA9IDQ7Ci0gICAgLyoqIEEgSmF2YSBzaG9ydC4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfU0hPUlQgPSA1OwotICAgIC8qKiBBIEphdmEgaW50LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9JTlQgPSA2OwotICAgIC8qKiBBIEphdmEgbG9uZy4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfTE9ORyA9IDc7Ci0KLSAgICAvKiogSmF2YSBwcmltaXRpdmUgdHlwZSBjb2RlcyAoZm9yIG5vbi1udWxsYWJsZSBKYXZhIHR5cGVzKSBhcmUgYmV0d2VlbiBKQVZBX0ZJUlNUX1BSSU1JVElWRSBhbmQgSkFWQV9MQVNUX1BSSU1JVElWRSwgaW5jbHVzaXZlLiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQVNUX1BSSU1JVElWRSA9IDc7Ci0KLSAgICAvKiogQSB7QGxpbmsgamF2YS5tYXRoLkJpZ0RlY2ltYWx9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CSUdfREVDSU1BTCA9IDg7Ci0gICAgLyoqIEEge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQklHX0lOVEVHRVIgPSA5OwotICAgIC8qKiBBIHtAbGluayBTdHJpbmd9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9TVFJJTkcgPSAxMDsKLSAgICAvKiogQSBieXRlW10uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0JZVEVfQVJSQVkgPSAxMTsKLSAgICAvKiogQSB7QGxpbmsgR0RhdGV9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9HREFURSA9IDEyOwotICAgIC8qKiBBIHtAbGluayBHRHVyYXRpb259LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9HRFVSQVRJT04gPSAxMzsKLSAgICAvKiogQSB7QGxpbmsgamF2YS51dGlsLkRhdGV9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9EQVRFID0gMTQ7Ci0gICAgLyoqIEEge0BsaW5rIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWV9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9RTkFNRSA9IDE1OwotICAgIC8qKiBBIHtAbGluayBqYXZhLnV0aWwuTGlzdH0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0xJU1QgPSAxNjsKLSAgICAvKiogQSB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0FMRU5EQVIgPSAxNzsKLQotICAgIC8qKiBBIGdlbmVyYXRlZCB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZX0gc3ViY2xhc3MuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0VOVU0gPSAxODsKLSAgICAvKiogQSB7QGxpbmsgamF2YS5sYW5nLk9iamVjdH0sIHVzZWQgZm9yIHNvbWUgc2ltcGxlIHR5cGUgdW5pb25zLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PQkpFQ1QgPSAxOTsgLy8gZm9yIHNvbWUgdW5pb25zCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlLAotICAgICAqIGlmIGl0IGlzIGNvbnNpc3RlbnQuIElmIGl0IGlzIG5vdCBjb25zaXN0ZW50LAotICAgICAqIHRoZW4gcmV0dXJucyBudWxsLgotICAgICAqIFNlZSB7QGxpbmsgI2hhc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2hhc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlIGFzIGEgc3Ryb25nbHktdHlwZWQgdmFsdWUsCi0gICAgICogaWYgaXQgaXMgY29uc2lzdGVudC4gSWYgaXQgaXMgbm90IGNvbnNpc3RlbnQsCi0gICAgICogdGhlbiByZXR1cm5zIG51bGwuCi0gICAgICogU2VlIHtAbGluayAjaGFzRGVmYXVsdH0gYW5kIHtAbGluayAjaGFzRml4ZWR9LgotICAgICAqLwotICAgIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hU3RyaW5nRW51bUVudHJ5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hU3RyaW5nRW51bUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWY1NGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVN0cmluZ0VudW1FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIGNvZGUtZ2VuZXJhdGVkIHN0cmluZyBlbnVtZXJhdGlvbgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0U3RyaW5nRW51bUVudHJpZXMKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hU3RyaW5nRW51bUVudHJ5Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIGVudW1lcmF0ZWQgc3RyaW5nIHZhbHVlCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW4gaW50ZWdlciB0byByZXByZXNlbnQgdGhpcyBjaG9pY2UgaW4gdGhlIGVudW1lcmF0aW9uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNhcGl0YWxpemVkIG5hbWUgdG8gdXNlIGZvciB0aGUgZW51bWVyYXRpb24gY29uc3RhbnQgbmFtZQotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudW1OYW1lKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxOGYyNy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNjaGVtYSB0eXBlLgotICogPHA+Ci0gKiBTY2hlbWFUeXBlIGlzIHRoZSBtZXRhZGF0YSAidHlwZSIgY2xhc3MgZm9yIHtAbGluayBYbWxPYmplY3R9LCBhbmQgaXQgcGxheXMgdGhlCi0gKiBhbmFsb2dvdXMgcm9sZSBmb3Ige0BsaW5rIFhtbE9iamVjdH0gdGhhdCB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfSBwbGF5cyBmb3IKLSAqIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0fS4KLSAqIDxwPgotICogRXZlcnkgWE1MIEJlYW4gY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGV0b24gU2NoZW1hVHlwZSBvYmplY3QKLSAqIG9idGFpbmFibGUgYnkgQ2xhc3NOYW1lLnR5cGUgKGUuZy4sIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXIjdHlwZX0pLCBhbmQKLSAqIGV2ZXJ5IFhNTCBCZWFuIGluc3RhbmNlIGhhcyBhbiBhY3R1YWwgU2NoZW1hVHlwZSwgb2J0YWluYWJsZSBieQotICoge0BsaW5rIFhtbE9iamVjdCNzY2hlbWFUeXBlfS4gIFRoZSBDbGFzc05hbWUudHlwZSBhbmQgc2NoZW1hVHlwZSgpIG1lY2hhbmlzbXMgYXJlCi0gKiBhbmFsb2dvdXMgdG8gdGhlIG9yZGluYXJ5IEphdmEgQ2xhc3NOYW1lLmNsYXNzIGFuZCBvYmouZ2V0Q2xhc3MoKSBtZWNoYW5pc21zLgotICogPHA+Ci0gKiBBbGwgc2NoZW1hIHR5cGVzIGFyZSByZXByZXNlbnRlZCBieSBhIFNjaGVtYVR5cGUsIHRoaXMgaW5jbHVkZXMgYWxsIHR5cGVzCi0gKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgYnVpbHQtaW4gb3IgdXNlci1kZWZpbmVkLCBjb21waWxlZCBvcgotICogdW5jb21waWxlZCwgc2ltcGxlIG9yIGNvbXBsZXguCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uLCBhIGNvbXBpbGVkIFhNTCBCZWFuIHR5cGUgc3lzdGVtIGluY2x1ZGVzIHNwZWNpYWwgImRvY3VtZW50IiBzY2hlbWEgdHlwZXMKLSAqIGVhY2ggcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgY29udGFpbmluZyBub3RoaW5nIGJ1dCBhIHNpbmdsZSBlbGVtZW50IGZvciBlYWNoCi0gKiBnbG9iYWwgZWxlbWVudCwgYW5kIHNwZWNpYWwgImF0dHJpYnV0ZSIgc2NoZW1hIHR5cGVzIGVhY2ggcmVwcmVzZW50aW5nCi0gKiBhIGZyYWdtZW50IGNvbnRhaW5pbmcgbm90aGluZyBidXQgYSBzaW5nbGUgZ2xvYmFsIGF0dHJpYnV0ZSBmb3IgZ2xvYmFsCi0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIERvIG5vdCBjb25mdXNlIFNjaGVtYSBUeXBlcyB3aXRoIG90aGVyIHR5cGVzIG9mIFNjaGVtYSBDb21wb25lbnRzIHN1Y2ggYXMKLSAqIHtAbGluayBTY2hlbWFHbG9iYWxFbGVtZW50IEdsb2JhbCBFbGVtZW50c30sIHtAbGluayBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgR2xvYmFsIEF0dHJpYnV0ZXN9LAotICoge0BsaW5rIFNjaGVtYU1vZGVsR3JvdXAgTmFtZWQgTW9kZWwgR3JvdXBzfSwgb3Ige0BsaW5rIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIEF0dHJpYnV0ZSBHcm91cHN9LgotICogU2NoZW1hVHlwZSByZXByZXNlbnRzIGEgVHlwZSBjb21wb25lbnQsIG5vdCBhbnkgb2YgdGhlIG90aGVyIGtpbmRzIG9mIGNvbXBvbmVudHMuCi0gKiBUaGVyZSBhcmUgZGlmZmVyZW50IGtpbmRzIG9mIG1ldGFkYXRhIG9iamVjdHMgZm9yIHRoZSBkaWZmZXJlbnQgU2NoZW1hIGNvbXBvbmVudHMuIAotICogPHA+Ci0gKiBUaGUgc3BhY2Ugb2YgU2NoZW1hVHlwZXMgaXMgZGl2aWRlZCBhcyBmb2xsb3dzOgotICogCi0gKiA8dWw+Ci0gKiA8bGk+Rmlyc3QsIHRoZXJlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlIGFuZCB0aGUgdW5pdmVyc2FsCi0gKiAgICAgc3VidHlwZS4gIFRoZXNlIGFyZSB7QGxpbmsgWG1sT2JqZWN0I3R5cGV9Ci0gKiAgICAgKGNvcnJlc3BvbmRpbmcgdG8geHM6YW55VHlwZSkgYW5kIHtAbGluayBYbWxCZWFucyNOT19UWVBFfSwKLSAqICAgICByZXNwZWN0aXZlbHkuICBUaGUgZmlyc3QgdHlwZSBpcyBhIGJhc2UgdHlwZSBvZiBhbGwgb3RoZXIKLSAqICAgICB0eXBlcy4gIFRoZSBvdGhlciB0eXBlIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiB0eXBlIGluZm9ybWF0aW9uCi0gKiAgICAgYW5kLCBhdCBsZWFzdCBpbiBzZXQtdGhlb3JldGljIHRlcm1zLCBpcyBhIHN1YnR5cGUgb2YgYWxsIG90aGVyIHR5cGVzLgotICogPGxpPlRoZXJlIGlzIGFub3RoZXIgdW5pdmVyc2FsIGJhc2UgdHlwZSB0aGF0IGlzIHRoZSBiYXNlIHR5cGUKLSAqICAgICBmb3IgYWxsIHNpbXBsZSB0eXBlcy4gIFRoaXMgaXMgdGhlIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlI3R5cGV9LAotICogICAgIGNvcnJlc3BvbmRpbmcgdG8geHM6YW55U2ltcGxlVHlwZS4gICBPbmx5IFhtbE9iamVjdC50eXBlIGFuZAotICogICAgIFhtbEFueVNpbXBsZVR5cGUudHlwZSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHtAbGluayAjaXNVUlR5cGV9LCBhbmQKLSAqICAgICBvbmx5IFhtbEJlYW5zLk5PX1RZUEUgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3Ige0BsaW5rICNpc05vVHlwZX0uCi0gKiA8bGk+VGhlIHR3byAic3BlY2lhbCIga2luZHMgb2YgdHlwZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHRoYXQKLSAqICAgICBkbyBub3QgZm9ybWFsbHkgZXhpc3QgaW4gdGhlIGFjdHVhbCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhcmUKLSAqICAgICBkb2N1bWVudCB0eXBlcyBhbmQgZ2xvYmFsIGF0dHJpYnV0ZSB0eXBlcyAoY29ycmVzcG9uZGluZyB0bwotICogICAgIGRvY3VtZW50cyB0aGF0IGNvbnRhaW4gYSBnbG9iYWwgZWxlbWVudCwgb3IgZnJhZ21lbnRzIHRoYXQKLSAqICAgICBjb250YWluIGEgZ2xvYmFsIGF0dHJpYnV0ZSkuICBUaGV5IGNhbiBiZSBkZXRlY3RlZCB1c2luZwotICogICAgIHtAbGluayAjaXNEb2N1bWVudFR5cGV9IGFuZCB7QGxpbmsgI2lzQXR0cmlidXRlVHlwZX0uIE90aGVyCi0gKiAgICAgdGhhbiB0aGVpciBhbm9ueW1pdHkgKGxhY2sgb2YgYSB0eXBlIG5hbWUpIGFuZCB0aGVpciBhcHBlYXJhbmNlCi0gKiAgICAgb25seSBhdCB0aGUgcm9vdCBvZiBhbiBpbnN0YW5jZSwgdGhleSBhcmUgb3RoZXJ3aXNlIGp1c3QgbGlrZQotICogICAgIG9yZGluYXJ5IGNvbXBsZXggdHlwZXMuCi0gKiA8bGk+U2ltcGxlIHR5cGVzIGNhbiBiZSBkZXRlY3RlZCB1c2luZyB7QGxpbmsgI2lzU2ltcGxlVHlwZX0uCi0gKiAgICAgQ29tcGxleCB0eXBlcyBhcmUgY29uc2RlcmVkIHRvIGJlIGFsbCB0aGUgdHlwZXMgdGhhdCBhcmUKLSAqICAgICBub3Qgc2ltcGxlLgotICogPGxpPlNpbXBsZSB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIHZhcmlldGllczogYXRvbWljIHR5cGVzLAotICogICAgIGxpc3QgdHlwZXMsIGFuZCB1bmlvbiB0eXBlcy4gIFdoaWNoIHZhcmlldHkgb2Ygc2ltcGxlIHR5cGUKLSAqICAgICB5b3UgaGF2ZSBjYW4gYmUgZGlzY292ZXJkIHVzaW5nIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0uCi0gKiAgICAgSXQgd2lsbCByZXR1cm4gZWl0aGVyIHtAbGluayAjQVRPTUlDfSwge0BsaW5rICNMSVNUfSwgb3IKLSAqICAgICB7QGxpbmsgI1VOSU9OfS4KLSAqIDxsaT5BbiB7QGxpbmsgI0FUT01JQ30gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGJhc2VkIG9uIG9uZSBvZiB0aGUKLSAqICAgICAyMCBidWlsdC1pbiBwcmltaXRpdmUgc2NoZW1hIHR5cGVzLiAgWW91IGNhbiBkZXRlcm1pbmUKLSAqICAgICB0aGUgdW5kZXJseWluZyBwcmltaXRpdmUgdHlwZSBmb3IgYW4gYXRvbWljIHNpbXBsZSB0eXBlCi0gKiAgICAgYnkgY2FsbGluZyB7QGxpbmsgI2dldFByaW1pdGl2ZVR5cGV9LiAgQW4gYXRvbWljIHR5cGUKLSAqICAgICBtYXkgYWRkIGZhY2V0IHJlc3RyaWN0aW9ucyBvbiB0b3Agb2YgdGhlIHByaW1pdGl2ZSB0eXBlLAotICogICAgIGFuZCB0aGVzZSBmYWNldHMgY2FuIGJlIGV4cGxvcmVkIHVzaW5nIHtAbGluayAjZ2V0RmFjZXR9LAotICogICAgIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LCB7QGxpbmsgI21hdGNoUGF0dGVybkZhY2V0fSwKLSAqICAgICB7QGxpbmsgI2dldEVudW1lcmF0aW9uVmFsdWVzfSwgYW5kIHJlbGF0ZWQgbWV0aG9kcy4KLSAqIDxsaT5BIHtAbGluayAjTElTVH0gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGJhc2VkIG9uIGFub3RoZXIgbm9uLWxpc3QKLSAqICAgICBzaW1wbGUgdHlwZS4gIFRoZSB1bmRlcmx5aW5nIGxpc3QgaXRlbSB0eXBlIGNhbiBiZSBvYnRhaW5lZAotICogICAgIGJ5IHVzaW5nIHtAbGluayAjZ2V0TGlzdEl0ZW1UeXBlfS4KLSAqIDxsaT5BIHtAbGluayAjVU5JT059IHNpbXBsZSB0eXBlIGlzIGFsd2F5cyBjb21wb3NlZCBvdXQgb2YgYSBudW1iZXIgb2YKLSAqICAgICBvdGhlciBzaW1wbGUgdHlwZXMuICBUaGUgZGlyZWN0IG1lbWJlcnMgb2YgdGhlIHVuaW9uIGNhbgotICogICAgIGJlIG9idGFpbmVkIGJ5IHtAbGluayAjZ2V0VW5pb25NZW1iZXJUeXBlc30uICBXaGVuIHVuaW9ucwotICogICAgIGNvbnNpc3Qgb2Ygb3RoZXIgdW5pb25zLCBpdCBpcyB1c2VmdWwgdG8ga25vdyB1c2VmdWwgdG8ga25vdwotICogICAgIHRoZSAibGVhdmVzIG9mIHRoZSB1bmlvbiB0cmVlIiwgc28gdGhlCi0gKiAgICAgc2V0IG9mIG5vbi11bmlvbiB0eXBlcyBtYWtpbmcgdXAgdGhlIHVuaW9uIGNhbiBiZSBvYnRhaW5lZAotICogICAgIGJ5IHtAbGluayAjZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzfS4gIFRoZSBjbG9zdXJlIG9mIHRoZQotICogICAgIGVudGlyZSAidW5pb24gdHJlZSIgaXMge0BsaW5rICNnZXRVbmlvblN1YlR5cGVzfSAodGhpcyBpbmNsdWRlcwotICogICAgIHRoZSB0eXBlIGl0c2VsZikuICBGb3IKLSAqICAgICBzaW1wbGUgdW5pb25zIHRoYXQgZG8gbm90IGNvbnNpc3Qgb2Ygb3RoZXIgdW5pb25zLCBhbGwgdGhyZWUKLSAqICAgICBvZiB0aGVzZSBzZXRzIGFyZSB0aGUgc2FtZS4KLSAqIDxsaT5Db21wbGV4IHR5cGVzIGhhdmUgbmVzdGVkIHN0cnVjdHVyZS4gIFRoZXkgYXJlIGRpdmlkZWQgaW50bwotICogICAgIGZvdXIgY29udGVudCB0eXBlczogZW1wdHkgY29udGVudCwgc2ltcGxlIGNvbnRlbnQsIGVsZW1lbnQtb25seQotICogICAgIGNvbnRlbnQsIGFuZCBtaXhlZCBjb250ZW50LiAgQWxsIGtpbmRzIG9mIGNvbXBsZXggdHlwZXMgbWF5Ci0gKiAgICAgaGF2ZSBhdHRyaWJ1dGVzLiAgVGhlIGNvbnRlbnQgdHlwZSBmb3IgYSBjb21wbGV4IHR5cGUgY2FuCi0gKiAgICAgYmUgZGVybWluZWQgdXNpbmcge0BsaW5rICNnZXRDb250ZW50VHlwZX0uICBUaGlzIHdpbGwgcmV0dXJuCi0gKiAgICAge0BsaW5rICNFTVBUWV9DT05URU5UfSwge0BsaW5rICNTSU1QTEVfQ09OVEVOVH0sCi0gKiAgICAge0BsaW5rICNFTEVNRU5UX0NPTlRFTlR9LCBvciB7QGxpbmsgI01JWEVEX0NPTlRFTlR9LgotICogPGxpPklmIGEgY29tcGxleCB0eXBlIGhhcyB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB0aGUgY29udGVudCBtb2RlbCB3aWxsIGJlIG51bGwuCi0gKiA8bGk+SWYgYSBjb21wbGV4IHR5cGUgaGFzIHtAbGluayAjU0lNUExFX0NPTlRFTlR9LCB0aGVuIGl0IHdpbGwgZXh0ZW5kIHRoZQotICogICAgIHNpbXBsZSB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50LiAgSW4gYWRkaXRpb24sIHRoZSB0eXBlCi0gKiAgICAgbWF5IGltcG9zZSBhZGRpdGlvbmFsIHNpbXBsZSB0eXBlIGZhY2V0IHJlc3RyaWN0aW9uczsgdGhlc2UgY2FuIAotICogICAgIGJlIGRldGVybWluZWQgaW4gdGhlIHNhbWUgd2F5IHRoZXkgYXJlIGZvciBhIHNpbXBsZSB0eXBlLgotICogPGxpPklmIGEgY29tcGxleCB0eXBlIGhhcyB7QGxpbmsgI0VMRU1FTlRfQ09OVEVOVH0gb3Ige0BsaW5rICNNSVhFRF9DT05URU5UfSwgdGhlbgotICogICAgIHRoZSBkZXRhaWxlZCBjb250ZW50IG1vZGVsIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZwotICogICAgIHRoZSBwYXJ0aWNsZSB0cmVlICh3aGljaCBtYXkgYmUgbnVsbCBmb3IgTUlYRURfQ09OVEVOVCkuCi0gKiAgICAgVGhlIHBhcnRpY2xlIHRyZWUgY2FuIGJlIG9idGFpbmVkIHZpYSB7QGxpbmsgI2dldENvbnRlbnRNb2RlbH0uCi0gKiA8bGk+V2hlbiB3b3JraW5nIHdpdGggYSBjb21wbGV4IHR5cGUsIG1vc3QgdXNlcnMgd2lsbCBmaW5kIGl0Ci0gKiAgICAgc3VmZmljaWVudCB0byBkaXNjb3ZlciB0aGUgc3VtbWFyaXplZCBzaGFwZSBvZiB0aGUgY29udGVudCBtb2RlbAotICogICAgIGFuZCBhdHRyaWJ1dGUgbW9kZWwgdXNpbmcge0BsaW5rICNnZXRFbGVtZW50UHJvcGVydGllc30sCi0gKiAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzfSwgYW5kIHJlbGF0ZWQgbWV0aG9kcyByYXRoZXIgdGhhbgotICogICAgIGV4YW1pbmluZyB0aGUgcGFydGljbGUgdHJlZSBhbmQgYXR0cmlidXRlIG1vZGVsIGRpcmVjdGx5LgotICogPC91bD4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyCi0gKiBAc2VlIFhtbE9iamVjdCNzY2hlbWFUeXBlCi0gKiBAc2VlIFNpbXBsZVZhbHVlI2luc3RhbmNlVHlwZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgdXNlZCB0byBkZXNjcmliZSB0aGUgdHlwZSBpbiB0aGUgc2NoZW1hLgotICAgICAqIE51bGwgaWYgdGhlIHR5cGUgaXMgYW5vbnltb3VzIChuZXN0ZWQpLCBvciBpZiBpdCBpcyBhIGRvY3VtZW50IHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgc2NoZW1hIGVsZW1lbnQuCi0gICAgICogTnVsbCBmb3IgdG9wLWxldmVsIChuYW1lZCkgdHlwZXMgYW5kIGRvY3VtZW50IHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFGaWVsZCBnZXRDb250YWluZXJGaWVsZCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGlzIGEgZG9jdW1lbnQgdHlwZS4KLSAgICAgKiA8cD4KLSAgICAgKiBEb2N1bWVudCB0eXBlcyBhcmUgZ2VuZXJhdGVkIGZvciBldmVyeSBnbG9iYWwgZWxlbWVudC4gQSBkb2N1bWVudAotICAgICAqIHR5cGUgaXMgYW4gdW5uYW1lZCBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50OgotICAgICAqIHdlIGRlZmluZSB0aGVzZSB0eXBlcywgYmVjYXVzZSB0aGV5IGFyZSB0aGUgdHlwZXMgb2YgdGhlICJkb2N1bWVudHMiCi0gICAgICogd2hpY2ggY29udGFpbiB0aGUgZGVmaW5lZCBnbG9iYWwgZWxlbWVudHMsIGFuZCB0aGV5IGFsbCB0dXJuIGludG8KLSAgICAgKiBKYXZhIHR5cGVzLiAoTmFtZWQgRWxlbWVudG5hbWVEb2N1bWVudC4pCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBpcyBhIGF0dHJpYnV0ZSB0eXBlLgotICAgICAqIDxwPgotICAgICAqIEF0dHJpYnV0ZSB0eXBlcyBhcmUgZ2VuZXJhdGVkIGZvciBldmVyeSBnbG9iYWwgYXR0cmlidXRlLiBBbiBhdHRyaWJ1dGUKLSAgICAgKiB0eXBlIGlzIGFuIHVubmFtZWQgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgZXhhY3RseSBvbmUgYXR0cmlidXRlOgotICAgICAqIHdlIGRlZmluZSB0aGVzZSB0eXBlcywgYmVjYXVzZSB0aGV5IGFyZSB0aGUgdHlwZXMgb2YgdGhlICJhdHRyaWJ1dGUgZG9jdW1lbnRzIgotICAgICAqIHdoaWNoIGNvbnRhaW4gdGhlIGRlZmluZWQgZ2xvYmFsIGF0dHJpYnV0ZSwgYW5kIHRoZXkgYWxsIHR1cm4gaW50bwotICAgICAqIEphdmEgdHlwZXMuIChOYW1lZCBBdHRyaWJ1dGVuYW1lQXR0cmlidXRlLikKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVR5cGUoKTsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgZWxlbWVudCBuYW1lIGlmIHRoaXMgaXMgYSBkb2N1bWVudCB0eXBlLAotICAgICAqIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgcW5hbWUgaWYgdGhpcyBpcyBhIGF0dHJpYnV0ZSB0eXBlLAotICAgICAqIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG91dGVyIHNjaGVtYSB0eXBlLgotICAgICAqIE51bGwgZm9yIHRvcC1sZXZlbCAobmFtZWQpIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldE91dGVyVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGFub255bW91cyB0eXBlIGhhcyBubyBjb3JyZXNwb25kaW5nIEphdmEgdHlwZS4gVHJ1ZSBmb3IKLSAgICAgKiBhbm9ueW1vdXMgdHlwZXMgbmVzdGVkIHdpdGhpbiBzaW1wbGUgdHlwZSByZXN0cmljdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHNjaGVtYSB0eXBlIHdhcyBjb21waWxlZCB0byBoYXZlIGEgY29ycmVzcG9uZGluZwotICAgICAqIEphdmEgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21waWxlZCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGdWxsSmF2YU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzaG9ydCB1bnF1YWxmaWllZCBKYXZhIG5hbWUgZm9yIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNob3J0SmF2YU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RnVsbEphdmFJbXBsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNob3J0IHVucXVhbGZpaWVkIEphdmEgbmFtZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBKYXZhIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzY2hlbWEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSmF2YSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGZvciB0aGlzIHNjaGVtYSB0eXBlLAotICAgICAqIGlmIGFwcGxpY2FibGUgKG9yIG51bGwgaWYgbm90IGFuIGVudW1lcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgWHNkIHR5cGUgaXMgYW5vbnltb3VzIChpLmUuLCBub3QgdG9wLWxldmVsKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fub255bW91c1R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGFueSBvZiB0aGUgNDArIGJ1aWx0LWluIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQnVpbHRpblR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIHRoZSBhbnlTaW1wbGVUeXBlIGFuZCBhbnkgcmVzdHJpY3Rpb25zL3VuaW9ucy9saXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYmFzZSByZXN0cmljdGlvbiBvciBleHRlbnNpb24gdHlwZS4gVW5pb25zIGFuZCBsaXN0cwotICAgICAqIHJldHVybiB0aGUgYW55U2ltcGxlVHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRCYXNlVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb21tb24gYmFzZSB0eXBlIHdpdGggdGhlIGdpdmVuIHR5cGUuIFRoZSByZXR1cm5lZAotICAgICAqIHR5cGUgaXMgdGhlIG1vc3Qgc3BlY2lmaWMgZGVjbGFyZWQgYmFzZSB0eXBlIG9mIGJvdGggdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGRlcml2ZXMgZnJvbSB0aGlzIHR5cGUgKG9yIGlmCi0gICAgICogaXQgaXMgdGhlIHNhbWUgdHlwZSkuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgWG1sT2JqZWN0LnR5cGUgKHRoZSBhbnlUeXBlKSBpcyBhc3NpZ25hYmxlCi0gICAgICogZnJvbSBhbGwgdHlwZSwgYW5kIHRoZSBYbWxCZWFucy5ub1R5cGUgKHRoZSBhYnNlbmNlIG9mCi0gICAgICogYSB0eXBlKSBpcyBhc3NpZ25hYmxlIHRvIGFsbCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKFNjaGVtYVR5cGUgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgZm9yIHRoZSBkZXJpdmF0aW9uIHR5cGUsIGVpdGhlciAKLSAgICAgKiB7QGxpbmsgI0RUX0VYVEVOU0lPTn0sIHtAbGluayAjRFRfUkVTVFJJQ1RJT059LCB7QGxpbmsgI0RUX05PVF9ERVJJVkVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25UeXBlKCk7Ci0gICAgCi0gICAgLyoqIE5vdCBkZXJpdmVkLiAgVHJ1ZSBmb3IgWG1sT2JqZWN0LnR5cGUgb25seS4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX05PVF9ERVJJVkVEID0gMDsKLSAgICAvKiogRGVyaXZlZCBieSByZXN0cmljdGlvbi4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX1JFU1RSSUNUSU9OID0gMTsKLSAgICAvKiogRGVyaXZlZCBieSBleHRlbnNpb24uIFNlZSB7QGxpbmsgI2dldERlcml2YXRpb25UeXBlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVF9FWFRFTlNJT04gPSAyOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGZvciBidWlsdGluIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQKLSAgICAgKiBmb3IgcXVpY2sgY29tcGFyaXNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgLyoqIE5vdCBhIGJ1aWx0aW4gdHlwZSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9UX0JVSUxUSU4gPSAwOwotICAgIC8qKiB4czphbnlUeXBlLCBha2Ege0BsaW5rIFhtbE9iamVjdCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfQU5ZX1RZUEUgPSAxOwotICAgIAotICAgIC8qKiBUaGUgcHJpbWl0aXZlIHR5cGVzIGhhdmUgY29kZXMgYmV0d2VlbiBCVENfRklSU1RfUFJJTUlUSVZFIGFuZCBCVENfTEFTVF9QUklNSVRJVkUgaW5jbHVzaXZlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0ZJUlNUX1BSSU1JVElWRSA9IDI7Ci0KLSAgICAvKiogeHM6YW55U2ltcGxlVHlwZSwgYWthIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfU0lNUExFID0gMjsKLQotICAgIC8qKiB4czpib29sZWFuLCBha2Ege0BsaW5rIFhtbEJvb2xlYW4jdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0JPT0xFQU4gPSAzOwotICAgIC8qKiB4czpiYXNlNjRCaW5hcnksIGFrYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5I3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19CQVNFXzY0X0JJTkFSWSA9IDQ7Ci0gICAgLyoqIHhzOmhleEJpbmFyeSwgYWthIHtAbGluayBYbWxCYXNlNjRCaW5hcnkjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0hFWF9CSU5BUlkgPSA1OwotICAgIC8qKiB4czphbnlVUkksIGFrYSB7QGxpbmsgWG1sQW55VVJJI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfVVJJID0gNjsKLSAgICAvKiogeHM6UU5hbWUsIGFrYSB7QGxpbmsgWG1sUU5hbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1FOQU1FID0gNzsKLSAgICAvKiogeHM6Tk9UQVRJT04sIGFrYSB7QGxpbmsgWG1sTk9UQVRJT04jdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05PVEFUSU9OID0gODsKLSAgICAvKiogeHM6ZmxvYXQsIGFrYSB7QGxpbmsgWG1sRmxvYXQjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0ZMT0FUID0gOTsKLSAgICAvKiogeHM6ZG91YmxlLCBha2Ege0BsaW5rIFhtbERvdWJsZSN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRE9VQkxFID0gMTA7Ci0gICAgLyoqIHhzOmRlY2ltYWwsIGFrYSB7QGxpbmsgWG1sRGVjaW1hbCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfREVDSU1BTCA9IDExOwotICAgIC8qKiB4czpzdHJpbmcsIGFrYSB7QGxpbmsgWG1sU3RyaW5nI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19TVFJJTkcgPSAxMjsKLQotICAgIC8qKiB4czpkdXJhdGlvbiwgYWthIHtAbGluayBYbWxEdXJhdGlvbiN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRFVSQVRJT04gPSAxMzsKLSAgICAvKiogeHM6ZGF0ZVRpbWUsIGFrYSB7QGxpbmsgWG1sRGF0ZVRpbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0RBVEVfVElNRSA9IDE0OwotICAgIC8qKiB4czp0aW1lLCBha2Ege0BsaW5rIFhtbFRpbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1RJTUUgPSAxNTsKLSAgICAvKiogeHM6ZGF0ZSwgYWthIHtAbGluayBYbWxEYXRlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19EQVRFID0gMTY7Ci0gICAgLyoqIHhzOmdZZWFyTW9udGgsIGFrYSB7QGxpbmsgWG1sR1llYXJNb250aCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfR19ZRUFSX01PTlRIID0gMTc7Ci0gICAgLyoqIHhzOmdZZWFyLCBha2Ege0BsaW5rIFhtbEdZZWFyI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX1lFQVIgPSAxODsKLSAgICAvKiogeHM6Z01vbnRoRGF5LCBha2Ege0BsaW5rIFhtbEdNb250aERheSN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfR19NT05USF9EQVkgPSAxOTsKLSAgICAvKiogeHM6Z0RheSwgYWthIHtAbGluayBYbWxHRGF5I3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX0RBWSA9IDIwOwotICAgIC8qKiB4czpnTW9udGgsIGFrYSB7QGxpbmsgWG1sR01vbnRoI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX01PTlRIID0gMjE7Ci0KLSAgICAvKiogVGhlIHByaW1pdGl2ZSB0eXBlcyBoYXZlIGNvZGVzIGJldHdlZW4gQlRDX0ZJUlNUX1BSSU1JVElWRSBhbmQgQlRDX0xBU1RfUFJJTUlUSVZFIGluY2x1c2l2ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQVNUX1BSSU1JVElWRSA9IDIxOwotCi0gICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgIC8qKiB4czppbnRlZ2VyLCBha2Ege0BsaW5rIFhtbEludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lOVEVHRVIgPSAyMjsKLSAgICAvKiogeHM6bG9uZywgYWthIHtAbGluayBYbWxMb25nI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MT05HID0gMjM7Ci0gICAgLyoqIHhzOmludCwgYWthIHtAbGluayBYbWxJbnQjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lOVCA9IDI0OwotICAgIC8qKiB4czpzaG9ydCwgYWthIHtAbGluayBYbWxTaG9ydCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfU0hPUlQgPSAyNTsKLSAgICAvKiogeHM6Ynl0ZSwgYWthIHtAbGluayBYbWxCeXRlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19CWVRFID0gMjY7Ci0gICAgLyoqIHhzOm5vblBvc2l0aXZlSW50ZWdlciwgYWthIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSID0gMjc7Ci0gICAgLyoqIHhzOk5lZ2F0aXZlSW50ZWdlciwgYWthIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05FR0FUSVZFX0lOVEVHRVIgPSAyODsKLSAgICAvKiogeHM6bm9uTmVnYXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9OX05FR0FUSVZFX0lOVEVHRVIgPSAyOTsKLSAgICAvKiogeHM6cG9zaXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlciN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfUE9TSVRJVkVfSU5URUdFUiA9IDMwOwotICAgIC8qKiB4czp1bnNpZ25lZExvbmcsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX0xPTkcgPSAzMTsKLSAgICAvKiogeHM6dW5zaWduZWRJbnQsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRJbnQjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVU5TSUdORURfSU5UID0gMzI7Ci0gICAgLyoqIHhzOnVuc2lnbmVkU2hvcnQsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydCN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19VTlNJR05FRF9TSE9SVCA9IDMzOwotICAgIC8qKiB4czp1bnNpZ25lZEJ5dGUsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX0JZVEUgPSAzNDsKLQotICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgIC8qKiB4czpub3JtYWxpemVkU3RyaW5nLCBha2Ege0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmcjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9STUFMSVpFRF9TVFJJTkcgPSAzNTsKLSAgICAvKiogeHM6dG9rZW4sIGFrYSB7QGxpbmsgWG1sVG9rZW4jdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVE9LRU4gPSAzNjsKLSAgICAvKiogeHM6TmFtZSwgYWthIHtAbGluayBYbWxOYW1lI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05BTUUgPSAzNzsKLSAgICAvKiogeHM6TkNOYW1lLCBha2Ege0BsaW5rIFhtbE5DTmFtZSN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OQ05BTUUgPSAzODsKLSAgICAvKiogeHM6bGFuZ3VhZ2UsIGFrYSB7QGxpbmsgWG1sTGFuZ3VhZ2UjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTEFOR1VBR0UgPSAzOTsKLSAgICAvKiogeHM6SUQsIGFrYSB7QGxpbmsgWG1sSUQjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSUQgPSA0MDsKLSAgICAvKiogeHM6SURSRUYsIGFrYSB7QGxpbmsgWG1sSURSRUYjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSURSRUYgPSA0MTsKLSAgICAvKiogeHM6SURSRUZTLCBha2Ege0BsaW5rIFhtbElEUkVGUyN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19JRFJFRlMgPSA0MjsKLSAgICAvKiogeHM6RU5USVRZLCBha2Ege0BsaW5rIFhtbEVOVElUWSN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19FTlRJVFkgPSA0MzsKLSAgICAvKiogeHM6RU5USVRJRVMsIGFrYSB7QGxpbmsgWG1sRU5USVRJRVMjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRU5USVRJRVMgPSA0NDsKLSAgICAvKiogeHM6Tk1UT0tFTiwgYWthIHtAbGluayBYbWxOTVRPS0VOI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05NVE9LRU4gPSA0NTsKLSAgICAvKiogeHM6Tk1UT0tFTlMsIGFrYSB7QGxpbmsgWG1sTk1UT0tFTlMjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk1UT0tFTlMgPSA0NjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQVNUX0JVSUxUSU4gPSA0NjsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGFueVR5cGUgYW5kIGFueVNpbXBsZVR5cGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVUlR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIHRoZSB0eXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0aGUgYWJzZW5jZSBvZiBhIGRldGVybWluZWQgdHlwZS4KLSAgICAgKiBYTUwgT2JqZWN0cyB3aG9zZSB0eXBlIGlzTm9UeXBlKCkgYXJlIG5ldmVyIHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTm9UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFUeXBlTG9hZGVyIGluIHdoaWNoIHRoaXMgdHlwZSB3YXMgZGVmaW5lZC4KLSAgICAgKiBDb21wbGV4IHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB1c2VkIGluIGV4YWN0bHkgb25lIHNjaGVtYSB0eXBlCi0gICAgICogc3lzdGVtLCBidXQgc2ltcGxlIHR5cGVzIGFyZSBkZWZpbmVkIGluIG9uZSB0eXBlIHN5c3RlbSBhbmQgY2FuCi0gICAgICogYmUgdXNlZCBpbiBhbnkgbnVtYmVyIG9mIHR5cGUgc3lzdGVtcy4gVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMKLSAgICAgKiB0aGUgYnVpbHRpbiB0eXBlcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGJ1aWx0aW4gdHlwZSBzeXN0ZW0KLSAgICAgKiBhbmQgdXNlZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZm9yIHRoZSBYU0QgZmlsZSBmcm9tIHdoaWNoIHRoaXMgdHlwZQotICAgICAqIHdhcyBsb2FkZWQuIEludGVuZGVkIGZvciB1c2Ugd2hlbiBkZWJ1Z2dpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiB0aGlzIHR5cGUgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgaW4gaW5zdGFuY2VzICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCi0gICAgLyoqIFRydWUgaWYgb3RoZXIgdHlwZXMgY2Fubm90IGV4dGVuZCB0aGlzIHR5cGUgKG9ubHkgZm9yIGNvbXBsZXggdHlwZXMpICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxFeHRlbnNpb24oKTsKLQotICAgIC8qKiBUcnVlIGlmIG90aGVyIHR5cGVzIGNhbm5vdCByZXN0cmljdCB0aGlzIHR5cGUgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFJlc3RyaWN0aW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiBsaXN0IGRlcml2YXRpb24gb2YgdGhpcyB0eXBlIGlzIHByb2hpYml0ZWQgKG9ubHkgZm9yIHNpbXBsZSB0eXBlcykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbExpc3QoKTsKLQotICAgIC8qKiBUcnVlIGlmIHVuaW9uIGRlcml2YXRpb24gb2YgdGhpcyB0eXBlIGlzIHByb2hpYml0ZWQgKG9ubHkgZm9yIHNpbXBsZSB0eXBlcykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFVuaW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiBleHRlbnNpb25zIG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoaXMgdHlwZSAqLwotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrRXh0ZW5zaW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiByZXN0cmljdGlvbnMgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgdGhpcyB0eXBlICovCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tSZXN0cmljdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB7QGxpbmsgI1NJTVBMRV9DT05URU5UfSwge0BsaW5rICNFTEVNRU5UX0NPTlRFTlR9LCBvcgotICAgICAqIHtAbGluayAjTUlYRURfQ09OVEVOVH0gZm9yIGNvbXBsZXggdHlwZXMuIEZvciBub25jb21wbGV4IHR5cGVzLCByZXR1cm5zCi0gICAgICoge0BsaW5rICNOT1RfQ09NUExFWF9UWVBFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0gICAgCi0gICAgLyoqIE5vdCBhIGNvbXBsZXggdHlwZS4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9DT01QTEVYX1RZUEUgPSAwOwotICAgIC8qKiBFbXB0eSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFlfQ09OVEVOVCA9IDE7Ci0gICAgLyoqIFNpbXBsZSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFX0NPTlRFTlQgPSAyOwotICAgIC8qKiBFbGVtZW50LW9ubHkgY29udGVudC4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDM7Ci0gICAgLyoqIE1peGVkIGNvbnRlbnQuICBTZWUge0BsaW5rICNnZXRDb250ZW50VHlwZSgpfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVhFRF9DT05URU5UID0gNDsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIGFycmF5IG9mIGlubmVyIChhbm9ueW1vdXMpIHR5cGVzIGRlZmluZWQKLSAgICAgKiB3aXRoaW4gdGhpcyB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlW10gZ2V0QW5vbnltb3VzVHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTY2hlbWFQcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIGFuIGVsZW1lbnQgd2l0aGluIHRoaXMKLSAgICAgKiBjb21wbGV4IHR5cGUgYnkgbG9va2luZyB1cCB0aGUgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eSBnZXRFbGVtZW50UHJvcGVydHkoUU5hbWUgZWx0TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgU2NoZW1hUHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHRvIGVsZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eVtdIGdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2NoZW1hUHJvcGVydHkgY29ycmVzcG9uZGluZyB0byBhbiBhdHRyaWJ1dGUgd2l0aGluIHRoaXMKLSAgICAgKiBjb21wbGV4IHR5cGUgYnkgbG9va2luZyB1cCB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVByb3BlcnR5IGdldEF0dHJpYnV0ZVByb3BlcnR5KFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHlbXSBnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgU2NoZW1hUHJvcGVydGllcyB3aXRoaW4gdGhpcyBjb21wbGV4IHR5cGUsCi0gICAgICogZWxlbWVudHMgZm9sbG93ZWQgYnkgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHlbXSBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhpcyBjb21wbGV4IHR5cGUsCi0gICAgICogZXhjbHVzaXZlIG9mIHRoZSBiYXNlIHR5cGUgKGlmIGFueSkuCi0gICAgICovCi0gICAgU2NoZW1hUHJvcGVydHlbXSBnZXREZXJpdmVkUHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG1vZGVsIGZvciB0aGlzIGNvbXBsZXggdHlwZSAod2l0aCBzaW1wbGUgb3IgY29tcGxleCBjb250ZW50KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hQXR0cmlidXRlTW9kZWwgZ2V0QXR0cmlidXRlTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0eXBlIHBlcm1pdHMgd2lsZGNhcmQgYXR0cmlidXRlcy4gU2VlIHRoZSBhdHRyaWJ1dGUgbW9kZWwgZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB3aWxkY2FyZHMgYXJlIGFsbG93ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQXR0cmlidXRlV2lsZGNhcmRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV4IGNvbnRlbnQgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlICh3aXRoIGNvbXBsZXggY29udGVudCkuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVBhcnRpY2xlIGdldENvbnRlbnRNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHR5cGUgcGVybWl0cyBlbGVtZW50IHdpbGRjYXJkcy4gU2VlIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggd2lsZGNhcmRzIGFyZSBhbGxvd2VkLCBhbmQgd2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzRWxlbWVudFdpbGRjYXJkcygpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGRvY3VtZW50IHR5cGVzLCB0cnVlIGlmIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgdGhlCi0gICAgICogZG9jdW1lbnQgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRTdWJzdGl0dXRpb24oUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBjb21wbGV4IGNvbnRlbnQgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlIGlzIGFuICJhbGwiIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0FsbENvbnRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgcGFydGljbGVzIGhhdmUgc2FtZSBkZWZhdWx0cywgbmlsbGFiaWxpdHksIGV0YywgdGhhdCBhcmUKLSAgICAgKiBpbnZhcmlhbnQgd2hlbiBvcmRlciBjaGFuZ2VzLiBDb21wdXRlZCBvbmx5IGZvciBKYXZhaXplZCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09yZGVyU2Vuc2l0aXZlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgY2hpbGQgZWxlbWVudCBiYXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lIGFuZAotICAgICAqIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZSAoYW5kIHRoZSB0eXBlIHN5c3RlbSB3aXRoaW4gd2hpY2ggbmFtZXMgYXJlCi0gICAgICogcmVzb2x2ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEVsZW1lbnRUeXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYW4gYXR0cmlidXRlIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQKLSAgICAgKiB0aGUgdHlwZSBzeXN0ZW0gd2l0aGluIHdoaWNoICh3aWxkY2FyZCkgbmFtZXMgYXJlIHJlc29sdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEF0dHJpYnV0ZVR5cGUoUU5hbWUgZWx0TmFtZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogU0lNUExFIFRZUEUgTU9ERUwgQkVMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiogeHM6bGVuZ3RoIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTEVOR1RIID0gMDsKLSAgICAvKiogeHM6bWluTGVuZ3RoIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUlOX0xFTkdUSCA9IDE7Ci0gICAgLyoqIHhzOm1heExlbmd0aCBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9MRU5HVEggPSAyOwotICAgIC8qKiB4czptaW5FeGNsdXNpdmUgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NSU5fRVhDTFVTSVZFID0gMzsKLSAgICAvKiogeHM6bWluSW5jbHVzaXZlIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUlOX0lOQ0xVU0lWRSA9IDQ7Ci0gICAgLyoqIHhzOm1heEluY2x1c2l2ZSBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9JTkNMVVNJVkUgPSA1OwotICAgIC8qKiB4czptYXhFeGNsdXNpdmUgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NQVhfRVhDTFVTSVZFID0gNjsKLSAgICAvKiogeHM6dG90YWxEaWdpdHMgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9UT1RBTF9ESUdJVFMgPSA3OwotICAgIC8qKiB4czpmcmFjdGlvbkRpZ2l0cyBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyA9IDg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0JBU0lDX0ZBQ0VUID0gODsKLQotICAgIC8qKiB4czp3aGl0ZVNwYWNlIGZhY2V0IC0gdXNlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9IGluc3RlYWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9XSElURV9TUEFDRSA9IDk7Ci0gICAgLyoqIHhzOnBhdHRlcm4gZmFjZXQgLSB1c2Uge0BsaW5rICNtYXRjaFBhdHRlcm5GYWNldH0gaW5zdGVhZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1BBVFRFUk4gPSAxMDsKLSAgICAvKiogeHM6ZW51bWVyYXRpb24gZmFjZXQgLSB1c2Uge0BsaW5rICNnZXRFbnVtZXJhdGlvblZhbHVlc30gaW5zdGVhZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0VOVU1FUkFUSU9OID0gMTE7Ci0KLSAgICAvKiogVGhlIGxhc3Qgb3JkaW5hcnkgZmFjZXQgY29kZSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0ZBQ0VUID0gMTE7Ci0gICAgCi0gICAgLyoqIEBzZWUgI29yZGVyZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUkRFUkVEID0gMTI7Ci0gICAgLyoqIEBzZWUgI2lzQm91bmRlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JPVU5ERUQgPSAxMzsKLSAgICAvKiogQHNlZSAjaXNGaW5pdGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DQVJESU5BTElUWSA9IDE0OwotICAgIC8qKiBAc2VlICNpc051bWVyaWMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OVU1FUklDID0gMTU7Ci0gICAgCi0gICAgLyoqIFRoZSBsYXN0IHByb3BlcnR5IGNvZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX1BST1BFUlRZID0gMTU7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmYWNldCwgb3IgbnVsbCBpZgotICAgICAqIG5vbmUgaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlIGdldEZhY2V0KGludCBmYWNldENvZGUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gZmFjZXQgaXMgZml4ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGYWNldEZpeGVkKGludCBmYWNldENvZGUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBvcmRlcmVkLiAgUmV0dXJucyBlaXRoZXIge0BsaW5rICNVTk9SREVSRUR9LAotICAgICAqIHtAbGluayAjUEFSVElBTF9PUkRFUn0sIG9yIHtAbGluayAjVE9UQUxfT1JERVJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgb3JkZXJlZCgpOwotCi0gICAgLyoqIFVub3JkZXJlZC4gU2VlIHtAbGluayAjb3JkZXJlZH0uICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVU5PUkRFUkVEID0gMDsKLSAgICAvKiogUGFydGlhbGx5IG9yZGVyZWQuIFNlZSB7QGxpbmsgI29yZGVyZWR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFBBUlRJQUxfT1JERVIgPSAxOwotICAgIC8qKiBUb3RhbGx5IG9yZGVyZWQuIFNlZSB7QGxpbmsgI29yZGVyZWR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFRPVEFMX09SREVSID0gMjsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgYm91bmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0JvdW5kZWQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgZmluaXRlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmluaXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG51bWVyaWMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNOdW1lcmljKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZXJlIGFyZSByZWdleCBwYXR0ZXJuIGZhY2VudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNQYXR0ZXJuRmFjZXQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRQYXR0ZXJucygpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4gZmFjZXRzLgotICAgICAqIEFsd2F5cyB0cnVlIGlmIHRoZXJlIGFyZSBubyBwYXR0ZXJuIGZhY2V0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaFBhdHRlcm5GYWNldChTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWxpZCBvYmplY3RzIGZyb20gdGhlCi0gICAgICogZW51bWVyYXRpb24gZmFjZXQsIG51bGwgaWYgbm8gZW51bWVyYXRpb24gZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgWG1sQW55U2ltcGxlVHlwZVtdIGdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgaXMgYSBzdHJpbmcgZW51bSB3aGVyZSBhbiBpbnRlZ2VyCi0gICAgICogaXMgYXNzaWduZWQgdG8gZWFjaCBlbnVtZXJhdGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N0cmluZ0VudW1WYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgaXMgYSBzdHJpbmcgZW51bWVyYXRpb24sIHJldHVybnMgdGhlIG1vc3QgYmFzaWMgYmFzZSBzY2hlbWEKLSAgICAgKiB0eXBlIHRoYXQgdGhpcyBlbnVlbXJhdGlvbiBpcyBiYXNlZCBvbi4gT3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFNjaGVtYVN0cmluZ0VudW1FbnRyaWVzIGZvciB0aGlzIHR5cGU6IHRoaXMKLSAgICAgKiBhcnJheSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgamF2YSBjb25zdGFudCBuYW1lcyB1c2VkIGZvcgotICAgICAqIGVhY2ggc3RyaW5nIGVudW0gZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGdldFN0cmluZ0VudW1FbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZW51bSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbnVtZXJhdGVkCi0gICAgICogc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoIG9yIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiBhIHN0cmluZyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hU3RyaW5nRW51bUVudHJ5IGVudW1FbnRyeUZvclN0cmluZyhTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbnVtZXJhdGVkCi0gICAgICogc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoIG9yIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiBhIHN0cmluZyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtRm9yU3RyaW5nKFN0cmluZyBzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBlbnVtIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW1lcmF0ZWQKLSAgICAgKiBzdHJpbmcsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgdGhpcyB0eXBlIGlzIG5vdAotICAgICAqIGEgc3RyaW5nIGVudW1lcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBmb3IgYW55IG9mIHRoZSAyMCBwcmltaXRpdmUgdHlwZXMgKHBsdXMgYW55U2ltcGxlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc2ltcGxlIHR5cGUgaXMgQVRPTUlDLCBVTklPTiwgb3IgTElTVC4KLSAgICAgKiBSZXR1cm5zIHtAbGluayAjTk9UX1NJTVBMRX0sIHtAbGluayAjQVRPTUlDfSwge0BsaW5rICNVTklPTn0sCi0gICAgICogb3Ige0BsaW5rICNMSVNUfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNpbXBsZVZhcmlldHkoKTsKLSAgICAKLSAgICAvKiogTm90IGEgc2ltcGxlIHR5cGUgb3Igc2ltcGxlIGNvbnRlbnQuIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9TSU1QTEUgPSAwOwotICAgIC8qKiBBdG9taWMgdHlwZS4gIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRPTUlDID0gMTsKLSAgICAvKiogVW5pb24gdHlwZS4gIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JT04gPSAyOwotICAgIC8qKiBTaW1wbGUgbGlzdCB0eXBlLiAgU2VlIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUID0gMzsKLQotCi0gICAgLyoqCi0gICAgICogRm9yIGF0b21pYyB0eXBlcyBvbmx5OiBnZXQgdGhlIHByaW1pdGl2ZSB0eXBlIHVuZGVybHlpbmcgdGhpcyBvbmUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgbm90IGFuIGF0b21pYyB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldFByaW1pdGl2ZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBhdG9taWMgbnVtZXJpYyByZXN0cmljdGlvbnMgb2YgZGVjaW1hbCBvbmx5OiB0aGUKLSAgICAgKiBudW1lcmljIHNpemUgY2F0ZWdvcnkuIFRha2VzIGludG8gYWNjb3VudCBtaW4gYW5kIG1heAotICAgICAqIHJlc3RyaWN0aW9ucyBhcyB3ZWxsIGFzIHRvdGFsRGlnaXRzIGFuZCBmcmFjdGlvbkRpZ2l0cwotICAgICAqIGZhY2V0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGVpdGhlciB7QGxpbmsgI05PVF9ERUNJTUFMfSwKLSAgICAgKiB7QGxpbmsgI1NJWkVfQllURX0sIHtAbGluayAjU0laRV9TSE9SVH0sIHtAbGluayAjU0laRV9JTlR9LAotICAgICAqIHtAbGluayAjU0laRV9MT05HfSwge0BsaW5rICNTSVpFX0JJR19JTlRFR0VSfSwgb3IKLSAgICAgKiB7QGxpbmsgI1NJWkVfQklHX0RFQ0lNQUx9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGVjaW1hbFNpemUoKTsKLQotICAgIC8qKiBOb3QgYSBkZWNpbWFsIHJlc3RyaWN0aW9uLiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0RFQ0lNQUwgPSAwOwotICAgIC8qKiBGaXRzIGluIGEgYnl0ZS4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQllURSA9IDg7Ci0gICAgLyoqIEZpdHMgaW4gYSBzaG9ydC4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfU0hPUlQgPSAxNjsKLSAgICAvKiogRml0cyBpbiBhbiBpbnQuIFNlZSB7QGxpbmsgI2dldERlY2ltYWxTaXplfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0lOVCA9IDMyOwotICAgIC8qKiBGaXRzIGluIGEgbG9uZy4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfTE9ORyA9IDY0OwotICAgIC8qKiBGaXRzIGluIGEge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQklHX0lOVEVHRVIgPSAxMDAwMDAwOyAvLyAibWlsbGlvbnMiCi0gICAgLyoqIEZpdHMgaW4gYSB7QGxpbmsgamF2YS5tYXRoLkJpZ0RlY2ltYWx9LiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9CSUdfREVDSU1BTCA9IDEwMDAwMDE7IC8vICJldmVuIG1vcmUiCi0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBzaGFsbG93IG1lbWJlciB0eXBlcy4gVGhpcwotICAgICAqIHJldHVybnMgdGhlIGRlY2xhcmVkIG1lbWJlciB0eXBlcyBvZiB0aGUgdW5pb24sIHNvLCBmb3IKLSAgICAgKiBleGFtcGxlIGlmIHRoZSB0eXBlIGNvbnRhaW5zIGFub3RoZXIgdW5pb24sIHRoZSBuZXN0ZWQKLSAgICAgKiBtZW1iZXJzIG9mIHRoYXQgdW5pb24gYXJlIE5PVCByZXR1cm5lZCBoZXJlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgdW5pb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRVbmlvbk1lbWJlclR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0cyB0aGUgZnVsbCB0cmVlIG9mIG1lbWJlciB0eXBlcy4KLSAgICAgKiBUaGlzIGNvbXB1dGVzIHRoZSBjbG9zdXJlIG9mIHRoZSBzZXQgcmV0dXJuZWQgYnkKLSAgICAgKiBnZXRVbmlvbk1lbWJlclR5cGVzKCksIHNvLCBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucwotICAgICAqIGFsbCB0aGUgdHlwZXMgbmVzdGVkIHdpdGhpbiB1bmlvbnMgb2YgdW5pb25zIGFzIHdlbGwKLSAgICAgKiBhcyB0aGUgdG9wLWxldmVsIG1lbWJlcnM7IHRoZSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUKLSAgICAgKiB0eXBlIGl0c2VsZi4gSWYgeW91IGFyZSBzZWVraW5nIG9ubHkgdGhlIGJhc2ljCi0gICAgICogbm9uLXVuaW9uIGNvbnNpdHVlbnRzLCB1c2UgZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgdW5pb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRVbmlvblN1YlR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBjb25zdGl0dWVudCBtZW1iZXIgdHlwZXMuIFRoaXMKLSAgICAgKiByZXR1cm5zIG9ubHkgbm9uLXVuaW9uIHR5cGVzLCBzbywgZm9yIGV4YW1wbGUsIGZvciB1bmlvbnMgb2YKLSAgICAgKiB1bmlvbnMsIHRoaXMgcmV0dXJucyB0aGUgZmxhdHRlbmVkIGxpc3Qgb2YgaW5kaXZpZHVhbCBtZW1iZXIKLSAgICAgKiB0eXBlcyB3aXRoaW4gdGhlIGlubmVybW9zdCB1bmlvbnMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZVtdIGdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogRm9yIHVuaW9uIHR5cGVzIG9ubHk6IGdldCB0aGUgbW9zdCBzcGVjaWZpYyBjb21tb24gYmFzZQotICAgICAqIHR5cGUgb2YgdGhlIGNvbnN0aXR1ZW50IG1lbWJlciB0eXBlcy4gTWF5IHJldHVybiBhIFVSIHR5cGUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYW5vbnltb3VzIHR5cGVzIGRlZmluZWQgaW5zaWRlIGEgdW5pb24gb25seTogZ2V0cwotICAgICAqIHRoZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGRlY2xhcmF0aW9uIG9yZGVyIG9mIHRoaXMKLSAgICAgKiB0eXBlIHdpdGhpbiB0aGUgb3V0ZXIgdW5pb24gdHlwZSwgb3IgemVybyBpZiB0aGlzIGlzCi0gICAgICogbm90IGFwcGxpY2FibGUuIFRoZSBmaXJzdCBhbm9ueW1vdXMgdW5pb24gbWVtYmVyIHdpdGhpbgotICAgICAqIGEgdW5pb24gdHlwZSBpcyBudW1iZXJlZCAiMSIuIFVzZWQgdG8gZGlmZmVyZW50aWF0ZQotICAgICAqIGJldHdlZW4gZGlmZmVyZW50IGFub255bW91cyB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGxpc3QgdHlwZXMgb25seTogZ2V0IHRoZSBpdGVtIHR5cGUuIFRoaXMgaXMgdGhlIGF0b21pYwotICAgICAqIG9yIHVuaW9uIHR5cGUgdGhhdCBpcyB0aGUgdHlwZSBvZiBldmVyeSBlbnRyeSBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyB0eXBlIGlzIG5vdCBhIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igbm9udW5pb24gc2ltcGxlIHR5cGVzOiBnZXQgdGhlIHdoaXRlc3BhY2UgcnVsZS4gVGhpcyBpcwotICAgICAqIGVpdGhlciB7QGxpbmsgI1dTX1BSRVNFUlZFfSwge0BsaW5rICNXU19SRVBMQUNFfSwgb3IKLSAgICAgKiB7QGxpbmsgI1dTX0NPTExBUFNFfS4gUmV0dXJucyB7QGxpbmsgI1dTX1VOU1BFQ0lGSUVEfQotICAgICAqIGZvciB1bmlvbnMgYW5kIGNvbXBsZXggdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaGl0ZVNwYWNlUnVsZSgpOwotCi0gICAgLyoqIFdoaXRlc3BhY2UgcnVsZSB1bnNwZWNpZmllZC4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19VTlNQRUNJRklFRCA9IDA7Ci0gICAgLyoqIFdoaXRlc3BhY2UgcHJlc2VydmVkLiAgU2VlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1BSRVNFUlZFID0gMTsKLSAgICAvKiogV2hpdGVzcGFjZSByZXBsYWNlZCBieSBvcmRpbmFyeSBzcGFjZS4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19SRVBMQUNFID0gMjsKLSAgICAvKiogV2hpdGVzcGFjZSBjb2xsYXBzZWQgYW5kIHRyaW1tZWQuICBTZWUge0BsaW5rICNnZXRXaGl0ZVNwYWNlUnVsZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfQ09MTEFQU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHR5cGUgdmFsdWUgdGhhdCBkb2VzIG5vdCByZXNpZGUgaW4gYSB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCB2KTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgdHlwZXMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICAgICAgeyBzdXBlcih0eXBlKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuVFlQRTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFUeXBlIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZSlnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJ1bnMgYSBTY2hlbWFUeXBlLlJlZiBwb2ludGluZyB0byB0aGlzIHNjaGVtYSB0eXBlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmIGdldFJlZigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2IwNTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNlYXJjaGFibGUgc2V0IG9mIFhNTCBTY2hlbWEgY29tcG9uZW50IGRlZmluaXRpb25zLgotICogPHA+Ci0gKiBTY2hlbWFUeXBlTG9hZGVyIGlzIHNvbWV3aGF0IGFuYWxvZ291cyB0byB7QGxpbmsgamF2YS5sYW5nLkNsYXNzTG9hZGVyfSwKLSAqIGJlY2F1c2UgaXQgaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcge0BsaW5rIFNjaGVtYUNvbXBvbmVudH0gZGVmaW5pdGlvbnMKLSAqIGJ5IG5hbWUsIHlldCBpdCBpcyBub3QgcmVzcG9uc2libGUgZm9yIGJlaW5nIGFibGUgdG8gZW51bWVyYXRlIGFsbCB0aGUKLSAqIGNvbXBvbmVudCBkZWZpbml0b25zIGF2YWlsYWJsZS4gKElmIHlvdSB3aXNoIHRvIGVudW1lcmF0ZSBjb21wb25lbnQKLSAqIGRlZmluaXRpb25zLCBzZWUge0BsaW5rIFNjaGVtYVR5cGVTeXN0ZW19LikgVGhlcmUgYXJlIHNvbWUgd2F5cyBpbiB3aGljaAotICogU2NoZW1hVHlwZVN5c3RlbXMgYXJlIGRpc3NpbWlsYXIgZnJvbSBDbGFzc0xvYWRlcnMsIGhvd2V2ZXIuCi0gKiBTaW5jZSBYTUwgU2NoZW1hIGhhcyBhIG51bWJlciBvZiBpbnN0YW5jZS1vcmllbnRlZCB0eXBpbmcgbWVjaGFuaXNtcwotICogKHN1Y2ggYXMgd2lsZGNhcmRzKSB0aGF0IGRvIG5vdCBleGlzdCBpbiBKYXZhLCBhIFNjaGVtYVR5cGVMb2FkZXIgaXMKLSAqIG5vdCBhc3NvY2lhdGVkIHdpdGggYSB0eXBlOyBpbnN0ZWFkLCBhIFNjaGVtYVR5cGVMb2FkZXIgaXMgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIFhNTCBpbnN0YW5jZS4KLSAqIDxwPgotICogRXZlcnkgWE1MIGluc3RhbmNlIGlzIGxvYWRlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBTY2hlbWFUeXBlTG9hZGVyOwotICogdGhlIFNjaGVtYVR5cGVMb2FkZXIgZm9yIGFuIGluc3RhbmNlIGlzIHVzZWQgdG8gcmVzb2x2ZSBhbGwgdHlwZSBkZWZpbml0aW9ucwotICogd2l0aGluIHRoZSBpbnN0YW5jZSBhbmQgZm9yIGFwcGx5aW5nIHR5cGUtc2Vuc2l0aXZlIG1ldGhvZHMgc3VjaCBhcwotICoge0BsaW5rIFhtbE9iamVjdCN2YWxpZGF0ZX0uCi0gKiA8cD4KLSAqIE5vcm1hbGx5IHRoZSBTY2hlbWFUeXBlTG9hZGVyIGJlaW5nIHVzZWQgZm9yIGFsbCBpbnN0YW5jZXMgaXMgdGhlCi0gKiBjb250ZXh0IHR5cGUgbG9hZGVyICh0aGF0IGlzLCB0aGUgU2NoZW1hVHlwZUxvYWRlciByZXR1cm5lZCBmcm9tCi0gKiB7QGxpbmsgWG1sQmVhbnMjZ2V0Q29udGV4dFR5cGVMb2FkZXIoKX0pLiAgVGhlIGNvbnRleHQgdHlwZSBsb2FkZXIKLSAqIGNvbnN1bHRzIHRoZSB0aHJlYWQncyBjb250ZXh0IENsYXNzTG9hZGVyIChzZWUge0BsaW5rIFRocmVhZCNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKX0pCi0gKiB0byBmaW5kIHNjaGVtYSB0eXBlIGRlZmludGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCi0gKiBUaGUgbmV0IHJlc3VsdCBpcyB0aGF0IHlvdSBjYW4gdXNlIHNjaGVtYSB0eXBlcyBzaW1wbHkgYnkgcHV0dGluZwotICogdGhlaXIgY29tcGlsZWQgc2NoZW1hIEpBUnMgb24geW91ciBjbGFzc3BhdGguCi0gKiBJZiB5b3Ugd2lzaCB0byBsb2FkIGluc3RhbmNlcyB1c2luZyBhIGRpZmZlcmVudCBTY2hlbWFUeXBlTG9hZGVyLCB0aGVuIHlvdSBtdXN0Ci0gKiBjYWxsIHtAbGluayAjcGFyc2V9IG1ldGhvZHMgb24gdGhlIFNjaGVtYVR5cGVMb2FkZXIgaW5zdGFuY2UgZXhwbGljaXRseQotICogcmF0aGVyIHRoYW4gdXNpbmcgdGhlIG5vcm1hbCBjb252ZW5pZW50IEZhY3RvcnkgbWV0aG9kcy4KLSAqIDxwPgotICogQSBTY2hlbWFUeXBlTG9hZGVyIGNhbiBiZSBvYnRhaW5lZCBieSBkeW5hbWljYWxseSBsb2FkaW5nIFhTRCBmaWxlcwotICogdXNpbmcge0BsaW5rIFhtbEJlYW5zI2xvYWRYc2R9LCBvciBieSBhc3NlbWJsaW5nIG90aGVyIFNjaGVtYVR5cGVMb2FkZXJzCi0gKiBvciBTY2hlbWFUeXBlU3lzdGVtcyBvbiBhIHBhdGggdXNpbmcge0BsaW5rIFhtbEJlYW5zI3R5cGVMb2FkZXJVbmlvbn0uCi0gKiAKLSAqIEBzZWUgWG1sQmVhbnMjbG9hZFhzZAotICogQHNlZSBYbWxCZWFucyNnZXRDb250ZXh0VHlwZUxvYWRlcgotICogQHNlZSBYbWxCZWFucyN0eXBlTG9hZGVyVW5pb24KLSAqIEBzZWUgU2NoZW1hVHlwZVN5c3RlbQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlTG9hZGVyCi17Ci0gICAgLyoqIFJldHVybnMgdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRUeXBlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIGRvY3VtZW50IHR5cGUgcm9vdGVkIGF0IHRoZSBnaXZlbiBlbGVtZW50IG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdHlwZSBjb250YWluaW5nIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIGdsb2JhbCBlbGVtZW50IGRlZmludGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgZmluZEVsZW1lbnQoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbnRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZmluZEF0dHJpYnV0ZShRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgbW9kZWwgZ3JvdXAgZGVmaW50aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cCBmaW5kTW9kZWxHcm91cChRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgYXR0cmlidXRlIGdyb3VwIGRlZmludGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGZpbmRBdHRyaWJ1dGVHcm91cChRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlbG9hZGVyIGNvbnRhaW5zIGFueSBkZWZpbml0aW9ucyBpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRGVmaW5lZChTdHJpbmcgbmFtZXNwYWNlKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZFR5cGVSZWYoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmREb2N1bWVudFR5cGVSZWYoUU5hbWUgbmFtZSk7Ci0gICAgCi0gICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kQXR0cmlidXRlVHlwZVJlZihRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZmluZEVsZW1lbnRSZWYoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIGZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBmaW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIEZpbmRzIGEgdHlwZSBmb3IgYSBnaXZlbiBzaWduYXR1cmUgc3RyaW5nICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvclNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKTsKLQotICAgIC8qKiBGaW5kcyBhIHR5cGUgZm9yIGEgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIFhNTCBCZWFuIGNsYXNzbmFtZSAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSk7Ci0KLSAgICAvKiogTG9hZHMgb3JpZ2luYWwgWFNEIHNvdXJjZSBhcyBhIHN0cmVhbS4gIFNlZSB7QGxpbmsgU2NoZW1hVHlwZSNnZXRTb3VyY2VOYW1lfS4gKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpOwotICAgIAotICAgIC8qKiBDb21waWxlcyBhbiBYUGF0aCAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGgoU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb247Ci0KLSAgICAvKiogQ29tcGlsZXMgYW4gWFF1ZXJ5ICovCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlUXVlcnkoU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotCi0gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuICovCi0gICAgcHVibGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGZpbGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggVVJMIGZpbGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIGppb3IsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggTm9kZSBub2RlLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICAvKiogUmV0dXJucyBhbiBYbWxTYXhIYW5kbGVyIHRoYXQgY2FuIHBhcnNlIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxTYXhIYW5kbGVyIG5ld1htbFNheEhhbmRsZXIgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbSB0aGF0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBYTUwgaXMgbm90IHZhbGlkIAotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGIyYmQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHRoZXJlIGlzIGNvcnJ1cHRpb24gb3IgYSB2ZXJzaW9uIG1pc21hdGNoCi0gKiBpbiBhIGNvbXBpbGVkIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGV4dGVuZHMgWG1sUnVudGltZUV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgaW50IF9jb2RlOwotICAgIAotICAgIC8qKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBmaWxlbmFtZSwgZXh0ZW5zaW9uLCBhbmQgY29kZSAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhhbmRsZSwgaW50IGNvZGUpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlICsgIiAoIiArIG5hbWUgKyAiLiIgKyBoYW5kbGUgKyAiKSAtIGNvZGUgIiArIGNvZGUpOwotICAgICAgICBfY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGZpbGVuYW1lLCBleHRlbnNpb24sIGNvZGUsIGFuZCBjYXVzZSAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhhbmRsZSwgaW50IGNvZGUsIEV4Y2VwdGlvbiBjYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UgKyAiICgiICsgbmFtZSArICIuIiArIGhhbmRsZSArICIpIC0gY29kZSAiICsgY29kZSk7Ci0gICAgICAgIF9jb2RlID0gY29kZTsKLSAgICAgICAgaW5pdENhdXNlKGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSwgZ2l2ZW4gYnkgb25lIG9mIHRoZSBudW1lcmljIGNvbnN0YW50cyBpbiB0aGlzIGNsYXNzICovCi0gICAgcHVibGljIGludCBnZXRDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19SRVNPVVJDRSA9IDA7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfTUFHSUNfQ09PS0lFID0gMTsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19NQUpPUl9WRVJTSU9OID0gMjsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19NSU5PUl9WRVJTSU9OID0gMzsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19GSUxFX1RZUEUgPSA0OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOUkVDT0dOSVpFRF9JTkRFWF9FTlRSWSA9IDU7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfUFJPUEVSVFlfVFlQRSA9IDY7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEX0NPTlRFTlRfTU9ERUwgPSA3OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX1NJTVBMRV9WQVJJRVRZID0gODsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJT19FWENFUFRJT04gPSA5OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9UT09fTEFSR0UgPSAxMDsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfUEFSVElDTEVfVFlQRSA9IDExOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9XUklURUFCTEUgPSAxMjsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfSEFORExFID0gMTM7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVTVEVEX0VYQ0VQVElPTiA9IDE0OwotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZVN5c3RlbS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMGY1ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBBIGZpbml0ZSBzZXQgb2YgWE1MIFNjaGVtYSBjb21wb25lbnQgZGVmaW5pdGlvbnMuCi0gKiA8cD4KLSAqIEV2ZXJ5IHtAbGluayBTY2hlbWFDb21wb25lbnR9IHN1Y2ggYXMgYSB7QGxpbmsgU2NoZW1hVHlwZX0sCi0gKiB7QGxpbmsgU2NoZW1hR2xvYmFsRWxlbWVudH0sIHtAbGluayBTY2hlbWFHbG9iYWxBdHRyaWJ1dGV9LAotICoge0BsaW5rIFNjaGVtYU1vZGVsR3JvdXB9LCB7QGxpbmsgU2NoZW1hQXR0cmlidXRlR3JvdXB9LCBvcgotICoge0BsaW5rIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludH0sIGlzIGRlZmluZWQgaW4gZXhhY3RseSBvbmUKLSAqIFNjaGVtYVR5cGVTeXN0ZW0uICAoU2VlIHtAbGluayBTY2hlbWFDb21wb25lbnQjZ2V0VHlwZVN5c3RlbSgpfS4pCi0gKiBBIHNpbmdsZSBTY2hlbWFUeXBlU3lzdGVtIGNhbiBpbmNsdWRlIGRlZmluaXRpb25zCi0gKiBmcm9tIGFueSBudW1iZXIgb2YgbmFtZXNwYWNlczsgb25lIFNjaGVtYVR5cGVTeXN0ZW0gY29uc2lzdHMgc2ltcGx5Ci0gKiBvZiBhIHNldCBvZiBjb21wb25lbnQgZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIGNvbXBpbGVkIHRvZ2V0aGVyLgotICogPHA+Ci0gKiBTaW5jZSBldmVyeSBjb21wb25lbnQgaXMgZGVmaW5lZCBpbiBhIHNpbmdsZSBTY2hlbWFUeXBlU3lzdGVtLCBubwotICogU2NoZW1hVHlwZVN5c3RlbSBvdGhlciB0aGFuIHtAbGluayBYbWxCZWFucyNnZXRCdWlsdGluVHlwZVN5c3RlbSgpfQotICogaW5jbHVkZXMgYW55IG9mIHRoZSB0aGUgYnVpbHQtaW4gdHlwZXMuICBUaGF0IG1lYW5zCi0gKiB5b3UgY2Fubm90IG9yZGluYXJpbHkgbG9hZCBpbnN0YW5jZXMgdXNpbmcgYSBzaW5nbGUKLSAqIFNjaGVtYVR5cGVTeXN0ZW0gYnkgaXRzZWxmLiBJbnN0ZWFkLCB5b3Ugd2lsbCB3YW50IHRvIGNvbWJpbmUgYSBwYXRoIG9mCi0gKiBTY2hlbWFUeXBlU3lzdGVtcyB0b2dldGhlciB1c2luZyB7QGxpbmsgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9ufQotICogdG8gZm9ybSBhIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBpbnN0YW5jZXMuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgY29tcGlsZXMgdGhlIHNjaGVtYSBpbiBteVhTREZpbGUKLSAqIGluIHRoZSBwcmVzZW5jZSBvZiBvbmx5IHRoZSBtaW5pbWFsIGJ1aWx0aW4gdHlwZSBzeXN0ZW0uCi0gKiBUaGUgcmVzdWx0aW5nIFNjaGVtYVR5cGVTeXN0ZW0gPGNvZGU+c3RzPC9jb2RlPiBjb250YWlucyBvbmx5IHRoZSBkZWZpbml0aW9ucwotICogZnJvbSBteVhTRCBmaWxlLiAgSW4gb3JkZXIgdG8gbG9hZCBhbmQgdmFsaWRhdGUgYW4gaW5zdGFuY2Ugd2l0aGluCi0gKiB0aGUgY29udGV4dCBvZiB0aG9zZSB0eXBlcywgd2UgbXVzdCBuZXh0IGNvbnN0cnVjdCBhCi0gKiB7QGxpbmsgU2NoZW1hVHlwZUxvYWRlcn0gPGNvZGU+c3RsPC9jb2RlPiB0aGF0IGNvbnRhaW5zIGJvdGgKLSAqIHRoZSBidWlsdGluIHR5cGUgc3lzdGVtIGFuZCB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhlIG15WFNEIGZpbGUuCi0gKiA8cHJlPgotICogU2NoZW1hVHlwZVN5c3RlbSBzdHMgPSBYbWxCZWFucy5jb21waWxlWHNkKG5ldyBYbWxPYmplY3RbXQotICogICAgeyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteVhTREZpbGUpIH0sCi0gKiAgICBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLAotICogICAgbnVsbCk7Ci0gKiBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IFhtbEJlYW5zLnR5cGVMb2FkZXJVbmlvbihuZXcgU2NoZW1hVHlwZUxvYWRlcltdCi0gKiAgICB7IHN0cywgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSB9KTsKLSAqIFhtbE9iamVjdCBteWRvYyA9IHN0bC5wYXJzZShpbnN0YW5jZUZpbGUsIG51bGwsIG51bGwpOwotICogU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCB2YWxpZDogIiArIG15ZG9jLnZhbGlkYXRlKCkpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIEFzIHlvdSBjYW4gc2VlLCBmb3Igd29ya2luZyB3aXRoIGluc3RhbmNlcywgeW91IHR5cGljYWxseSB3YW50IHRvCi0gKiB3b3JrIHdpdGggYSBTY2hlbWFUeXBlTG9hZGVyIGNvbnN0cnVjdGVkIGZyb20gYSBwYXRoIHJhdGhlciB0aGFuCi0gKiBhIHNvbGl0YXJ5IFNjaGVtYVR5cGVTeXN0ZW0uICBTZWUge0BsaW5rIFhtbEJlYW5zI2xvYWRYc2R9IGZvcgotICogYSBjb252ZW5pZW50IGFsdGVybmF0aXZlIHRvIHtAbGluayBYbWxCZWFucyNjb21waWxlWHNkfS4KLSAqIDxwPgotICogQSBTY2hlbWFUeXBlU3lzdGVtIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGVudW1lcmF0ZSB0aGUgZXhhY3Qgc2V0Ci0gKiBvZiBjb21wb25lbnQgZGVmaW5pdGlvbnMgZGVyaXZlZCBmcm9tIGEgc2V0IG9mIFhTRCBmaWxlcywgZm9yIGV4YW1wbGUsCi0gKiB3aGVuIHlvdSBhcmUgYW5hbHl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgWFNEIGZpbGVzIHRoZW1zZWx2ZXMuCi0gKiBIZXJlIGlzIGhvdyB0byB1c2UgYSBTY2hlbWFUeXBlU3lzdGVtIHRvIGluc3BlY3QgYSBzZXQgb2Ygc2NoZW1hCi0gKiBkZWZpbml0aW9uczoKLSAqIDxvbD4KLSAqIDxsaT5GaXJzdCwgdXNlIHtAbGluayBYbWxCZWFucyNjb21waWxlWHNkfSB0byBjb21waWxlIGFueSBudW1iZXIKLSAqICAgICBvZiBzY2hlbWEgZmlsZXMuICBJZiB0aGUgc2NoZW1hIGZpbGVzIGFyZSB2YWxpZCwgcmVzdWx0IHdpbGwKLSAqICAgICBiZSBhIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCBjb250YWlucyBhbGwgdGhlIGNvbXBvbmVudCBkZWZpbml0aW9ucwotICogICAgIGZyb20gdGhvc2UgZmlsZXMuICBJdCB3aWxsIGNvbnRhaW4gbm8gb3RoZXIgY29tcG9uZW50IGRlZmluaXRpb25zLgotICogPGxpPkFsdGVybmF0aXZlbHksIGNhbGwge0BsaW5rIFNjaGVtYUNvbXBvbmVudCNnZXRUeXBlU3lzdGVtfSBvbgotICogICAgIGEgcHJlY29tcGlsZWQgc2NoZW1hIGNvbXBvbmVudCB0byBkaXNjb3ZlciB0aGUgU2NoZW1hVHlwZVN5c3RlbQotICogICAgIHdpdGhpbiB3aGljaCB0aGF0IGNvbXBvbmVudCB3YXMgb3JpZ2luYWxseSBjb21waWxlZC4KLSAqIDxsaT5PbmNlIHlvdSBoYXZlIGEgU2NoZW1hVHlwZVN5c3RlbSwgY2FsbDoKLSAqICAgPHVsPgotICogICA8bGk+IHtAbGluayAjZ2xvYmFsVHlwZXMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIHR5cGUgZGVmaW5pdGlvbnMuCi0gKiAgIDxsaT4ge0BsaW5rICNnbG9iYWxFbGVtZW50cygpfSBmb3IgYWxsIHRoZSBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9ucy4KLSAqICAgPGxpPiB7QGxpbmsgI2dsb2JhbEF0dHJpYnV0ZXMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4KLSAqICAgPGxpPiB7QGxpbmsgI21vZGVsR3JvdXBzKCl9IGZvciBhbGwgdGhlIG5hbWVkIG1vZGVsIGdyb3VwIGRlZmluaXRpb25zLgotICogICA8bGk+IHtAbGluayAjYXR0cmlidXRlR3JvdXBzKCl9IGZvciBhbGwgdGhlIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9ucy4KLSAqICAgPC91bD4KLSAqIDxsaT5JbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHNwZWNpYWwgdHlwZXMgZ2VuZXJhdGVkIGZvciBYTUwgQmVhbnMgdGhhcmUKLSAqICAgICBhcmUgbm90IGZvcm1hbGx5IHBhcnQgb2YgdGhlIFNjaGVtYSBzcGVjaWZpY2F0aW9uOgotICogICA8dWw+Ci0gKiAgIDxsaT4ge0BsaW5rICNkb2N1bWVudFR5cGVzKCl9IHJldHVybnMgYWxsIHRoZSBkb2N1bWVudCB0eXBlcy4KLSAqICAgPGxpPiB7QGxpbmsgI2F0dHJpYnV0ZVR5cGVzKCl9IHJldHVybnMgYWxsIHRoZSBhdHRyaWJ1dGUgdHlwZXMuCi0gKiAgIDwvdWw+Ci0gKiA8L29sPgotICogCi0gKiA8cD4KLSAqIEEgZG9jdW1lbnQgdHlwZSBpcyBhIHR5cGUgdGhhdCBjb250YWlucyBhIHNpbmdsZSBnbG9iYWwgZWxlbWVudDsgdGhlcmUKLSAqIGlzIG9uZSBkb2N1bWVudCB0eXBlIGZvciBlYWNoIGdsb2JhbCBlbGVtZW50IGRlZmluaXRpb24gaW4gYQotICogU2NoZW1hVHlwZVN5c3RlbS4gIEluIGFuIGluc3RhbmNlIGRvY3VtZW50LCBvbmx5IHRoZSByb290IFhtbE9iamVjdAotICogY2FuIGhhdmUgYSBkb2N1bWVudCB0eXBlIGFzIGl0cyB0eXBlLgotICogPHA+Ci0gKiBTaW1pbGFybHksIGFuIGF0dHJpYnV0ZSB0eXBlIGlzIGEgdHlwZSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGdsb2JhbAotICogYXR0cmlidXRlLCBhbmQgdGhlcmUgaXMgb25lIGF0dHJpYnV0ZSB0eXBlIGZvciBlYWNoIGdsb2JhbCBhdHRyaWJ1dGUKLSAqIGRlZmluaXRpb24gaW4gYSBTY2hlbWFUeXBlU3lzdGVtLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHJvb3QKLSAqIFhtbE9iamVjdCByZXByZXNlbnRpbmcgYSBmcmFnbWVudCB3aG9zZSB0eXBlIGlzIGFuIGF0dHJpYnV0ZSB0eXBlLAotICogYnV0IGF0dHJpYnV0ZSB0eXBlcyBhcmUgcHJlc2VudCBtYWlubHkgZm9yIHN5bW1ldHJ5IGFuZCB0byBzaW1wbGlmeQotICogY29kZSBzdWNoIGFzIHRoZSB0eXBlLXRyZWUtd2Fsa2luZyBjb2RlIGJlbG93LgotICogPHA+Ci0gKiBUaGUgZ2xvYmFsIGNvbXBvbmVudCBtZXRob2RzIGFib3ZlIG9ubHkgcHJvdmlkZSBhIHZpZXcgb2YgdGhlIHRvcC1sZXZlbAotICogY29tcG9uZW50cyBvZiBhIFNjaGVtYVR5cGVTeXN0ZW0gYW5kIGRvIG5vdCBpbmNsdWRlIGFueSBuZXN0ZWQKLSAqIGRlZmluaXRpb25zLiAgVG8gdmlldyBhbGwgdGhlIG5lc3RlZCBkZWZpbml0aW9ucywgeW91IHdpbGwgd2FudCB0bwotICogdHJhdmVyc2UgdGhlIGVudGlyZSB0cmVlIG9mIHtAbGluayBTY2hlbWFUeXBlfSBkZWZpbnRpb25zIHdpdGhpbiBhCi0gKiBTY2hlbWFUeXBlU3lzdGVtIGJ5IGV4YW1pbmluZyB0aGUge0BsaW5rIFNjaGVtYVR5cGUjZ2V0QW5vbnltb3VzVHlwZXMoKX0KLSAqIHdpdGhpbiBlYWNoIHtAbGluayBTY2hlbWFUeXBlfSByZWN1cnNpdmVseS4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIHN0YW5kYXJkIHRyZWV3YWxrIHRoYXQgdmlzaXRzIGV2ZXJ5Ci0gKiB7QGxpbmsgU2NoZW1hVHlwZX0gaW4gdGhlIFNjaGVtYVR5cGVTeXN0ZW0gb25jZSwgaW5jbHVkaW5nIG5lc3RlZAotICogZGVmaW5pdGlvbnMuCi0gKiA8cHJlPgotICogTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gKiBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5kb2N1bWVudFR5cGVzKCkpKTsKLSAqIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAqIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmdsb2JhbFR5cGVzKCkpKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKQotICogewotICogICAgIFNjaGVtYVR5cGUgc1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICogICAgIFN5c3RlbS5vdXQucHJpbmxudCgiVmlzaXRpbmcgIiArIHNUeXBlLnRvU3RyaW5nKCkpOwotICogICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlIFNjaGVtYVR5cGUgCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIgCi0gKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAqIEBzZWUgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9uCi0gKiBAc2VlIFhtbEJlYW5zI2dldEJ1aWx0aW5UeXBlU3lzdGVtCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGVTeXN0ZW0gZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gYXR0cmlidXRlR3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBhIHR5cGUgc3lzdGVtIChyZXNvbHZlcyBhbGwgaGFuZGxlcyB3aXRoaW4gdGhlIHR5cGUgc3lzdGVtKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGVzIGEgdHlwZSwgZWxlbWVudCwgb3IgYXR0cmlidXRlIHVzaW5nIHRoZSBoYW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudCByZXNvbHZlSGFuZGxlKFN0cmluZyBoYW5kbGUpOwotCi0gICAgLyoqCi0gICAgICogTG9jYXRlcyBhIHR5cGUsIGVsZW1lbnQsIG9yIGF0dHJpYnV0ZSB1c2luZyB0aGUgaGFuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc2xvYWRlciB1c2VkIGJ5IHRoaXMgbG9hZGVyIGZvciByZXNvbHZpbmcgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGlzIHR5cGUgdG8gYSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVRvRGlyZWN0b3J5KEZpbGUgY2xhc3NEaXIpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NpbXBsZVZhbHVlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2ltcGxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5YmNhNy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2ltcGxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBBbGwgWG1sT2JqZWN0IGltcGxlbWVudGF0aW9ucyBjYW4gYmUgY29lcmNlZCB0byBTaW1wbGVWYWx1ZS4KLSAqIEZvciBhbnkgZ2l2ZW4gc2NoZW1hIHR5cGUsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbnZlcnNpb24KLSAqIG1ldGhvZHMgd2lsbCB3b3JrLiAgT3RoZXJzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogPHA+Ci0gKiBTaW1wbGVWYWx1ZSBpcyB1c2VmdWwgZm9yIGRlY2xhcmluZyB2YXJpYWJsZXMgd2hpY2ggY2FuIGhvbGQKLSAqIG1vcmUgdGhhbiBvbmUgc2ltaWxhciBzY2hlbWEgdHlwZSB0aGF0IG1heSBub3QgaGFwcGVuIHRvCi0gKiBoYXZlIGEgY29tbW9uIFhNTCBiYXNlIHR5cGUsIGZvciBleGFtcGxlLCB0d28gbGlzdCB0eXBlcywKLSAqIG9yIHR3byB1bnJlbGF0ZWQgaW50ZWdlciByZXN0cmljdGlvbnMgdGhhdCBoYXBwZW4gdG8gZml0Ci0gKiBpbnRvIGFuIGludC4KLSAqLwotcHVibGljIGludGVyZmFjZSBTaW1wbGVWYWx1ZSBleHRlbmRzIFhtbE9iamVjdAotewotICAgIC8qKgotICAgICAqIFRoZSBzYW1lIGFzIGdldFNjaGVtYVR5cGUgdW5sZXNzIHRoaXMgaXMgYSB1bmlvbiBpbnN0YW5jZQotICAgICAqIG9yIG5pbCB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgdW5pb25zLCB0aGlzIHJldHVybnMgdGhlIG5vbi11bmlvbiBjb25zaXR1ZW50IHR5cGUgb2YKLSAgICAgKiB0aGlzIGluc3RhbmNlLiBUaGlzIHR5cGUgbWF5IGNoYW5nZSBpZiBzZXR0ZXJzIGFyZSBjYWxsZWQKLSAgICAgKiB0aGF0IGNhdXNlIHRoZSBpbnN0YW5jZSB0byBjaGFuZ2UgdG8gYW5vdGhlciBjb25zdGl0dWVudAotICAgICAqIHR5cGUgb2YgdGhlIHVuaW9uLgotICAgICAqIDxwPgotICAgICAqIEZvciBuaWwgdmFsdWVzLCB0aGlzIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSgpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30uICovCi0gICAgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi4gKi8KLSAgICBib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJ5dGUuICovCi0gICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgc2hvcnQuICovCi0gICAgcHVibGljIHNob3J0IGdldFNob3J0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYW4gaW50LiAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBsb25nLiAqLwotICAgIHB1YmxpYyBsb25nIGdldExvbmdWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfS4gKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0uICovCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgZmxvYXQuICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCi0gICAgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9LiAqLwotICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZ2V0RW51bVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9LiAqLwotICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfS4gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0uICovCi0gICAgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfS4gKi8KLSAgICBRTmFtZSBnZXRRTmFtZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIGZyaWVuZGx5IEphdmEgb2JqZWN0cyAoU3RyaW5nLCBJbnRlZ2VyLCBCeXRlLCBTaG9ydCwgTG9uZywgQmlnSW50ZWdlciwgRGVjaW1hbCwgRmxvYXQsIERvdWJsZSwgYnl0ZVtdLCBDYWxlbmRhciwgR0R1cmF0aW9uKS4gKi8KLSAgICBMaXN0IGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiBYbWxBbnlTaW1wbGVUeXBlIG9iamVjdHMuICovCi0gICAgTGlzdCB4Z2V0TGlzdFZhbHVlKCk7Ci0KLSAgICAvKiogUmV0dXJucyBhIHVuaW9uIHZhbHVlIGFzIGEgaXRzIG5hdHVyYWwgZnJpZW5kbHkgSmF2YSBvYmplY3QgKFN0cmluZywgSW50ZWdlciwgQnl0ZSwgU2hvcnQsIExvbmcsIEJpZ0ludGVnZXIsIERlY2ltYWwsIEZsb2F0LCBEb3VibGUsIGJ5dGVbXSwgQ2FsZW5kYXIsIEdEdXJhdGlvbikuICovCi0gICAgT2JqZWN0IGdldE9iamVjdFZhbHVlKCk7Ci0KLSAgICAvLyBmb2xsb3dpbmcgYXJlIHNpbXBsZSB0eXBlIHZhbHVlIHNldHRlcnMKLQotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9LiAqLwotICAgIHZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi4gKi8KLSAgICB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIHYpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJ5dGUuICovCi0gICAgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBzaG9ydC4gKi8KLSAgICB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGludC4gKi8KLSAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBsb25nLiAqLwotICAgIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9LiAqLwotICAgIHZvaWQgc2V0QmlnSW50ZWdlclZhbHVlKEJpZ0ludGVnZXIgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0uICovCi0gICAgdm9pZCBzZXRCaWdEZWNpbWFsVmFsdWUoQmlnRGVjaW1hbCBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LiAqLwotICAgIHZvaWQgc2V0RmxvYXRWYWx1ZShmbG9hdCB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuICovCi0gICAgdm9pZCBzZXREb3VibGVWYWx1ZShkb3VibGUgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKi8KLSAgICB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfS4gKi8KLSAgICB2b2lkIHNldEVudW1WYWx1ZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0uICovCi0gICAgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0uICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0uICovCi0gICAgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9LiAqLwotICAgIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fS4gKi8KLSAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFyYml0cmFyeSB7QGxpbmsgT2JqZWN0fS4gKi8KLSAgICB2b2lkIHNldE9iamVjdFZhbHVlKE9iamVjdCBvYmopOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTdHJpbmdWYWx1ZX0KLSAgICAgKi8KLSAgICBTdHJpbmcgc3RyaW5nVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Qm9vbGVhblZhbHVlfQotICAgICAqLwotICAgIGJvb2xlYW4gYm9vbGVhblZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJ5dGVWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHNob3J0LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFNob3J0VmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhbiBpbnQuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgbG9uZy4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMb25nVmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0QmlnSW50ZWdlclZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJpZ0RlY2ltYWxWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEZsb2F0VmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGRvdWJsZS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREb3VibGVWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJ5dGVBcnJheVZhbHVlfQotICAgICAqLwotICAgIGJ5dGVbXSBieXRlQXJyYXlWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEVudW1WYWx1ZX0KLSAgICAgKi8KLSAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9Ci0gICAgICovCi0gICAgRGF0ZSBkYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKi8KLSAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0R1cmF0aW9ufS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRHVyYXRpb25WYWx1ZX0KLSAgICAgKi8KLSAgICBHRHVyYXRpb24gZ0R1cmF0aW9uVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0UU5hbWVWYWx1ZX0KLSAgICAgKi8KLSAgICBRTmFtZSBxTmFtZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2YgZnJpZW5kbHkgSmF2YSBvYmplY3RzIChTdHJpbmcsIEludGVnZXIsIEJ5dGUsIFNob3J0LCBMb25nLCBCaWdJbnRlZ2VyLCBEZWNpbWFsLCBGbG9hdCwgRG91YmxlLCBieXRlW10sIENhbGVuZGFyLCBHRHVyYXRpb24pLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKi8KLSAgICBMaXN0IGxpc3RWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIFhtbEFueVNpbXBsZVR5cGUgb2JqZWN0cy4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHVuaW9uIHZhbHVlIGFzIGEgaXRzIG5hdHVyYWwgZnJpZW5kbHkgSmF2YSBvYmplY3QgKFN0cmluZywgSW50ZWdlciwgQnl0ZSwgU2hvcnQsIExvbmcsIEJpZ0ludGVnZXIsIERlY2ltYWwsIEZsb2F0LCBEb3VibGUsIGJ5dGVbXSwgQ2FsZW5kYXIsIEdEdXJhdGlvbikuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0T2JqZWN0VmFsdWV9Ci0gICAgICovCi0gICAgT2JqZWN0IG9iamVjdFZhbHVlKCk7Ci0KLSAgICAvLyBmb2xsb3dpbmcgYXJlIHNpbXBsZSB0eXBlIHZhbHVlIHNldHRlcnMKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0U3RyaW5nVmFsdWV9Ci0gICAgICovCi0gICAgdm9pZCBzZXQoU3RyaW5nIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBib29sZWFuLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJvb2xlYW5WYWx1ZX0KLSAgICAgKi8KLSAgICB2b2lkIHNldChib29sZWFuIHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgYnl0ZS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Qnl0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChieXRlIHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgc2hvcnQuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KHNob3J0IHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGludC4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGludCB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGxvbmcuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldExvbmdWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQobG9uZyB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0QmlnSW50ZWdlclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0QmlnRGVjaW1hbFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChCaWdEZWNpbWFsIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBmbG9hdC4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RmxvYXRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoZmxvYXQgdik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERvdWJsZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChkb3VibGUgdik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBieXRlIGFycmF5LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYnl0ZVtdIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZX0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEVudW1WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQ2FsZW5kYXIgb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChEYXRlIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRHVyYXRpb25WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0UU5hbWVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoUU5hbWUgb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0TGlzdFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChMaXN0IG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYW4gYXJiaXRyYXJ5IHtAbGluayBPYmplY3R9LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRPYmplY3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBvYmplY3RTZXQoT2JqZWN0IG9iaik7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU3RyaW5nRW51bUFic3RyYWN0QmFzZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1N0cmluZ0VudW1BYnN0cmFjdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZTEzMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU3RyaW5nRW51bUFic3RyYWN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgY29kZS1nZW5lcmF0ZWQgc3RyaW5nIGVudW1lcmF0aW9uIHZhbHVlIGNsYXNzZXMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgYXJlIGludGVuZGVkIHRvIGJlIGZpbmFsIHR5cGVzIHdpdGggYSBmaW5pdGUgc2V0IG9mCi0gKiBzaW5nbGV0b24gaW5zdGFuY2VzLiAgRWFjaCBpbnN0YW5jZSBoYXMgYSBzdHJpbmcgdmFsdWUsIHdoaWNoCi0gKiBpdCByZXR1cm5zIHZpYSB7QGxpbmsgI3RvU3RyaW5nfSwgYW5kIGFuIGludCB2YWx1ZSBmb3IgdGhlIHB1cnBvc2UKLSAqIG9mIHN3aXRjaGluZyBpbiBjYXNlIHN0YXRlbWVudHMsIHJldHVybmVkIHZpYSB7QGxpbmsgI2ludFZhbHVlfS4KLSAqIDxwPgotICogRWFjaCBzdWJjbGFzcyBtYW5hZ2VzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlLlRhYmxlfSwKLSAqIHdoaWNoIGhvbGRzIGFsbCB0aGUgc2luZ2xldG9uIGluc3RhbmNlcyBmb3IgdGhlIHN1YmNsYXNzLiBBIFRhYmxlCi0gKiBjYW4gcmV0dXJuIGEgc2luZ2xldG9uIGluc3RhbmNlIGdpdmVuIGEgU3RyaW5nIG9yIGFuIGludGVnZXIgY29kZS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBfc3RyaW5nOwotICAgIHByaXZhdGUgaW50IF9pbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2VzIHNob3VsZCBvbmx5IGJlIGNyZWF0ZWQgYnkgc3ViY2xhc3Nlcy4KLSAgICAgKi8gCi0gICAgcHJvdGVjdGVkIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UoU3RyaW5nIHMsIGludCBpKQotICAgICAgICB7IF9zdHJpbmcgPSBzOyBfaW50ID0gaTsgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsgcmV0dXJuIF9zdHJpbmc7IH0KLSAgICAvKiogUmV0dXJucyBhbiBpbnQgY29kZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBzd2l0Y2ggc3RhdGVtZW50cyAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaW50VmFsdWUoKQotICAgICAgICB7IHJldHVybiBfaW50OyB9Ci0gICAgLyoqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGUgdW5kZXJseWluZyBzdHJpbmcgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgeyByZXR1cm4gX3N0cmluZy5oYXNoQ29kZSgpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIG1hbmFnZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGVudW1lcmF0aW9ucy4KLSAgICAgKiBFYWNoIHN1YmNsYXNzIG9mIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgaGFzIGFuIGluc3RhbmNlCi0gICAgICogb2YgYSB0YWJsZSB0byBob2xkIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VzLgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRhYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIE1hcCBfbWFwOwotICAgICAgICBwcml2YXRlIExpc3QgX2xpc3Q7Ci0gICAgICAgIHB1YmxpYyBUYWJsZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gYXJyYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9tYXAgPSBuZXcgSGFzaE1hcChhcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgX2xpc3QgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCArIDEpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbWFwLnB1dChhcnJheVtpXS50b1N0cmluZygpLCBhcnJheVtpXSk7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBhcnJheVtpXS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChfbGlzdC5zaXplKCkgPD0gaikKLSAgICAgICAgICAgICAgICAgICAgX2xpc3QuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgIF9saXN0LnNldChqLCBhcnJheVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gZm9yIGEge0BsaW5rIFN0cmluZ30sIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZm9yU3RyaW5nKFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX21hcC5nZXQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBmb3IgYW4gaW50IGNvZGUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZm9ySW50KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+IF9saXN0LnNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nRW51bUFic3RyYWN0QmFzZSlfbGlzdC5nZXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIGxhc3QgdmFsaWQgaW50IGNvZGUgKHRoZSBmaXJzdCBpcyAxOyB6ZXJvIGlzIG5vdCB1c2VkKS4gKi8KLSAgICAgICAgcHVibGljIGludCBsYXN0SW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LnNpemUoKSAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1hNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhOTNhMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIHRocm93biBmcm9tIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAqIAotICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0KLSAqIEBzZWUgU2NoZW1hVHlwZUxvYWRlciNuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0KLSAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFhNTFN0cmVhbUV4Y2VwdGlvbgotewotICAgIHB1YmxpYyBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uICggWG1sRXJyb3IgeG1sRXJyb3IgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHhtbEVycm9yLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIF94bWxFcnJvciA9IHhtbEVycm9yOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxFcnJvciBnZXRYbWxFcnJvciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfeG1sRXJyb3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxFcnJvciBfeG1sRXJyb3I7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlTaW1wbGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZmU4Y2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jU2ltcGxlX1R5cGVfRGVmaW5pdGlvbiI+eHM6YW55U2ltcGxlVHlwZTwvYT4gdHlwZS4KLSAqIDxwPgotICogQWxsIHNpbXBsZSB0eXBlcyBhcmUgY29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxBbnlTaW1wbGVUeXBlIGV4dGVuZHMgWG1sT2JqZWN0Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYW55U2ltcGxlVHlwZSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldFN0cmluZ1ZhbHVlfQotICAgICAqKi8KLSAgICBTdHJpbmcgc3RyaW5nVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRTdHJpbmdWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoU3RyaW5nIHMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfQotICAgICAqKi8KLSAgICBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30KLSAgICAgKiovCi0gICAgdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDthbnl0aGluZyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDthbnl0aGluZyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55VVJJLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55VVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjEyZDkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiPnhzOmFueVVSSTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxBbnlVUkkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYW55VVJJIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxBbnlVUkl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVVSSX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVVSSX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEFueVVSSX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtodHRwOi8vd3d3LnczLm9yZy8mbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7aHR0cDovL3d3dy53My5vcmcvJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmNkODYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJhc2U2NEJpbmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiPnhzOmJhc2U2NEJpbmFyeTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gYSBieXRlIGFycmF5LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzZTY0QmluYXJ5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2Jhc2U2NEJpbmFyeSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZUFycmF5VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGJ5dGVbXSBiYSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKiovCi0gICAgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCi0gICAgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gYmEpOwotCi0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1ZHaHBjeUJ6ZEhKcCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtWR2hwY3lCemRISnAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJlYW5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTUyZGIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJlYW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBQcm92aWRlcyBhbiBhc3NvcnRtZW50IG9mIHV0aWxpdGllcwotICogZm9yIG1hbmFnaW5nIFhNTCBCZWFuIHR5cGVzLCB0eXBlIHN5c3RlbXMsIFFOYW1lcywgcGF0aHMsCi0gKiBhbmQgcXVlcmllcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEJlYW5zCi17Ci0gICAgLyoqCi0gICAgICogVGhyZWFkIGxvY2FsIFFOYW1lIGNhY2hlIGZvciBnZW5lcmFsIHVzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsIF90aHJlYWRMb2NhbExvYWRlclFOYW1lQ2FjaGUgPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZUNhY2hlKCAzMiApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRocmVhZCBsb2NhbCBRTmFtZUNhY2hlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZUNhY2hlIGdldFFOYW1lQ2FjaGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gKFFOYW1lQ2FjaGUpIF90aHJlYWRMb2NhbExvYWRlclFOYW1lQ2FjaGUuZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhIG5hbWUgZnJvbSB0aGUgdGhyZWFkIGxvY2FsIFFOYW1lQ2FjaGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFFOYW1lICggU3RyaW5nIGxvY2FsUGFydCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UU5hbWVDYWNoZSgpLmdldE5hbWUoICIiLCAgbG9jYWxQYXJ0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhIG5hbWUgZnJvbSB0aGUgdGhyZWFkIGxvY2FsIFFOYW1lQ2FjaGUKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UU5hbWUgKCBTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgbG9jYWxQYXJ0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZUNhY2hlKCkuZ2V0TmFtZSggbmFtZXNwYWNlVXJpLCAgbG9jYWxQYXJ0ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9nZXRDb250ZXh0VHlwZUxvYWRlck1ldGhvZCA9IGJ1aWxkR2V0Q29udGV4dFR5cGVMb2FkZXJNZXRob2QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX2dldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kID0gYnVpbGRHZXRCdWlsdGluU2NoZW1hVHlwZVN5c3RlbU1ldGhvZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfZ2V0Tm9UeXBlTWV0aG9kID0gYnVpbGRHZXROb1R5cGVNZXRob2QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX3R5cGVMb2FkZXJCdWlsZGVyTWV0aG9kID0gYnVpbGRUeXBlTG9hZGVyQnVpbGRlck1ldGhvZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfY29tcGlsYXRpb25NZXRob2QgPSBidWlsZENvbXBpbGF0aW9uTWV0aG9kKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGNhdXNlZEV4Y2VwdGlvbihSdW50aW1lRXhjZXB0aW9uIGUsIFRocm93YWJsZSBjYXVzZSkKLSAgICB7Ci0gICAgICAgIGUuaW5pdENhdXNlKGNhdXNlKTsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sRXhjZXB0aW9uIHdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikKLSAgICAgICAgICAgIHJldHVybiAoWG1sRXhjZXB0aW9uKSBlOwotCi0gICAgICAgIHJldHVybiBuZXcgWG1sRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBidWlsZEdldENvbnRleHRUeXBlTG9hZGVyTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlTG9hZGVySW1wbCIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImdldENvbnRleHRUeXBlTG9hZGVyIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBTY2hlbWFUeXBlTG9hZGVySW1wbDogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBidWlsZEdldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbSIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImdldCIsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW06IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIiksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGJ1aWxkR2V0Tm9UeXBlTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbSIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImdldE5vVHlwZSIsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW06IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIiksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgYnVpbGRUeXBlTG9hZGVyQnVpbGRlck1ldGhvZCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgcmVzb3VyY2VMb2FkZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuUmVzb3VyY2VMb2FkZXIiLCBmYWxzZSwgWG1sQmVhbnMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlTG9hZGVySW1wbCIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImJ1aWxkIiwgbmV3IENsYXNzW10geyBTY2hlbWFUeXBlTG9hZGVyW10uY2xhc3MsIHJlc291cmNlTG9hZGVyQ2xhc3MsIENsYXNzTG9hZGVyLmNsYXNzIH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFNjaGVtYVR5cGVMb2FkZXJJbXBsOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGJ1aWxkQ29tcGlsYXRpb25NZXRob2QoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVTeXN0ZW1JbXBsIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZm9yU2NoZW1hWG1sIiwgbmV3IENsYXNzW10geyBYbWxPYmplY3RbXS5jbGFzcywgU2NoZW1hVHlwZUxvYWRlci5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBTY2hlbWFUeXBlU3lzdGVtSW1wbDogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUGF0aCwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKLSAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlUGF0aCggcGF0aEV4cHIsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGlsZXMgYW4gWFBhdGgsIHJldHVybmluZyBhIFN0cmluZyBlcXVhbCB0byB0aGF0IHdoaWNoIHdhcyBwYXNzZWQsCi0gICAgICogYnV0IHdob3NlIGlkZW50aXR5IGlzIHRoYXQgb2Ygb25lIHdoaWNoIGhhcyBiZWVuIHByZWNvbXBpbGVkIGFuZCBjYWNoZWQ7IAotICAgICAqIHRha2VzIGFuIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB0ZXh0IHRoYXQgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIGNvbnRleHQgbm9kZS4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyAidGhpcyIsIGFzIGluICIkdGhpcyIuCi0gICAgICogCi0gICAgICogQHBhcmFtICBvcHRpb25zICBPcHRpb25zIGZvciB0aGUgcGF0aC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZXh0VHlwZUxvYWRlcigpLmNvbXBpbGVQYXRoKCBwYXRoRXhwciwgb3B0aW9ucyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUXVlcnksIHJldHVybmluZyBhIFN0cmluZyBlcXVhbCB0byB0aGF0IHdoaWNoIHdhcyBwYXNzZWQsCi0gICAgICogYnV0IHdob3NlIGlkZW50aXR5IGlzIHRoYXQgb2Ygb25lIHdoaWNoIGhhcyBiZWVuIHByZWNvbXBpbGVkIGFuZCBjYWNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlUXVlcnkoIHF1ZXJ5RXhwciwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUXVlcnksIHJldHVybmluZyBhIFN0cmluZyBlcXVhbCB0byB0aGF0IHdoaWNoIHdhcyBwYXNzZWQsCi0gICAgICogYnV0IHdob3NlIGlkZW50aXR5IGlzIHRoYXQgb2Ygb25lIHdoaWNoIGhhcyBiZWVuIHByZWNvbXBpbGVkIGFuZCBjYWNoZWQ7Ci0gICAgICogdGFrZXMgYW4gb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHRleHQgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRleHQgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRleHRUeXBlTG9hZGVyKCkuY29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgU2NoZW1hVHlwZUxvYWRlciBiYXNlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQncyBjb250ZXh0Ci0gICAgICogQ2xhc3NMb2FkZXIuIFRoaXMgaXMgdGhlIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBpcyB1c2VkIHRvIGFzc2lnbgotICAgICAqIHNjaGVtYSB0eXBlcyB0byBYTUwgZG9jdW1lbnRzIGJ5IGRlZmF1bHQuIFRoZSBTY2hlbWFUeXBlTG9hZGVyIGlzCi0gICAgICogYWxzbyBjb25zdWx0ZWQgdG8gcmVzb2x2ZSB3aWxkY2FyZHMgYW5kIHhzaTp0eXBlIGF0dHJpYnV0ZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlICJwYXJzZSIgbWV0aG9kcyBvZiBYbWxCZWFucyBhbGwgZGVsZWdhdGUgdG8gdGhlCi0gICAgICogInBhcnNlSW5zdGFuY2UiIG1ldGhvZHMgb2YgdGhlIGNvbnRleHQgdHlwZSBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGdldENvbnRleHRUeXBlTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVMb2FkZXIpX2dldENvbnRleHRUeXBlTG9hZGVyTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIFNjaGVtYVR5cGVMb2FkZXJJbXBsLmdldENvbnRleHRUeXBlTG9hZGVyKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIHN5c3RlbS4gVGhpcyBTY2hlbWFUeXBlU3lzdGVtIGNvbnRhaW5zCi0gICAgICogb25seSB0aGUgNDYgYnVpbHRpbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGdldEJ1aWx0aW5UeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVTeXN0ZW0pX2dldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpOiB2ZXJpZnkgdGhhdCB2ZXJzaW9uIG9mIHhiZWFuLmphciBpcyBjb3JyZWN0IiksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCByZXN1bHRzIGZyb20gY29tcGlsaW5nIHRoZSBYTUwKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgcGFzc2VkLgotICAgICAqIDxwPgotICAgICAqIEp1c3QgbGlrZSBjb21waWxlVHlwZVN5c3RlbSwgYnV0IHVzZXMgdGhlIGNvbnRleHQgdHlwZSBsb2FkZXIgZm9yCi0gICAgICogbGlua2luZywgYW5kIHJldHVybnMgYSB1bmlvbmVkIHR5cGVsb2FkZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IKLSAgICAgKiBjcmVhdGluZyBpbnN0YW5jZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGxvYWRYc2QoWG1sT2JqZWN0W10gc2NoZW1hcykgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvYWRYc2Qoc2NoZW1hcywgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdGhlIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCByZXN1bHRzIGZyb20gY29tcGlsaW5nIHRoZSBYTUwKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgcGFzc2VkIGluIDxlbT5zY2hlbWFzPC9lbT4uPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgaXMganVzdCBsaWtlIGNvbXBpbGVUeXBlU3lzdGVtLCBidXQgdXNlcyB0aGUgY29udGV4dCB0eXBlIGxvYWRlciBmb3IKLSAgICAgKiBsaW5raW5nLCBhbmQgcmV0dXJucyBhIHVuaW9uZWQgdHlwZWxvYWRlciB0aGF0IGlzIHN1aXRhYmxlIGZvcgotICAgICAqIGNyZWF0aW5nIGluc3RhbmNlcy48L3A+Ci0gICAgICogCi0gICAgICogPHA+VXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IG9uZSBvciBib3RoIG9mIHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAqIAotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QSBjb2xsZWN0aW9uIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gZXJyb3IgbGlzdGVuZXIgZHVyaW5nCi0gICAgICogY29tcGlsYXRpb24sIGFzIGRlc2NyaWJlZCBpbiB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfS48L2xpPgotICAgICAqIDxsaT5XaGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBiZSBkb25lIHdoZW4gYnVpbGRpbmcgdGhlIFNjaGVtYVR5cGVTeXN0ZW0sCi0gICAgICogYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldENvbXBpbGVOb1ZhbGlkYXRpb259LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1hcyBUaGUgc2NoZW1hIGRlZmluaXRpb25zIGZyb20gd2hpY2ggdG8gYnVpbGQgdGhlIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgYW4gZXJyb3IgbGlzdGVuZXIgYW5kL29yIHZhbGlkYXRpb24gYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGxvYWRYc2QoWG1sT2JqZWN0W10gc2NoZW1hcywgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzdHMgPQotICAgICAgICAgICAgICAgIChTY2hlbWFUeXBlU3lzdGVtKQotICAgICAgICAgICAgICAgICAgICBfY29tcGlsYXRpb25NZXRob2QuaW52b2tlKAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbmV3IE9iamVjdFtdIHsgc2NoZW1hcywgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKSwgb3B0aW9ucyB9KTsKLQotICAgICAgICAgICAgaWYgKHN0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICB0eXBlTG9hZGVyVW5pb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTY2hlbWFUeXBlTG9hZGVyW10geyBzdHMsIGdldENvbnRleHRUeXBlTG9hZGVyKCkgfSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZm9yU2NoZW1hWG1sKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgd3JhcHBlZEV4Y2VwdGlvbihlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdGhlIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCByZXN1bHRzIGZyb20gY29tcGlsaW5nIHRoZSBYTUwKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgcGFzc2VkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGUgWG1sT2JqZWN0cyBwYXNzZWQgaW4gc2hvdWxkIGJlIHczYyAmbHQ7c2NoZW1hJmd0OyBlbGVtZW50cyB3aG9zZSB0eXBlCi0gICAgICogaXMgb3JnLnczYy54MjAwMS54bWxTY2hlbWEuU2NoZW1hLiAoVGhhdCBpcywgc2NoZW1hIGVsZW1lbnRzIGluCi0gICAgICogdGhlIFhNTCBuYW1lc3BhY2UgaHR0cDovL3d3dy53M2Mub3JnLzIwMDEvWE1MU2NoZW1hLikgIEFsc28KLSAgICAgKiBvcmcudzNjLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudCBpcyBwZXJtaXR0ZWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgYSBTY2hlbWFUeXBlTG9hZGVyIHdoaWNoIHdpbGwgYmUKLSAgICAgKiBjb25zdWx0ZWQgZm9yIGFscmVhZHktY29tcGlsZWQgc2NoZW1hIHR5cGVzIHdoaWNoIG1heSBiZSBsaW5rZWQKLSAgICAgKiB3aGlsZSBwcm9jZXNzaW5nIHRoZSBnaXZlbiBzY2hlbWFzLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IGlzIHJldHVybmVkIHNob3VsZCBiZSBjb21iaW5lZAotICAgICAqICh2aWEge0BsaW5rICN0eXBlTG9hZGVyVW5pb259KSB3aXRoIHRoZSB0eXBlcGF0aCB0eXBlbG9hZGVyIGluIG9yZGVyCi0gICAgICogdG8gY3JlYXRlIGEgdHlwZWxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBjcmVhdGluZyBhbmQgdmFsaWRhdGluZwotICAgICAqIGluc3RhbmNlcy48L3A+Ci0gICAgICogCi0gICAgICogPHA+VXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAqIAotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QSBjb2xsZWN0aW9uIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gZXJyb3IgbGlzdGVuZXIgZHVyaW5nCi0gICAgICogY29tcGlsYXRpb24sIGFzIGRlc2NyaWJlZCBpbiB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfS48L2xpPgotICAgICAqIDxsaT5XaGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBiZSBkb25lIHdoZW4gYnVpbGRpbmcgdGhlIFNjaGVtYVR5cGVTeXN0ZW0sCi0gICAgICogYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldENvbXBpbGVOb1ZhbGlkYXRpb259LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1hcyBUaGUgc2NoZW1hIGRlZmluaXRpb25zIGZyb20gd2hpY2ggdG8gYnVpbGQgdGhlIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKiBAcGFyYW0gdHlwZXBhdGggVGhlIHBhdGggdG8gYWxyZWFkeS1jb21waWxlZCBzY2hlbWEgdHlwZXMgZm9yIGxpbmtpbmcgd2hpbGUgcHJvY2Vzc2luZy4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgYW4gZXJyb3IgbGlzdGVuZXIgYW5kL29yIHZhbGlkYXRpb24gYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGNvbXBpbGVYc2QoWG1sT2JqZWN0W10gc2NoZW1hcywgU2NoZW1hVHlwZUxvYWRlciB0eXBlcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZXBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3VwcGx5IGEgU2NoZW1hVHlwZUxvYWRlciBmb3IgY29tcGlsZXRpbWUgbGlua2luZyIpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVTeXN0ZW0pX2NvbXBpbGF0aW9uTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10geyBzY2hlbWFzLCB0eXBlcGF0aCwgb3B0aW9ucyB9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZm9yU2NoZW1hWG1sKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyB3cmFwcGVkRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5pb24gb2YgYSBsaXN0IG9mIHR5cGVMb2FkZXJzLiBUaGUgcmV0dXJuZWQKLSAgICAgKiBTY2hlbWFUeXBlTG9hZGVyIHNlYXJjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFNjaGVtYVR5cGVMb2FkZXJzCi0gICAgICogaW4gb3JkZXIgZnJvbSBmaXJzdCB0byBsYXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlciB0eXBlTG9hZGVyVW5pb24oU2NoZW1hVHlwZUxvYWRlcltdIHR5cGVMb2FkZXJzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlTG9hZGVycy5sZW5ndGggPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUxvYWRlcnNbMF07Ci0KLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcilfdHlwZUxvYWRlckJ1aWxkZXJNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7dHlwZUxvYWRlcnMsIG51bGwsIG51bGx9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIFNjaGVtYVR5cGVMb2FkZXJJbXBsOiB2ZXJpZnkgdGhhdCB2ZXJzaW9uIG9mIHhiZWFuLmphciBpcyBjb3JyZWN0IiksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTY2hlbWFUeXBlTG9hZGVyIHRoYXQgc2VhcmNoZXMgZm9yIGNvbXBpbGVkIHNjaGVtYSB0eXBlcwotICAgICAqIGluIHRoZSBnaXZlbiBDbGFzc0xvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgdHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVMb2FkZXIpX3R5cGVMb2FkZXJCdWlsZGVyTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge251bGwsIG51bGwsIGxvYWRlcn0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGw6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU2NoZW1hVHlwZSBmcm9tIGEgY29ycmVzcG9uZGluZyBYbWxPYmplY3Qgc3ViY2xhc3MsCi0gICAgICogb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZSB0eXBlRm9yQ2xhc3MoQ2xhc3MgYykKLSAgICB7Ci0gICAgICAgIGlmIChjID09IG51bGwgfHwgIVhtbE9iamVjdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGMpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkIHR5cGVGaWVsZCA9IGMuZ2V0RmllbGQoInR5cGUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHR5cGVGaWVsZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpdHlwZUZpZWxkLmdldChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZSBnZXROb1R5cGUoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfZ2V0Tm9UeXBlTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIFNjaGVtYVR5cGVMb2FkZXJJbXBsLmdldENvbnRleHRUeXBlTG9hZGVyKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIFNjaGVtYVR5cGUgb2JqZWN0IGdpdmVuIHRvIGFuIFhtbE9iamVjdCBpbnN0YW5jZSB3aGVuCi0gICAgICogbm8gdHlwZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgTk9fVFlQRSBpcyB0aGUgdW5pdmVyc2FsIGRlcml2ZWQgdHlwZS4gIFRoYXQgaXMsIGl0IGlzCi0gICAgICogZGVyaXZlZCBmcm9tIGFsbCBvdGhlciBzY2hlbWEgdHlwZXMsIGFuZCBubyBpbnN0YW5jZXMgb2YgdGhlCi0gICAgICogTk9fVFlQRSBhcmUgdmFsaWQuIChJdCBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgYW55VHlwZSwKLSAgICAgKiB3aGljaCBpcyB0aGUgdW5pdmVyc2FsIGJhc2UgdHlwZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0eXBlcwotICAgICAqIGNhbiBiZSBkZXJpdmVkLCBhbmQgb2Ygd2hpY2ggYWxsIGluc3RhbmNlcyBhcmUgdmFsaWQuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZSBOT19UWVBFID0gZ2V0Tm9UeXBlKCk7Ci0KLSAgICBwcml2YXRlIFhtbEJlYW5zICggKSB7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA2M2MxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iPnhzOmJvb2xlYW48L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gSmF2YSBib29sZWFuLiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQm9vbGVhbiBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ib29sZWFuIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0Qm9vbGVhblZhbHVlfQotICAgICAqKi8KLSAgICBib29sZWFuIGJvb2xlYW5WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJvb2xlYW4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI3NldEJvb2xlYW5WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYm9vbGVhbiB2KTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBib29sZWFuICovCi0gICAgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbiAqLwotICAgIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJvb2xlYW59LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJvb2xlYW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJvb2xlYW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEJvb2xlYW59IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7dHJ1ZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDt0cnVlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFhNGRiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2J5dGUiPnhzOmJ5dGU8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gSmF2YSBieXRlLiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQnl0ZSBleHRlbmRzIFhtbFNob3J0Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYnl0ZSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVWYWx1ZX0KLSAgICAgKiovCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZVZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoYnl0ZSBzKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlICovCi0gICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSBzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJ5dGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEJ5dGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDYWxlbmRhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGIwYzllLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDYWxlbmRhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIEFuIFhNTCBTY2hlbWEgY29tcGF0aWJsZSBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIEdyZWdvcmlhbkNhbGVuZGFyfS4KLSAqIFhtbENhbGVuZGFyIG1vZGlmaWVzIHNldmVyYWwga2V5IGRldGFpbHMgaW4gdGhlIGJlaGF2aW9yIG9mCi0gKiBHcmVnb3JpYW5DYWxlbmRhciB0byBtYWtlIGl0IG1vcmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIFhNTCBkYXRlcy4KLSAqIDxwPgotICogSXQgaXMgZWFzeSB0byBjb252ZXJ0IGJldHdlZW4gWG1sQ2FsZW5kYXIgYW5kIHtAbGluayBHRGF0ZX0sIG9yIHRvCi0gKiBwYXJzZSBvciBlbWl0IGFuIFhtbENhbGVuZGFyIHVzaW5nIGEgc3RhbmRhcmQgWE1MIFNjaGVtYQotICogbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAqIDxvbD4KLSAqIDxsaT4KLSAqIFRvIG1hdGNoIFhNTCBTY2hlbWEgZGF0ZXMsIHRoaXMgWG1sQ2FsZW5kYXIgaXMgYSBmdWxseSBwcm9sZXB0aWMKLSAqIEdyZWdvcmlhbiBjYWxlbmRhciBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGF0IEdyZWdvcmlhbiBjYWxlbmRhcgotICogcnVsZXMgYXJlIGFwcGxpZWQgYmFja3dhcmRzIGluIHRpbWUgYXMgaWYgdGhleSBoYWQgYWx3YXlzIGJlZW4gaW4KLSAqIGVmZmVjdCwgYWN0dWFsIGhpc3RvcmljYWwgY2lyY3Vtc3RhbmNlcyBjb25jZXJuaW5nIHRoZSBvYnNlcnZhbmNlCi0gKiBvZiB0aGUgMTU4MiBkZWNyZWUgb2YgUG9wZSBHcmVnb3J5IFhJSUkgbm90d2l0aHN0YW5kaW5nLgotICogPC9saT4KLSAqIDxsaT4KLSAqIEluIG9yZGVyIHRvIGJldHRlciBzdXBwb3J0IHBhcnRpYWxseS1zcGVjaWZpZWQgZGF0ZXMgZm9yIFhNTCBTY2hlbWEsCi0gKiB0aGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgc3RhYmxlIGdldChmaWVsZCkgbWV0aG9kCi0gKiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgaW5zdGFuY2UgaWYgeW91IGFyZSBhY2Vzc2luZyBhIGZpZWxkIHJpZ2h0Ci0gKiBhZnRlciBpdCB3YXMgZXhwbGljaXRseSBzZXQ6IGEgc2V0IGZvbGxvd2VkIGJ5IGEgZ2V0IHdpbGwgYWx3YXlzCi0gKiByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYW5kIHdpbGwgbm90IGZpbGwgaW4gYW55IG90aGVyIGZpZWxkcy4gSG93ZXZlciwKLSAqIGlmIHlvdSBnZXQgYSBmaWVsZCB0aGF0IHdhcyBub3QgZXhwbGljaXRseSBzZXQsIHRoZW4gYWxsIHRoZSBmaWVsZHMKLSAqIGFyZSBzdGlsbCBhdXRvbWF0aWNhbGx5IGZpbGxlZCBhbmQgbm9ybWFsaXplZCBmb3IgeW91LCBqdXN0IGxpa2UgYQotICogcmVndWxhciBHcmVnb3JpYW5DYWxlbmRhci4gSWYgeW91IHdpc2ggdG8gZm9yY2UgdGhlIGNvbXBsZXRpb24gYW5kCi0gKiBkZWZhdWx0aW5nIG9mIGFsbCB0aGUgZmllbGRzICh3aXRob3V0IGh1bnRpbmcgdG8gZ2V0IG9uZSB0aGF0IGhhcHBlbnMKLSAqIHRvIGJlIHVuc2V0KSwgeW91IGNhbiBhbHdheXMgZG8gc28gYnkgY2FsbGluZyBnZXRUaW1lKCkuCi0gKiA8L2xpPgotICogPGxpPgotICogV2hlbiBhIHllYXIgaXMgdW5zcGVjaWZpZWQgYW5kIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5Ci0gKiAoZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBhIC5nZXQgb3IgLmdldFRpbWUgbWV0aG9kIGFzIGRpc2N1c3NlZCBhYm92ZSksCi0gKiB0aGUgeWVhciBpcyBkZWZhdWx0ZWQgdG8geWVhciAwIChhbHNvIGtub3duIGFzIDEgQkMpLiAgVGhpcyBpcyBkaWZmZXJlbnQKLSAqIGZyb20ge0BsaW5rIEdyZWdvcmlhbkNhbGVuZGFyfSwgd2hpY2ggY2hvb3NlcyAxOTcwLiBUaGUgcmVhc29uIDAgaXMgcHJlZmVyYWJsZQotICogaXMgdGhhdCBpdCBpcyBhIGxlYXAgeWVhciBhbmQgc28gaXQgcGVybWl0cyB0aGUgZGF0ZSAtLTItMjkgdG8gYmUgc3BlY2lmaWVkCi0gKiBzdGFibHkuIEEgZGlmZmVyZW50IGRlZmF1bHQgeWVhciBjYW4gYmUgY2hvc2VuIHZpYSB0aGUgc3RhdGljIG1ldGhvZAotICoge0BsaW5rICNzZXREZWZhdWx0WWVhcihpbnQpIFhtbENhbGVuZGFyLnNldERlZmF1bHRZZWFyKCl9LCBvciBieSBzZXR0aW5nIHRoZSAKLSAqIHN5c3RlbSBwcm9wZXJ0eSAidXNlci5kZWZhdWx0eWVhciIuIElmIHlvdSBkbyBjaGFuZ2UgdGhpcyB2YWx1ZSwgeW91IHNob3VsZCAKLSAqIHBpY2sgYW5vdGhlciBsZWFwIHllYXIgc3VjaCBhcyAyMDAwIGFuZCBhdm9pZCBub24tbGVhcCB5ZWFycyBzdWNoIGFzIDE5MDAuCi0gKiA8L2xpPgotICogPGxpPgotICogV2hlbiBjb25zdHJ1Y3RpbmcgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhbiBYTUwgU2NoZW1hCi0gKiBmb3JtYXR0ZWQgZGF0ZSBvciB0aW1lIHN0cmluZyBvciBHRGF0ZSBvYmplY3QsIHRoZSB0aW1lem9uZQotICogZm9yIHRoZSBjYWxlbmRhciBpcyB0YWtlbiBmcm9tIHRoZSBzdHJpbmcgaWYgaXQgaXMgcHJlc2VudCwgb3IKLSAqIHRha2VuIHRvIGJlIHtAbGluayBqYXZhLnV0aWwuVGltZVpvbmUjZ2V0RGVmYXVsdCgpIFRpbWVab25lLmdldERlZmF1bHQoKX0gaWYgbm90LgotICogPHA+Ci0gKiAgICAgRm9yIGV4YW1wbGUsIHRoZSBYTUwgdGltZXpvbmUgIloiIGlzIHRyYW5zbGF0ZWQgdG8gIkdNVCI7Ci0gKiAgICAgdGhlIFhNTCB0aW1lem9uZSAiKzA1OjAwIiBpcyB0cmFuc2xhdGVkIHRvICJHTVQrMDU6MDAiLgotICogPC9wPgotICogPC9saT4KLSAqIDxsaT4KLSAqIEZpbmFsbHksIHRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBTdHJpbmcgY29uc3RydWN0b3IgYW5kIGEKLSAqIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgY29tcGx5IHdpdGggdGhlIFhNTCBTY2hlbWEgY29udmVudGlvbnMKLSAqIGZvciBmb3JtYXR0aW5nIGEgZGF0ZS4gSWYgb25seSBhIHN1YnNldCBvZiBmaWVsZHMgaGF2ZSBiZWVuCi0gKiBleHBsaWNpdGx5IHNldCwgdG9TdHJpbmcoKSBwcm9kdWNlcyBhIHN0cmluZyB3aXRoIHRoZSBwcm9wZXIgc3Vic2V0Ci0gKiBvZiBpbmZvcm1hdGlvbi4KLSAqIDwvbGk+Ci0gKiA8L29sPgotICovIAotcHVibGljIGNsYXNzIFhtbENhbGVuZGFyIGV4dGVuZHMgR3JlZ29yaWFuQ2FsZW5kYXIKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZvciBhIHN0YW5kYXJkIFhNTAotICAgICAqIHNjaGVtYSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCi0gICAgICogCi0gICAgICogVGhlIHBhcnNlciBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0gICAgICogCi0gICAgICogWVlZWS1NTS1ERFRoaDptbTpzcyAgICAgICAgICAtIGRhdGVUaW1lCi0gICAgICogWVlZWS1NTS1ERCAgICAgICAgICAgICAgICAgICAtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIGhoOm1tOnNzICAgICAgICAgIC0gdGltZQotICAgICAqIFlZWVkgICAgICAgICAgICAgICAgICAgICAgICAgLSBnWWVhcgotICAgICAqICAgIC0tTU0gICAgICAgICAgICAgICAgICAgICAgLSBnTW9udGgKLSAgICAgKiAgICAgIC0tLUREICAgICAgICAgICAgICAgICAgIC0gZ0RheQotICAgICAqIAotICAgICAqIFRoZSBwYXJzZXIgYWN0dWFsbHkgYWNjZXB0cyBhbGwgMTYgY29tYmluYXRpb25zIG9mIHN1YnNldHMgb2YKLSAgICAgKiBmaWVsZHMgKFksIE0sIEQsIFQpIHVzaW5nIHRoZSBzYW1lIHNjaGVtZSwgZXZlbiBmb3IgY29tYmluYXRpb25zCi0gICAgICogdGhhdCBhcmUgbm90IGRlZmluZWQgYXMgdHlwZXMgaW4gdGhlIHNjaGVtYSBzcGVjLCBzdWNoIGFzCi0gICAgICogeWVhciwgZGF5LCBhbmQgdGltZToKLSAgICAgKiAKLSAgICAgKiBZWVlZLS1ERFRoaDptbTpzcyAgICAgICAgICAgIC0gW2V2ZXJ5dGhpbmcgYnV0IG1vbnRoIHNwZWNpZmllZF0KLSAgICAgKiAKLSAgICAgKiBJbiB0aGUgc3RyaW5nLCBlYWNoIGZpZWxkIG11c3QgYmUgcGFkZGVkIHRvIGl0cyBmdWxsIHdpZHRoLCBmb3IKLSAgICAgKiBleGFtcGxlLCBKYW51YXJ5IG11c3QgYmUgLS0wMSwgbm90IGp1c3QgLS0xLgotICAgICAqIAotICAgICAqIEluIHBhcnRpY3VsYXIsIGEgeWVhciBtdXN0IGJlIHBhZGRlZCB0byBhdCBsZWFzdCBmb3VyIGRpZ2l0cywgc28KLSAgICAgKiAiOTgiIGlzIG5vdCBhIHZhbGlkIHllYXIsIGFsdGhvdWdoICIxOTk4IiBhbmQgIjAwOTgiIGFyZSBib3RoIHZhbGlkCi0gICAgICogeWVhcnMsIHVuYW1iaWd1b3VzbHkgMTkgY2VudHVyaWVzIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuICBBIHllYXIKLSAgICAgKiBtYXkgYWxzbyBiZSBwcmVjZWRlZCBieSBhIG1pbnVzIHN5bWJvbDogMDAwMCBpcyAxIEJDIGFuZCAtMDAwMSBpcwotICAgICAqIDIgQkMuCi0gICAgICoKLSAgICAgKiBGaW5hbGx5IGEgdGltZXpvbmUgaXMgYWx3YXlzIGFsbG93ZWQgKHlldCBvcHRpb25hbCkgYXQgdGhlIGVuZC4KLSAgICAgKiBUaW1lem9uZXMgbXVzdCBiZSBlaXRoZXIgIloiIChVVEMsIHdoaWNoIHdlIHRyYW5zbGF0ZSB0byBHTVQpLAotICAgICAqIG9yIHNpbXBsZSBvZmZzZXRzIGZyb20gVVRDIGluIHRoZSByYW5nZSAiLTE0OjAwIiB0byAiKzE0OjAwIiwKLSAgICAgKiBmb3IgZXhhbXBsZTogIjE0OjMwOjAwLTA1OjAwIiBzcGVjaWZpZXMgMjozMCBQTSBpbiB0aGUKLSAgICAgKiBhZnRlcm5vb24gYXQgVVRDLTA1OjAwLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBFU1QuCi0gICAgICogCi0gICAgICogSWYgYSB0aW1lem9uZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBUaW1lWm9uZSBpcyB1c2VkLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoU3RyaW5nIHhtbFNjaGVtYURhdGVTdHJpbmcpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZSh4bWxTY2hlbWFEYXRlU3RyaW5nKSk7IC8vIHVzZSBHRGF0ZSB0byBwYXJzZQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZyb20gYSBHRGF0ZS4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgbm90IGNvbXBsZXRlZCwgeW91IGNhbiByb3VuZC10cmlwIHRvIGFuCi0gICAgICogZXF1aXZhbGVudCBHRGF0ZSBieSB3cml0aW5nICJuZXcgR0RhdGUobmV3IFhtbENhbGVuZGFyKGdkYXRlKSkiLgotICAgICAqIEhvd2V2ZXIsIGlmIHlvdSBhY2Nlc3MgYW55IG9mIHRoZSB1bnNldCBmaWVsZHMgb2YgdGhlIGNhbGVuZGFyLCBhbGwKLSAgICAgKiB0aGUgZmllbGRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4sIHNvIHBhcnRpYWwgZGF0ZXMKLSAgICAgKiB3aXRob3V0IHRpbWV6b25lcyBvciBvdGhlciBmaWVsZHMgd2lsbCBub3Qgcm91bmQtdHJpcCBhZnRlciBhY2Nlc3MuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxDYWxlbmRhcihHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoR0RhdGUudGltZVpvbmVGb3JHRGF0ZShkYXRlKSwgZGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgWG1sQ2FsZW5kYXIoVGltZVpvbmUgdHosIEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgc3VwZXIodHopOwotICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYwotICAgICAgICBjbGVhcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgeSA9IGRhdGUuZ2V0WWVhcigpOwotICAgICAgICAgICAgaWYgKHkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkFEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRVJBLCBHcmVnb3JpYW5DYWxlbmRhci5CQyk7Ci0gICAgICAgICAgICAgICAgeSA9IDEgLSB5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0KENhbGVuZGFyLllFQVIsIHkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkYXRlLmhhc01vbnRoKCkpCi0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuTU9OVEgsIGRhdGUuZ2V0TW9udGgoKSAtIDEpOyAvLyBub3RlISEKLSAgICAgICAgaWYgKGRhdGUuaGFzRGF5KCkpCi0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXRlLmdldERheSgpKTsKLSAgICAgICAgaWYgKGRhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGRhdGUuZ2V0SG91cigpKTsKLSAgICAgICAgICAgIHNldChDYWxlbmRhci5NSU5VVEUsIGRhdGUuZ2V0TWludXRlKCkpOwotICAgICAgICAgICAgc2V0KENhbGVuZGFyLlNFQ09ORCwgZGF0ZS5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBpZiAoZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgZGF0ZS5nZXRNaWxsaXNlY29uZCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lWm9uZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQsIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgKiAxMDAwICogNjAgKiAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSAqIDYwICsgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKSk7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCwgMCk7IC8vIG5vdGUhISAgaWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiBHcmVnb3JpYW5DYWxlbmRhciB3aWxsIHBpY2sgdXAgRFNUIGZyb20gdGhlIHRpbWUgem9uZQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhIERhdGUuCi0gICAgICogCi0gICAgICogVGhlIGRlZmF1bHQgVGltZVpvbmUgaXMgdXNlZCBmb3IgY29tcHV0aW5nIHRoZSB2YXJpb3VzIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgdGhpcyhUaW1lWm9uZS5nZXREZWZhdWx0KCksIG5ldyBHRGF0ZShkYXRlKSk7Ci0gICAgICAgIGNvbXBsZXRlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCi0gICAgICogdGhlIGRlZmF1bHQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICB0aGlzKFRpbWVab25lLmdldERlZmF1bHQoKSwgbmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCwgZGF5LAotICAgICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmRzLCBpbgotICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24sCi0gICAgICAgICAgICBpbnQgdHpTaWduLAotICAgICAgICAgICAgaW50IHR6SG91ciwKLSAgICAgICAgICAgIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiwgdHpTaWduLCB0ekhvdXIsIHR6TWludXRlKSk7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gdGltZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBVbmxpa2UgdGhlIEdyZWdvcmlhbkNhbGVuZGFyIGltcGxlbWVudGF0aW9uLCB0aGUgZ2V0KCkgZG9lcyBub3QKLSAgICAgKiBmb3JjZSBhIGNvbXBsZXRlIG9mIGFsbCBmaWVsZHMuICBJZiB5b3Ugd2lzaCB0byBmb3JjZSBhIGNvbXBsZXRpb24KLSAgICAgKiBvZiBhbGwgdGhlIGZpZWxkcywgY2FsbCBnZXRUaW1lKCkgZmlyc3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXQoaW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgaWYgKCFpc1NldChmaWVsZCkgfHwgaXNUaW1lU2V0KQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldChmaWVsZCk7IC8vIGZvcmNlcyBhIGNvbXBsZXRlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbEdldChmaWVsZCk7IC8vIGRvZXMgbm90IGZvcmNlIGEgY29tcGxldGUuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBpbnN0YW5jZSB3aXRoIG5vIGZpZWxkcyBzZXQuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxDYWxlbmRhcigpCi0gICAgewotICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYwotICAgICAgICBjbGVhcigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVmYXVsdFllYXIgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERUZBVUxUX1lFQVIgPSAwOyAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHllYXIgdGhhdCBpcyB1c2VkIHdoZW4gbm8geWVhciBpcyBzcGVjaWZpZWQuCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRZZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChkZWZhdWx0WWVhciA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHllYXJzdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGVmYXVsdHllYXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoeWVhcnN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IEludGVnZXIucGFyc2VJbnQoeWVhcnN0cmluZyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IERFRkFVTFRfREVGQVVMVF9ZRUFSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHRZZWFyID0gREVGQVVMVF9ERUZBVUxUX1lFQVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRZZWFyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHllYXIgdG8gYmUgdXNlZCB3aGVuIG5vIHllYXIgaXMgc3BlY2lmaWVkLgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICBkZWZhdWx0WWVhciA9IHllYXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyBHcmVnb3JpYW5DYWxlbmRhci5jb21wdXRlVGltZSB0byBhcHBseSBhIGRpZmZlcmVudAotICAgICAqIGRlZmF1bHQgeWVhci4gIChJdCBtdXN0IGJlIGEgbGVhcCB5ZWFyLikKLSAgICAgKi8gCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRpbWUoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB1bnNldFllYXIgPSAhaXNTZXQoWUVBUik7Ci0gICAgICAgIGlmICh1bnNldFllYXIpCi0gICAgICAgICAgICBzZXQoWUVBUiwgZ2V0RGVmYXVsdFllYXIoKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jb21wdXRlVGltZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVuc2V0WWVhcikKLSAgICAgICAgICAgICAgICBjbGVhcihZRUFSKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZSBfYmVnaW5uaW5nT2ZUaW1lID0gbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpOwotICAgIAotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgWG1sQ2FsZW5kYXIgdXNpbmcgYSBzdGFuZGFyZCBYTUwgU2NoZW1hCi0gICAgICogZm9ybWF0LCBhcyBkZXNjcmliZWQgaW4gWG1sQ2FsZW5kYXIoU3RyaW5nIHMpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuZXcgR0RhdGUodGhpcykpLnRvU3RyaW5nKCk7IC8vIHVzZSBHRGF0ZSB0byBwcmludAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjliMTBlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcG9zaXRpb24gYmV0d2VlbiB0d28gbG9naWNhbCB0b2tlbnMgaW4gYW4gWE1MIGRvY3VtZW50LiAKLSAqIAotICogVGhlIHRva2VucyB0aGVtc2VsdmVzIGFyZSBub3QgZXhwb3NlZCBhcyBvYmplY3RzLCBidXQgdGhlaXIgdHlwZSBhbmQgcHJvcGVydGllcwotICogYXJlIGRpc2NvdmVyYWJsZSB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIGN1cnNvci4gIEluIHBhcnRpY3VsYXIsIHRoZSBnZW5lcmFsCi0gKiBjYXRlZ29yeSBvZiB0b2tlbiBpcyByZXByZXNlbnRlZCBieSBhIHtAbGluayBYbWxDdXJzb3IuVG9rZW5UeXBlIFRva2VuVHlwZX0uPGJyLz48YnIvPgotICogCi0gKiBZb3UgdXNlIGFuIFhtbEN1cnNvciBpbnN0YW5jZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGFuZCBtYW5pcHVsYXRlIGFuIFhNTCAKLSAqIGluc3RhbmNlIGRvY3VtZW50LiAKLSAqIE9uY2UgeW91IG9idGFpbiBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gY3JlYXRlIGEgY3Vyc29yIHRvIHJlcHJlc2VudCAKLSAqIGEgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIFhNTC4gQmVjYXVzZSB5b3UgY2FuIHVzZSBhIGN1cnNvciB3aXRoIG9yIAotICogd2l0aG91dCBhIHNjaGVtYSBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIAotICogd2F5IHRvIGhhbmRsZSBYTUwgd2l0aG91dCBhIHNjaGVtYS4gWW91IGNhbiBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5Ci0gKiBjYWxsaW5nIHRoZSB7QGxpbmsgWG1sVG9rZW5Tb3VyY2UjbmV3Q3Vyc29yKCkgbmV3Q3Vyc29yfSBtZXRob2QgCi0gKiBleHBvc2VkIGJ5IGFuIG9iamVjdCByZXByZXNlbnRpbmcKLSAqIHRoZSBYTUwsIHdoZXRoZXIgaXQgd2FzIHBhcnNlZCBpbnRvIGEgc3Ryb25nIHR5cGUgY29tcGlsZWQgZnJvbSAKLSAqIHNjaGVtYSBvciBhbiB7QGxpbmsgWG1sT2JqZWN0IFhtbE9iamVjdH0gKGFzIGluIHRoZSBuby1zY2hlbWEgY2FzZSkuPGJyLz48YnIvPgotICogCi0gKiBXaXRoIGFuIFhtbEN1cnNvciwgeW91IGNhbiBhbHNvOiA8YnIvPjxici8+Ci0gKiAKLSAqIDx1bD4KLSAqIDxsaT5FeGVjdXRlIFhRdWVyeSBhbmQgWFBhdGggZXhwcmVzc2lvbnMgYWdhaW5zdCB0aGUgWE1MIHdpdGggdGhlCi0gKiBleGVjUXVlcnkgYW5kIHNlbGVjdFBhdGggbWV0aG9kcy48L2xpPgotICogCi0gKiA8bGk+RWRpdCBhbmQgcmVzaGFwZSB0aGUgZG9jdW1lbnQgYnkgaW5zZXJ0aW5nLCBtb3ZpbmcsIGNvcHlpbmcsIGFuZCByZW1vdmluZwotICogWE1MLjwvbGk+Ci0gKiAKLSAqIDxsaT5JbnNlcnQgYm9va21hcmtzIHRoYXQgInN0aWNrIiB0byB0aGUgWE1MIGF0IHRoZSBjdXJzb3IncwotICogcG9zaXRpb24gZXZlbiBpZiB0aGUgY3Vyc29yIG9yIFhNTCBtb3Zlcy48L2xpPgotCi0gKiA8bGk+R2V0IGFuZCBzZXQgdmFsdWVzIGZvciBjb250YWluZXJzIChlbGVtZW50cyBhbmQgd2hvbGUgZG9jdW1lbnRzKSwKLSAqIGF0dHJpYnV0ZXMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBhbmQgY29tbWVudHMuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEEgY3Vyc29yIG1vdmVzIHRocm91Z2ggWE1MIGJ5IG1vdmluZyBwYXN0IHRva2Vucy4gQQotICogdG9rZW4gcmVwcmVzZW50cyBhIGNhdGVnb3J5IG9mIFhNTCBtYXJrdXAsIHN1Y2ggYXMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQsIAotICogaXRzIGVuZCwgYW4gYXR0cmlidXRlLCBjb21tZW50LCBhbmQgc28gb24uIFhtbEN1cnNvciBtZXRob2RzIHN1Y2ggYXMKLSAqIHRvTmV4dFRva2VuLCB0b05leHRTaWJsaW5nLCB0b1BhcmVudCwgYW5kIHNvIG9uIG1vdmUgdGhlIGN1cnNvciAKLSAqIGFtb25nIHRva2Vucy4gRWFjaCB0b2tlbidzIGNhdGVnb3J5IGlzIG9mIGEgcGFydGljdWxhciA8ZW0+dHlwZTwvZW0+LCByZXByZXNlbnRlZCAKLSAqIGJ5IG9uZSBvZiB0aGUgbmluZSB0eXBlcyBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgWG1sQ3Vyc29yLlRva2VuVHlwZSBUb2tlblR5cGV9IGNsYXNzLiA8YnIvPjxici8+Ci0gKiAKLSAqIFdoZW4geW91IGdldCBhIG5ldyBjdXJzb3IgZm9yIGEgd2hvbGUgaW5zdGFuY2UgZG9jdW1lbnQsIHRoZSBjdXJzb3IgaXMKLSAqIGludGlhbGx5IGxvY2F0ZWQgYmVmb3JlIHRoZSBTVEFSVERPQyB0b2tlbi4gVGhpcyB0b2tlbiwgd2hpY2ggaGFzIG5vIGFuYWxvZ3kKLSAqIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbiwgaXMgcHJlc2VudCBpbiB0aGlzIGxvZ2ljYWwgbW9kZWwgb2YgWE1MCi0gKiBzbyB0aGF0IHlvdSBtYXkgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZG9jdW1lbnQgYXMgYSB3aG9sZQotICogYW5kIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudC4gVGVybWluYXRpbmcgdGhlIGRvY3VtZW50IGlzIGFuIEVORERPQwotICogdG9rZW4uIFRoaXMgdG9rZW4gaXMgYWxzbyBub3QgcGFydCBvZiB0aGUgWE1MIHNwZWNpZmljYXRpb24uIEEgY3Vyc29yIAotICogbG9jYXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyB0b2tlbiBpcyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LiAKLSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBwb3NpdGlvbiB0aGUgY3Vyc29yIGFmdGVyIHRoZSBFTkRET0MgdG9rZW4uIAotICogVGh1cywgdGhlIFNUQVJURE9DIGFuZCBFTkRET0MgdG9rZW5zIGFyZSBlZmZlY3RpdmVseSAiYm9va2VuZHMiIGZvciB0aGUgY29udGVudCBvZiAKLSAqIHRoZSBkb2N1bWVudC48YnIvPjxici8+Ci0gKiAKLSAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBYTUwsIGlmIHlvdSB3ZXJlIHRoZSBuYXZpZ2F0ZSBhIGN1cnNvcgotICogdGhyb3VnaCB0aGUgWE1MIGRvY3VtZW50IHVzaW5nIHRvTmV4dFRva2VuKCksIHRoZSBsaXN0IG9mIHRva2VuIHR5cGVzIHRoYXQgCi0gKiBmb2xsb3dzIHJlcHJlc2VudHMgdGhlIHRva2VuIHNlcXVlbmNlIHlvdSB3b3VsZCBlbmNvdW50ZXIuIDxici8+PGJyLz4KLSAqIAotICogPHByZT4KLSAqICZsdDtzYW1wbGUgeD0neScmZ3Q7Ci0gKiAgICAgJmx0O3ZhbHVlJmd0O2ZvbyZsdDsvdmFsdWUmZ3Q7Ci0gKiAmbHQ7L3NhbXBsZSZndDsKLSAqIDwvcHJlPgotICogCi0gKiBTVEFSVERPQyA8YnIvPgotICogU1RBUlQgKHNhbXBsZSkgPGJyLz4KLSAqIEFUVFIgKHg9J3knKSA8YnIvPgotICogVEVYVCAoIlxuICAgICIpIDxici8+Ci0gKiBTVEFSVCAodmFsdWUpIDxici8+Ci0gKiBURVhUICgiZm9vIikgPGJyLz4KLSAqIEVORCAodmFsdWUpIDxici8+Ci0gKiBURVhUICgiXG4iKSA8YnIvPgotICogRU5EIChzYW1wbGUpPGJyLz4KLSAqIEVORERPQyA8YnIvPjxici8+Ci0gKgotICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0b2tlbnMgYXZhaWxhYmxlLCBoYXNOZXh0VG9rZW4oKSByZXR1cm5zCi0gKiBmYWxzZSBhbmQgdG9OZXh0VG9rZW4oKSByZXR1cm5zIHRoZSBzcGVjaWFsIHRva2VuIHR5cGUgTk9ORSBhbmQgZG9lcyBub3QgbW92ZQotICogdGhlIGN1cnNvci4KLSAqIDxici8+PGJyLz4KLSAqIAotICogVGhlIHtAbGluayAjY3VycmVudFRva2VuVHlwZSgpIGN1cnJlbnRUb2tlblR5cGUoKX0gbWV0aG9kIAotICogd2lsbCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHRva2VuIHRoYXQgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnNvci4gCi0gKiBZb3UgY2FuIGFsc28gdXNlIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgdGhhdCB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgCi0gKiB0b2tlbiB0eXBlLiBUaGVzZSBpbmNsdWRlIHRoZSBtZXRob2RzIGlzU3RhcnQoKSwgCi0gKiBpc1N0YXJ0ZG9jKCksIGlzVGV4dCgpLCBpc0F0dHIoKSwgYW5kIHNvIG9uLiBFYWNoIHJldHVybnMgYSBib29sZWFuIAotICogdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0b2tlbiB0aGF0IGZvbGxvd3MgdGhlIGN1cnNvciBpcyB0aGUgdHlwZSAKLSAqIGluIHF1ZXN0aW9uLiAKLSAqIDxici8+PGJyLz4KLSAqIAotICogQSBmZXcgb3RoZXIgbWV0aG9kcyBkZXRlcm1pbmUgd2hldGhlciB0aGUgdG9rZW4gaXMgb2YgYSBraW5kIHRoYXQgbWF5IGluY2x1ZGUgCi0gKiBtdWx0aXBsZSB0b2tlbiB0eXBlcy4gVGhlIGlzQW55QXR0cigpIG1ldGhvZCwgZm9yIGV4YW1wbGUsIHJldHVybnMgdHJ1ZSBpZgotICogdGhlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3Vyc29yIGlzIGFueSBraW5kIG9mIGF0dHJpYnV0ZSwgCi0gKiBpbmNsdWRpbmcgdGhvc2Ugb2YgdGhlIEFUVFIgdG9rZW4gdHlwZSBhbmQgeG1sbnMgYXR0cmlidXRlcy4KLSAqIDxici8+PGJyLz4KLSAqIAotICogTGVnaXRpbWF0ZSBzZXF1ZW5jZXMgb2YgdG9rZW5zIGZvciBhbiBYTUwgZG9jdW1lbnQgYXJlIGRlc2NyaWJlZAotICogYnkgdGhlIGZvbGxvd2luZyBCYWNrdXMtTmF1ciBGb3JtIChCTkYpOiA8YnIvPgotICogCi0gKiA8cHJlPgotICogJmx0O2RvYyZndDsgOjo9IFNUQVJURE9DICZsdDthdHRyaWJ1dGVzJmd0OyAmbHQ7Y29udGVudCZndDsgRU5ERE9DCi0gKiAmbHQ7ZWxlbWVudCZndDsgOjo9IFNUQVJUICZsdDthdHRyaWJ1dGVzJmd0OyAmbHQ7Y29udGVudCZndDsgRU5ECi0gKiAmbHQ7YXR0cmlidXRlcyZndDsgOjo9ICggQVRUUiB8IE5BTUVTUEFDRSApICoKLSAqICZsdDtjb250ZW50Jmd0OyA6Oj0gKCBDT01NRU5UIHwgUFJPQ0lOU1QgfCBURVhUIHwgJmx0O2VsZW1lbnQmZ3Q7ICkgKgotICogPC9wcmU+Ci0gKiAKLSAqIE5vdGUgdGhhdCBhIGxlZ2l0aW1hdGUgc2VxdWVuY2UgaXMgU1RBUlRET0MgRU5ERE9DLCB0aGUgcmVzdWx0IG9mIAotICogY3JlYXRpbmcgYSBicmFuZCBuZXcgaW5zdGFuY2Ugb2YgYW4gZW1wdHkgZG9jdW1lbnQuIEFsc28gbm90ZSB0aGF0IAotICogYXR0cmlidXRlcyBtYXkgb25seSBmb2xsb3cgY29udGFpbmVyIHRva2VucyAoU1RBUlRET0Mgb3IgU1RBUlQpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ3Vyc29yIGV4dGVuZHMgWG1sVG9rZW5Tb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiBBbiBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgYW4gWE1MIHRva2VuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVG9rZW5UeXBlCi0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKSB7IHJldHVybiBfbmFtZTsgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIElOVF8gdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUgKCApIHsgcmV0dXJuIF92YWx1ZTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIE5vIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX05PTkUgICAgICA9IDA7Ci0gICAgICAgIC8qKiBUaGUgc3RhcnQtZG9jdW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfU1RBUlRET0MgID0gMTsKLSAgICAgICAgLyoqIFRoZSBlbmQtZG9jdW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfRU5ERE9DICAgID0gMjsKLSAgICAgICAgLyoqIFRoZSBzdGFydC1lbGVtZW50IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1NUQVJUICAgICA9IDM7Ci0gICAgICAgIC8qKiBUaGUgZW5kLWVsZW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfRU5EICAgICAgID0gNDsKLSAgICAgICAgLyoqIFRoZSB0ZXh0IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RFWFQgICAgICA9IDU7Ci0gICAgICAgIC8qKiBUaGUgYXR0cmlidXRlIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0FUVFIgICAgICA9IDY7Ci0gICAgICAgIC8qKiBUaGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX05BTUVTUEFDRSA9IDc7Ci0gICAgICAgIC8qKiBUaGUgY29tbWVudCB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9DT01NRU5UICAgPSA4OwotICAgICAgICAvKiogVGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfUFJPQ0lOU1QgID0gOTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUcnVlIGlmIG5vIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vbmUgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBOT05FOyAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgc3RhcnQtZG9jdW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRkb2MgICggKSB7IHJldHVybiB0aGlzID09IFNUQVJURE9DOyAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBlbmQtZG9jdW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5kZG9jICAgICggKSB7IHJldHVybiB0aGlzID09IEVORERPQzsgICAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBzdGFydC1lbGVtZW50IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBTVEFSVDsgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWVsZW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiB0aGlzID09IEVORDsgICAgICAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyB0ZXh0IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RleHQgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBURVhUOyAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgYXR0cmlidXRlIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHIgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBBVFRSOyAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZSAoICkgeyByZXR1cm4gdGhpcyA9PSBOQU1FU1BBQ0U7IH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgY29tbWVudCB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50ICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gQ09NTUVOVDsgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiB0aGlzID09IFBST0NJTlNUOyAgfQotCi0gICAgICAgIC8qKiBUcnVlIGlmIGlzIHN0YXJ0LWRvY3VtZW50IG9yIHN0YXJ0LWVsZW1lbnQgdG9rZW4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIgKCApIHsgcmV0dXJuIHRoaXMgPT0gU1RBUlRET0MgIHx8IHRoaXMgPT0gU1RBUlQ7IH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWRvY3VtZW50IG9yIGVuZC1lbGVtZW50IHRva2VuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoICAgICggKSB7IHJldHVybiB0aGlzID09IEVORERPQyAgICB8fCB0aGlzID09IEVORDsgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIGF0dHJpYnV0ZSBvciBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG9rZW4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gTkFNRVNQQUNFIHx8IHRoaXMgPT0gQVRUUjsgIH0KLQotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBuby10b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIE5PTkUgICAgICA9IG5ldyBUb2tlblR5cGUoICJOT05FIiwgICAgICBJTlRfTk9ORSAgICAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHN0YXJ0LWRvY3VtZW50IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgU1RBUlRET0MgID0gbmV3IFRva2VuVHlwZSggIlNUQVJURE9DIiwgIElOVF9TVEFSVERPQyAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gc3RhcnQtZG9jdW1lbnQgdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBFTkRET0MgICAgPSBuZXcgVG9rZW5UeXBlKCAiRU5ERE9DIiwgICAgSU5UX0VORERPQyAgICApOwotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBzdGFydC1lbGVtZW50IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgU1RBUlQgICAgID0gbmV3IFRva2VuVHlwZSggIlNUQVJUIiwgICAgIElOVF9TVEFSVCAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gZW5kLWVsZW1lbnQgdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBFTkQgICAgICAgPSBuZXcgVG9rZW5UeXBlKCAiRU5EIiwgICAgICAgSU5UX0VORCAgICAgICApOwotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiB0ZXh0IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgVEVYVCAgICAgID0gbmV3IFRva2VuVHlwZSggIlRFWFQiLCAgICAgIElOVF9URVhUICAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gYXR0cmlidXRlIHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgQVRUUiAgICAgID0gbmV3IFRva2VuVHlwZSggIkFUVFIiLCAgICAgIElOVF9BVFRSICAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgTkFNRVNQQUNFID0gbmV3IFRva2VuVHlwZSggIk5BTUVTUEFDRSIsIElOVF9OQU1FU1BBQ0UgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gY29tbWVudCB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIENPTU1FTlQgICA9IG5ldyBUb2tlblR5cGUoICJDT01NRU5UIiwgICBJTlRfQ09NTUVOVCAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBQUk9DSU5TVCAgPSBuZXcgVG9rZW5UeXBlKCAiUFJPQ0lOU1QiLCAgSU5UX1BST0NJTlNUICApOwotCi0gICAgICAgIHByaXZhdGUgVG9rZW5UeXBlICggU3RyaW5nIG5hbWUsIGludCB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgX3ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYWxsb2NhdGVzIHJlc291cmNlcyBuZWVkZWQgdG8gbWFuYWdlIHRoZSBjdXJzb3IsIHJlbmRlcmluZyB0aGlzIGN1cnNvcgotICAgICAqIGlub3BlcmFibGUuIEJlY2F1c2UgY3Vyc29ycyBhcmUgbWFuYWdlZCBieSBhIG1lY2hhbmlzbSB3aGljaCBzdG9yZXMgdGhlIAotICAgICAqIFhNTCwgc2ltcGx5IGxldHRpbmcgYSBjdXJzb3IgZ28gb3V0IG9mIHNjb3BlIGFuZCBoYXZpbmcgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCi0gICAgICogYXR0ZW1wdCB0byByZWNsYWltIGl0IG1heSBub3QgcHJvZHVjZSBkZXNpcmFibGUgcGVyZm9ybWFuY2UuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogU28sIGV4cGxpY2l0bHkgZGlzcG9zaW5nIGEgY3Vyc29yIGFsbG93cyB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgotICAgICAqIHRvIHJlbGVhc2UgaXRzIHJlc3BvbnNpYmlsaXR5IG9mIG1haW50YWluaW5nIGl0cyBwb3NpdGlvbi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBBZnRlciBhIGN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgbWF5IG5vdCBiZSB1c2VkIGFnYWluLiAgSXQgY2FuCi0gICAgICogdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG9yIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHVzZWQgYWZ0ZXIKLSAgICAgKiBkaXNwb3NhbC48YnIvPjxici8+Ci0gICAgICovCi0KLSAgICB2b2lkIGRpc3Bvc2UgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBtb3ZlVG8gY3Vyc29yLiAgaWYgdGhlCi0gICAgICogbW92ZVRvIGN1cnNvciBpcyBpbiBhIGRpZmZlcmVudCBkb2N1bWVudCBmcm9tIHRoaXMgY3Vyc29yLCB0aGlzIGN1cnNvcgotICAgICAqIHdpbGwgbm90IGJlIG1vdmVkLCBhbmQgZmFsc2UgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBtb3ZlVG8gIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMgY3Vyc29yCi0gICAgICogc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DdXJzb3IgKCBYbWxDdXJzb3IgbW92ZVRvICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhpcyBjdXJzb3Igb24gYW4gaW50ZXJuYWwgc3RhY2sgb2Ygc2F2ZWQKLSAgICAgKiBwb3NpdGlvbnMgKGluZGVwZW5kZW50IG9mIHNlbGVjdGlvbikuIFRoaXMgbG9jYXRpb24gbWF5IGJlIHJlc3RvcmVkCi0gICAgICogbGF0ZXIgYnkgY2FsbGluZyB0aGUgcG9wKCkgbWV0aG9kLgotICAgICAqLwotCi0gICAgdm9pZCBwdXNoICggKTsKLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBjdXJzb3IgbG9jYXRpb24gbW9zdCByZWNlbnRseSBzYXZlZCB3aXRoIHRoZSBwdXNoKCkgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlcmUgd2FzIGEgbG9jYXRpb24gdG8gcmVzdG9yZTsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gcG9wICggKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFBhdGggZXhwcmVzc2lvbiBhZ2FpbnN0IHRoZSBYTUwgdGhhdCB0aGlzIAotICAgICAqIGN1cnNvciBpcyBpbi4gIFRoZSBjdXJzb3JzIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZS4gIFRvIG5hdmlnYXRlIHRvIHRoZQotICAgICAqIHNlbGVjdGlvbnMsIHVzZSBoYXNOZXh0U2VsZWN0aW9uIGFuZCB0b05leHRTZWxlY3Rpb24gKHNpbWlsYXIgdG8KLSAgICAgKiBqYXZhLnV0aWwuSXRlcmF0b3IpLjxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCi0gICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246Ci0gICAgICogPHByZT4KLSAgICAgKiBjdXJzb3Iuc2VsZWN0UGF0aCgiLi9wdXJjaGFzZS1vcmRlci9saW5lLWl0ZW1bcHJpY2UgPD0gMjAuMDBdIik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBwYXRoICBUaGUgcGF0aCBleHByZXNzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBYUGF0aCBleHByZXNzaW9uIGFnYWluc3QgdGhlIFhNTCB0aGF0IHRoaXMgCi0gICAgICogY3Vyc29yIGlzIGluLiBUaGUgY3Vyc29yJ3MgcG9zaXRpb24gZG9lcyBub3QgY2hhbmdlLiAgVG8gbmF2aWdhdGUgdG8gdGhlCi0gICAgICogc2VsZWN0aW9ucywgdXNlIGhhc05leHRTZWxlY3Rpb24gYW5kIHRvTmV4dFNlbGVjdGlvbiAoc2ltaWxhciB0bwotICAgICAqIGphdmEudXRpbC5JdGVyYXRvcikuPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIFRoZSByb290IHJlZmVycmVkIHRvIGJ5IHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBnaXZlbiBhcyAKLSAgICAgKiBhIGRvdC4gVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIHBhdGggZXhwcmVzc2lvbjoKLSAgICAgKiA8cHJlPgotICAgICAqIGN1cnNvci5zZWxlY3RQYXRoKCIuL3B1cmNoYXNlLW9yZGVyL2xpbmUtaXRlbVtwcmljZSA8PSAyMC4wMF0iKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHBhdGggIFRoZSBwYXRoIGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBxdWVyeSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgbmV4dCBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQgc2VsZWN0aW9uOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBoYXNOZXh0U2VsZWN0aW9uICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbmV4dCBsb2NhdGlvbiBpbiB0aGUgc2VsZWN0aW9uLCAKLSAgICAgKiBpZiBhbnkuIFNlZSB0aGUgc2VsZWN0UGF0aCgpIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b05leHRTZWxlY3Rpb24gKCApOwotICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhpcyBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGUgc2VsZWN0aW9uLiAKLSAgICAgKiBJZiBpIGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VsZWN0aW9uCi0gICAgICogY291bnQsIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAgICogIAotICAgICAqIFNlZSBhbHNvIHRoZSBzZWxlY3RQYXRoKCkgYW5kIGFkZFRvU2VsZWN0aW9uKCkgbWV0aG9kcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGkgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBsb2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b1NlbGVjdGlvbiAoIGludCBpICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBTZWUgYWxzbyB0aGUgc2VsZWN0UGF0aCgpIAotICAgICAqIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCi0gICAgICogCi0gICAgICogWW91IG1heSBleHBlcmllbmNlIGJldHRlciBwZXJmb3JtYW5jZSBpZiB5b3UgdXNlIHRoZSBpdGVyYXRpb24KLSAgICAgKiBtb2RlbCB1c2luZyB0aGUgdG9OZXh0U2VsZWN0aW9uIG1ldGhvZCwgcmF0aGVyIHRoYW4gCi0gICAgICogdGhlIGluZGV4aW5nIG1vZGVsIHVzaW5nIHRoZSBnZXRTZWxlY3Rpb25Db3VudCBhbmQgCi0gICAgICogdG9TZWxlY3Rpb24gbWV0aG9kcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKi8KLQotICAgIGludCBnZXRTZWxlY3Rpb25Db3VudCAoICk7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBjdXJzb3IgdG8gdGhlIHNlbGVjdGlvbi4gIAotICAgICAqIFNlZSBhbHNvIHRoZSBzZWxlY3RQYXRoKCkgbWV0aG9kLiBZb3UgY2FuIHVzZSB0aGlzIGFzIGFuIAotICAgICAqIGFsdGVybmF0aXZlIHRvIGNhbGxpbmcgdGhlIHNlbGVjdFBhdGggbWV0aG9kIHdoZW4geW91IHdhbnQKLSAgICAgKiB0byBkZWZpbmUgeW91ciBvd24gc2VsZWN0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBhZGRUb1NlbGVjdGlvbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoaXMgY3Vyc29yJ3Mgc2VsZWN0aW9uLCBidXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyU2VsZWN0aW9ucyAoICk7ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBib29rbWFyay4gIElmIHRoZQotICAgICAqIGJvb2ttYXJrIGlzIGluIGEgZGlmZmVyZW50IGRvY3VtZW50IGZyb20gdGhpcyBjdXJzb3Igb3IgaWYgdGhlIAotICAgICAqIGJvb2ttYXJrIGlzIG9ycGhhbmVkLCB0aGlzIGN1cnNvcgotICAgICAqIHdpbGwgbm90IGJlIG1vdmVkLCBhbmQgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGJvb2ttYXJrICBUaGUgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMKLSAgICAgKiBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9Cb29rbWFyayAoIFhtbEJvb2ttYXJrIGJvb2ttYXJrICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbG9jYXRpb24gYWZ0ZXIgaXRzIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgKiB3aGVyZSBhIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuICBSZXR1cm5zIGZhbHNlIGlmIG5vCi0gICAgICogc3VjaCBib29rbWFyayBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtICBrZXkgIFRoZSBrZXkgaGVsZCBieSB0aGUgbmV4dCBib29rbWFyayBhdCB0aGUgbG9jYXRpb24gdG8gCi0gICAgICogd2hpY2ggdGhpcyBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIFRoZSBuZXh0IGNvcnJlc3BvbmRpbmcgYm9va21hcmssIGlmIGl0IGV4aXN0czsgbnVsbCBpZiB0aGVyZQotICAgICAqIGlzIG5vIG5leHQgYm9va21hcmsgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKi8KLQotICAgIFhtbEJvb2ttYXJrIHRvTmV4dEJvb2ttYXJrICggT2JqZWN0IGtleSApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbiBiZWZvcmUgaXRzIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgKiB3aGVyZSBhIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuICBSZXR1cm5zIGZhbHNlIGlmIG5vCi0gICAgICogc3VjaCBib29rbWFyayBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtICBrZXkgIFRoZSBrZXkgaGVsZCBieSB0aGUgcHJldmlvdXMgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIAotICAgICAqIHdoaWNoIHRoaXMgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgcHJldmlvdXMgY29ycmVzcG9uZGluZyBib29rbWFyaywgaWYgaXQgZXhpc3RzOyBudWxsIGlmIAotICAgICAqIHRoZXJlIGlzIG5vIHByZXZpb3VzIGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICovCi0KLSAgICBYbWxCb29rbWFyayB0b1ByZXZCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRva2VuLiBOYW1lcyBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogU1RBUlQsIEFUVFIsIE5BTUVTUEFDRSBvciBQUk9DSU5TVC4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vCi0gICAgICogbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4uIEZvciBTVEFSVCBhbmQgQVRUUiwgdGhlIAotICAgICAqIG5hbWUgcmV0dXJuZWQgaWRlbnRpZmllcyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUuIAotICAgICAqIEZvciBOQU1FU1BBQ0UsIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBuYW1lIGlzIHRoZSBwcmVmaXgsIHdoaWxlIAotICAgICAqIHRoZSBVUkkgaXMgdGhlIG5hbWVzcGFjZSBkZWZpbmVkLiBGb3IgUFJPQ0lOU1QsIHRoZSBsb2NhbCBwYXJ0IAotICAgICAqIGlzIHRoZSB0YXJnZXQgYW5kIHRoZSB1cmkgaXMgIiIuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIFhNTCBhdCB0aGlzIGN1cnNvcidzIGxvY2F0aW9uOyBudWxsIGlmIHRoZXJlCi0gICAgICogaXMgbm8gbmFtZS4KLSAgICAgKi8KLQotICAgIFFOYW1lIGdldE5hbWUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIFNUQVJULCBOQU1FU1BBQ0UsCi0gICAgICogQVRUUiBvciBQUk9DSU5TVC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuZXcgbmFtZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW4uCi0gICAgICovCi0KLSAgICB2b2lkIHNldE5hbWUgKCBRTmFtZSBuYW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIFVSSSBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIHByZWZpeC4gVGhlIGN1cnJlbnQKLSAgICAgKiBjb250ZXh0IG11c3QgYmUgYXQgYSBTVEFSVCBvciBTVEFSVERPQy4gTmFtZXNwYWNlIHByZWZpeCBtYXBwaW5ncwotICAgICAqIGFyZSBxdWVyaWVkIGZvciB0aGUgbWFwcGluZ3MgZGVmaW5lZCBhdCB0aGUgY3VycmVudCBjb250YWluZXIgZmlyc3QsCi0gICAgICogdGhlbiBwYXJlbnRzIGFyZSBxdWVyaWVkLiBUaGUgcHJlZml4IGNhbiBiZSAiIiBvciBudWxsIHRvIGluZGljYXRlCi0gICAgICogYSBzZWFyY2ggZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS48YnIvPjxici8+LgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIHF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50LiBXaGVuIHRoZSAKLSAgICAgKiBkb2N1bWVudCBpcyBwZXJzaXN0ZWQsIHRoZSBzYXZpbmcgbWVjaGFuaXNtIG1heSBzeW50aGVzaXplIG5hbWVzcGFjZXMgCi0gICAgICogKG5zMSwgbnMyLCBhbmQgc28gb24pIGZvciB0aGUgcHVycG9zZXMgb2YgcGVyc2lzdGVuY2UuIFRoZXNlIG5hbWVwYWNlcyBhcmUgCi0gICAgICogb25seSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGFuZCBhcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gCi0gICAgICogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcHJlZml4ICBUaGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBuYW1lc3BhY2UuCi0gICAgICogQHJldHVybiAgVGhlIFVSSSBmb3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHByZWZpeCBpZiBpdAotICAgICAqIGV4aXN0czsgb3RoZXJ3aXNlLCBudWxsLgotICAgICAqLwotICAgIFN0cmluZyBuYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZml4IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBuYW1lc3BhY2UgVVJJLiAgVGhlCi0gICAgICogY3VycmVudCBjb250ZXh0IG11c3QgYmUgYXQgYSBTVEFSVCBvciBTVEFSVERPQy4gIElmIHRoZXJlIGlzIGFuCi0gICAgICogZXhpc3RpbmcgcHJlZml4IHRoYXQgaW5kaWNhdGVzIHRoZSBVUkkgaW4gdGhlIGN1cnJlbnQgY29udGV4dCwgdGhhdAotICAgICAqIHByZWZpeCBtYXkgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBuZXcgcHJlZml4IGZvciB0aGUgVVJJIHdpbGwgYmUKLSAgICAgKiBkZWZpbmVkIGJ5IGFkZGluZyBhbiB4bWxucyBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgY29udGFpbmVyIG9yIGEKLSAgICAgKiBwYXJlbnQgY29udGFpbmVyLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIHF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50LiBXaGVuIHRoZSAKLSAgICAgKiBkb2N1bWVudCBpcyBwZXJzaXN0ZWQsIHRoZSBzYXZpbmcgbWVjaGFuaXNtIG1heSBzeW50aGVzaXplIG5hbWVzcGFjZXMgCi0gICAgICogKG5zMSwgbnMyLCBhbmQgc28gb24pIGZvciB0aGUgcHVycG9zZXMgb2YgcGVyc2lzdGVuY2UuIFRoZXNlIG5hbWVwYWNlcyBhcmUgCi0gICAgICogb25seSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGFuZCBhcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gCi0gICAgICogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlVVJJICBUaGUgbmFtZXNwYWNlIFVSSSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBwcmVmaXguCi0gICAgICogQHJldHVybiAgVGhlIHByZWZpeCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgVVJJIGlmIGl0IGV4aXN0czsgCi0gICAgICogb3RoZXJ3aXNlLCBhIG5ld2x5IGdlbmVyYXRlZCBwcmVmaXguCi0gICAgICovCi0gICAgU3RyaW5nIHByZWZpeEZvck5hbWVzcGFjZSAoIFN0cmluZyBuYW1lc3BhY2VVUkkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIHRvIHRoZSBzcGVjaWZpZWQgbWFwLCBhbGwgdGhlIG5hbWVzcGFjZXMgaW4gc2NvcGUgYXQgdGhlIGNvbnRhaW5lcgotICAgICAqIHdoZXJlIHRoaXMgY3Vyc29yIGlzIHBvc2l0aW9uZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgCi0gICAgICogY29udGFpbmVyIHRva2VucyBvbmx5LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgYWRkVG9UaGlzICBUaGUgTWFwIHRvIGFkZCB0aGUgbmFtZXNwYWNlcyB0by4KLSAgICAgKi8KLQotICAgIHZvaWQgZ2V0QWxsTmFtZXNwYWNlcyAoIE1hcCBhZGRUb1RoaXMgKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdCBhdCB0aGUgY3VycmVudCBTVEFSVCwKLSAgICAgKiBTVEFSVERPQywgb3IgQVRUUi4gPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIFRoZSBzdHJvbmdseS10eXBlZCBvYmplY3QgY2FuIGJlIGNhc3QgdG8gdGhlIHN0cm9uZ2x5LXR5cGVkCi0gICAgICogWEJlYW4gaW50ZXJmYWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFhNTCBTY2hlbWEgVHlwZSBnaXZlbgotICAgICAqIGJ5IHJlc3VsdC5nZXRTY2hlbWFUeXBlKCkuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgYSBtb3JlIHNwZWNpZmljIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQsIGFuIFhtbE9iamVjdAotICAgICAqIHdob3NlIHNjaGVtYSB0eXBlIGlzIGFueVR5cGUgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgc3Ryb25nbHktdHlwZWQgb2JqZWN0IGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uOwotICAgICAqIG51bGwgaWYgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgbm90IGEgU1RBUlQsIFNUQVJURE9DLCBvciBBVFRSLgotICAgICAqLwotCi0gICAgWG1sT2JqZWN0IGdldE9iamVjdCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCB0b2tlbi4gQnkgZGVmaW5pdGlvbiwgdGhlIGN1cnJlbnQKLSAgICAgKiB0b2tlbiBpcyB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IuIAotICAgICAqIElmIHlvdSdyZSBpbiB0aGUgbWlkZGxlIG9mIHRleHQsIGJlZm9yZSBhIGNoYXJhY3RlciwgeW91IGdldCBURVhULgotICAgICAqIFlvdSBjYW4ndCBkaXZlIGludG8gdGhlIHRleHQgb2YgYW4gQVRUUiwgQ09NTUVOVCBvciBQUk9DSU5TVC48YnIvPjxici8+Ci0gICAgICogCi0gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUsIGl0IG1heSBiZSBtb3JlIGNvbnZlbmllbnQgZm9yIHlvdSB0byB1c2Ugb25lIG9mIHRoZSAKLSAgICAgKiBtZXRob2RzIHRoYXQgdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHRva2VuIHR5cGUuIFRoZXNlIGluY2x1ZGUgdGhlIG1ldGhvZHMgCi0gICAgICogaXNTdGFydCgpLCBpc1N0YXJ0ZG9jKCksIGlzVGV4dCgpLCBpc0F0dHIoKSwgYW5kIHNvIG9uLiBFYWNoIHJldHVybnMgYSBib29sZWFuIAotICAgICAqIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdG9rZW4gdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3IgaXMgdGhlIHR5cGUgCi0gICAgICogaW4gcXVlc3Rpb24uIAotICAgICAqIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEByZXR1cm4gIFRoZSBUb2tlblR5cGUgaW5zdGFuY2UgZm9yIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudAotICAgICAqIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIGN1cnJlbnRUb2tlblR5cGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBTVEFSVERPQyB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGF0IHRoZSB2ZXJ5IHJvb3Qgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJURE9DIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzU3RhcnRkb2MgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkRET0MgdG9rZW4gdHlwZSwgbWVhbmluZyAKLSAgICAgKiBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkRET0MgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNFbmRkb2MgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJUIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYW4gZWxlbWVudCdzIHN0YXJ0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJUIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzU3RhcnQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkQgdG9rZW4gdHlwZSwgbWVhbmluZyAKLSAgICAgKiBqdXN0IGJlZm9yZSBhbiBlbGVtZW50J3MgZW5kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkQgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNFbmQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHRoaXMgdG9rZW4gaXMgYSBURVhUIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgb3IgaW5zaWRlIHRleHQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgVEVYVCB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc1RleHQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBBVFRSIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYW4gYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBBVFRSIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzQXR0ciAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgTkFNRVNQQUNFIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgTkFNRVNQQUNFIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzTmFtZXNwYWNlICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBDT01NRU5UIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYSBjb21tZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIENPTU1FTlQgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNDb21tZW50ICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBQUk9DSU5TVCB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBQUk9DSU5TVCB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc1Byb2NpbnN0ICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBjb250YWluZXIgdG9rZW4uIFRoZSBTVEFSVERPQyBhbmQgU1RBUlQgCi0gICAgICogdG9rZW4gdHlwZXMgYXJlIGNvbnRhaW5lcnMuIENvbnRhaW5lcnMsIGluY2x1ZGluZyBkb2N1bWVudHMgYW5kIGVsZW1lbnRzLAotICAgICAqIGhhdmUgdGhlIHNhbWUgY29udGVudCBtb2RlbC4gSW4gb3RoZXIgd29yZHMsIGEgZG9jdW1lbnQgYW5kIGFuIGVsZW1lbnQgCi0gICAgICogbWF5IGhhdmUgdGhlIHNhbWUgY29udGVudHMuIEZvciBleGFtcGxlLCBhIGRvY3VtZW50IG1heSBjb250YWluIGF0dHJpYnV0ZXMgCi0gICAgICogb3IgdGV4dCwgd2l0aG91dCBhbnkgY2hpbGQgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgY29udGFpbmVyIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0NvbnRhaW5lciAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgZmluaXNoIHRva2VuLiBBIGZpbmlzaCB0b2tlbiBjYW4gYmUgYW4gRU5ERE9DCi0gICAgICogb3IgRU5EIHRva2VuIHR5cGUuCi0KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBmaW5pc2ggdG9rZW47IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzRmluaXNoICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW55IGF0dHJpYnV0ZS4gVGhpcyBpbmNsdWRlcyBhbiBBVFRSIHRva2VuIHR5cGUgYW5kCi0gICAgICogdGhlIE5BTUVTUEFDRSB0b2tlbiB0eXBlIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJyZW50IGN1cnNvciBpcyBhdCBhbnkgYXR0cmlidXRlOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0FueUF0dHIgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzIHRva2VuLiBCeSBkZWZpbml0aW9uLCB0aGUgcHJldmlvdXMKLSAgICAgKiB0b2tlbiBpcyB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnNvci48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBJZiB5b3UncmUgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LCBhZnRlciBhIGNoYXJhY3RlciwgeW91IGdldCBURVhULgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSBUb2tlblR5cGUgaW5zdGFuY2UgZm9yIHRoZSB0b2tlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIAotICAgICAqIHRva2VuIGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIHByZXZUb2tlblR5cGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHRva2VuLiBXaGVuIHRoaXMgaXMgZmFsc2UsIGFzIHdoZW4gdGhlIGN1cnNvciBpcwotICAgICAqIGF0IHRoZSBFTkRET0MgdG9rZW4sIHRoZSB0b05leHRUb2tlbigpIG1ldGhvZCByZXR1cm5zIE5PTkUgYW5kIGRvZXMgbm90IAotICAgICAqIG1vdmUgdGhlIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZXJlIGlzIGEgbmV4dCB0b2tlbjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaGFzTmV4dFRva2VuICggKTsKLQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHRva2VuLiBXaGVuIHRoaXMgaXMgZmFsc2UsIHRvUHJldlRva2VuCi0gICAgICogcmV0dXJucyBOT05FIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBoYXNQcmV2VG9rZW4gKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgdG9rZW4uIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgdG9rZW5zIAotICAgICAqIGF2YWlsYWJsZSwgaGFzTmV4dFRva2VuIHJldHVybnMgZmFsc2UgYW5kIHRvTmV4dFRva2VuKCkgcmV0dXJucyAKLSAgICAgKiBOT05FIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuIFJldHVybnMgdGhlIHRva2VuIHR5cGUgCi0gICAgICogb2YgdGhlIHRva2VuIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHVwb24gYSBzdWNjZXNzZnVsIG1vdmUuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIHRva2VuIHR5cGUgZm9yIHRoZSBuZXh0IHRva2VuIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOwotICAgICAqIG90aGVyd2lzZSwgTk9ORS4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSB0b05leHRUb2tlbiAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB0b2tlbi4gV2hlbiB0aGVyZSBpcyBubwotICAgICAqIHByZXZpb3VzIHRva2VuLCByZXR1cm5zIE5PTkUsIG90aGVyd2lzZSByZXR1cm5zIHRoZSB0b2tlbgotICAgICAqIHRvIHRoZSBsZWZ0IG9mIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgdG9rZW4gdHlwZSBmb3IgdGhlIHByZXZpb3VzIHRva2VuIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOwotICAgICAqIG90aGVyd2lzZSwgTk9ORS4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSB0b1ByZXZUb2tlbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQKLSAgICAgKiBTVEFSVCBvciBTVEFSVERPQy4gVGhhdCBpcywgdGhlIGZpcnN0IHRva2VuIGFmdGVyIGFsbCBBVFRSIGFuZCBOQU1FU1BBQ0UKLSAgICAgKiB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU1RBUlQuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQgb3IgU1RBUlRET0MsIHRoZSBjdXJzb3IgaXMgbm90Ci0gICAgICogbW92ZWQgYW5kIE5PTkUgaXMgcmV0dXJuZWQuIElmIHRoZSBjdXJyZW50IFNUQVJUIG9yIFNUQVJURE9DCi0gICAgICogaGFzIG5vIGNvbnRlbnQsIHRoZSBjdXJzb3IgaXMgbW92ZWQgdG8gdGhlIEVORCBvciBFTkRET0MgdG9rZW4uPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSBuZXcgY3VycmVudCB0b2tlbiB0eXBlLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIHRvRmlyc3RDb250ZW50VG9rZW4gKCApOwotCi0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBFTkQgb3IgRU5ERE9DIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogY3VycmVudCBTVEFSVCBvciBTVEFSVERPQywgYW5kIHJldHVybnMgRU5EIG9yIEVORERPQy4gPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQgb3IgU1RBUlRET0MsIHRoZSBjdXJzb3IgaXMgbm90Ci0gICAgICogbW92ZWQgYW5kIE5PTkUgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIG5ldyBjdXJyZW50IHRva2VuIHR5cGUuCi0gICAgICovCi0KLSAgICBUb2tlblR5cGUgdG9FbmRUb2tlbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciBmb3J3YXJkIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGFuZAotICAgICAqIHN0b3BzIGF0IHRoZSBuZXh0IG5vbi1URVhUIHRva2VuLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotICAgICAqIGFjdHVhbGx5IG1vdmVkIGFjcm9zcywgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIAotICAgICAqIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+LiBJZiB0aGVyZSBpcyBubyBmdXJ0aGVyIHRleHQsIG9yIGlmIAotICAgICAqIHRoZXJlIGlzIG5vIHRleHQgYXQgYWxsLCByZXR1cm5zIHplcm8uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogTm90ZSB0aGlzIGRvZXMgbm90IGRpdmUgaW50byBhdHRyaWJ1dGUgdmFsdWVzLCBjb21tZW50IGNvbnRlbnRzLAotICAgICAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gY29udGVudHMsIGV0Yy4sIGJ1dCBvbmx5IGNvbnRlbnQgdGV4dC48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBZb3UgY2FuIHBhc3MgbWF4Q2hhcmFjdGVyQ291bnQgJmx0OyAwIHRvIG1vdmUgb3ZlciBhbGwgdGhlIHRleHQgdG8gdGhlIAotICAgICAqIHJpZ2h0LiBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdG9OZXh0VG9rZW4sIGJ1dCByZXR1cm5zIHRoZSBhbW91bnQgCi0gICAgICogb2YgdGV4dCBtb3ZlZCBvdmVyLgotICAgICAqCi0gICAgICogQHBhcmFtICBtYXhDaGFyYWN0ZXJDb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2gKLSAgICAgKiB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJ5IHdoaWNoIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyAKLSAgICAgKiAwIGlmIHRoZSBjdXJzb3Igd2FzIG5vdCBtb3ZlZC4KLSAgICAgKi8KLQotICAgIGludCB0b05leHRDaGFyICggaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciBiYWNrd2FyZHMgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGdpdmVuLiAgSGFzCi0gICAgICogc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgdG8gdGhlIHtAbGluayAjdG9OZXh0Q2hhcihpbnQpIHRvTmV4dENoYXJ9IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBieSB3aGljaAotICAgICAqIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2ggdGhlIGN1cnNvciB3YXMgbW92ZWQ7IAotICAgICAqIDAgaWYgdGhlIGN1cnNvciB3YXMgbm90IG1vdmVkLgotICAgICAqLwotCi0gICAgaW50IHRvUHJldkNoYXIgKCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQgKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgc2libGluZyBlbGVtZW50LCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBuZXh0IHNpYmxpbmcKLSAgICAgKiBlbGVtZW50LiAoQnkgZGVmaW5pdGlvbiB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCBpcyB0aGUgc2FtZQotICAgICAqIGFzIHRoZSBwb3NpdGlvbiBvZiBpdHMgU1RBUlQgdG9rZW4uKQotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHMgU1RBUlQsIHRoZSBjdXJzb3Igd2lsbCBiZSAKLSAgICAgKiBtb3ZlZCB0byB0aGUgbmV4dCBTVEFSVCB3aXRob3V0IG1vdmluZyBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoZSAKLSAgICAgKiBjdXJyZW50IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBzaWJsaW5nCi0gICAgICogZWxlbWVudC4gKEJ5IGRlZmluaXRpb24gdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaXMgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgcG9zaXRpb24gb2YgaXRzIFNUQVJUIHRva2VuLikKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b1ByZXZTaWJsaW5nICggKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9yIFNUQVJURE9DLCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwYXJlbnQuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogV29ya3MgaWYgeW91J3JlIGluIGF0dHJpYnV0ZXMgb3IgY29udGVudC4gUmV0dXJucyBmYWxzZSBvbmx5IGlmIGF0Ci0gICAgICogU1RBUlRET0MuIE5vdGUgdGhhdCB0aGUgcGFyZW50IG9mIGFuIEVORCB0b2tlbiBpcyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIFNUQVJUIHRva2VuLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IGZhbHNlIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIFNUQVJURE9DCi0gICAgICogdG9rZW4uCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvUGFyZW50ICggKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQsIG9yIHJldHVybnMgZmFsc2UgYW5kCi0gICAgICogZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50IGNoaWxkcmVuLiA8YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIG5vdCBjdXJyZW50bHkgaW4gYW4gZWxlbWVudCwgaXQgbW92ZXMgaW50byB0aGUgCi0gICAgICogZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgbmV4dCBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvRmlyc3RDaGlsZCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbGFzdCBlbGVtZW50IGNoaWxkLCBvciByZXR1cm5zIGZhbHNlIGFuZAotICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudCBjaGlsZHJlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0xhc3RDaGlsZCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gCi0gICAgICogbm8gbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIAotICAgICAqIHRvLgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0by4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0NoaWxkICggU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvciB0by4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DaGlsZCAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGNoaWxkIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IDxlbT5pbmRleDwvZW0+LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgaW5kZXggIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2Ugb2YgY2hpbGQgCi0gICAgICogZWxlbWVudHMuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DaGlsZCAoIGludCBpbmRleCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCA8ZW0+aW5kZXg8L2VtPiBjaGlsZCBlbGVtZW50IG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgbmFtZSwgd2hlcmUgdGhhdCBlbGVtZW50IGlzIHRoZSAuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICogQHBhcmFtICBpbmRleCAgVGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBvZiBjaGlsZAotICAgICAqIGVsZW1lbnRzLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ2hpbGQgKCBRTmFtZSBuYW1lLCBpbnQgaW5kZXggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gbm8KLSAgICAgKiBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yCi0gICAgICogdG8uCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lICk7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHF1YWxpZmllZCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50LCBvcgotICAgICAqIHJldHVybnMgZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBhdHRyaWJ1dGVzLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogeG1sbnMgYXR0cmlidXRlcyAobmFtZXNwYWNlIGRlY2xhcmF0aW9ucykgYXJlIG5vdCBjb25zaWRlcmVkIAotICAgICAqIGF0dHJpYnV0ZXMgYnkgdGhpcyBmdW5jdGlvbi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBUaGUgY3Vyc29yIG11c3QgYmUgb24gYSBTVEFSVCBvciBTVEFSVERPQyBmb3IgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdWNjZWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvRmlyc3RBdHRyaWJ1dGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudCwgb3IKLSAgICAgKiByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogYXR0cmlidXRlcy4gVGhlIG9yZGVyIG9mIGF0dHJpYnV0ZXMgaXMgYXJiaXRyYXJ5LCBidXQgc3RhYmxlLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKLSAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGEgU1RBUlQgb3IgU1RBUlRET0MgZm9yIHRoaXMgbWV0aG9kCi0gICAgICogdG8gc3VjY2VlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0xhc3RBdHRyaWJ1dGUgKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGF0dHJpYnV0ZSwgb3IgcmV0dXJucwotICAgICAqIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgaXMgbm8gbmV4dAotICAgICAqIHNpYmxpbmcgYXR0cmlidXRlLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKLSAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGFuIGF0dHJpYnV0ZSBmb3IgdGhpcyBtZXRob2QgdG8gc3VjY2VlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b05leHRBdHRyaWJ1dGUgKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgc2libGluZyBhdHRyaWJ1dGUsIG9yIHJldHVybnMKLSAgICAgKiBmYWxzZSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzCi0gICAgICogc2libGluZyBhdHRyaWJ1dGUuIFRoZSBvcmRlciBvZiBhdHRyaWJ1dGVzIGlzIGFyYml0cmFyeSwgYnV0IHN0YWJsZS48YnIvPjxici8+Ci0gICAgICogCi0gICAgICogeG1sbnMgYXR0cmlidXRlcyAobmFtZXNwYWNlIGRlY2xhcmF0aW9ucykgYXJlIG5vdCBjb25zaWRlcmVkIAotICAgICAqIGF0dHJpYnV0ZXMgYnkgdGhpcyBmdW5jdGlvbi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBUaGUgY3Vyc29yIG11c3QgYmUgb24gYW4gYXR0cmlidXRlIGZvciB0aGlzIG1ldGhvZCB0byBzdWNjZWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvUHJldkF0dHJpYnV0ZSAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiBhdCBhIFNUQVJUIG9yIFNUQVJURE9DLCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGdpdmVuCi0gICAgICogYXR0cmlidXRlLiBXaGVuIG5vdCBhdCBhIFNUQVJUIG9yIFNUQVJURE9DIG9yIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QKLSAgICAgKiBleGlzdCwgcmV0dXJucyBudWxsLiAgCi0gICAgICogCi0gICAgICogQHBhcmFtICBhdHRyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyByZXF1ZXN0ZWQuCi0gICAgICogQHJldHVybiAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSwgbnVsbC4KLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRBdHRyaWJ1dGVUZXh0ICggUU5hbWUgYXR0ck5hbWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXaGVuIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MsIHNldHMgdGhlIGF0dHJpYnV0ZSB0ZXh0IGZvciB0aGUgZ2l2ZW4KLSAgICAgKiBhdHRyaWJ1dGUuIFdoZW4gbm90IGF0IGEgU1RBUlQgb3IgU1RBUlRET0MgcmV0dXJucyBmYWxzZS4KLSAgICAgKiBJZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nIHNldC4KLSAgICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIG5ldyB2YWx1ZSB3YXMgc2V0OyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBzZXRBdHRyaWJ1dGVUZXh0ICggUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApOwotICAKLSAgICAvKioKLSAgICAgKiBXaGVuIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MsIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgYXR0ck5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSAoIFFOYW1lIGF0dHJOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LCBlbGVtZW50LCBhdHRyaWJ1dGUsCi0gICAgICogY29tbWVudCwgcHJvY2luc3Qgb3IgdGV4dCB0b2tlbi4gPGJyLz48YnIvPgotICAgICAqCi0gICAgICogV2hlbiBnZXR0aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGVsZW1lbnQsIG5vbi10ZXh0IGNvbnRlbnQgc3VjaAotICAgICAqIGFzIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgaWdub3JlZCBhbmQgdGV4dCBpcyBjb25jYXRlbmF0ZWQuCi0gICAgICogRm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBuZXN0ZWQgZWxlbWVudCBjaGlsZHJlbiwgdGhpcwotICAgICAqIHJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCB0ZXh0IG9mIGFsbCBtaXhlZCBjb250ZW50IGFuZCB0aGUKLSAgICAgKiB0ZXh0IG9mIGFsbCB0aGUgZWxlbWVudCBjaGlsZHJlbiwgcmVjdXJzaW5nIGluIGZpcnN0LXRvLWxhc3QKLSAgICAgKiBkZXB0aGZpcnN0IG9yZGVyLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBhdHRyaWJ1dGVzLCB0aGlzIHJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZS48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBGb3IgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCB0aGlzIHJldHVybnMgdGhlIHRleHQgY29udGVudHMgCi0gICAgICogb2YgdGhlIGNvbW1lbnQgb3IgUEksIG5vdCBpbmNsdWRpbmcgdGhlIGRlbGltaXRpbmcgc2VxdWVuY2VzICZsdDshLS0gLS0mZ3Q7LCAmbHQ7PyA/Jmd0Oy4KLSAgICAgKjxici8+PGJyLz4KLSAgICAgKiBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgYSBTVEFSVCwgU1RBUlRET0MsIFRFWFQsIEFUVFIsIENPTU1FTlQsIG9yCi0gICAgICogUFJPQ0lOU1QsIHRoaXMgcmV0dXJucyBudWxsLiBUaGUgdmFsdWUgb2YgYW4gZW1wdHkgdGFnIGlzIHRoZQotICAgICAqIGVtcHR5IHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0b2tlbiwgaWYgdGhlIHRva2VuJ3MgdHlwZSBpcwotICAgICAqIFNUQVJULCBTVEFSVERPQywgVEVYVCwgQVRUUiwgQ09NTUVOVCwgb3IgUFJPQ0lOU1Q7IG51bGwgaWYgdGhlIHR5cGUgaXMKLSAgICAgKiBFTkQsIEVORERPQywgTk9ORSwgb3IgTkFNRVNQQUNFLgotICAgICAqLwotCi0gICAgU3RyaW5nIGdldFRleHRWYWx1ZSAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LCBlbGVtZW50LCBhdHRyaWJ1dGUsCi0gICAgICogY29tbWVudCwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciB0ZXh0IHRva2VuLCBjb3VudGluZyByaWdodCBmcm9tIAotICAgICAqIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gdXAgdG8gPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4sCi0gICAgICogYW5kIGNvcGllcyB0aGUgcmV0dXJuZWQgdGV4dCBpbnRvIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4uIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBXaGVuIGdldHRpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gZWxlbWVudCwgbm9uLXRleHQgY29udGVudCBzdWNoCi0gICAgICogYXMgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBpZ25vcmVkIGFuZCB0ZXh0IGlzIGNvbmNhdGVuYXRlZC4KLSAgICAgKiBGb3IgZWxlbWVudHMgdGhhdCBoYXZlIG5lc3RlZCBlbGVtZW50IGNoaWxkcmVuLCB0aGlzCi0gICAgICogcmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHRleHQgb2YgYWxsIG1peGVkIGNvbnRlbnQgYW5kIHRoZQotICAgICAqIHRleHQgb2YgYWxsIHRoZSBlbGVtZW50IGNoaWxkcmVuLCByZWN1cnNpbmcgaW4gZmlyc3QtdG8tbGFzdAotICAgICAqIGRlcHRoZmlyc3Qgb3JkZXIuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogRm9yIGF0dHJpYnV0ZXMsIHRoaXMgcmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBjb21tZW50cyBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIHRoaXMgcmV0dXJucyB0aGUgdGV4dCBjb250ZW50cyAKLSAgICAgKiBvZiB0aGUgY29tbWVudCBvciBQSSwgbm90IGluY2x1ZGluZyB0aGUgZGVsaW1pdGluZyBzZXF1ZW5jZXMgJmx0OyEtLSAtLSZndDssICZsdDs/ID8mZ3Q7LgotICAgICAqIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBFTkQsIEVORERPQywgb3IgTkFNRVNQQUNFLCB0aGlzIHJldHVybnMgMC4gCi0gICAgICogVGhlIHZhbHVlIG9mIGFuIGVtcHR5IHRhZyBpcyB0aGUgZW1wdHkgc3RyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcmV0dXJuZWRDaGFycyAgQSBjaGFyYWN0ZXIgYXJyYXkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gIG9mZnNldCAgVGhlIHBvc2l0aW9uIHdpdGhpbiByZXR1cm5lZENoYXJzIHRvIHdoaWNoIHRoZSBmaXJzdCBvZiB0aGUgCi0gICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCi0gICAgICogbG9jYXRpb24gdG8gY29weS4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZDsgMCBpZiBubyBjaGFyYWN0ZXJzIAotICAgICAqIHdlcmUgY29waWVkLgotICAgICAqLwotCi0gICAgaW50IGdldFRleHRWYWx1ZSAoIGNoYXJbXSByZXR1cm5lZENoYXJzLCBpbnQgb2Zmc2V0LCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBjdXJyZW50IFRFWFQgdG9rZW4uICBJZiB0aGUgY3VycmVudCB0b2tlbgotICAgICAqIGlzIG5vdCBURVhULCByZXR1cm5zICIiLiAgSWYgaW4gdGhlIG1pZGRsZSBvZiBhIFRFWFQgdG9rZW4sIHJldHVybnMKLSAgICAgKiB0aG9zZSBjaGFycyB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciBvZiB0aGUgVEVYVCB0b2tlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIHRleHQ7IGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCB0b2tlbiB0eXBlIGlzCi0gICAgICogbm90IFRFWFQuCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiBpZiB0aGF0IFhNTCdzCi0gICAgICogdG9rZW4gdHlwZSBpcyBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IgUFJPQ0lOU1QuIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGNoaWxkcmVuIHRoaXMgZmlyc3QgcmVtb3ZlcyBhbGwKLSAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSB0ZXh0IHRvIHVzZSBhcyBhIG5ldyB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzICBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBJZiB0aGUgdG9rZW4gdHlwZSBhdCB0aGlzCi0gICAgICogY3Vyc29yJ3MgbG9jYXRpb24gaXMgbm90IFNUQVJULCBTVEFSVERPQywgQVRUUiwgQ09NTUVOVCBvcgotICAgICAqIFBST0NJTlNULgotICAgICAqLwotICAgIHZvaWQgc2V0VGV4dFZhbHVlICggU3RyaW5nIHRleHQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiAoaWYgdGhhdCBYTUwncwotICAgICAqIHRva2VuIHR5cGUgaXMgU1RBUlQsIFNUQVJURE9DLCBBVFRSLCBDT01NRU5UIG9yIFBST0NJTlNUKSB0byB0aGUgCi0gICAgICogY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkuIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGNoaWxkcmVuIHRoaXMgZmlyc3QgcmVtb3ZlcyBhbGwKLSAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHNvdXJjZUNoYXJzICBBIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBYTUwncyBuZXcgdmFsdWUuCi0gICAgICogQHBhcmFtICBvZmZzZXQgIFRoZSBwb3NpdGlvbiB3aXRoaW4gc291cmNlQ2hhcnMgZnJvbSB3aGljaCB0aGUgZmlyc3Qgb2YgCi0gICAgICogdGhlIHNvdXJjZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBjb3BpZWQuCi0gICAgICogQHBhcmFtICBsZW5ndGggIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNldCBhcyB0aGUgWE1MJ3MgbmV3Ci0gICAgICogdmFsdWUuCi0gICAgICogQHRocm93cyAgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIHRva2VuIHR5cGUgYXQgdGhpcwotICAgICAqIGN1cnNvcidzIGxvY2F0aW9uIGlzIG5vdCBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IKLSAgICAgKiBQUk9DSU5TVC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFRleHRWYWx1ZSAoIGNoYXJbXSBzb3VyY2VDaGFycywgaW50IG9mZnNldCwgaW50IGxlbmd0aCApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjaGFyYWN0ZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHVwIHRvIHRoZSBuZXh0IHRva2VuLgotICAgICAqLwotICAgIFN0cmluZyBnZXRDaGFycyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlciwgY291bnRpbmcgcmlnaHQgZnJvbSAKLSAgICAgKiB0aGlzIGN1cnNvcidzIGxvY2F0aW9uIHRvIHRoZSBjaGFyYWN0ZXIgYXQgPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4uICBUaGUgCi0gICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBhcmUgYWRkZWQgdG8gPGVtPnJldHVybmVkQ2hhcnM8L2VtPiwgd2l0aCB0aGUgZmlyc3QKLSAgICAgKiBjaGFyYWN0ZXIgY29waWVkIHRvIHRoZSA8ZW0+b2Zmc2V0PC9lbT4gcG9zaXRpb24uIFRoZSA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPiAKLSAgICAgKiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4gCi0gICAgICogbWludXMgPGVtPm9mZnNldDwvZW0+LiBDb3BpZXMgYSBudW1iZXIgb2YgY2hhcmFjdGVycywgd2hpY2ggaXMgCi0gICAgICogZWl0aGVyIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+IG9yIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dCB0b2tlbiwgCi0gICAgICogd2hpY2hldmVyIGlzIGxlc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtICByZXR1cm5lZENoYXJzICBBIGNoYXJhY3RlciBhcnJheSB0byBob2xkIHRoZSByZXR1cm5lZCBjaGFyYWN0ZXJzLgotICAgICAqIEBwYXJhbSAgb2Zmc2V0ICBUaGUgcG9zaXRpb24gd2l0aGluIHJldHVybmVkQ2hhcnMgYXQgd2hpY2ggdGhlIGZpcnN0IG9mIHRoZSAKLSAgICAgKiByZXR1cm5lZCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJldHVybmVkOyAwIGlmIG5vIGNoYXJhY3RlcnMgCi0gICAgICogd2VyZSByZXR1cm5lZCBvciBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgVEVYVC4gCi0gICAgICovCi0KLSAgICBpbnQgZ2V0Q2hhcnMgKCBjaGFyW10gcmV0dXJuZWRDaGFycywgaW50IG9mZnNldCwgaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgU1RBUlRET0MgdG9rZW4sIHdoaWNoIGlzIHRoZSAKLSAgICAgKiByb290IG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLQotICAgIHZvaWQgdG9TdGFydERvYyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgRU5ERE9DIHRva2VuLCB3aGljaCBpcyB0aGUgZW5kCi0gICAgICogb2YgdGhlIGRvY3VtZW50LgotICAgICAqLwotCi0gICAgdm9pZCB0b0VuZERvYyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgc3BlY2lmaWVkIGN1cnNvciBpcyBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcwotICAgICAqIHRoaXMgY3Vyc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHRoYXQgbWF5IGJlIGluIHRoZSBzYW1lIGRvY3VtZW50Ci0gICAgICogYXMgdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGN1cnNvciBpcyBpbiB0aGUgc2FtZSBkb2N1bWVudDsKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0luU2FtZURvY3VtZW50ICggWG1sQ3Vyc29yIGN1cnNvciApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGN1cnNvciBpcyBiZWZvcmUsIAotICAgICAqIGFmdGVyLCBvciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgc3BlY2lmaWVkIGN1cnNvci4gPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpIDwgMDwvY29kZT4gbWVhbnMgYSBpcyB0byB0aGUgbGVmdCBvZiBiLjxici8+Ci0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPT0gMDwvY29kZT4gbWVhbnMgYSBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBiLjxici8+Ci0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPiAwPC9jb2RlPiBtZWFucyBhIGlzIHRvIHRoZSByaWdodCBvZiBiLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFRoZSBzb3J0IG9yZGVyIG9mIGN1cnNvcnMgaW4gdGhlIGRvY3VtZW50IGlzIHRoZSB0b2tlbiBvcmRlci4KLSAgICAgKiBGb3IgZXhhbXBsZSwgaWYgY3Vyc29yICJhIiBpcyBhdCBhIFNUQVJUIHRva2VuIGFuZCB0aGUgY3Vyc29yICJiIgotICAgICAqIGlzIGF0IGEgdG9rZW4gd2l0aGluIHRoZSBjb250ZW50cyBvZiB0aGUgc2FtZSBlbGVtZW50LCB0aGVuCi0gICAgICogYS5jb21wYXJlUG9zaXRpb24oYikgd2lsbCByZXR1cm4gLTEsIG1lYW5pbmcgdGhhdCB0aGUgcG9zaXRpb24KLSAgICAgKiBvZiBhIGlzIGJlZm9yZSBiLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAotICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgMSBpZiB0aGlzIGN1cnNvciBpcyBhZnRlciB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgMCBpZiAKLSAgICAgKiB0aGlzIGN1cnNvciBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgCi0gICAgICogLTEgaWYgdGhpcyBjdXJzb3IgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgotICAgICAqIEB0aHJvd3MgIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjdXJzb3IgaXMgbm90IGluIHRoZSBzYW1lIGRvY3VtZW50IGFzIHRoaXMgY3Vyc29yLgotICAgICAqLwotCi0gICAgaW50IGNvbXBhcmVQb3NpdGlvbiAoIFhtbEN1cnNvciBjdXJzb3IgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIChvciBiZWZvcmUpCi0gICAgICogdGhlIHNwZWNpZmllZCBjdXJzb3IuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIAotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpICZsdDsgMCA8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBjdXJzb3IgIFRoZSBjdXJzb3Igd2hvc2UgcG9zaXRpb24gc2hvdWxkIGJlIGNvbXBhcmVkCi0gICAgICogd2l0aCB0aGlzIGN1cnNvci4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjdXJzb3I7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzTGVmdE9mICggWG1sQ3Vyc29yIGN1cnNvciApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhpcyBjdXJzb3IgaXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGN1cnNvci4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgCi0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPT0gMCA8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBjdXJzb3IgIFRoZSBjdXJzb3Igd2hvc2UgcG9zaXRpb24gc2hvdWxkIGJlIGNvbXBhcmVkCi0gICAgICogd2l0aCB0aGlzIGN1cnNvci4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgY3Vyc29yIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIAotICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0F0U2FtZVBvc2l0aW9uQXMgKCBYbWxDdXJzb3IgY3Vyc29yICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgcmlnaHQgb2YgKG9yIGFmdGVyKQotICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcyAKLSAgICAgKiA8Y29kZT5hLmNvbXBhcmVQb3NpdGlvbihiKSAmZ3Q7IDAgPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAotICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIGN1cnNvcjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNSaWdodE9mICggWG1sQ3Vyc29yIGN1cnNvciApOwotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFF1ZXJ5IGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoaXMKLSAgICAgKiBjdXJzb3IgaXMgaW4uIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBUaGUgcXVlcnkgbWF5IGJlIGEgU3RyaW5nIG9yIGEgY29tcGlsZWQgcXVlcnkuIFlvdSBjYW4gcHJlY29tcGlsZQotICAgICAqIGFuIFhRdWVyeSBleHByZXNzaW9uIHVzaW5nIHRoZSBYbWxCZWFucy5jb21waWxlUXVlcnkgbWV0aG9kLiA8YnIvPjxicj4KLSAgICAgKiAKLSAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCi0gICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246Ci0gICAgICogPHByZT4KLSAgICAgKiBYbWxDdXJzb3IgcmVzdWx0cyA9IGN1cnNvci5leGVjUXVlcnkoInB1cmNoYXNlLW9yZGVyL2xpbmUtaXRlbVtwcmljZSAmbHQ7PSAyMC4wMF0iKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHF1ZXJ5ICBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KLSAgICAgKiBAcmV0dXJuICBBIGN1cnNvciBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS4KLSAgICAgKiBAdGhyb3dzICBYbWxSdW50aW1lRXhjZXB0aW9uICBJZiB0aGUgcXVlcnkgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLgotICAgICAqLwotCi0gICAgWG1sQ3Vyc29yIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSApOwotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFF1ZXJ5IGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoaXMKLSAgICAgKiBjdXJzb3IgaXMgaW4sIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHF1ZXJ5ICBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBxdWVyeSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLQotICAgIFhtbEN1cnNvciBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnksIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgZGNvdW1lbnQgYXQgYSBwYXJ0aWN1bGFyIHBvaW50Ci0gICAgICogaW4gdGltZS4gIEl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZAotICAgICAqIHNpbmNlIHRoYXQgcG9pbnQgaW4gdGltZS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgQ2hhbmdlU3RhbXAKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkb2N1bWVudCBhc3NvaWF0ZWQgd2l0aCB0aGlzIENoYW5nZVN0YW1wCi0gICAgICAgICAqIGhhcyBiZWVuIGFsdGVyZWQgc2luY2UgdGhlIENoYW5nZVN0YW1wIGhhZCBiZWVuIGNyZWF0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkICggKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhbXAgZm9yIHRoZSBkb2N1bWVudCB0aGUgY3VycmVudCBjdXJzb3IgaXMgaW4uIAotICAgICAqIFRoaXMgY2hhbmdlIHN0YW1wIGNhbiBiZSBxdWVyaWVkIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZSB0byBmaW5kIG91dAotICAgICAqIGlmIHRoZSBkb2N1bWVudCBoYXMgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgY2hhbmdlIHN0YW1wIGZvciB0aGUgZG9jdW1lbnQgdGhlIGN1cnJlbnQgY3Vyc29yIGlzIGluLgotICAgICAqLwotICAgIENoYW5nZVN0YW1wIGdldERvY0NoYW5nZVN0YW1wICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIG9mIFhtbEJvb2ttYXJrIGNhbiBiZSB1c2VkIHRvIGFubm90YXRlIGFuIFhNTCBkb2N1bWVudC4KLSAgICAgKiBUaGlzIGNsYXNzIGlzIGFic3RyYWN0IHRvIHByZXZlbnQgcGFydGllcyBmcm9tIGluYWR2ZXJ0ZW50bHkgCi0gICAgICogaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVycycgYm9va21hcmtzIHdpdGhvdXQgZXhwbGljaXRseQotICAgICAqIHNoYXJpbmcgYSBib29rbWFyayBjbGFzcy4KLSAgICAgKi8KLQotICAgIGFic3RyYWN0IGNsYXNzIFhtbEJvb2ttYXJrCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIHN0cm9uZ2x5LXJlZmVyZW5jZWQgYm9va21hcmsuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrICggKSB7IHRoaXMoIGZhbHNlICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgYm9va21hcmsuCi0gICAgICAgICAqIEBwYXJhbSB3ZWFrIHRydWUgaWYgdGhlIGRvY3VtZW50J3MgcmVmZXJlbmNlIHRvIHRoZSBib29rbWFyayBzaG91bGQgYmUgYSBXZWFrUmVmZXJlbmNlCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrICggYm9vbGVhbiB3ZWFrICkKLSAgICAgICAgewotICAgICAgICAgICAgX3JlZiA9IHdlYWsgPyBuZXcgV2Vha1JlZmVyZW5jZSggdGhpcyApIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgdGhlIGNyZWF0ZUN1cnNvciBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IGN1cnNvciB3aGljaCBpcwotICAgICAgICAgKiBwb3NpdGlvbmVkIGF0IHRoZSBzYW1lIHNwbGFjZSBhcyB0aGUgYm9va21hcmsuICBJdCBpcyBtdWNoIG1vcmUKLSAgICAgICAgICogZWZmaWNpZW50IHRvIGNhbGwgdG9Cb29rbWFyayBvbiBhbiBleGlzdGluZyBjdXJzb3IgdGhhbiBpdAotICAgICAgICAgKiBpcyB0byBjcmVhdGUgYSBuZXcgY3Vyc29yLiAgSG93ZXZlciwgdG9Cb29rbWFyayBtYXkgZmFpbCBpZiB0aGUKLSAgICAgICAgICogYm9va21hcmsgaXMgaW4gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgY3Vyc29yLiAgSXQgaXMKLSAgICAgICAgICogdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcyB3aGVyZSBjcmVhdGVDdXJzb3IgbmVlZHMgdG8gYmUgY2FsbGVkCi0gICAgICAgICAqIG9uIHRoZSBib29rbWFyay4gIFN1YnNlcXVlbnQgbmF2aWdhdGlvbnMgdG8gYm9va21hcmsKLSAgICAgICAgICogcG9zaXRpb25zIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZSBsYXN0IGN1cnNvciB0bwotICAgICAgICAgKiBpbXByb3ZlIHBlcmZvcm1hY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50TWFyayA9PSBudWxsID8gbnVsbCA6IF9jdXJyZW50TWFyay5jcmVhdGVDdXJzb3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNb3ZlcyB0aGUgZ2l2ZW4gY3Vyc29yIHRvIHRoaXMgYm9va21hcmssIGFuZCByZXR1cm5zIGl0LgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBmaW5hbCBYbWxDdXJzb3IgdG9Cb29rbWFyayAoIFhtbEN1cnNvciBjICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGMgPT0gbnVsbCB8fCAhYy50b0Jvb2ttYXJrKCB0aGlzICkgPyBjcmVhdGVDdXJzb3IoKSA6IGM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQga2V5IGZvciBib29rbWFya3MgaXMgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMKLSAgICAgICAgICogdGhlbS4gIFRoaXMgd2F5LCBtdWx0aXBsZSBwYXJ0aWVzIHVzaW5nIGJvb2ttYXJrcyBpbiB0aGUKLSAgICAgICAgICogc2FtZSBpbnN0YW5jZSBkb2N1bWVudCB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNob3RoZXIuCi0gICAgICAgICAqIE9uZSBjYW4sIGhvd2V2ZXIsIG92ZXJyaWRlIGdldEtleSgpIHRvIHVzZSBhIGtleSBvdGhlciB0aGFuCi0gICAgICAgICAqIHRoZSBjbGFzcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1hcmsgaXMgc2V0IGJ5IHRoZSBob3N0IGRvY3VtZW50OyBpdCBpcyBjYXBhYmxlIG9mCi0gICAgICAgICAqIHJldHVybmluZyBhbiBYbWxDdXJzb3IgaW1wbGVtZW50YXRpb24gYXQgdGhlIGxvY2F0aW9uIG9mCi0gICAgICAgICAqIHRoZSBib29rbWFyay4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgICAgICAgWG1sTWFyayAgIF9jdXJyZW50TWFyazsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiBub24tbnVsbCwgdGhlIHJlZiBpcyB1c2VkIGJ5IHRoZSBob3N0IGRvY3VtZW50Ci0gICAgICAgICAqIHRvIG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBib29rbWFyay4gIElmIGl0IGlzIGEgd2VhawotICAgICAgICAgKiByZWZlcmVuY2UsIHRoZSBob3N0IGRvY3VtZW50IHdpbGwgbm90IHByZXZlbnQgdGhlIEJvb2ttYXJrCi0gICAgICAgICAqIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGZpbmFsIFJlZmVyZW5jZSBfcmVmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGFic3RyYWN0IHtAbGluayBYbWxDdXJzb3J9IGZhY3RvcnkuCi0gICAgICogSW1wbGVtZW50YXRpb25zIG9mIFhtbEN1cnNvciBpbXBsZW1lbnQgWG1sTWFyayB0byBiZSBhYmxlIHRvCi0gICAgICogcmVjb25zdGl0dXRlIGEgY3Vyc29yIGZyb20gYSBib29rbWFyay4gV2hlbiBjb250ZW50IG1vdmVzIGJldHdlZW4KLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIHRoZSBYbWxNYXJrIGlzIHNldCB0byB0aGUgaW1wbG1lbnRhdGlvbidzIHdoaWNoCi0gICAgICogcmVjaWV2ZXMgdGhlIG5ldyBjb250ZW50LgotICAgICAqLwotCi0gICAgaW50ZXJmYWNlIFhtbE1hcmsKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBib29rbWFyayB0byB0aGUgZG9jdW1lbnQgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKgotICAgICAqIFRoZSBib29rbWFyayBpcyBhdHRhY2hlZCB0byB0aGUgdG9rZW4gaW4gdGhlIHRyZWUgaW1tZWRpYXRlbHkgCi0gICAgICogYWZ0ZXIgdGhlIGN1cnNvci4gSWYgdGhlIHRyZWUgaXMgbWFuaXB1bGF0ZWQgdG8gbW92ZQotICAgICAqIHRoYXQgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHBsYWNlLCB0aGUgYm9va21hcmsgbW92ZXMgd2l0aCBpdC4KLSAgICAgKiBJZiB0aGUgdHJlZSBpcyBtYW5pcHVsYXRlZCB0byBkZWxldGUgdGhhdCB0b2tlbiBmcm9tIHRoZQotICAgICAqIHRyZWUsIHRoZSBib29rbWFyayBpcyBvcnBoYW5lZC4gQ29weSBvcGVyYXRpb25zIGRvIG5vdCBjb3B5Ci0gICAgICogYm9va21hcmtzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgYm9va21hcmsgIFRoZSBib29rbWFyayB0byBzZXQuCi0gICAgICovCi0KLSAgICB2b2lkIHNldEJvb2ttYXJrICggWG1sQm9va21hcmsgYm9va21hcmsgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgCi0gICAgICogYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4gSWYgdGhlcmUgaXMgbm8gYm9va21hcmsgd2hvc2Uga2V5IGlzIAotICAgICAqIGdpdmVuIGJ5IHRoZSBzcGVjaWZpZWQga2V5IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCBudWxsIGlzIHJldHVybmVkLiAKLSAgICAgKiBJZiB0aGUge0BsaW5rIFhtbEN1cnNvci5YbWxCb29rbWFyayNnZXRLZXkoKSBnZXRLZXl9IG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiBvbiAKLSAgICAgKiB0aGUgYm9va21hcmssIHRoZW4gdGhlIGJvb2ttYXJrJ3MgY2xhc3MgaXMgdXNlZCBhcyB0aGUga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSAga2V5ICBUaGUga2V5IGZvciB0aGUgYm9va21hcmsgdG8gcmV0cmlldmUuCi0gICAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBib29rbWFyazsgbnVsbCBpZiB0aGVyZSBpcyBubyBib29rbWFyawotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICovCi0KLSAgICBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGJvb2ttYXJrIHdob3NlIGtleSBpcyBzcGVjaWZpZWQsIGlmIHRoZSBib29rbWFyawotICAgICAqIGV4aXN0cyBhdCB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSAga2V5ICBUaGUgZm9yIHRoZSBib29rbWFyayB0byBjbGVhci4KLSAgICAgKi8KLQotICAgIHZvaWQgY2xlYXJCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIGJvb2ttYXJrcyBhdCB0aGlzIGxvY2F0aW9uLCBhZGRpbmcgdGhlbSB0bwotICAgICAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gQm9va21hcmtzIGhlbGQgYnkgd2VhayByZWZlcmVuY2VzIGFyZQotICAgICAqIGFkZGVkIHRvIHRoaXMgY29sbGVjdGlvbiBhcyBXZWFrIHJlZmVyZW5jZWQgb2JqZWN0cyBwb2ludGluZyB0byB0aGUKLSAgICAgKiBib29rbWFyay4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxpc3RUb0ZpbGwgIFRoZSBjb2xsZWN0aW9uIHRoYXQgd2lsbCBjb250YWluIGJvb2ttYXJrcwotICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqLwotCi0gICAgdm9pZCBnZXRBbGxCb29rbWFya1JlZnMgKCBDb2xsZWN0aW9uIGxpc3RUb0ZpbGwgKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIFhNTCB0aGF0IGlzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yLgotICAgICAqIAotICAgICAqIEZvciB0aGUgVEVYVCwgQVRUUiwgTkFNRVNQQUNFLCBDT01NRU5UIGFuZCBQUk9DSU5TVCB0b2tlbnMsIGEgc2luZ2xlIAotICAgICAqIHRva2VuIGlzIHJlbW92ZWQuIEZvciBhIFNUQVJUIHRva2VuLCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGFuZCBhbGwgCi0gICAgICogb2YgaXRzIGNvbnRlbnRzIGFyZSByZW1vdmVkLiBGb3IgYWxsIG90aGVyIHRva2VucywgdGhpcyBpcyBhIG5vLW9wLiAKLSAgICAgKiBZb3UgY2Fubm90IHJlbW92ZSBhIFNUQVJURE9DLgotICAgICAqIAotICAgICAqIFRoZSBjdXJzb3JzIGxvY2F0ZWQgaW4gdGhlIFhNTCB0aGF0IHdhcyByZW1vdmVkIGFsbCBjb2xsYXBzZSB0byB0aGUgCi0gICAgICogc2FtZSBsb2NhdGlvbi4gQWxsIGJvb2ttYXJrcyBpbiB0aGlzIFhNTCB3aWxsIGJlIG9ycGhhbmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgcmVtb3ZlZDsgZmFsc2Ugb25seSBpZiB0aGUgY3Vyc29yIGlzIAotICAgICAqIGp1c3QgYmVmb3JlIEVORCBvciBFTkRET0MgdG9rZW4uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgY3Vyc29yIGlzIGF0IGEgCi0gICAgICogU1RBUlRET0MgdG9rZW4uCi0gICAgICovCi0KLSAgICBib29sZWFuIHJlbW92ZVhtbCAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgWE1MIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbgotICAgICAqIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvciwgc2hpZnRpbmcgWE1MIGF0IHRoYXQgbG9jYXRpb24gCi0gICAgICogdG8gdGhlIHJpZ2h0IHRvIG1ha2Ugcm9vbS4gRm9yIHRoZSBURVhULCBBVFRSLCBOQU1FU1BBQ0UsIAotICAgICAqIENPTU1FTlQgYW5kIFBST0NJTlNUIHRva2VucywgYSBzaW5nbGUgdG9rZW4gaXMgbW92ZWQuIEZvciBhIHN0YXJ0IHRva2VuLCB0aGUKLSAgICAgKiBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBtb3ZlZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMKLSAgICAgKiBpcyBhIG5vLW9wLgotICAgICAqIAotICAgICAqIFRoZSBib29rbWFya3MgbG9jYXRlZCBpbiB0aGUgWE1MIHRoYXQgd2FzIG1vdmVkIGFsc28gbW92ZSB0byB0aGUKLSAgICAgKiBuZXcgbG9jYXRpb247IHRoZSBjdXJzb3JzIGRvbid0IG1vdmUgd2l0aCB0aGUgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciBhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIFhNTCBzaG91bGQKLSAgICAgKiBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIG1vdmVkOyBmYWxzZSBvbmx5IGlmIHRoZSBjdXJzb3IgaXMgCi0gICAgICoganVzdCBiZWZvcmUgRU5EIG9yIEVORERPQyB0b2tlbi4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICBib29sZWFuIG1vdmVYbWwgKCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBYTUwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uCi0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+dG9IZXJlPC9lbT4gY3Vyc29yLiBGb3IgdGhlIFRFWFQsIEFUVFIsIE5BTUVTUEFDRSwgCi0gICAgICogQ09NTUVOVCBhbmQgUFJPQ0lOU1QgdG9rZW5zLCBhIHNpbmdsZSB0b2tlbiBpcyBjb3BpZWQuICBGb3IgYSBzdGFydCB0b2tlbiwgCi0gICAgICogdGhlIGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgY29udGVudHMgYXJlIGNvcGllZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMKLSAgICAgKiBpcyBhIG5vLW9wLgotICAgICAqIAotICAgICAqIFRoZSBjdXJzb3JzIGFuZCBib29rbWFya3MgbG9jYXRlZCBpbiB0aGUgWE1MIHRoYXQgd2FzIGNvcGllZCBhcmUgYWxzbyBjb3BpZWQgCi0gICAgICogdG8gdGhlIG5ldyBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciBhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIFhNTCBzaG91bGQKLSAgICAgKiBiZSBjb3BpZWQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBjb3BpZWQ7IGZhbHNlIGlmIHRoZSB0b2tlbiBzdXBwb3J0cyB0aGUgb3BlcmF0aW9uLAotICAgICAqIGJ1dCBub3RoaW5nIHdhcyBjb3BpZWQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBjb3B5WG1sICggWG1sQ3Vyc29yIHRvSGVyZSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIgKFNUQVJURE9DIE9SIFNUQVJUKSBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqIHRoaXMgY3Vyc29yLiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuIERvZXMKLSAgICAgKiBub3QgcmVtb3ZlIGF0dHJpYnV0ZXMgb3IgbmFtc3BhY2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiByZW1vdmVYbWxDb250ZW50cyAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciAoU1RBUlRET0MgT1IgU1RBUlQpIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvci4KLSAgICAgKiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuIERvZXMgbm90IG1vdmUgYXR0cmlidXRlcyBvcgotICAgICAqIG5hbWVzcGFjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBtb3ZlWG1sQ29udGVudHMgKCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyIChTVEFSVERPQyBPUiBTVEFSVCkgaW1tZWRpYXRlbHkgdG8KLSAgICAgKiB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+dG9IZXJlPC9lbT4gY3Vyc29yLgotICAgICAqIEZvciBhbGwgb3RoZXIgc2l0dWF0aW9ucywgcmV0dXJucyBmYWxzZS4gIERvZXMgbm90IGNvcHkgYXR0cmlidXRlcyBvcgotICAgICAqIG5hbWVzcGFjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkCi0gICAgICogYmUgY29waWVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gY29weVhtbENvbnRlbnRzICggWG1sQ3Vyc29yIHRvSGVyZSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgY2hhcmFjdGVycyB1cCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyLCBjb3VudGluZyByaWdodCBmcm9tIAotICAgICAqIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gdG8gdGhlIGNoYXJhY3RlciBhdCA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPi4gVGhlIAotICAgICAqIHNwYWNlIHJlbWFpbmluZyBmcm9tIHJlbW92aW5nIHRoZSBjaGFyYWN0ZXJzIGNvbGxhcHNlcyB1cCB0byB0aGlzIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIHJlbW92ZS4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgaW50IHJlbW92ZUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBjaGFyYWN0ZXJzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbW1lZGlhdGVseSAKLSAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIGN1cnNvci4gQ2hhcmFjdGVycyBhcmUgY291bnRlZCB0byB0aGUgcmlnaHQgdXAgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyLiBYTUwgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIGN1cnNvciBpcyAKLSAgICAgKiBzaGlmdGVkIHRvIHRoZSByaWdodCB0byBtYWtlIHJvb20uIFRoZSBzcGFjZSByZW1haW5pbmcgZnJvbSBtb3ZpbmcgdGhlIAotICAgICAqIGNoYXJhY3RlcnMgY29sbGFwc2VzIHVwIHRvIHRoaXMgY3Vyc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCi0gICAgICogbG9jYXRpb24gdG8gbW92ZS4KLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciB0byB3aGljaCB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgbW92ZWQuCi0gICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBtb3ZlZC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICBpbnQgbW92ZUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50LCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgY2hhcmFjdGVycyB0byB0aGUgcG9zaXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBjdXJzb3IuCi0gICAgICogQ2hhcmFjdGVycyBhcmUgY291bnRlZCB0byB0aGUgcmlnaHQgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlci4gCi0gICAgICogWE1MIGFmdGVyIHRoZSBkZXN0aW5hdGlvbiBjdXJzb3IgaXMgc2hpZnRlZCB0byB0aGUgcmlnaHQgdG8gbWFrZSByb29tLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCi0gICAgICogbG9jYXRpb24gdG8gY29weS4KLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciB0byB3aGljaCB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgotICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIGludCBjb3B5Q2hhcnMgKCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQsIFhtbEN1cnNvciB0b0hlcmUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCB0ZXh0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIHRleHQgdG8gaW5zZXJ0LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0Q2hhcnMgKCBTdHJpbmcgdGV4dCApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIAotICAgICAqIHRoZSBlbGVtZW50IHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIAotICAgICAqIHRoZSBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEVsZW1lbnQgKCBTdHJpbmcgbG9jYWxOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKLSAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCBzcGVjaWZpZWQgbmFtZXNwYWNlIAotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGVsZW1lbnQncyBuYW1lc3BhY2UuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHF1YWxpZmllZCBuYW1lLiBBZnRlciB0aGUgZWxlbWVudCBpcyBpbnNlcnRlZCwgdGhpcyBjdXJzb3IgaXMgYmV0d2VlbiBpdHMgc3RhcnQgCi0gICAgICogYW5kIGVuZC4gVGhpcyBjdXJzb3IgY2FuIHRoZW4gYmUgdXNlZCB0byBpbnNlcnQgYWRkaXRpb25hbCBYTUwgaW50byAKLSAgICAgKiB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGxvY2FsIG5hbWUuIEFmdGVyIHRoZSBlbGVtZW50IGlzIGluc2VydGVkLCB0aGlzIGN1cnNvciBpcyBiZXR3ZWVuIGl0cyBzdGFydCAKLSAgICAgKiBhbmQgZW5kLiBUaGlzIGN1cnNvciBjYW4gdGhlbiBiZSB1c2VkIHRvIGluc2VydCBhZGRpdGlvbmFsIFhNTCBpbnRvIAotICAgICAqIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBsb2NhbE5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGxvY2FsIG5hbWUgYW5kIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIEFmdGVyIHRoZSBlbGVtZW50IAotICAgICAqIGlzIGluc2VydGVkLCB0aGlzIGN1cnNvciBpcyBiZXR3ZWVuIGl0cyBzdGFydCBhbmQgZW5kLiBUaGlzIGN1cnNvciAKLSAgICAgKiBjYW4gdGhlbiBiZSB1c2VkIHRvIGluc2VydCBhZGRpdGlvbmFsIFhNTCBpbnRvIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBlbGVtZW50J3MgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgYmVnaW5FbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIHRoZQotICAgICAqIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBhbmQgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIGNvbnRlbnQgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFFOYW1lIG5hbWUsIFN0cmluZyB0ZXh0ICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKLSAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSBjb250ZW50IGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRFbGVtZW50V2l0aFRleHQgKCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdGV4dCApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgdGhlCi0gICAgICogZWxlbWVudCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUsIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UsIAotICAgICAqIGFuZCBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGVsZW1lbnQncyBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtICB0ZXh0ICBUaGUgY29udGVudCBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHRleHQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0Ci0gICAgICogdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbG9jYWxOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0Ci0gICAgICogdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lIGFuZCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtICB1cmkgIFRoZSBVUkkgZm9yIHRoZSBuZXcgYXR0cmlidXRlJ3MgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBhdHRyaWJ1dGUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAotICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBTdHJpbmcgTmFtZSwgU3RyaW5nIHZhbHVlICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGFuIGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLCBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUncyBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAotICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgCi0gICAgICogZ2l2aW5nIGl0IHRoZSBzcGVjaWZpZWQgcHJlZml4IGFuZCBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtICBwcmVmaXggIFRoZSBwcmVmaXggZm9yIHRoZSBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtICBuYW1lc3BhY2UgIFRoZSBVUkkgZm9yIHRoZSBuYW1lc3BhY2UuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnROYW1lc3BhY2UgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhbiBYTUwgY29tbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKLSAgICAgKiBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIG5ldyBjb21tZW50J3MgY29udGVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydENvbW1lbnQgKCBTdHJpbmcgdGV4dCApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhbiBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKLSAgICAgKiBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCB0YXJnZXQgYW5kIHRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0YXJnZXQgIFRoZSB0YXJnZXQgZm9yIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIG5ldyBwcm9jZXNzaW5nIGluc3RydWN0aW9uJ3MgdGV4dC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydFByb2NJbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRleHQgKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTAyZTM2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSI+eHM6ZGF0ZTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIERhdGV9LCBhbmQge0BsaW5rIEdEYXRlfS4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxEYXRlIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2RhdGUiKTsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIERhdGUgZGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoRGF0ZSBkKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbERhdGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbERhdGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNi0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2LTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlVGltZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2M5NjUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiPnhzOmRhdGVUaW1lPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgRGF0ZX0sIGFuZCB7QGxpbmsgR0RhdGV9LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERhdGVUaW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2RhdGVUaW1lIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIERhdGUgZGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoRGF0ZSBkKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbERhdGVUaW1lfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEYXRlVGltZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEYXRlVGltZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEYXRlVGltZX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2LTE0VDEyOjAwOjAwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYtMTRUMTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGVjaW1hbC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwY2VlMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGVjaW1hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBCaWdEZWNpbWFsfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRGVjaW1hbCBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9kZWNpbWFsIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfSAqLwotICAgIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfSAqLwotICAgIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgYmQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJpZ0RlY2ltYWxWYWx1ZX0KLSAgICAgKiovCi0gICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0QmlnRGVjaW1hbFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChCaWdEZWNpbWFsIGJkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRGVjaW1hbH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRGVjaW1hbH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRGVjaW1hbH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sRGVjaW1hbH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0LjU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQuNTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvY3VtZW50UHJvcGVydGllcy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvY3VtZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTQ5NWZmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb2N1bWVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgaW5mb3JtYXRpb24gdG8gYW4gWE1MCi0gKiBkb2N1bWVudC4gIEl0IGFsc28gZGVmaW5lcyBzZXZlcmFsIHdlbGwta25vd24gdHlwZXMgb2YKLSAqIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGF0dGFjaGVkIG9yIGZvdW5kIG9uIGEgZG9jdW1lbnQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50ZWQgdG8gYXNzb2NpYXRlIGEgZmlsZW5hbWUKLSAqIHdpdGggdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYW4geG1sIG9iamVjdCAieG9iaiIuICBUaGlzCi0gKiBjb3VsZCBiZSBkb25lIHZpYSB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gKiA8cD4KLSAqIHRva2VuU291cmNlLmRvY3VtZW50UHJvcGVydGllcygpLnNldChYbWxEb2N1bWVudFByb3BlcnRpZXMuTkFNRSwgIk15RmlsZW5hbWUueG1sIik7Ci0gKiA8cD4KLSAqIFRvIGZldGNoIHRoZSBmaWxlbmFtZSBsYXRlciwgZ2l2ZW4gYW4geG9iajIgYW55d2hlcmUgaW4gdGhlCi0gKiBzYW1lIGRvY3VtZW50LCB5b3UgY2FuIHdyaXRlOgotICogPHA+Ci0gKiBmaWxlbmFtZSA9IChTdHJpbmcpdG9rZW5Tb3VyY2UuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0KFhtbERvY3VtZW50UHJvcGVydGllcy5OQU1FKTsKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbERvY3VtZW50UHJvcGVydGllcwotewotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIFhNTCBkb2N1bWVudCBmaWxlLiAgVHlwaWNhbGx5IGEgVVJMLCBidXQgbWF5Ci0gICAgICogYmUgYW55IFN0cmluZy4KLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgbmFtZSB0byBzZXQKLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRTb3VyY2VOYW1lCi0gICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXRTb3VyY2VOYW1lICggU3RyaW5nIHNvdXJjZU5hbWUgKSB7IHB1dCggU09VUkNFX05BTUUsIHNvdXJjZU5hbWUgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFhNTCBkb2N1bWVudCBmaWxlLiAgVHlwaWNhbGx5IGEgVVJMLCBidXQgbWF5Ci0gICAgICogYmUgYW55IFN0cmluZy4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRTb3VyY2VOYW1lCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBTT1VSQ0VfTkFNRSApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgWE1MIGRvY3VtZW50LiAgU2hvdWxkIGJlIGEgdmFsaWQKLSAgICAgKiBYTUwgZW5jb2Rpbmcgc3RyaW5nLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgSVNPIGVuY29kaW5nIG5hbWUKLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2RpbmcKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXRFbmNvZGluZyAoIFN0cmluZyBlbmNvZGluZyApIHsgcHV0KCBFTkNPRElORywgZW5jb2RpbmcgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBYTUwgZG9jdW1lbnQsIGFzIGFuIElTTyBlbmNvZGluZyBuYW1lLgotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRDaGFyYWN0ZXJFbmNvZGluZwotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIEVOQ09ESU5HICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBYTUwgdmVyc2lvbiBzdHJpbmcgdG8gdXNlIGluIHRoZSAmbHQmIzYzO3htbCYjNjM7Jmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKiAoVGhlIFhNTCBzcGVjaWZpY2F0aW9uIGlzIHF1aXRlIHN0YWJsZSBhdCAiMS4wIi4pCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIFhNTCB2ZXJzaW9uIHN0cmluZwotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldFZlcnNpb24gKCBTdHJpbmcgdmVyc2lvbiApIHsgcHV0KCBWRVJTSU9OLCB2ZXJzaW9uICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYTUwgdmVyc2lvbiBzdHJpbmcgdXNlZCBpbiB0aGUgJmx0JiM2Mzt4bWwmIzYzOyZndDsgZGVjbGFyYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbiAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBWRVJTSU9OICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBET0NUWVBFIG5hbWUgdXNlIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBkb2N0eXBlbmFtZSB0aGUgZG9jdHlwZW5hbWUKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXREb2N0eXBlTmFtZSAoIFN0cmluZyBkb2N0eXBlbmFtZSApIHsgcHV0KCBET0NUWVBFX05BTUUsIGRvY3R5cGVuYW1lICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBET0NUWVBFIG5hbWUgdXNlZCBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N0eXBlTmFtZSAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBET0NUWVBFX05BTUUgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIERPQ1RZUEUgcHVibGljIElEIHRvIHVzZSBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gcHVibGljaWQgdGhlIHB1YmxpYyBJRAotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldERvY3R5cGVQdWJsaWNJZCAoIFN0cmluZyBwdWJsaWNpZCApIHsgcHV0KCBET0NUWVBFX1BVQkxJQ19JRCwgcHVibGljaWQgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIERPQ1RZUEUgcHVibGljIElEIHVzZWQgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVB1YmxpY0lkICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfUFVCTElDX0lEICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBET0NUWVBFIHN5c3RlbSBJRCB0byB1c2UgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIHN5c3RlbWlkIHRoZSBzeXN0ZW0gSUQKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXREb2N0eXBlU3lzdGVtSWQgKCBTdHJpbmcgc3lzdGVtaWQgKSB7IHB1dCggRE9DVFlQRV9TWVNURU1fSUQsIHN5c3RlbWlkICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBET0NUWVBFIHN5c3RlbSBJRCB1c2VkIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVN5c3RlbUlkICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfU1lTVEVNX0lEICk7IH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgZGlnZXN0IHVzZWQgdG8gc3VtbWFyaXplIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZGlnZXN0IHRoZSBieXRlcyBvZiB0aGUgZGlnZXN0Ci0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRNZXNzYWdlRGlnZXN0Ci0gICAgICovIAotICAgIHB1YmxpYyB2b2lkICAgc2V0TWVzc2FnZURpZ2VzdCggYnl0ZVtdIGRpZ2VzdCApIHsgcHV0KCBNRVNTQUdFX0RJR0VTVCwgZGlnZXN0ICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdCB1c2VkIHRvIHN1bW1hcml6ZSB0aGUgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRNZXNzYWdlRGlnZXN0Ci0gICAgICovIAotICAgIHB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZURpZ2VzdCggKSB7IHJldHVybiAoYnl0ZVtdKSBnZXQoIE1FU1NBR0VfRElHRVNUICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIChhIFN0cmluZykgZm9yCi0gICAgICogdGhlIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBYTUwgZG9jdW1lbnQgd2FzIGxvYWRlZC4KLSAgICAgKiBUaGlzIG5hbWUsIGlmIHByZXNlbnQsIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCi0gICAgICogZG9jdW1lbnQgd2hlbiByZXBvcnRpbmcgdmFsaWRhdGlvbiBvciBjb21pbGF0aW9uIGVycm9ycy4KLSAgICAgKgotICAgICAqIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKEZpbGUpIGFuZCBTY2hlbWFUeXBlTG9hZGVyLmxvYWRJbnN0YW5jZShGaWxlKQotICAgICAqIGJvdGggYXV0b21hdGljYWxseSBzZXQgdGhpcyB2YWx1ZSB0byB0aGUgZmlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU09VUkNFX05BTUUgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG9jdW1lbnQgZW5jb2RpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFTkNPRElORyA9IG5ldyBPYmplY3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2N1bWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkVSU0lPTiA9IG5ldyBPYmplY3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2MgdHlwZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRE9DVFlQRV9OQU1FID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvYyB0eXBlIHB1YmxpYyBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERPQ1RZUEVfUFVCTElDX0lEID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvYyB0eXBlIHN5c3RlbSBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERPQ1RZUEVfU1lTVEVNX0lEID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNIQSBtZXNzYWdlIGRpZ2VzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE1FU1NBR0VfRElHRVNUID0gbmV3IE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogQXR0YWNoZXMgYSB2YWx1ZSB0byB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQgY29udGFpbmluZwotICAgICAqIHRoZSBnaXZlbiB0b2tlbiBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhlcmUgY2FuIGJlIG9uZSB2YWx1ZSBmb3IgZWFjaCBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhdHRhY2ggdG8gdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgcHV0ICggT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbHVlIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCB1c2luZyBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhpcyBpcyB0aGUga2V5IHRoYXQgd2FzIHByZXZpb3VzbHkKLSAgICAgKiAgICAgICAgICAgICAgcGFzc2VkIHRvIHNldCB0byBzdG9yZSB0aGUgdmFsdWUuCi0gICAgICogQHJldHVybiAgICAgIFRoZSBzYXZlZCB2YWx1ZSwgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0ICggT2JqZWN0IGtleSApOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHZhbHVlIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCB1c2luZyBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhpcyBpcyB0aGUga2V5IHRoYXQgd2FzIHByZXZpb3VzbHkKLSAgICAgKiAgICAgICAgICAgICAgcGFzc2VkIHRvIHNldCB0byBzdG9yZSB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCByZW1vdmUgKCBPYmplY3Qga2V5ICk7Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwNzgwYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRG91YmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RvdWJsZSI+eHM6ZG91YmxlPC9hPiB0eXBlLgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBkb3VibGUuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERvdWJsZSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9kb3VibGUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlICovCi0gICAgZG91YmxlIGdldERvdWJsZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGRvdWJsZSAqLwotICAgIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERvdWJsZVZhbHVlfQotICAgICAqKi8KLSAgICBkb3VibGUgZG91YmxlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBkb3VibGUKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RG91YmxlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGRvdWJsZSB2KTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRG91YmxlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEb3VibGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzLjM0ZSs1NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjMuMzRlKzU3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRHVyYXRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFiNTEzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiI+eHM6ZHVyYXRpb248L2E+IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEge0BsaW5rIEdEdXJhdGlvbn0uCi0gKiAKLSAqIEBzZWUgR0R1cmF0aW9uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbER1cmF0aW9uIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2R1cmF0aW9uIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259ICovCi0gICAgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259ICovCi0gICAgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0R1cmF0aW9uVmFsdWV9Ci0gICAgICoqLwotICAgIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEdXJhdGlvblZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGdkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRHVyYXRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbER1cmF0aW9ufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbER1cmF0aW9ufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbER1cmF0aW9ufSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1AxWTJNVDJIJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1AxWTJNVDJIJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUSUVTLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRJRVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNjU0ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRJRVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIj54czpFTlRJVElFUzwvYT4gdHlwZSwKLSAqIGEgbGlzdCB0eXBlLgotICogPHA+Ci0gKiBBIGxpc3QgdHlwZS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRJRVMgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRJRVMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbEVOVElUWX0gdmFsdWVzICoqLwotICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSAqLwotICAgIHZvaWQgc2V0TGlzdFZhbHVlKExpc3QgbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCBsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgWG1sRU5USVRZfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoTGlzdCBsKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRU5USVRJRVN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUSUVTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUSUVTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUSUVTfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlNjhkZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSI+eHM6RU5USVRZPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRZIGV4dGVuZHMgWG1sTkNOYW1lCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRZIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxFTlRJVFl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUWX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFcnJvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2Q0NGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYXQgYSBzcGVjaWZpYyBYTUwgbG9jYXRpb24uCi0gKiA8cD4KLSAqIFRoZSBtZXNzYWdlIGNhbiBiZSBhbiBlcnJvciwgd2FybmluZywgb3Igc2ltcGxlIGluZm9ybWF0aW9uLCBhbmQKLSAqIGl0IG1heSBvcHRpb25hbGx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGxvY2F0aW9uIGluCi0gKiBhbiBYTUwgZG9jdW1lbnQuICBUaGUgY2xhc3MgaW5jbHVkZXMgbWV0aG9kcyBmb3IgZXh0cmFjdGluZwotICogdGhlIGxvY2F0aW9uIGFzIGEgbGluZSBudW1iZXIsIFhtbEN1cnNvciwgb3IgWG1sT2JqZWN0LCBhcwotICogd2VsbCBhcyBmb3Igb2J0YWluaW5nIGFuZCBtZXNzYWdlIGFuZCBzZXZlcml0eSBvZiB0aGUKLSAqIGVycm9yLiAKLSAqIAotICogQHNlZSBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXIKLSAqIEBzZWUgWG1sRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFcnJvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc291cmNlOwotICAgIHByaXZhdGUgaW50ICAgIF9zZXZlcml0eSA9IFNFVkVSSVRZX0VSUk9SOwotICAgIHByaXZhdGUgaW50ICAgIF9saW5lID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgICAgX2NvbHVtbiA9IC0xOwotICAgIHByaXZhdGUgaW50ICAgIF9vZmZzZXQgPSAtMTsKLSAgICAKLSAgICBwcml2YXRlIHRyYW5zaWVudCBYbWxDdXJzb3IgX2N1cnNvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBzcmMgVGhlIG9yaWdpbmFsIFhtbEVycm9yIHRvIGNvcHkuCi0gICAgICovCi0gICAgcHVibGljIFhtbEVycm9yKFhtbEVycm9yIHNyYykKLSAgICB7Ci0gICAgICAgIF9tZXNzYWdlID0gc3JjLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgX3NldmVyaXR5ID0gc3JjLmdldFNldmVyaXR5KCk7Ci0gICAgICAgIF9zb3VyY2UgPSBzcmMuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICBfbGluZSA9IHNyYy5nZXRMaW5lKCk7Ci0gICAgICAgIF9jb2x1bW4gPSBzcmMuZ2V0Q29sdW1uKCk7Ci0gICAgICAgIF9vZmZzZXQgPSBzcmMuZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIF9jdXJzb3IgPSBzcmMuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICogdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0LCBYbWxDdXJzb3IgY3Vyc29yKQotICAgIHsKLSAgICAgICAgX21lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBfc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgICAgICAgX3NvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICBfY29sdW1uID0gY29sdW1uOwotICAgICAgICBfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBfY3Vyc29yID0gY3Vyc29yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIG5vIGxvY2F0aW9uIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gZm9yTWVzc2FnZShtZXNzYWdlLCBTRVZFUklUWV9FUlJPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIHdpdGggbm8gbG9jYXRpb24gYW5kIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JTb3VyY2UobWVzc2FnZSwgc2V2ZXJpdHksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCBsb2NhdGVkIGluIHRoZSBnaXZlbiBmaWxlIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JTb3VyY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvckxvY2F0aW9uKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBzb3VyY2VOYW1lLCAtMSwgLTEsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIGZpbGUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yU291cmNlKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvckxvY2F0aW9uKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2VOYW1lLCAtMSwgLTEsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBnaXZlbiBmaWxlIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgMS1iYXNlZCBsaW5lIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIGNvbHVtbiB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSAwLWJhc2UgZmlsZSBjaGFyYWN0ZXIgb2Zmc2V0LCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JMb2NhdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBTRVZFUklUWV9FUlJPUiwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBnaXZlbiBmaWxlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCi0gICAgICogQHBhcmFtIHNvdXJjZU5hbWUgdGhlIFVSTCBvciBvdGhlciBuYW1lIGZvciB0aGUgZmlsZQotICAgICAqIEBwYXJhbSBsaW5lIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIDAtYmFzZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvckxvY2F0aW9uKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2VOYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHksIHNvdXJjZU5hbWUsIGxpbmUsIGNvbHVtbiwgb2Zmc2V0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIHBoeXNjaWFsIGxvY2F0aW9uIGFuZCBYbWxDdXJzb3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIDEtYmFzZWQgbGluZSBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIDEtYmFzZWQgY29sdW1uIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgMC1iYXNlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yTG9jYXRpb25BbmRDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0LCBYbWxDdXJzb3IgY3Vyc29yKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBzZXZlcml0eSwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIGN1cnNvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIGxvY2F0ZWQgYXQgdGhlIFhtbE9iamVjdCwgd2l0aCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSB4b2JqIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck9iamVjdChTdHJpbmcgbWVzc2FnZSwgWG1sT2JqZWN0IHhvYmopCi0gICAgewotICAgICAgICByZXR1cm4gZm9yT2JqZWN0KG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCB4b2JqKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgYXQgdGhlIFhtbE9iamVjdC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQotICAgICAqIEBwYXJhbSB4b2JqIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck9iamVjdChTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBYbWxPYmplY3QgeG9iaikKLSAgICB7Ci0gICAgICAgIGlmICh4b2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZm9yTWVzc2FnZShtZXNzYWdlLCBzZXZlcml0eSk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHhvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIFhtbEVycm9yIHJlc3VsdCA9IGZvckN1cnNvcihtZXNzYWdlLCBzZXZlcml0eSwgY3VyKTsKLSAgICAgICAgaWYgKGN1ciAhPSBudWxsKQotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCB0aGUgWG1sQ3Vyc29yLCB3aXRoIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIFhtbEN1cnNvciBjdXJzb3IpCi0gICAgewotICAgICAgICByZXR1cm4gZm9yQ3Vyc29yKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBjdXJzb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCB0aGUgWG1sQ3Vyc29yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgWG1sQ3Vyc29yIGN1cnNvcikKLSAgICB7Ci0gICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmb3JNZXNzYWdlKG1lc3NhZ2UsIHNldmVyaXR5KTsKLQotICAgICAgICAvLyBIdW50IGRvd24gdGhlIGxpbmUvY29sdW1uL29mZnNldAotCi0gICAgICAgIGludCBsaW5lID0gLTE7Ci0gICAgICAgIGludCBjb2x1bW4gPSAtMTsKLSAgICAgICAgaW50IG9mZnNldCA9IC0xOwotICAgICAgICBTdHJpbmcgc291cmNlID0gbnVsbDsKLQotICAgICAgICBzb3VyY2UgPSBjdXJzb3IuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0gY3Vyc29yLm5ld0N1cnNvcigpOwotCi0gICAgICAgIFhtbExpbmVOdW1iZXIgbG4gPQotICAgICAgICAgICAgKFhtbExpbmVOdW1iZXIpIGMuZ2V0Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICBpZiAobG4gPT0gbnVsbCkKLSAgICAgICAgICAgIGxuID0gKFhtbExpbmVOdW1iZXIpIGMudG9QcmV2Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICBpZiAobG4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbGluZSA9IGxuLmdldExpbmUoKTsKLSAgICAgICAgICAgIGNvbHVtbiA9IGxuLmdldENvbHVtbigpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbG4uZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjLmRpc3Bvc2UoKTsKLQotICAgICAgICByZXR1cm4gbmV3IFhtbEVycm9yKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2UsIGxpbmUsIGNvbHVtbiwgb2Zmc2V0LCBjdXJzb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIHByb2R1Y2UgYSBuaWNlbHkgZm9ybWF0dGVkIGZpbGVuYW1lIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXR0ZWRGaWxlTmFtZShTdHJpbmcgcmF3U3RyaW5nLCBVUkkgYmFzZSkKLSAgICB7Ci0gICAgICAgIGlmIChyYXdTdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFVSSSB1cmkgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBsb29rcyBsaWtlIGFuIGFic29sdXRlIFVSSSwgdHJlYXQgaXQgYXMgc3VjaAotICAgICAgICAgICAgdXJpID0gbmV3IFVSSShyYXdTdHJpbmcpOwotCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyZWF0IGl0IGxpa2UgYSBmaWxlbmFtZQotICAgICAgICAgICAgaWYgKCF1cmkuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cmkgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9va3MgbGlrZSBhIGZpbGVuYW1lOyBjb252ZXJ0IGl0IHRvIHVyaSBmb3IgcmVsYXRpdml6YXRpb24KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdXJpID0gbmV3IEZpbGUocmF3U3RyaW5nKS50b1VSSSgpOwotCi0gICAgICAgIGlmIChiYXNlICE9IG51bGwpCi0gICAgICAgICAgICB1cmkgPSBiYXNlLnJlbGF0aXZpemUodXJpKTsKLQotICAgICAgICAvLyBmaWxlbmFtZXMgZ2V0IHRoZWlyIGZpbGU6IHN0cmlwcGVkIG9mZiBhbmQgdGhlaXIgLydzIHR1cm5lZCBpbnRvIFwncyAoTVNET1MpCi0gICAgICAgIGlmICh1cmkuaXNBYnNvbHV0ZSgpID8gdXJpLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwIDoKLSAgICAgICAgICAgIGJhc2UgIT0gbnVsbCAmJiBiYXNlLmlzQWJzb2x1dGUoKSAmJiBiYXNlLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGaWxlKHVyaSkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVycm9yLiBTZWUge0BsaW5rICNnZXRTZXZlcml0eX0uCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVkVSSVRZX0VSUk9SICAgPSAwOwotICAgIC8qKgotICAgICAqIEEgd2FybmluZy4gU2VlIHtAbGluayAjZ2V0U2V2ZXJpdHl9LgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9XQVJOSU5HID0gMTsKLSAgICAvKioKLSAgICAgKiBBbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuIFNlZSB7QGxpbmsgI2dldFNldmVyaXR5fS4KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWRVJJVFlfSU5GTyAgICA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4gIEVpdGhlciB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfS4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCAgICBnZXRTZXZlcml0eSAgICggKSB7IHJldHVybiBfc2V2ZXJpdHk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIHdpdGhvdXQgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAgICAoICkgeyByZXR1cm4gX21lc3NhZ2U7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgKG9yIG90aGVyIG5hbWUpIG9mIHRoZSBmaWxlIHdpdGggdGhlIGVycm9yLCBpZiBhdmFpbGFibGUuCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSAoICkgeyByZXR1cm4gX3NvdXJjZTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgICAgZ2V0TGluZSAgICAgICAoICkgeyByZXR1cm4gX2xpbmU7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgICAgZ2V0Q29sdW1uICAgICAoICkgeyByZXR1cm4gX2NvbHVtbjsgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgLTEgaWYgbm90LgotICAgICAqLyAKLSAgICBwdWJsaWMgaW50ICAgIGdldE9mZnNldCAgICAgKCApIHsgcmV0dXJuIF9vZmZzZXQ7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlLiAgWG1sQ3Vyc29yLmNsYXNzIGFuZAotICAgICAqIFhtbE9iamVjdC5jbGFzcyBjYW4gYmUgcGFzc2VkLCBmb3IgZXhhbXBsZS4gIE51bGwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8gCi0gICAgcHVibGljIE9iamVjdCBnZXRMb2NhdGlvbiAoIE9iamVjdCB0eXBlICkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IFhtbEN1cnNvci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBfY3Vyc29yOwotICAgICAgICBpZiAodHlwZSA9PSBYbWxPYmplY3QuY2xhc3MgJiYgX2N1cnNvciAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9jdXJzb3IuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgYXMgYW4ge0BsaW5rIFhtbEN1cnNvcn0sIG51bGwgaWYKLSAgICAgKiBub3QgYXZhaWxhYmxlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldEN1cnNvckxvY2F0aW9uICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChYbWxDdXJzb3IpIGdldExvY2F0aW9uKCBYbWxDdXJzb3IuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gb2YgdGhlIGVycm9yIGFzIGFuIHtAbGluayBYbWxPYmplY3R9LCBudWxsIGlmCi0gICAgICogbm90IGF2YWlsYWJsZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3RMb2NhdGlvbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBnZXRMb2NhdGlvbiggWG1sT2JqZWN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBzdGFuZGFyZCBzdHJpbmcgZm9yIHRoZSBlcnJvciBtZXNzYWdlLCBjb21wbGV0ZSB3aXRoCi0gICAgICogZmlsZW5hbWUgYW5kIGxvY2F0aW9uIG9mZnNldHMgaWYgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoIG51bGwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyBhIHN0YW5kYXJkIHN0cmluZyB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLiAgSWYgYSBub24tbnVsbAotICAgICAqIFVSSSBpcyBzdXBwbGllZCwgc291cmNlIG5hbWVzIGFyZSByZWxhdGl2aXplZCBhZ2FpbnN0IHRoZSBnaXZlbgotICAgICAqIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggVVJJIGJhc2UgKQotICAgIHsKLSAgICAgICAgLy8gbW9kaWZpZWQgdG8gY2FyZWZ1bGx5IG1hdGNoIHRoZSBJREUncwotICAgICAgICAvLyB3b3Jrc2hvcC53b3Jrc3BhY2UuYW50LkFudExvZ2dlciByZWdleAotICAgICAgICAvLyB3aGljaCBhbHNvIG1hdGNoZXMgamF2YWMgKGRhdmlkYmF1KQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBTdHJpbmcgc291cmNlID0gZm9ybWF0dGVkRmlsZU5hbWUoZ2V0U291cmNlTmFtZSgpLCBiYXNlKTsKLQotICAgICAgICBpZiAoIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBzb3VyY2UgKTsKLSAgICAgICAgICAgIGludCBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKCBsaW5lIDwgMCApCi0gICAgICAgICAgICAgICAgbGluZSA9IDA7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIGxpbmUgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29sdW1uKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggZ2V0Q29sdW1uKCkgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICc6JyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKCBnZXRTZXZlcml0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTRVZFUklUWV9FUlJPUiAgIDogc2IuYXBwZW5kKCAiZXJyb3I6ICIgKTsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0VWRVJJVFlfV0FSTklORyA6IHNiLmFwcGVuZCggIndhcm5pbmc6ICIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNFVkVSSVRZX0lORk8gOiBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtc2cgPSBnZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCBtc2cgPT0gbnVsbCA/ICI8VW5zcGVjaWZpZWQgbWVzc2FnZT4iIDogbXNnICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2ZjE5ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQSBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGNhbiBiZSB0aHJvd24gd2hpbGUgcHJvY2Vzc2luZywKLSAqIHBhcnNpbmcsIG9yIGNvbXBpbGluZyBYTUwuICBNYXkgY29udGFpbiBhbnkgbnVtYmVyIG9mIHtAbGluayBYbWxFcnJvcn0KLSAqIG9iamVjdHMuCi0gKiA8cD4KLSAqIEBzZWUgWG1sRXJyb3IKLSAqIEBzZWUgWG1sUnVudGltZUV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBTdHJpbmcgbSAgICAgICAgICAgICAgKSB7IHN1cGVyKCBtICk7ICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSBhbmQgYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCApIHsgc3VwZXIoIG0sIHQgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFRocm93YWJsZSB0ICAgICAgICAgICApIHsgc3VwZXIoIHQgKTsgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYW4ge0BsaW5rIFhtbEVycm9yfS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFhtbEVycm9yIGVycm9yICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIGVycm9yLnRvU3RyaW5nKCksIG51bGwsIGVycm9yICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UsIGEgY2F1c2UsIGFuZCBhbiB7QGxpbmsgWG1sRXJyb3J9LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBYbWxFcnJvciBlcnJvciApCi0gICAgewotICAgICAgICB0aGlzKCBtLCB0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBlcnJvciApICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLCBhIGNhdXNlLCBhbmQgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBYbWxFcnJvciBYbWxFcnJvcnN9LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBDb2xsZWN0aW9uIGVycm9ycyApCi0gICAgewotICAgICAgICBzdXBlciggbSwgdCApOwotCi0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KCBlcnJvcnMgKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYW4ge0BsaW5rIFhtbFJ1bnRpbWVFeGNlcHRpb259LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggWG1sUnVudGltZUV4Y2VwdGlvbiB4bWxSdW50aW1lRXhjZXB0aW9uICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKAotICAgICAgICAgICAgeG1sUnVudGltZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHhtbFJ1bnRpbWVFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwotCi0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0geG1sUnVudGltZUV4Y2VwdGlvbi5nZXRFcnJvcnMoKTsKLQotICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggbmV3IEFycmF5TGlzdCggZXJyb3JzICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIFhtbEVycm9yIFhtbEVycm9yc30gdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXJyb3IgZ2V0RXJyb3IgKCApCi0gICAgewotICAgICAgICBpZiAoX2Vycm9ycyA9PSBudWxsIHx8IF9lcnJvcnMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gKFhtbEVycm9yKSBfZXJyb3JzLmdldCggMCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBYbWxFcnJvciBYbWxFcnJvcnN9IHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24sIGlmIGFueS4KLSAgICAgKi8gCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lcnJvcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9lcnJvcnM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEZhY3RvcnlIb29rLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmFjdG9yeUhvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NTUxMi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmFjdG9yeUhvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGhvb2sgZm9yIHRoZSBYTUwgQmVhbiBGYWN0b3J5IG1lY2hhbmlzbS4KLSAqIFByb3ZpZGVkIGZvciBhZHZhbmNlZCB1c2VycyB3aG8gd2lzaCB0byBwcm92aWRlIHRoZWlyIG93bgotICogaW1wbGVtZW50YXRpb24gb2YgdGhlIEZhY3RvcnkucGFyc2UgbWV0aG9kcy4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwKLSAqIHRvIGRlZmVyIHJlYWRpbmcgWE1MIHN0cmVhbXMgdW50aWwgbmVlZGVkLgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIGhvb2ssIGNhbGwgWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5zZXRIb29rKCksIHBhc3NpbmcKLSAqIHlvdXIgb3duIFhtbEZhY3RvcnlIb29rIGltcGxlbWVudGF0aW9uLiAgVGhlbiBldmVyeSBjYWxsIHRvIGEgRmFjdG9yeQotICogbWV0aG9kIHdpbGwgYmUgZGVsZ2F0ZWQgdG8geW91ciBob29rLgotICoKLSAqIDxwcmU+Ci0gKiBNeUhvb2sgaG9vayA9IG5ldyBNeUhvb2soKTsKLSAqIFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuc2V0SG9vayhob29rKTsKLSAqIC8vIHRoaXMgcmVzdWx0cyBpbiBhIGNhbGwgdG8gaG9vay5wYXJzZSguLi4pCi0gKiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShuZXcgRmlsZSgidGVzdC54bWwiKSk7Ci0gKiA8L3ByZT4KLSAqIAotICogSWYgdGhlIGhvb2sgbmVlZHMgdG8gdHVybiBhcm91bmQgYW5kIGludm9rZSB0aGUgYnVpbHQtaW4gcGFyc2VycywgdGhlbgotICogaXQgc2hvdWxkIGRvIHNvIGJ5IGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBvbiB0aGUgcGFzc2VkCi0gKiBTY2hlbWFUeXBlTG9hZGVyLiAgU2luY2UgU2NoZW1hVHlwZUxvYWRlci5wYXJzZSgpIG1ldGhvZHMgZGVsZWdhdGUKLSAqIHRvIHRoZSByZWdpc3RlcmVkIGhvb2ssIGEgaG9vayB0aGF0IHdpc2hlcyB0byBhY3R1YWxseSBpbnZva2UgdGhlCi0gKiBkZWZhdWx0IHBhcnNlciB3aXRob3V0IGhhdmluZyBpdHNlbGYgY2FsbGVkIGJhY2sgYWdhaW4gc2hvdWxkCi0gKiB1bnJlZ2lzdGVyIGl0c2VsZiBiZWZvcmUgY2FsbGluZyBsb2FkZXIucGFyc2UoKSwgYW5kIHRoZW4gcmUtcmVnaXN0ZXIKLSAqIGl0c2VsZiBhZ2FpbiBhZnRlciB0aGUgY2FsbC4KLSAqIDxwcmU+Ci0gKiB2b2lkIHBhcnNlKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCAuLi4pCi0gKiB7Ci0gKiAgICAgWG1sRmFjdG9yeUhvb2sgcmVtZW1iZXIgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2sobnVsbCk7Ci0gKiAgICAgbG9hZGVyLnBhcnNlKC4uLik7IC8vIGlzbid0IGhvb2tlZC4KLSAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2socmVtZW1iZXIpOwotICogfQotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmFjdG9yeUhvb2sKLXsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdJbnN0YW5jZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIEhvb2tzIEZhY3RvcnkucGFyc2UgY2FsbHMgKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIsIFJlYWRlciBqaW9yLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIC8qKiBIb29rcyBGYWN0b3J5LnBhcnNlIGNhbGxzICovCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdYbWxTYXhIYW5kbGVyIGNhbGxzICovCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBtYW5hZ2UgdGhlIFhtbEZhY3RvcnlIb29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICovIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVGhyZWFkQ29udGV4dAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGhyZWFkSG9vayA9IG5ldyBUaHJlYWRMb2NhbCgpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgaG9vaywgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmFjdG9yeUhvb2sgZ2V0SG9vaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoWG1sRmFjdG9yeUhvb2spdGhyZWFkSG9vay5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBob29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEhvb2soWG1sRmFjdG9yeUhvb2sgaG9vaykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZWFkSG9vay5zZXQoaG9vayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm92aWRlZCB0byBwcmV2ZW50IHVud2FudGVkIGNvbnN0cnVjdGlvbgotICAgICAgICBwcml2YXRlIFRocmVhZENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmxvYXQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmI1ZTFhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCI+eHM6ZmxvYXQ8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gYSBKYXZhIGZsb2F0LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxGbG9hdCBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9mbG9hdCIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBmbG9hdCAqLwotICAgIGZsb2F0IGdldEZsb2F0VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgZmxvYXQgKi8KLSAgICB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBmbG9hdAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0RmxvYXRWYWx1ZX0KLSAgICAgKiovCi0gICAgZmxvYXQgZmxvYXRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGZsb2F0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRGbG9hdFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChmbG9hdCB2KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEZsb2F0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxGbG9hdH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxGbG9hdH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxGbG9hdH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMi4zNGUrNSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMi4zNGUrNSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWUyYTVlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSI+eHM6Z0RheTwvYT4gdHlwZS4KLSAqIEEgZ0RheSBzcGVjaWZpZXMgb25seSBhIGRheS1vZi1tb250aC4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIEdEYXRlfSwgb3IgYW4gaW50LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEdEYXkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ0RheSIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgaW50IGdldEludFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxHRGF5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHRGF5fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tLTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tLTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NjVjOC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIj54czpnTW9udGg8L2E+IHR5cGUuCi0gKiBBIGdNb250aCBzcGVjaWZpZXMgb25seSBhIG1vbnRoLW9mLXllYXIuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBHRGF0ZX0sIG9yIGFuIGludC4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxHTW9udGggZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ01vbnRoIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIgKi8KLSAgICBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIgKi8KLSAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIGdkKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0xMgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgaW50IGludFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGludCB2KTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sR01vbnRofS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHTW9udGh9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstLTA2Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMGRkZmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdNb250aERheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aERheSI+eHM6Z01vbnRoRGF5PC9hPiB0eXBlLgotICogQSBnTW9udGhEYXkgc3BlY2lmaWVzIGEgZGF5IG9mIGEgc3BlY2lmaWMgbW9udGggd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSB5ZWFyLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9IG9yIHtAbGluayBHRGF0ZX0uCi0gKiAKLSAqIEBzZWUgWG1sQ2FsZW5kYXIKLSAqIEBzZWUgR0RhdGUKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sR01vbnRoRGF5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dNb250aERheSIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdNb250aERheX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRoRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRoRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR01vbnRoRGF5fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tMDYtMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNi0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiYzUyNS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhciI+eHM6Z1llYXI8L2E+IHR5cGUuCi0gKiBBIGdZZWFyIHNwZWNpZmllcyBhIEdyZWdvcmlhbiB5ZWFyIChBRCkuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBHRGF0ZX0sIG9yIGFuIGludC4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxHWWVhciBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9nWWVhciIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgaW50IGdldEludFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdZZWFyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHWWVhcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXJNb250aC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4ZWRhZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXJNb250aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyTW9udGgiPnhzOmdZZWFyTW9udGg8L2E+IHR5cGUuCi0gKiBBIGdZZWFyTW9udGggc3BlY2lmaWVzIGEgbW9udGggaW4gYSBzcGVjaWZpYyB5ZWFyLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgR0RhdGV9LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEdZZWFyTW9udGggZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ1llYXJNb250aCIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdZZWFyTW9udGh9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdZZWFyTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdZZWFyTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEdZZWFyTW9udGh9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwYWIxMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSGV4QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2hleEJpbmFyeSI+eHM6aGV4QmluYXJ5PC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIGJ5dGUgYXJyYXkuIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxIZXhCaW5hcnkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfaGV4QmluYXJ5Iik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVBcnJheVZhbHVlfQotICAgICAqKi8KLSAgICBieXRlW10gYnl0ZUFycmF5VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYnl0ZVtdIGJhKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqKi8KLSAgICBieXRlW10gZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKi8KLSAgICB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBiYSk7Ci0KLQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxIZXhCaW5hcnl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEhleEJpbmFyeX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEhleEJpbmFyeX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEhleEJpbmFyeX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDs2ODY1NmM2YzZmJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzY4NjU2YzZjNmYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDI0M2MuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIj54czpJRDwvYT4gdHlwZS4KLSAqIDxwPgotICogV2hlbiB2YWxpZGF0ZWQsIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4gIEFuIGVsZW1lbnQKLSAqIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aG9zZSB0eXBlIGlzIElELgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBTdHJpbmd9LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sSUQgZXh0ZW5kcyBYbWxOQ05hbWUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRCIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSUR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbElEfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O24xJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O24xJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMGRlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUYiPnhzOklEUkVGPC9hPiB0eXBlLgotICogPHA+Ci0gKiBXaGVuIHZhbGlkYXRlZCwgSURSRUYgdmFsdWVzIG11c3QgbWF0Y2ggYW4gSUQgdmFsdWUgdGhhdCBpcyBwcmVzZW50IHdpdGhpbgotICogdGhlIGRvY3VtZW50LiBUaGlzIHJ1bGUgaXMgb25seSB2ZXJpZmllZCB3aGVuIGEgd2hvbGUgZG9jdW1lbnQgaXMgdmFsaWRhdGVkCi0gKiBhdCBvbmNlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBTdHJpbmd9LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sSURSRUYgZXh0ZW5kcyBYbWxOQ05hbWUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRFJFRiIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSURSRUZ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEUkVGfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEUkVGfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbElEUkVGfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmY2NkZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUZTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiPnhzOklEUkVGUzwvYT4gdHlwZSwKLSAqIGEgbGlzdCB0eXBlLgotICogPHA+Ci0gKiBXaGVuIHZhbGlkYXRlZCwgSURSRUYgdmFsdWVzIG11c3QgbWF0Y2ggYW4gSUQgdmFsdWUgdGhhdCBpcyBwcmVzZW50IHdpdGhpbgotICogdGhlIGRvY3VtZW50LiBUaGlzIHJ1bGUgaXMgb25seSB2ZXJpZmllZCB3aGVuIGEgd2hvbGUgZG9jdW1lbnQgaXMgdmFsaWRhdGVkCi0gKiBhdCBvbmNlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBMaXN0fS4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGUyBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRFJFRlMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbElEUkVGfSB2YWx1ZXMgKi8KLSAgICBMaXN0IHhnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gKi8KLSAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IGwpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIExpc3QgbGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbElEUkVGfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoTGlzdCBsKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSURSRUZTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRlN9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRlN9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJRFJFRlN9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MGVmM2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiPnhzOmludDwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBpbnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEludCBleHRlbmRzIFhtbExvbmcKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9pbnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLwotICAgIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50ICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqKi8KLSAgICBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEludH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSW50fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSW50fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sSW50fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1NjcmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWY1MmMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnRlZ2VyIj54czppbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFRoaXMgdHlwZSBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiPnhzOmludDwvYT4KLSAqIG9yIEphdmEge0BsaW5rIEludGVnZXJ9LiAgVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyIHdpdGgKLSAqIGFueSBudW1iZXIgb2YgZGlnaXRzLCB3aGlsZSBhIEphdmEgaW50IG9yIGFuIHhzOmludCBpcyBhIDMyLWJpdCBmaW5pdGUtcHJlY2lzaW9uIGludGVnZXIuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSB7QGxpbmsgQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEludGVnZXIgZXh0ZW5kcyBYbWxEZWNpbWFsCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfaW50ZWdlciIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0gKi8KLSAgICBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0gKi8KLSAgICB2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShCaWdJbnRlZ2VyIGJpKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCaWdJbnRlZ2VyVmFsdWV9Ci0gICAgICoqLwotICAgIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0ludGVnZXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQmlnSW50ZWdlciBiaSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEludGVnZXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEludGVnZXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEludGVnZXJ9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODI2MTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xhbmd1YWdlIj54czpsYW5ndWFnZTwvYT4gdHlwZS4KLSAqIDxwPgotICogVGhpcyB0eXBlIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhbiBzdGFuZGFyZCBJU08gbGFuZ3VhZ2UgY29kZSBzdHJpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTGFuZ3VhZ2UgZXh0ZW5kcyBYbWxUb2tlbgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2xhbmd1YWdlIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxMYW5ndWFnZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7ZW4tdXMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7ZW4tdXMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExpbmVOdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NDI0MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotCi0vKioKLSAqIEEgc3ViY2xhc3Mgb2YgWG1sQm9va21hcmsgdGhhdCBob2xkcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLSAqIElmIGEgZG9jdW1lbnQgaXMgcGFyc2VkIHdpdGggbGluZSBudW1iZXJzCi0gKiBlbmFibGVkLCB0aGVzZSBib29rbWFya3Mgd2lsbCBiZSBwbGFjZWQgYXQgYXBwcm9wcmlhdGUgbG9jYXRpb25zCi0gKiB3aXRoaW4gdGhlIGRvY3VtZW50LgotICogCi0gKiBAc2VlIFhtbE9wdGlvbnMjc2V0TG9hZExpbmVOdW1iZXJzIAotICovCi1wdWJsaWMgY2xhc3MgWG1sTGluZU51bWJlciBleHRlbmRzIFhtbEJvb2ttYXJrCi17Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIHdpdGggbm8gY29sdW1uIG9yIG9mZnNldCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxMaW5lTnVtYmVyICggaW50IGxpbmUgKSB7IHRoaXMoIGxpbmUsIC0xLCAtMSApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gd2l0aCBubyBmaWxlIG9mZnNldCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGNvbHVtbiBudW1iZXIgLSB0aGUgZmlyc3QgY29sdW1uIGlzIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lLCBpbnQgY29sdW1uICkgeyB0aGlzKCBsaW5lLCBjb2x1bW4sIC0xICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGluZSBudW1iZXIgYW5kIGNvbHVtbiB3aXRoIG5vIGZpbGUgb2Zmc2V0IGluZm9ybWF0aW9uLgotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIG51bWJlciAtIHRoZSBmaXJzdCBsaW5lIGlzIDEKLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgY29sdW1uIG51bWJlciAtIHRoZSBmaXJzdCBjb2x1bW4gaXMgMQotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQgLSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBmaWxlIGlzIDAKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICBfY29sdW1uID0gY29sdW1uOwotICAgICAgICBfb2Zmc2V0ID0gb2Zmc2V0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSAgICggKSB7IHJldHVybiBfbGluZTsgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uICggKSB7IHJldHVybiBfY29sdW1uOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgMC1iYXNlZCBmaWxlIG9mZnNldCBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bi4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBnZXRPZmZzZXQgKCApIHsgcmV0dXJuIF9vZmZzZXQ7IH0KLQotICAgIHByaXZhdGUgaW50IF9saW5lLCBfY29sdW1uLCBfb2Zmc2V0OwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjY4NDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbG9uZyI+eHM6bG9uZzwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBsb25nLgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxMb25nIGV4dGVuZHMgWG1sSW50ZWdlcgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2xvbmciKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgbG9uZyAqLwotICAgIGxvbmcgZ2V0TG9uZ1ZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KLSAgICB2b2lkIHNldExvbmdWYWx1ZShsb25nIHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgbG9uZwotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMb25nVmFsdWV9Ci0gICAgICoqLwotICAgIGxvbmcgbG9uZ1ZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgbG9uZwotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRMb25nVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGxvbmcgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbExvbmd9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbExvbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbExvbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbExvbmd9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjc4MTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5DTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIj54czpOYW1lPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBUaGlzIGtpbmQgb2Ygc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBub24tY29sb25pemVkIHN0cmluZ3MgdGhhdCBhcmUgdXNlZAotICogZm9yIFhNTCBsb2NhbG5hbWVzIGFuZCBwcmVmaXhlcywgIm15LWhyZWYuMiIuICBJdCBpcyBqdXN0IGEgcGh5c2ljYWwKLSAqIHN0cmluZywgaG93ZXZlciwgYW5kIGl0IHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCB7QGxpbmsgWG1sUU5hbWV9LAotICogd2hpY2ggaXMgYSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGxvY2FsbmFtZSBhbmQgbmFtZXNwYWNlIFVSSS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5DTmFtZSBleHRlbmRzIFhtbE5hbWUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9OQ05hbWUiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5DTmFtZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTkNOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTkNOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTkNOYW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O015LU5hbWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7TXktTmFtZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmU2NTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiI+eHM6Tk1UT0tFTjwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KLSAqIDxwPgotICogQW4gTk1UT0tFTiBpcyBYTUwncyBjbG9zZXN0IGNvbmNlcHQgdG8gYW4gImlkZW50aWZpZXIiOyBmb3IgZXhhbXBsZSwKLSAqIGl0IGRvZXMgbm90IHBlcm1pdCBzcGFjZXMgYW5kIG9ubHkgbGltaXRlZCBwdW5jdHVhdGlvbi4gIFNvIE5NVE9LRU4gaXMKLSAqIGNvbW1vbmx5IHVzZWQgdG8gZGVzY3JpYmUgYSBzaW5nbGUgdG9rZW4gb3IgZW51bWVyYXRlZCBzdHJpbmcgdmFsdWUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOTVRPS0VOIGV4dGVuZHMgWG1sVG9rZW4KLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9OTVRPS0VOIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOTVRPS0VOfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOTVRPS0VOfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjImbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7c2FtcGxlLTEuMiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBiZTg0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiPnhzOk5NVE9LRU5TPC9hPiB0eXBlLAotICogYSBsaXN0IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBMaXN0fS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTk1UT0tFTlMgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTk1UT0tFTlMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbE5NVE9LRU59IHZhbHVlcyAqLwotICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSAqLwotICAgIHZvaWQgc2V0TGlzdFZhbHVlKExpc3QgbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCBsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgWG1sTk1UT0tFTn0gdmFsdWVzCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIExpc3QgeGxpc3RWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KExpc3QgbCk7Ci0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sTk1UT0tFTlN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5NVE9LRU5TfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5NVE9LRU5TfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5NVE9LRU5TfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjEgc2FtcGxlLTEuMiBzYW1wbGUtMS4zJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjEgc2FtcGxlLTEuMiBzYW1wbGUtMS4zJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5PVEFUSU9OLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MzkxOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iPnhzOk5PVEFUSU9OPC9hPiB0eXBlLgotICogPHA+Ci0gKiBOT1RBVElPTnMgYXJlIGEgbWVjaGFuaXNtIGluIFhNTCBTY2hlbWEgdGhhdCBpcyBwcm92aWRlZAotICogZm9yIHBhcnRpYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIE5PVEFUSU9OcyBpbiBEVERzLiAgWE1MIFNjaGVtYQotICogdXNlcnMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXZlIGFueSByZWFzb24gdG8gdXNlIHRoaXMgZGF0YSB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTk9UQVRJT04gZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTk9UQVRJT04iKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5PVEFUSU9OfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOT1RBVElPTn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOT1RBVElPTn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOT1RBVElPTn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4MmRkYS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIj54czpOYW1lPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBUaGlzIGtpbmQgb2Ygc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIHVzZWQgZm9yIFhNTCAxLjAKLSAqIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcywgZS5nLiwgInByZTphLWIuY2RlZiIuICBJdCBpcyBqdXN0IGEgcGh5c2ljYWwKLSAqIHN0cmluZywgaG93ZXZlciwgYW5kIGl0IHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCB7QGxpbmsgWG1sUU5hbWV9LAotICogd2hpY2ggaXMgYSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGxvY2FsbmFtZSBhbmQgbmFtZXNwYWNlIFVSSS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5hbWUgZXh0ZW5kcyBYbWxUb2tlbgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX05hbWUiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5hbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5hbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5hbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5hbWV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7TXk6TmFtZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtNeTpOYW1lJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNWZlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciI+eHM6bmVnYXRpdmVJbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIG5lZ2F0aXZlIHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTmVnYXRpdmVJbnRlZ2VyIGV4dGVuZHMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfbmVnYXRpdmVJbnRlZ2VyIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstMTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstMTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzNGNmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIj54czpub25OZWdhdGl2ZUludGVnZXI8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgemVybyBvciBwb3NpdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBleHRlbmRzIFhtbEludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGMwMmM5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIj54czpub25Qb3NpdGl2ZUludGVnZXI8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgemVybyBvciBuZWdhdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vblBvc2l0aXZlSW50ZWdlciBleHRlbmRzIFhtbEludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub25Qb3NpdGl2ZUludGVnZXIiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0xMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0xMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vcm1hbGl6ZWRTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3M2VlMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIj54czpub3JtYWxpemVkU3RyaW5nPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBBbiBub3JtYWxpemVkU3RyaW5nIHNpbXBseSBpcyBhIHN0cmluZyB3aGVyZSBhbGwgdGhlIGNhcnJpYWdlIHJldHVybiwKLSAqIGxpbmVmZWVkLCBhbmQgdGFiIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgKHN3aXRjaGVkIHRvKSBvcmRpbmFyeQotICogc3BhY2UgY2hhcmFjdGVycy4gIFVzZSBub3JtYWxpemVkU3RyaW5nIGZvciBsb25nIHN0cmluZ3MgdG8gbWFrZSB0aGVtCi0gKiBpbnNlbnNpdGl2ZSB0byBsaW5lIGJyZWFraW5nLiAgSWYgeW91IHdpc2ggdG8gb2Z0ZW4gYmUgaW5zZW5zaXRpdmUgdG8KLSAqIHJ1bnMgb2Ygd2hpdGVzcGFjZSAoYXMgaXMgb2Z0ZW4gdGhlIGNhc2UpLCB1c2UKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPnhzOnRva2VuPC9hPgotICogKGFrYSB7QGxpbmsgWG1sVG9rZW59KSBpbnN0ZWFkLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4gIFdoZW4gb2J0YWluaW5nIHRoZSBzdHJpbmdWYWx1ZSwgdGhlCi0gKiB3aGl0ZXNwYWNlLW5vcm1hbGl6ZWQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vcm1hbGl6ZWRTdHJpbmcgZXh0ZW5kcyBYbWxTdHJpbmcKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub3JtYWxpemVkU3RyaW5nIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OyBzdHJpbmcgdG8gbm9ybWFsaXplICZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsgc3RyaW5nIHRvIG5vcm1hbGl6ZSAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJlNjljLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8ja2V5LXVyVHlwZSI+eHM6YW55VHlwZTwvYT4sCi0gKiB0aGUgYmFzZSB0eXBlIGZvciBhbGwgWE1MIEJlYW5zLgotICogPHA+Ci0gKiBTaW5jZSBhbGwgWE1MIFNjaGVtYSB0eXBlcyBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvcnJlc3BvbmRpbmcgWE1MIEJlYW4KLSAqIGNsYXNzZXMsIGFuZCBhbGwgU2NoZW1hIHR5cGUgZGVyaXZhdGlvbiBjb3JyZXNwb25kcyB0byBKYXZhIGNsYXNzCi0gKiBpbmhlcml0YW5jZSwgdGhlIGZhY3QgdGhhdCBhbGwgU2NoZW1hIHR5cGVzIGRlcml2ZSBmcm9tIHhzOmFueVR5cGUgbWVhbnMKLSAqIHRoYXQgYWxsIFhNTCBCZWFuIGNsYXNzZXMgZGVyaXZlIGZyb20gWG1sT2JqZWN0LgotICogPHA+Ci0gKiBPbiB0aGlzIGJhc2UgY2xhc3MgeW91IHdpbGwgZmluZCBhIG51bWJlciBvZiBjb21tb24gZmFjaWxpdGllcyB0aGF0Ci0gKiBhbGwgWE1MIEJlYW4gY2xhc3NlcyBwcm92aWRlOgotICogPHA+Ci0gKiA8dWw+Ci0gKiA8bGk+RXZlcnkgWE1MIEJlYW4gY2xhc3MgaGFzIGFuIGlubmVyIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIGFuZCBwYXJzaW5nCi0gKiAgICAgaW5zdGFuY2VzLCBpbmNsdWRpbmcgWG1sT2JqZWN0LiBVc2Uge0BsaW5rIFhtbE9iamVjdC5GYWN0b3J5fSBpdHNlbGYKLSAqICAgICB0byBwcm9kdWNlIHVudHlwZWQgWE1MIHRyZWVzIG9yIFhNTCB0cmVlcyB0aGF0IGltcGxlbWVudCBzcGVjaWZpYwotICogICAgIHN1YnR5cGVzIG9mIFhtbE9iamVjdCBkZXBlbmRpbmcgb24gYSByZWNvZ25pemVkIHJvb3QgZG9jdW1lbnQgZWxlbWVudC4KLSAqICAgICBJZiB5b3UgZGVwZW5kIG9uIHRoZSBhdXRvbWF0aWMgdHlwZSBpbmZlcmVuY2UsIHlvdSB3aWxsIHdhbnQgdG8gdW5kZXJzdGFuZAotICogICAgIHRoZSB0eXBlIGluZmVyZW5jZSBpc3N1ZXMgZGVzY3JpYmVkIGJlbG93LgotICogPGxpPlRvIHdyaXRlIG91dCBhbiBhY2N1cmF0ZSBYTUwgZmlsZSBmb3IgdGhlIFhNTCB0cmVlIHVuZGVyIHRoaXMKLSAqICAgICBYbWxPYmplY3QsIHVzZSBvbmUgb2YgdGhlIHtAbGluayAjc2F2ZX0gbWV0aG9kcywKLSAqICAgICBvciB7QGxpbmsgI25ld0lucHV0U3RyZWFtfSBvciB7QGxpbmsgI25ld1JlYWRlcn0uCi0gKiAgICAgVXNlIHtAbGluayAjdG9TdHJpbmd9IHRvIHByb2R1Y2UgYSBwcmV0dHktcHJpbnRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAqICAgICBYTUwgc3VidHJlZSB1bmRlciB0aGlzIFhNTCBPYmplY3QuICBJZiB5b3Ugc2F2ZSBpbnRlcmlvciBwb3J0aW9ucyBvZgotICogICAgIGFuIFhNTCBkb2N1bWVudCwgeW91IHdpbGwgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBpbm5lciBjb250ZW50cwotICogICAgIHZlcnN1cyBvdXRlciBjb250YWluZXIgaXNzdWVzIGRlc2NyaWJlZCBiZWxvdy4KLSAqIDxsaT5JdCBpcyBhbHNvIHNpbXBsZSB0byBjb3B5IGFuIFhtbE9iamVjdCBpbnN0YW5jZSB0byBvciBmcm9tIGEgc3RhbmRhcmQKLSAqICAgICBET00gdHJlZSBvciBTQVggc3RyZWFtLiAgVXNlIHtAbGluayBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShOb2RlKX0sCi0gKiAgICAgZm9yIGV4YW1wbGUsIHRvIGxvYWQgZnJvbSBET007IHVzZSB7QGxpbmsgWG1sT2JqZWN0LkZhY3RvcnkjbmV3WG1sU2F4SGFuZGxlcn0KLSAqICAgICB0byBsb2FkIGZyb20gU0FYOyB1c2Uge0BsaW5rICNuZXdEb21Ob2RlKCl9IHRvIHNhdmUgdG8gRE9NOyBhbmQgdXNlIAotICogICAgIHtAbGluayAjc2F2ZShvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciwgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyKX0KLSAqICAgICB0byBzYXZlIHRvIFNBWC4KLSAqIDxsaT5Vc2Uge0BsaW5rICN2YWxpZGF0ZX0gdG8gdmFsaWRhdGUgdGhlIHN1YnRyZWUgb2YgWE1MIHVuZGVyIHRoaXMKLSAqICAgICBYTUwgT2JqZWN0LiAgSWYgeW91IHdpc2ggdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbgotICogICAgIGFuZCByZWFzb24gZm9yIHZhbGlkYXRpb24gZXJyb3JzLCBzZWUge0BsaW5rIFhtbE9wdGlvbnMjc2V0RXJyb3JMaXN0ZW5lcn0sCi0gKiAgICAgYW5kIHVzZSB7QGxpbmsgI3ZhbGlkYXRlKFhtbE9wdGlvbnMpfS4KLSAqIDxsaT5Vc2Uge0BsaW5rICNuZXdDdXJzb3J9IHRvIGFjY2VzcyB0aGUgZnVsbCBYTUwgaW5mb3NldCwgZm9yIGV4YW1wbGUsCi0gKiAgICAgaWYgeW91IG5lZWQgdG8gZGV0ZXJtaW5lIGludGVybGVhdmVkIGVsZW1lbnQgb3JkZXIgb3IgbWFuaXB1bGF0ZQotICogICAgIGFubm90YXRpb25zLCBjb21tZW50cywgb3IgbWl4ZWQgY29udGVudC4gIFNlZSB7QGxpbmsgWG1sQ3Vyc29yfS4KLSAqIDxsaT5Vc2Uge0BsaW5rICNzZWxlY3RQYXRofSB0byBmaW5kIG90aGVyIFhtbE9iamVjdHMgaW4gdGhlIHN1YnRyZWUgdW5kZXJuZWF0aAotICogICAgIHRoaXMgWG1sT2JqZWN0IHVzaW5nIHJlbGF0aXZlIFhQYXRocy4gIChJbiBzZWxlY3RQYXRoLCAiLiIgaW5kaWNhdGVzCi0gKiAgICAgdGhlIGN1cnJlbnQgZWxlbWVudCBvciBhdHRyaWJ1dGUuKQotICogPC91bD4KLSAqIDxwPgotICogVHlwZSBpbmZlcmVuY2UuICBXaGVuIHVzaW5nIHtAbGluayBYbWxPYmplY3QuRmFjdG9yeX0gdG8gcGFyc2UgWE1MIGRvY3VtZW50cywKLSAqIHRoZSBhY3R1YWwgZG9jdW1lbnQgdHlwZSBpcyBub3Qge0BsaW5rIFhtbE9iamVjdCN0eXBlfSBpdHNlbGYsIGJ1dCBhIHN1YnR5cGUKLSAqIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgcGFyc2VkIGRvY3VtZW50LiAgSWYgdGhlIHBhcnNlZCBkb2N1bWVudAotICogY29udGFpbnMgYSByZWNvZ25pemVkIHJvb3QgZG9jdW1lbnQgZWxlbWVudCwgdGhlbiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlCi0gKiBsb2FkZWQgaW5zdGFuY2Ugd2lsbCBiZSB0aGUgbWF0Y2hpbmcgRG9jdW1lbnQgdHlwZS4gIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobXlEb2N1bWVudCk7Ci0gKiBpZiAoeG9iaiBpbnN0YW5jZW9mIE15T3JkZXJEb2N1bWVudCkgLy8gc3RhcnRzIHcvICZsdDtteS1vcmRlciZndDsKLSAqIHsKLSAqICAgICBNeU9yZGVyRG9jdW1lbnQgbXlkb2MgPSAoTXlPcmRlckRvY3VtZW50KXhvYmo7Ci0gKiAgICAgaWYgKCF4b2JqLnZhbGlkYXRlKCkpCi0gKiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGEgdmFsaWQgbXktb3JkZXIgZG9jdW1lbnQiKTsKLSAqIH0KLSAqIGVsc2UKLSAqIHsKLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCBhIG15LW9yZGVyIGRvY3VtZW50Iik7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIEV2ZXJ5IFhNTCBCZWFuIGNsYXNzIGhhcyBpdHMgb3duIGlubmVyIEZhY3RvcnkgY2xhc3MsCi0gKiBzbyBpZiB5b3UgYWN0dWFsbHkga25vdyBleGFjdGx5IHdoaWNoIFhNTCBCZWFuIGRvY3VtZW50IHR5cGUKLSAqIHlvdSB3YW50IHRvIGxvYWQgYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHlvdSBzaG91bGQgdXNlIHRoZQotICogdGhlIHNwZWNpZmljIFhNTCBCZWFuIEZhY3RvcnkgY2xhc3MgaW5zdGVhZC4gRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogTXlPcmRlckRvY3VtZW50IG15ZG9jID0gTXlPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UobXlEb2N1bWVudCk7Ci0gKiA8L3ByZT4KLSAqIFRoZSBjb2RlIGFib3ZlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJzZWQgZG9jdW1lbnQKLSAqIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIHByb3BlciAobXktb3JkZXIpIGVsZW1lbnQuCi0gKiA8cD4KLSAqIElubmVyIHZlcnN1cyBvdXRlci4gIEFuIFhtbE9iamVjdCByZXByZXNlbnRzIHRoZQotICogPGVtPmNvbnRlbnRzPC9lbT4gb2YgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUsIDxlbT5ub3Q8L2VtPiB0aGUgZWxlbWVudAotICogb3IgYXR0cmlidXRlIGl0c2VsZi4gIFNvIHdoZW4geW91IHZhbGlkYXRlIG9yIHNhdmUgYW4gWG1sT2JqZWN0LCB5b3UKLSAqIGFyZSB2YWxpZGF0aW5nIG9yIHNhdmluZyBpdHMgY29udGVudHMsIG5vdCBpdHMgY29udGFpbmVyLiAgRm9yIGV4YW1wbGUsCi0gKiBpZiB0aGUgWG1sT2JqZWN0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQgd2hpY2ggaGFwcGVucwotICogdG8gaXRzZWxmIGJlIGluIHRoZSB3cm9uZyBvcmRlciByZWxhdGl2ZSB0byBpdHMgc2libGluZ3MsIHZhbGlkYXRlIHdpbGwKLSAqIG5vdCBjb21wbGFpbiBhYm91dCB0aGUgbWlzcGxhY2VtZW50IG9mIHRoZSBlbGVtZW50IGl0c2VsZi4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZgotICogZWxlbWVudHMgPGVtPndpdGhpbjwvZW0+IHRoZSBYbWxPYmplY3QgYXJlIGluIHRoZSB3cm9uZyBvcmRlciwgdmFsaWRhdGUKLSAqIHdpbGwgY29tcGxhaW4uICBTaW1pbGFybHksIHdoZW4gc2F2aW5nIHRoZSBjb250ZW50cyBvZiBhbiBpbnRlcmlvcgotICogWG1sT2JqZWN0LCBpdCBpcyB0aGUgY29udGVudHMgb2YgYW4gZWxlbWVudCwgbm90IHRoZSBlbGVtZW50IGl0c2VsZiwKLSAqIHdoaWNoIGlzIHNhdmVkIGJ5IGRlZmF1bHQuCi0gKiA8cD4KLSAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgZnJhZ21lbnRzLiBXaGVuIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgY29udGVudHMgb2YgYQotICogd2hvbGUgWE1MIGRvY3VtZW50LCB0aGUgc3RhbmRhcmQgWE1MIHJlcHJlbnRhdGlvbiBmb3IgYSBkb2N1bWVudCBpcyB1c2VkLgotICogSG93ZXZlciwgdGhlcmUgaXMgbm8gc3RhbmRhcmQgY29uY3JldGUgWE1MIHJlcHJlc2VudGF0aW9uIGZvciAianVzdCB0aGUKLSAqIGNvbnRlbnRzIiBvZiBhbiBpbnRlcmlvciBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gU28gd2hlbiBvbmUgaXMgbmVlZGVkLAotICogdGhlIHRhZyAmbHQ7eG1sLWZyYWdtZW50Jmd0OyBpcyB1c2VkIHRvIHdyYXAgdGhlIGNvbnRlbnRzLiAgVGhpcyB0YWcgaXMgdXNlZAotICogY2FuIGFsc28gYmUgdXNlZCB0byBsb2FkIGp1c3QgdGhlIGNvbnRlbnRzIGZvciBhbiBYbWxPYmplY3QgZG9jdW1lbnQgZnJhZ21lbnQKLSAqIG9mIGFyYml0cmFyeSB0eXBlLiBJZiB5b3Ugd2lzaCB0byBzYXZlIG91dCB0aGUgWG1sT2JqZWN0J3MgY29udGFpbmVyIGVsZW1lbnQKLSAqIGFsb25nIHdpdGggaXRzIGNvbnRlbnRzLCB1c2Uge0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZU91dGVyfS4KLSAqIDxwPgotICogSW1wbGVtZW50aW5nIFhtbE9iamVjdC4gIFRoZSBYTUxCZWFucyBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgYXJiaXRyYXJ5Ci0gKiBpbXBsZW1lbnRhdGlvbnMgb2YgWG1sT2JqZWN0IC0gaW4gYWxtb3N0IGFsbCBjYXNlcywgeW91IHNob3VsZCBvbmx5IHVzZQotICogdGhlIGltcGxlbWVudGF0aW9ucyBvZiBYbWxPYmplY3QgcHJvdmlkZWQgYnkgdGhlIFhNTEJlYW5zIGNvbXBpbGVyIGl0c2VsZi4KLSAqIElmIHlvdSBuZWVkIHRvIGltcGxlbWVudCBYbWxPYmplY3QgeW91cnNlbGYsIHlvdSBzaG91bGQgc3ViY2xhc3MKLSAqIEZpbHRlclhtbE9iamVjdCBpbiBvcmRlciB0byBkZWxlZ2F0ZSB0byBhbm90aGVyIHVuZGVybHlpbmcgWG1sT2JqZWN0Ci0gKiBpbXBsZW1lbnRhdGlvbi4gVGhpcyB0ZWNobmlxdWUgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHlvdXIgY29kZSB1bmNoYW5nZWQKLSAqIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIFhNTEJlYW5zIHRoYXQgYWRkIGFkZGl0aW9uYWwgbWV0aG9kcyBvbiBYbWxPYmplY3QuIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxPYmplY3QgZXh0ZW5kcyBYbWxUb2tlblNvdXJjZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2FueVR5cGUiKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzY2hlbWEgdHlwZSBmb3IgdGhpcyBpbnN0YW5jZS4gVGhpcyBpcyBhIHBlcm1hbmVudCwKLSAgICAgKiB1bmNoYW5naW5nIHByb3BlcnR5IG9mIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QgYXJlIHZhbGlkCi0gICAgICogYWNjb3JpbmcgdG8gc2NoZW1hVHlwZSgpLgotICAgICAqIDxwPgotICAgICAqIERvZXMgYSBkZWVwIHZhbGlkYXRpb24gb2YgdGhlIGVudGlyZSBzdWJ0cmVlIHVuZGVyIHRoZQotICAgICAqIG9iamVjdCwgYnV0IGRvZXMgbm90IHZhbGlkYXRlIHRoZSBwYXJlbnRzIG9yIHNpYmxpbmdzCi0gICAgICogb2YgdGhlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGlzIGluIHRoZSBpbnRlcmlvciBvZiBhbiB4bWwKLSAgICAgKiB0cmVlLgotICAgICAqLwotICAgIGJvb2xlYW4gdmFsaWRhdGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5KdXN0IGxpa2UgdmFsaWRhdGUoKSwgYnV0IHdpdGggb3B0aW9ucy48L3A+Ci0gICAgICogPHA+SWYgeW91IHdpc2ggdG8gY29sbGVjdCBlcnJvciBtZXNzYWdlcyBhbmQgbG9jYXRpb25zIHdoaWxlIHZhbGlkYXRpbmcsCi0gICAgICogdXNlIHRoZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfSBtZXRob2QuIFdpdGggdGhhdCBtZXRob2QsCi0gICAgICogeW91IGNhbiBzcGVjaWZ5IGFuIG9iamVjdCBpbiB3aGljaCB0byBzdG9yZSBtZXNzYWdlcyByZWxhdGVkIHRvIHZhbGlkYXRpb24uCi0gICAgICogVGhlIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBleGFtcGxlLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIC8vIENyZWF0ZSBhbiBYbWxPcHRpb25zIGluc3RhbmNlIGFuZCBzZXQgdGhlIGVycm9yIGxpc3RlbmVyLgotICAgICAqIFhtbE9wdGlvbnMgdmFsaWRhdGVPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgKiBBcnJheUxpc3QgZXJyb3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAqIHZhbGlkYXRlT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdCk7Ci0gICAgICogCi0gICAgICogLy8gVmFsaWRhdGUgdGhlIFhNTC4KLSAgICAgKiBib29sZWFuIGlzVmFsaWQgPSBuZXdFbXAudmFsaWRhdGUodmFsaWRhdGVPcHRpb25zKTsKLSAgICAgKiAKLSAgICAgKiAvLyBJZiB0aGUgWE1MIGlzbid0IHZhbGlkLCBsb29wIHRocm91Z2ggdGhlIGxpc3RlbmVyJ3MgY29udGVudHMsCi0gICAgICogLy8gcHJpbnRpbmcgY29udGFpbmVkIG1lc3NhZ2VzLgotICAgICAqIGlmICghaXNWYWxpZCkKLSAgICAgKiB7Ci0gICAgICogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVycm9yTGlzdC5zaXplKCk7IGkrKykKLSAgICAgKiAgICAgIHsKLSAgICAgKiAgICAgICAgICBYbWxFcnJvciBlcnJvciA9IChYbWxFcnJvcillcnJvckxpc3QuZ2V0KGkpOwotICAgICAqICAgICAgICAgIAotICAgICAqICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4iKTsKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2U6ICIgKyBlcnJvci5nZXRNZXNzYWdlKCkgKyAiXG4iKTsKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW9uIG9mIGludmFsaWQgWE1MOiAiICsgCi0gICAgICogICAgICAgICAgICAgIGVycm9yLmdldEN1cnNvckxvY2F0aW9uKCkueG1sVGV4dCgpICsgIlxuIik7Ci0gICAgICogICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbiAKLSAgICAgKiBDb2xsZWN0aW9ufSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgYm9vbGVhbiB2YWxpZGF0ZShYbWxPcHRpb25zIG9wdGlvbnMpOwotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHBhdGguICBQYXRoIGNhbiBiZSBhIHN0cmluZyBvciBwcmVjb21waWxlZCBwYXRoIFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcGF0aCBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aCwgd2hlcmUgIi4iIHJlcHJlc2VudHMgdGhlCi0gICAgICogZWxlbWVudCBvciBhdHRyaWJ1dGUgY29udGFpbmcgdGhpcyBYbWxPYmplY3QsIGFuZCBpdCBtdXN0IHNlbGVjdAotICAgICAqIG9ubHkgb3RoZXIgZWxlbWVudHMgb3IgYXR0cmlidXRlcy4gIElmIGEgbm9uLWVsZW1lbnQgb3Igbm9uLWF0dHJpYnV0ZQotICAgICAqIGlzIHNlbGVjdGVkLCBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXJyYXkgdGhhdCBpcyByZXR1cm5lZCBjb250YWlucyBhbGwgdGhlIHNlbGVjdGVkCi0gICAgICogWG1sT2JqZWN0cywgd2l0aGluIHRoZSBzYW1lIGRvY3VtZW50LCBsaXN0ZWQgaW4gZG9jdW1lbnQKLSAgICAgKiBvcmRlci4gIFRoZSBhY3R1YWwgYXJyYXkgdHlwZSBvZiB0aGUgcmVzdWx0IGlzIGluZmVycmVkCi0gICAgICogZnJvbSB0aGUgY2xvc2VzdCBjb21tb24gYmFzZSB0eXBlIG9mIHNlbGVjdGVkIHJlc3VsdHMuCi0gICAgICogPHA+Ci0gICAgICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzYWdlLiAgU3VwcG9zZSB3ZSBoYXZlIGEgZ2xvYmFsCi0gICAgICogZWxlbWVudCBkZWZpbml0aW9uIGZvciAib3duZXIiIHdob3NlIHR5cGUgaXMgInBlcnNvbiI6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICZsdDtzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvc2FtcGxlIj4KLSAgICAgKiAgICAgICZsdDtlbGVtZW50IG5hbWU9Im93bmVyIiB0eXBlPSJwZXJzb24iLz4KLSAgICAgKiAgICAgICZsdDtjb21wbGV4VHlwZSBuYW1lPSJwZXJzb24iPgotICAgICAqICAgICAgICAgWy4uLl0KLSAgICAgKiAgICAgICZsdDsvY29tcGxleFR5cGU+Ci0gICAgICogICAmbHQ7L3NjaGVtYT4KLSAgICAgKiA8L3ByZT4KLSAgICAgKiBhbmQgc3VwcG9zZSAib3duZXIiIHRhZ3MgY2FuIGJlIHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZQotICAgICAqIGRvY3VtZW50LiAgVGhlbiB3ZSBjYW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIGZpbmQKLSAgICAgKiB0aGVtIGFsbDoKLSAgICAgKiA8cHJlPgotICAgICAqIGltcG9ydCBvcmcub3BlbnVyaS5zYW1wbGUuUGVyc29uOwotICAgICAqIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci0gICAgICogWy4uLl0KLSAgICAgKiAgIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobXlGaWxlKTsKLSAgICAgKiAgIFBlcnNvbltdIHJlc3VsdHM7Ci0gICAgICogICByZXN1bHRzID0gKFBlcnNvbltdKXhvYmouc2VsZWN0UGF0aCgKLSAgICAgKiAgICAgICJkZWNsYXJlIG5hbWVzcGFjZSBzPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL3NhbXBsZScgIiArCi0gICAgICogICAgICAiLi8vczpvd25lciIpOwotICAgICAqIDwvcHJlPgotICAgICAqIE5vdGljZSB0aGUgd2F5IGluIHdoaWNoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIGRvbmUgaW4gWFBhdGggMi4wLgotICAgICAqIFNpbmNlIFhQYXRoIGNhbiBvbmx5IG5hdmlnYXRlIHdpdGhpbiBhbiBYTUwgZG9jdW1lbnQgLSBpdCBjYW5ub3QKLSAgICAgKiBjb25zdHJ1Y3QgbmV3IFhNTCAtIHRoZSByZXN1bHRpbmcgWG1sT2JqZWN0cyBhbGwgcmVzaWRlIGluCi0gICAgICogdGhlIHNhbWUgWE1MIGRvY3VtZW50IGFzIHRoaXMgWG1sT2JqZWN0IGl0c2VsZi4KLSAgICAgKi8KLSAgICBYbWxPYmplY3RbXSBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGggKTsKLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgYSBwYXRoLCBhcHBseWluZyBvcHRpb25zLgotICAgICAqIAotICAgICAqIEBzZWUgI3NlbGVjdFBhdGgoU3RyaW5nKQotICAgICAqLwotICAgIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIHF1ZXJ5LiAgUXVlcnkgY2FuIGJlIGEgc3RyaW5nIG9yIHByZWNvbXBpbGVkIHF1ZXJ5IFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBYUXVlcnkgaXMgdmVyeSBzaW1pbGFyIHRvIGFuIFhQYXRoLCBleGNlcHQgdGhhdCBpdCBhbHNvIHBlcm1pdHMKLSAgICAgKiBjb25zdHJ1Y3Rpb24gb2YgbmV3IFhNTC4gIEFzIGEgcmVzdWx0LCB0aGUgWG1sT2JqZWN0cyB0aGF0IGFyZQotICAgICAqIHJldHVybmVkIGZyb20gZXhlY1F1ZXJ5IGFyZSBpbiBuZXdseSBjcmVhdGVkIGRvY3VtZW50cywgc2VwYXJhdGUKLSAgICAgKiBmcm9tIHRoZSBYbWxPYmplY3Qgb24gd2hpY2ggdGhlIHF1ZXJ5IGlzIGV4ZWN1dGVkLgotICAgICAqIDxwPgotICAgICAqIFN5bnRheCBhbmQgdXNhZ2UgaXMgb3RoZXJ3aXNlIHNpbWlsYXIgdG8gc2VsZWN0UGF0aC4KLSAgICAgKiA8cD4KLSAgICAgKiBAc2VlICNzZWxlY3RQYXRoKFN0cmluZykKLSAgICAgKi8KLSAgICBYbWxPYmplY3RbXSBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnkgKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgcXVlcnkgd2l0aCBvcHRpb25zLgotICAgICAqIAotICAgICAqIFVzZSB0aGUgPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KLSAgICAgKiAKLSAgICAgKiA8dGFibGU+Ci0gICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZX08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gcmVwbGFjZSB0aGUgZG9jdW1lbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgUU5hbWUgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICogIHJlc3VsdGluZyBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFJlcGxhY2VEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwV2hpdGVzcGFjZX08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIGNvbW1lbnRzIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcENvbW1lbnRzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwUHJvY2luc3RzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5BIG1hcCBvZiBuYW1lc3BhY2UgVVJJIHN1YnN0aXR1dGlvbnMgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlc308L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+QWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MgdG8gYmUgYWRkZWQgd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyB0cmltIHRoZSB1bmRlcmx5aW5nIFhNTCB0ZXh0IGJ1ZmZlciBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3RpbmcgCi0gICAgICogIGEgZG9jdW1lbnQsIHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFRyaW1UZXh0QnVmZmVyfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5XaGV0aGVyIHZhbHVlIGZhY2V0cyBzaG91bGQgYmUgY2hlY2tlZCBhcyB0aGV5IGFyZSBzZXQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFZhbGlkYXRlT25TZXR9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDwvdGFibGU+IAotICAgICAqIAotICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24uCi0gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBhcyBkZXNjcmliZWQuCi0gICAgICogCi0gICAgICogQHNlZSAjZXhlY1F1ZXJ5KFN0cmluZykKLSAgICAgKi8KLSAgICBYbWxPYmplY3RbXSBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnksIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgIAotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGF0YSBhbmQKLSAgICAgKiByZXR1cm5zIGEgbmV3IFhtbE9iamVjdCBpbnN0YW5jZSB3aG9zZSBzY2hlbWFUeXBlIGlzIHRoZQotICAgICAqIG5ldyB0eXBlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgdHlwZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuIENlcnRhaW4KLSAgICAgKiB0eXBlIGNoYW5nZXMgbWF5IGJlIHByb2hpYml0ZWQgb24gdGhlIGludGVyaW9yIG9mIGFuIHhtbAotICAgICAqIHRyZWUgZHVlIHRvIHNjaGVtYSB0eXBlIHN5c3RlbSBjb25zdHJhaW50cyAodGhhdCBpcywgZHVlCi0gICAgICogdG8gYSBwYXJlbnQgY29udGFpbmVyIHdpdGhpbiB3aGljaCB0aGUgbmV3bHkgc3BlY2lmaWVkCi0gICAgICogdHlwZSBpcyBub3QgcGVybWlzc2libGUpLCBidXQgdGhlcmUgYXJlIG5vIGNvbnN0cmFpbnRzCi0gICAgICogYXQgdGhlIHJvb3R0eXBlIGNoYW5nZXMgYXJlIG5ldmVyCi0gICAgICogcHJvaGliaXRlZCBhdCB0aGUgcm9vdCBvZiBhbiB4bWwgdHJlZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgdHlwZSBjaGFuZ2UgaXMgYWxsb3dlZCwgdGhlbiB0aGUgbmV3IFhtbE9iamVjdCBzaG91bGQKLSAgICAgKiBiZSB1c2VkIHJhdGhlciB0aGFuIHRoZSBvbGQgb25lLiBUaGUgb2xkIFhtbE9iamVjdCBpbnN0YW5jZSBhbmQKLSAgICAgKiBhbnkgb3RoZXIgWG1sT2JqZWN0IGluc3RhbmNlcyBpbiB0aGUgc3VidHJlZSBhcmUgcGVybWFuZW50bHkKLSAgICAgKiBpbnZhbGlkYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAoVGhleSB3aWxsIHJldHVybgotICAgICAqIEludmFsaWRTdGF0ZUV4Y2VwdGlvbiBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtLikKLSAgICAgKgotICAgICAqIElmIGEgdHlwZSBjaGFuZ2UgaXMgZG9uZSBvbiB0aGUgaW50ZXJpb3Igb2YgYW4gWG1sCi0gICAgICogdHJlZSwgdGhlbiB4c2k6dHlwZSBhdHRyaWJ1dGVzIGFyZSB1cGRhdGVkIGFzIG5lZWRlZC4KLSAgICAgKi8KLSAgICBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIG5ld1R5cGUpOwotCi0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBuaWwuIE5vdGUgdGhhdCBpbiBvcmRlciB0byBiZSBuaWwsCi0gICAgICogdGhlIHZhbHVlIG11c3QgYmUgaW4gYW4gZWxlbWVudCwgYW5kIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcKLSAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBtYXJrZWQgYXMgbmlsbGFibGUgaW4gdGhlIHNjaGVtYS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTmlsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSB0byBuaWwuIFRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG11c3QKLSAgICAgKiBiZSBtYXJrZWQgYXMgbmlsbGFibGUgaW4gdGhlIHNjaGVtYS4KLSAgICAgKi8KLSAgICB2b2lkIHNldE5pbCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhNTCBzdHJpbmcgZm9yIHRoaXMgWE1MIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIGlzIHByZXR0eS1wcmludGVkLiAgSWYgeW91IHdhbnQgYSBub24tcHJldHR5LXByaW50ZWQKLSAgICAgKiBzdHJpbmcsIG9yIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgb3B0aW9ucyBwcmVjaXNlbHksIHVzZSB0aGUKLSAgICAgKiB4bWxUZXh0KCkgbWV0aG9kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgd2hlbiBwcm9kdWNpbmcgWE1MIGFueSBvYmplY3Qgb3RoZXIgdGhhbiB2ZXJ5IHJvb3Qgb2YgdGhlCi0gICAgICogZG9jdW1lbnQsIHRoZW4geW91IGFyZSBndWFyYW50ZWVkIHRvIGJlIGxvb2tpbmcgYXQgb25seSBhIGZyYWdtZW50Ci0gICAgICogb2YgWE1MLCBpLmUuLCBqdXN0IHRoZSBjb250ZW50cyBvZiBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSwgYW5kCi0gICAgICogYW5kIHdlIHdpbGwgcHJvZHVjZSBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGFuIDxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiB0YWcuCi0gICAgICogVGhlIFhtbE9wdGlvbnMuc2V0U2F2ZU91dGVyKCkgb3B0aW9uIG9uIHhtbFRleHQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZQotICAgICAqIHRoZSBhY3R1YWwgZWxlbWVudCBuYW1lIGFib3ZlIHRoZSBvYmplY3QgaWYgeW91IHdpc2guCi0gICAgICovCi0gICAgU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbW11dGFibGUgdmFsdWUuIEltbXV0YWJsZSB2YWx1ZXMgZG8gbm90Ci0gICAgICogaGF2ZSBhIHBvc2l0aW9uIGluIGEgdHJlZTsgcmF0aGVyLCB0aGV5IGFyZSBzdGFuZC1hbG9uZSBzaW1wbGUgdHlwZQotICAgICAqIHZhbHVlcy4gSWYgdGhlIG9iamVjdCBpcyBpbW11dGFibGUsIHRoZSBlcXVhbHMoKSBtZXRob2RzIHRlc3RzIGZvcgotICAgICAqIHZhbHVlIGVxdWFsaXR5LCBhbmQgdGhlIG9iamVjdCBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IGZvciBhIGhhc2guCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZS90eXBlIG9mIHRoaXMgWG1sT2JqZWN0IHRvIGJlIGEgY29weSBvZiB0aGUgc291cmNlCi0gICAgICogWG1sT2JqZWN0LiAgQmVjYXVzZSB0aGUgdHlwZSBvZiB0aGUgc291cmNlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGlzCi0gICAgICogdGFyZ2V0LCB0aGlzIFhtbE9iamVjdCBtYXkgYmVjb21lIGRlZnVuY3QuICBJbiB0aGlzIGNhc2UgdGhlIG5ldwotICAgICAqIFhtbE9iamVjdCBpcyByZXR1cm5lZC4gIElmIG5vIHR5cGUgY2hhbmdlIGhhcHBlbnMsIHRoZSBzYW1lIHRoaXMgd2lsbCBiZQotICAgICAqIHJldHVybmVkLgotICAgICAqLwotICAgIFhtbE9iamVjdCBzZXQoWG1sT2JqZWN0IHNyY09iaik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGlzIFhtbE9iamVjdC4gIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIHRoZQotICAgICAqIHNhbWUgdHlwZSBhcyB0aGUgY3VycmVudCBvYmplY3QsIGFuZCBoYXMgYWxsIHRoZSBjb250ZW50IG9mCi0gICAgICogdGhlIFhNTCBkb2N1bWVudCB1bmRlcm5lYXRoIHRoZSBjdXJyZW50IG9iamVjdC4gIE5vdGUgdGhhdAotICAgICAqIGFueSBwYXJ0cyBvZiB0aGUgWE1MIGRvY3VtZW50IGFib3ZlIG9yIG91dHNpZGUgdGhpcyBYbWxPYmplY3QgYXJlCi0gICAgICogbm90IGNvcGllZC4KLSAgICAgKi8KLSAgICBYbWxPYmplY3QgY29weSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgeG1sIHZhbHVlcyBhcmUgZXF1YWwuIFR3byBkaWZmZXJlbnQgb2JqZWN0cwotICAgICAqICh3aGljaCBhcmUgZGlzdGluZ3Vpc2hlZCBieSBlcXVhbHMob2JqKSA9PSBmYWxzZSkgbWF5IG9mCi0gICAgICogY291cnNlIGhhdmUgZXF1YWwgdmFsdWVzICh2YWx1ZUVxdWFscyhvYmopID09IHRydWUpLgotICAgICAqIDxwPgotICAgICAqIFVzdWFsbHkgdGhpcyBtZXRob2QgY2FuIGJlIHRyZWF0ZWQgYXMgYW4gb3JkaW5hcnkgZXF1dmFsZW5jZQotICAgICAqIHJlbGF0aW9uLCBidXQgYWN0dWFsbHkgaXQgaXMgbm90IGlzIG5vdCB0cmFuc2l0aXZlLgotICAgICAqIEhlcmUgaXMgYSBwcmVjaXNlIHNwZWNpZmljYXRpb246Ci0gICAgICogPHA+Ci0gICAgICogVGhlcmUgYXJlIHR3byBjYXRlZ29yaWVzIG9mIFhNTCBvYmplY3Q6IG9iamVjdHMgd2l0aCBhIGtub3duCi0gICAgICogaW5zdGFuY2UgdHlwZSwgYW5kIG9iamVjdHMgd2hvc2Ugb25seSBrbm93biB0eXBlIGlzIG9uZSBvZiB0aGUKLSAgICAgKiB1ci10eXBlcyAoZWl0aGVyIEFueVR5cGUgb3IgQW55U2ltcGxlVHlwZSkuIFRoZSBmaXJzdCBjYXRlZ29yeQotICAgICAqIGlzIGNvbXBhcmVkIGluIHRlcm1zIG9mIGxvZ2ljYWwgdmFsdWUgc3BhY2VzLCBhbmQgdGhlIHNlY29uZAotICAgICAqIGNhdGVnb3J5IGlzIGNvbXBhcmVkIGxleGljYWxseS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSB0d28gY2F0ZWdvcmllcywgdmFsdWVFcXVhbHMgaXMgYSB3ZWxsLWJlaGF2ZWQKLSAgICAgKiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gSG93ZXZlciwgd2hlbiBjb21wYXJpbmcgYW4gb2JqZWN0IG9mIGtub3duCi0gICAgICogdHlwZSB3aXRoIGFuIG9iamVjdCB3aXRoIHVyLXR5cGUsIHRoZSBjb21wYXJpc29uIGlzIGRvbmUgYnkgYXR0ZW1wdGluZwotICAgICAqIHRvIGNvbnZlcnQgdGhlIGxleGljYWwgZm9ybSBvZiB0aGUgdXItdHlwZWQgb2JqZWN0IGludG8gdGhlIG90aGVyCi0gICAgICogdHlwZSwgYW5kIHRoZW4gY29tcGFyaW5nIHRoZSByZXN1bHRzLiBVci10eXBlZCBvYmplY3RzIGFyZSB0aGVyZWZvcmUKLSAgICAgKiB0cmVhdGVkIGFzIGxleGljYWwgd2lsZGNhcmRzIGFuZCBtYXkgYmUgZXF1YWwgdG8gb2JqZWN0cyBpbiBkaWZmZXJlbnQKLSAgICAgKiB2YWx1ZSBzcGFjZXMsIGV2ZW4gdGhvdWdoIHRoZSBvYmplY3RzIGluIGRpZmZlcmVudCB2YWx1ZSBzcGFjZXMgYXJlCi0gICAgICogbm90IGVxdWFsIHRvIGVhY2ggb3RoZXIuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRoZSBhbnlTaW1wbGVUeXBlIHZhbHVlICIxIiB3aWxsIGNvbXBhcmUgYXMgYW4KLSAgICAgKiBlcXVhbFZhbHVlIHRvIHRoZSBzdHJpbmcgIjEiLCB0aGUgZmxvYXQgdmFsdWUgIjEuMCIsIHRoZSBkb3VibGUKLSAgICAgKiB2YWx1ZSAiMS4wIiwgdGhlIGRlY2ltYWwgIjEiLCBhbmQgdGhlIEdZZWFyICIxIiwgZXZlbiB0aG91Z2gKLSAgICAgKiBhbGwgdGhlc2Ugb2JqZWN0cyB3aWxsIGNvbXBhcmUgdW5lcXVhbCB0byBlYWNoIG90aGVyIHNpbmNlIHRoZXkKLSAgICAgKiBsaWUgaW4gZGlmZmVyZW50IHZhbHVlIHNwYWNlcy4KLSAgICAgKi8KLSAgICBib29sZWFuIHZhbHVlRXF1YWxzKFhtbE9iamVjdCBvYmopOwotCi0gICAgaW50IHZhbHVlSGFzaENvZGUoKTsKLQotICAgIC8qKgotICAgICAqIEltcGVsZW1lbnRzIHRoZSBDb21wYXJhYmxlIGludGVyZmFjZSBieSBjb21wYXJpbmcgdHdvIHNpbXBsZQotICAgICAqIHhtbCB2YWx1ZXMgYmFzZWQgb24gdGhlaXIgc3RhbmRhcmQgWE1MIHNjaGVtYSBvcmRlcmluZy4KLSAgICAgKiBUaHJvd3MgYSBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgbm8gc3RhbmRhcmQgb3JkZXJpbmcgYXBwbGllcywKLSAgICAgKiBvciBpZiB0aGUgdHdvIHZhbHVlcyBhcmUgaW5jb21wYXJhYmxlIHdpdGhpbiBhIHBhcnRpYWwgb3JkZXIuCi0gICAgICovCi0gICAgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29tcGFyaXNvbiBtZXRob2QgaXMgc2ltaWxhciB0byBjb21wYXJlVG8sIGJ1dCByYXRoZXIKLSAgICAgKiB0aGFuIHRocm93aW5nIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gdHdvIHZhbHVlcyBhcmUgaW5jb21wYXJhYmxlLAotICAgICAqIGl0IHJldHVybnMgdGhlIG51bWJlciAyLiBUaGUgcmVzdWx0IGNvZGVzIGFyZSAtMSBpZiB0aGlzIG9iamVjdAotICAgICAqIGlzIGxlc3MgdGhhbiBvYmosIDEgaWYgdGhpcyBvYmplY3QgaXMgZ3JlYXRlciB0aGFuIG9iaiwgemVybyBpZgotICAgICAqIHRoZSBvYmplY3RzIGFyZSBlcXVhbCwgYW5kIDIgaWYgdGhlIG9iamVjdHMgYXJlIGluY29tcGFyYWJsZS4KLSAgICAgKi8KLSAgICBpbnQgY29tcGFyZVZhbHVlKFhtbE9iamVjdCBvYmopOwotICAgIAotICAgIC8qKiBMRVNTX1RIQU4gaXMgLTEuIFNlZSB7QGxpbmsgI2NvbXBhcmVWYWx1ZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBMRVNTX1RIQU4gPSAtMTsKLSAgICAvKiogRVFVQUwgaXMgMC4gU2VlIHtAbGluayAjY29tcGFyZVZhbHVlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEVRVUFMID0gMDsKLSAgICAvKiogR1JFQVRFUl9USEFOIGlzIDEuIFNlZSB7QGxpbmsgI2NvbXBhcmVWYWx1ZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX1RIQU4gPSAxOwotICAgIC8qKiBOT1RfRVFVQUwgaXMgMi4gU2VlIHtAbGluayAjY29tcGFyZVZhbHVlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PVF9FUVVBTCA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgZmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlcy4gIE5vdGUgdGhhdCBpZgotICAgICAqIGEgdHlwZSBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgWE1MIGJlaW5nIGxvYWRlZCAoZm9yIGV4YW1wbGUsCi0gICAgICogYnkgcmVjb2duaXppbmcgdGhlIGRvY3VtZW50IGVsZW1lbnQgUU5hbWUpLCB0aGVuIHRoZSBpbnN0YW5jZQotICAgICAqIHJldHVybmVkIGJ5IGEgZmFjdG9yeSB3aWxsIGhhdmUgdGhlIGluZmVycmVkIHR5cGUuICBPdGhlcndpc2UKLSAgICAgKiB0aGUgRmFjdG9yeSB3aWxsIHJldHVybmVkIGFuIHVudHlwZWQgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldywgY29tcGxldGVseSBlbXB0eSBpbnN0YW5jZS4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoICkgewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3LCBjb21wbGV0ZWx5IGVtcHR5IGluc3RhbmNlLCBzcGVjaWZ5aW5nIG9wdGlvbnMKLSAgICAgICAgICogZm9yIHRoZSByb290IGVsZW1lbnQncyBkb2N1bWVudCB0eXBlIGFuZC9vciB3aGV0aGVyIHRvIHZhbGlkYXRlCi0gICAgICAgICAqIHZhbHVlIGZhY2V0cyBhcyB0aGV5IGFyZSBzZXQuPC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHRhYmxlPgotICAgICAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5XaGV0aGVyIHZhbHVlIGZhY2V0cyBzaG91bGQgYmUgY2hlY2tlZCBhcyB0aGV5IGFyZSBzZXQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRWYWxpZGF0ZU9uU2V0fTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDwvdGFibGU+IAotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzcGVjaWZ5aW5nIHJvb3QgZG9jdW1lbnQgdHlwZSBhbmQvb3IgdmFsdWUgZmFjZXQgCi0gICAgICAgICAqIGNoZWNraW5nLgotICAgICAgICAgKiBAcmV0dXJuIEEgbmV3LCBlbXB0eSBpbnN0YW5jZSBvZiBYbWxPYmplY3QuPC9saT4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbW11dGFibGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxPYmplY3R9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IG5ld1ZhbHVlICggT2JqZWN0IG9iaiApIHsKLSAgICAgICAgICByZXR1cm4gdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBTdHJpbmd9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFN0cmluZyBzICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ30gYXMgWE1MLgotICAgICAgICAgKiAKLSAgICAgICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHRhYmxlPgotICAgICAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UbyBwbGFjZSBsaW5lIG51bWJlciBhbm5vdGF0aW9ucyBpbiB0aGUgc3RvcmUgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkTGluZU51bWJlcnN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHJlcGxhY2UgdGhlIGRvY3VtZW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIFFOYW1lIHdoZW4gcGFyc2luZy48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRSZXBsYWNlRG9jdW1lbnRFbGVtZW50fTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwV2hpdGVzcGFjZX08L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIGNvbW1lbnRzIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwQ29tbWVudHN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFByb2NpbnN0c308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+QSBtYXAgb2YgbmFtZXNwYWNlIFVSSSBzdWJzdGl0dXRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+QWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MgdG8gYmUgYWRkZWQgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHRyaW0gdGhlIHVuZGVybHlpbmcgWE1MIHRleHQgYnVmZmVyIGltbWVkaWF0ZWx5IGFmdGVyIHBhcnNpbmcgCi0gICAgICAgICAqICBhIGRvY3VtZW50LCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkVHJpbVRleHRCdWZmZXJ9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPC90YWJsZT4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIHBhcnNlLgotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGFzIHNwZWNpZmllZC4KLSAgICAgICAgICogQHJldHVybiBBIG5ldyBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggU3RyaW5nIHMsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBGaWxlfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGYgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIG51bGwsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBGaWxlfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGYsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogRG93bmxvYWRzIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5uZXQuVVJMfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIG51bGwsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEb3dubG9hZHMgdGhlIGdpdmVuIHtAbGluayBqYXZhLm5ldC5VUkx9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIG51bGwsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWNvZGVzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gaXMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWNvZGVzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgWE1MLgotICAgICAgICAgKiAKLSAgICAgICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHRhYmxlPgotICAgICAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIHdoZW4gcGFyc2luZyBvciB3cml0aW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRDaGFyYWN0ZXJFbmNvZGluZ308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXREb2N1bWVudFR5cGV9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlBsYWNlIGxpbmUgbnVtYmVyIGFubm90YXRpb25zIGluIHRoZSBzdG9yZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRMaW5lTnVtYmVyc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+UmVwbGFjZSB0aGUgZG9jdW1lbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgUU5hbWUgd2hlbiBwYXJzaW5nLjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFJlcGxhY2VEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlN0cmlwIGFsbCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBXaGl0ZXNwYWNlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5TdHJpcCBhbGwgY29tbWVudHMgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBDb21tZW50c308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+U3RyaXAgYWxsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwUHJvY2luc3RzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5TZXQgYSBtYXAgb2YgbmFtZXNwYWNlIFVSSSBzdWJzdGl0dXRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+U2V0IGFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UcmltIHRoZSB1bmRlcmx5aW5nIFhNTCB0ZXh0IGJ1ZmZlciBpbW1lZGlhdGVseSBhZnRlciBwYXJzaW5nIAotICAgICAgICAgKiAgYSBkb2N1bWVudCwgcmVzdWx0aW5nIGluIGEgc21hbGxlciBtZW1vcnkgZm9vdHByaW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFRyaW1UZXh0QnVmZmVyfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDwvdGFibGU+IAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gaXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIG51bGwsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFJlYWRlcn0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIHIgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFJlYWRlcn0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydHMgdGhlIGdpdmVuIERPTSB7QGxpbmsgTm9kZX0gaW50byBhbiBYbWxPYmplY3QuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUgKSB0aHJvd3MgWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydHMgdGhlIGdpdmVuIERPTSB7QGxpbmsgTm9kZX0gaW50byBhbiBYbWxPYmplY3QuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4ge0BsaW5rIFhNTElucHV0U3RyZWFtfSBpbnRvIGFuIFhtbE9iamVjdC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvYWRzIHRoZSBnaXZlbiB7QGxpbmsgWE1MSW5wdXRTdHJlYW19IGludG8gYW4gWG1sT2JqZWN0LgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFhNTElucHV0U3RyZWFtIHhpcywgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCBudWxsLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhbiB7QGxpbmsgWG1sU2F4SGFuZGxlcn0gdGhhdCBjYW4gbG9hZCBhbiBYbWxPYmplY3QgZnJvbSBTQVggZXZlbnRzLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2F4SGFuZGxlciBuZXdYbWxTYXhIYW5kbGVyICggKSB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3WG1sU2F4SGFuZGxlciggbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYW4ge0BsaW5rIFhtbFNheEhhbmRsZXJ9IHRoYXQgY2FuIGxvYWQgYW4gWG1sT2JqZWN0IGZyb20gU0FYIGV2ZW50cy4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdYbWxTYXhIYW5kbGVyKCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIG5ldyB2YWxpZGF0aW5nIHtAbGluayBYTUxJbnB1dFN0cmVhbX0gdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQuCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtICggWE1MSW5wdXRTdHJlYW0geGlzICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIG5ldyB2YWxpZGF0aW5nIHtAbGluayBYTUxJbnB1dFN0cmVhbX0gdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyAKLSAgICAgICAgICogd2hlbiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkLCBzcGVjaWZ5aW5nIG9wdGlvbnMKLSAgICAgICAgICogZm9yIHRoZSByb290IGVsZW1lbnQncyBkb2N1bWVudCB0eXBlIGFuZC9vciB0aGUgY29sbGVjdGlvbiBvYmplY3QgdG8gdXNlCi0gICAgICAgICAqIGFzIGFuIGVycm9yIGxpc3RlbmVyIHdoaWxlIHZhbGlkYXRpbmcuPC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHA+VXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+QSBjb2xsZWN0aW9uIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gZXJyb3IgbGlzdGVuZXIgZHVyaW5nCi0gICAgICAgICAqIGNvbXBpbGF0aW9uLCBhcyBkZXNjcmliZWQgaW4ge0BsaW5rIFhtbE9wdGlvbnMjc2V0RXJyb3JMaXN0ZW5lcn0uPC9saT4KLSAgICAgICAgICogPGxpPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LCBhcyBkZXNjcmliZWQgaW4gCi0gICAgICAgICAqIHtAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZShTY2hlbWFUeXBlKX0uPC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4aXMgVGhlIGJhc2lzIGZvciB0aGUgbmV3IFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgcm9vdCBkb2N1bWVudCB0eXBlIGFuZC9vciBhbiBlcnJvciBsaXN0ZW5lci4KLSAgICAgICAgICogQHJldHVybiBBIG5ldyB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFuY2VzIGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAgKi8gCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPcHRpb25zLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmJiZTAwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVXNlZCB0byBzdXBwbHkgb3B0aW9ucyBmb3IgbG9hZGluZywgc2F2aW5nLCBhbmQgY29tcGlsaW5nLCBhbmQgdmFsaWRhdGluZy4KLSAqIDxwPgotICogVGhlcmUgYXJlIHR3byBzdHlsZXMgZm9yIHVzaW5nIFhtbE9wdGlvbnM6IG11bHRpbGluZSBzZXR1cCwgYW5kIHNpbmdsZS1saW5lIHVzZS4KLSAqIEhlcmUgYXJlIHR3byBleGFtcGxlcy4gIEZpcnN0LCBtdWx0aWxpbmUgc3R5bGU6Ci0gKiA8cHJlPgotICogWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAqIG9wdHMuc2V0U2F2ZVByZXR0eVByaW50KCk7Ci0gKiBvcHRzLnNldFNhdmVQcmV0dHlQcmludEluZGVudCg0KTsKLSAqIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqLnhtbFRleHQob3B0cykpOwotICogPC9wcmU+Ci0gKiAKLSAqIFRoZSBhbHRlcm5hdGl2ZSBpcyBzaW5nbGUtbGluZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiBTeXN0ZW0ub3V0LnByaW50bG4oeG9iai54bWxUZXh0KAotICogICAgIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZVByZXR0eVByaW50SW5kZW50KDQpKSk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFhtbE9wdGlvbnMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgTWFwIF9tYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYmxhbmsgWG1sT3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyAoICkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgWG1sT3B0aW9ucywgY29weWluZyB0aGUgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyAoWG1sT3B0aW9ucyBvdGhlcikgewotICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgX21hcC5wdXRBbGwob3RoZXIuX21hcCk7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgLy8KLSAgICAvLyBIYW5keS1kYW5keSBoZWxwZXIgbWV0aG9kcyBmb3Igc2V0dGluZyBzb21lIG9wdGlvbnMKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgc2F2ZXIgdG8gc2F2ZSBuYW1lc3BhY2UgYXR0cmlidXRlcyBmaXJzdC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVOYW1lc3BhY2VzRmlyc3QoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX05BTUVTUEFDRVNfRklSU1QgKTsgCi0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIHNhdmVyIHRvIHJlZm9ybWF0IHdoaXRlIHNwYWNlIGZvciBlYXNpZXIgcmVhZGluZy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVQcmV0dHlQcmludCgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfUFJFVFRZX1BSSU5UICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gdXNlZCB3aXRoIDxjb2RlPnNldFNhdmVQcmV0dHlQcmludDwvY29kZT4gdGhpcyBzZXRzIHRoZSBpbmRlbnQKLSAgICAgKiBhbW91bnQgdG8gdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudCBhbW91bnQgdG8gdXNlCi0gICAgICogQHNlZSAjc2V0U2F2ZVByZXR0eVByaW50Ci0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlUHJldHR5UHJpbnRJbmRlbnQoaW50IGluZGVudCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5ULCBpbmRlbnQgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiB1c2VkIHdpdGggPGNvZGU+c2V0U2F2ZVByZXR0eVByaW50PC9jb2RlPiB0aGlzIHNldHMgdGhlIG9mZnNldAotICAgICAqIGFtb3VudCB0byB1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGFtb3VudCB0byB1c2UKLSAgICAgKiBAc2VlICNzZXRTYXZlUHJldHR5UHJpbnQKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVQcmV0dHlQcmludE9mZnNldChpbnQgb2Zmc2V0KSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQsIG9mZnNldCApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHBhcnNpbmcgb3Igd3JpdGluZyBhIGRvY3VtZW50LCB0aGlzIHNldHMgdGhlIGNoYXJhY3RlcgotICAgICAqIGVuY29kaW5nIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGNoYXJhY3RlciBlbmNvZGluZwotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBDSEFSQUNURVJfRU5DT0RJTkcsIGVuY29kaW5nICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gcGFyc2luZyBhIGRvY3VtZW50LCB0aGlzIHNldHMgdGhlIHR5cGUgb2YgdGhlIHJvb3QKLSAgICAgKiBlbGVtZW50LiBJZiB0aGlzIGlzIHNldCwgdGhlIHBhcnNlciB3aWxsIG5vdCB0cnkgdG8gZ3Vlc3MKLSAgICAgKiB0aGUgdHlwZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyA8Y29kZT5RTmFtZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHJvb3QgZWxlbWVudCdzIGRvY3VtZW50IHR5cGUuCi0gICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0RG9jdW1lbnRUeXBlKFNjaGVtYVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gc2V0KCBET0NVTUVOVF9UWVBFLCB0eXBlICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPlNldHMgYSBjb2xsZWN0aW9uIG9iamVjdCBmb3IgY29sbGVjdGluZyB7QGxpbmsgWG1sRXJyb3J9IG9iamVjdHMgCi0gICAgICogZHVyaW5nIHBhcnNpbmcsIHZhbGlkYXRpb24sIGFuZCBjb21waWxhdGlvbi4gV2hlbiBzZXQsIHRoZSBjb2xsZWN0aW9uIAotICAgICAqIHdpbGwgY29udGFpbiBhbGwgdGhlIGVycm9ycyBhZnRlciB0aGUgb3BlcmF0aW9uIHRha2VzIHBsYWNlLiAgTm90aWNlIHRoYXQKLSAgICAgKiB0aGUgZXJyb3JzIHdpbGwgb25seSBoYXZlIGxpbmUgbnVtYmVycyBpZiB0aGUgZG9jdW1lbnQgd2FzCi0gICAgICogbG9hZGVkIHdpdGggbGluZSBudW1iZXJzIGVuYWJsZWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2ltcGxlIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdXNpbmcgYW4gZXJyb3IgbGlzdGVuZXIKLSAgICAgKiBkdXJpbmcgdmFsaWRhdGlvbi48L3A+Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiAvLyBDcmVhdGUgYW4gWG1sT3B0aW9ucyBpbnN0YW5jZSBhbmQgc2V0IHRoZSBlcnJvciBsaXN0ZW5lci4KLSAgICAgKiBYbWxPcHRpb25zIHZhbGlkYXRlT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICogQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgKiB2YWxpZGF0ZU9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3QpOwotICAgICAqIAotICAgICAqIC8vIFZhbGlkYXRlIHRoZSBYTUwuCi0gICAgICogYm9vbGVhbiBpc1ZhbGlkID0gbmV3RW1wLnZhbGlkYXRlKHZhbGlkYXRlT3B0aW9ucyk7Ci0gICAgICogCi0gICAgICogLy8gSWYgdGhlIFhNTCBpc24ndCB2YWxpZCwgbG9vcCB0aHJvdWdoIHRoZSBsaXN0ZW5lcidzIGNvbnRlbnRzLAotICAgICAqIC8vIHByaW50aW5nIGNvbnRhaW5lZCBtZXNzYWdlcy4KLSAgICAgKiBpZiAoIWlzVmFsaWQpCi0gICAgICogewotICAgICAqICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICogICAgICB7Ci0gICAgICogICAgICAgICAgWG1sRXJyb3IgZXJyb3IgPSAoWG1sRXJyb3IpZXJyb3JMaXN0LmdldChpKTsKLSAgICAgKiAgICAgICAgICAKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlOiAiICsgZXJyb3IuZ2V0TWVzc2FnZSgpICsgIlxuIik7Ci0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGlvbiBvZiBpbnZhbGlkIFhNTDogIiArIAotICAgICAqICAgICAgICAgICAgICBlcnJvci5nZXRDdXJzb3JMb2NhdGlvbigpLnhtbFRleHQoKSArICJcbiIpOwotICAgICAqICAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBBIGNvbGxlY3Rpb24gdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cyAKLSAgICAgKiB2aWEge0BsaW5rIENvbGxlY3Rpb24jYWRkfQotICAgICAqIAotICAgICAqIEBzZWUgWG1sRXJyb3IKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKiBAc2VlIFhtbE9iamVjdCN2YWxpZGF0ZShYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRMb2FkTGluZU51bWJlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRFcnJvckxpc3RlbmVyIChDb2xsZWN0aW9uIGMpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIEVSUk9SX0xJU1RFTkVSLCBjICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgc2F2ZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbmFtZXNwYWNlIHByZWZpeCBkZWNsYXJhdGlvbnMuCi0gICAgICogVGhlIHNhdmVyIHdpbGwgZG8gdGhpcyBieSBwYXNzaW5nIG92ZXIgdGhlIGRvY3VtZW50IHR3aWNlLCBmaXJzdCB0bwotICAgICAqIGNvbGxlY3QgdGhlIHNldCBvZiBuZWVkZWQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIHRoZW4gc2Vjb25kCi0gICAgICogdG8gYWN0dWFsbHkgc2F2ZSB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZGVjbGFyYXRpb25zIGNvbGxlY3RlZAotICAgICAqIGF0IHRoZSByb290LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUFnZ3Jlc2l2ZU5hbWVzcGFjZXMoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHNhdmVyIHRvIHdyYXAgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaW4KLSAgICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgdG9wIGxldmVsIGVsZW1lbnQKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVTeW50aGV0aWNEb2N1bWVudEVsZW1lbnQgKFFOYW1lIG5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsIG5hbWUgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgc2F2ZXIgd2lsbCB0cnkgdG8gdXNlIHRoZSBkZWZhdWx0Ci0gICAgICogbmFtZXNwYWNlIGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIFVSSS4gSWYgaXQgaXMgbm90IHNldAotICAgICAqIHRoZSBzYXZlciB3aWxsIGFsd2F5cyBjcmVhdGVkIG5hbWVkIHByZWZpeGVzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0VXNlRGVmYXVsdE5hbWVzcGFjZSAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1VTRV9ERUZBVUxUX05BTUVTUEFDRSApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBuYW1lc3BhY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGRlY2xhcmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotICAgICAqIGZyYWdtZW50IGJlaW5nIHNhdmVkLCB0aGlzIGFsbG93cyB0aG9zZSBtYXBwaW5ncyB0byBiZSBwYXNzZWQKLSAgICAgKiBkb3duIHRvIHRoZSBzYXZlciwgc28gdGhlIHByZWZpeGVzIGFyZSBub3QgcmUtZGVjbGFyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcGxpY2l0TmFtZXNwYWNlcyBhIG1hcCBvZiBwcmVmaXhlcyB0byB1cmlzIHRoYXQgY2FuIGJlCi0gICAgICogIHVzZWQgYnkgdGhlIHNhdmVyIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlSW1wbGljaXROYW1lc3BhY2VzIChNYXAgaW1wbGljaXROYW1lc3BhY2VzKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMsIGltcGxpY2l0TmFtZXNwYWNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG1hcCBvZiBoaW50cyB0byBwYXNzIHRvIHRoZSBzYXZlciBmb3Igd2hpY2ggcHJlZml4ZXMgdG8gdXNlCi0gICAgICogZm9yIHdoaWNoIG5hbWVzcGFjZSBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1Z2dlc3RlZFByZWZpeGVzIGEgbWFwIGZyb20gVVJJcyB0byBwcmVmaXhlcwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVN1Z2dlc3RlZFByZWZpeGVzIChNYXAgc3VnZ2VzdGVkUHJlZml4ZXMpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTLCBzdWdnZXN0ZWRQcmVmaXhlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHNhdmVyIHRvIGZpbHRlciBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLSAgICAgKiB3aXRoIHRoZSBnaXZlbiB0YXJnZXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsdGVyUHJvY2luc3QgdGhlIG5hbWUgb2YgYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uIHRvIGZpbHRlcgotICAgICAqICAgb24gc2F2ZQotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUZpbHRlclByb2NpbnN0IChTdHJpbmcgZmlsdGVyUHJvY2luc3QpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfRklMVEVSX1BST0NJTlNULCBmaWx0ZXJQcm9jaW5zdCApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHNhdmluZyBhIGZyYWdtZW50LCB0aGlzIG9wdGlvbiBjaGFuZ2VzIHRoZSBxbmFtZSBvZiB0aGUgc3ludGhlc2l6ZWQKLSAgICAgKiByb290IGVsZW1lbnQuICBOb3JtYWxseSAmbHQ7eG1sLWZyYWdtZW50Jmd0OyBpcyB1c2VkLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVVzZU9wZW5GcmFnICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfVVNFX09QRU5fRlJBR01FTlQgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBzYXZpbmcgYmVnaW5zIG9uIHRoZSBlbGVtZW50IG9yIGl0cyBjb250ZW50cwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZU91dGVyICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfT1VURVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBzYXZpbmcgYmVnaW5zIG9uIHRoZSBlbGVtZW50IG9yIGl0cyBjb250ZW50cwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUlubmVyICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfSU5ORVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZG9jdW1lbnQgZWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFFOYW1lIHdoZW4gcGFyc2luZy4gIElmIG51bGwgaXMgc3VwcGxpZWQsIHRoZSBkb2N1bWVudCBlbGVtZW50Ci0gICAgICogaXMgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkUmVwbGFjZURvY3VtZW50RWxlbWVudCAoIFFOYW1lIHJlcGxhY2VtZW50ICkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQsIHJlcGxhY2VtZW50ICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgYWxsIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZAotICAgICAqIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgQ2FuIGJlIHVzZWQgdG8gc2F2ZSBtZW1vcnkgb24gbGFyZ2UKLSAgICAgKiBkb2N1bWVudHMgd2hlbiB5b3Uga25vdyB0aGVyZSBpcyBubyBtaXhlZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcFdoaXRlc3BhY2UgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVFJJUF9XSElURVNQQUNFKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBhbGwgY29tbWVudHMgYXJlIHN0cmlwcGVkIHdoZW4gcGFyc2luZwotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZFN0cmlwQ29tbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBzZXQoIExPQURfU1RSSVBfQ09NTUVOVFMgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgCi0gICAgICogYXJlIHN0cmlwcGVkIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcFByb2NpbnN0cyAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1NUUklQX1BST0NJTlNUUyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIGxpbmUgbnVtYmVyIGFubm90YXRpb25zIGFyZSBwbGFjZWQKLSAgICAgKiBpbiB0aGUgc3RvcmUgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuICBUaGlzIGlzIHBhcnRpY3VsYXJseQotICAgICAqIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cyB0byBjb250YWluCi0gICAgICogbGluZSBudW1iZXJzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sRXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkTGluZU51bWJlcnMgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9MSU5FX05VTUJFUlMgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gc2V0cyBhIG1hcCBvZiBuYW1lc3BhY2UgdXJpIHN1YnN0aXR1dGlvbnMgdGhhdCBoYXBwZW4KLSAgICAgKiB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgeW91Ci0gICAgICogaGF2ZSBkb2N1bWVudHMgdGhhdCB1c2Ugbm8gbmFtZXNwYWNlLCBidXQgeW91IHdpc2ggdG8gYXZvaWQKLSAgICAgKiB0aGUgbmFtZSBjb2xsaXNpb24gcHJvYmxlbXMgdGhhdCBvY2N1ciB3aGVuIHlvdSBpbnRyb2R1Y2UKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgd2l0aG91dCBhIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICogPHA+Ci0gICAgICogQnkgbWFwcGluZyB0aGUgZW1wdHkgc3RyaW5nICIiICh0aGUgYWJzZW5jZSBvZiBhIFVSSSkgdG8gYSBzcGVjaWZpYwotICAgICAqIG5hbWVzcGFjZSwgeW91IGNhbiBmb3JjZSB0aGUgcGFyc2VyIHRvIGJlaGF2ZSBhcyBpZiBhIG5vLW5hbWVzcGFjZQotICAgICAqIGRvY3VtZW50IHdlcmUgYWN0dWFsbHkgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIFRoaXMgYWxsb3dzIHlvdQotICAgICAqIHRvIHR5cGUgdGhlIGluc3RhbmNlIGFjY29yZGluZyB0byBhIHNjaGVtYSBpbiBhIG5vbmVtcHR5IG5hbWVzcGFjZSwKLSAgICAgKiBhbmQgdGhlcmVmb3JlIGF2b2lkIHRoZSBwcm9ibGVtYXRpYyBwcmFjdGljZSBvZiB1c2luZyBzY2hlbWEKLSAgICAgKiBkZWZpbml0aW9ucyB3aXRob3V0IGEgdGFyZ2V0IG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3Vic3ROYW1lc3BhY2VzIGEgbWFwIG9mIGRvY3VtZW50IFVSSXMgdG8gcmVwbGFjZW1lbnQgVVJJcwotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyAoTWFwIHN1YnN0TmFtZXNwYWNlcykgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVUJTVElUVVRFX05BTUVTUEFDRVMsIHN1YnN0TmFtZXNwYWNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSB1bmRlcmx5aW5nIHhtbCB0ZXh0IGJ1ZmZlciBpcyB0cmltbWVkCi0gICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyBhIGRvY3VtZW50IHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5Ci0gICAgICogZm9vdHByaW50LiAgVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgbG9hZGluZyBhIGxhcmdlIG51bWJlcgotICAgICAqIG9mIHVuY2hhbmdpbmcgZG9jdW1lbnRzIHRoYXQgd2lsbCBzdGF5IGluIG1lbW9yeSBmb3Igc29tZSB0aW1lLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRUcmltVGV4dEJ1ZmZlciAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1RSSU1fVEVYVF9CVUZGRVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gcGFyc2luZwotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5zZXMgYWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMgKE1hcCBuc2VzKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUywgbnNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgd2hlbiBsb2FkaW5nIGZyb20gYW4gSW5wdXRTdHJlYW0gb3IgRmlsZSwgdGhlbgotICAgICAqIHRoZSBsb2FkZXIgd2lsbCBjb21wdXRlIGEgMTYwLWJpdCBTSEEtMSBtZXNzYWdlIGRpZ2VzdCBvZiB0aGUgWE1MCi0gICAgICogZmlsZSB3aGlsZSBsb2FkaW5nIGl0IGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB2aWEKLSAgICAgKiBYbWxPYmplY3QuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOwotICAgICAqIDxicj4KLSAgICAgKiBUaGUgc2NoZW1hIGNvbXBpbGVyIHVzZXMgbWVzc2FnZSBkaWdlc3RzIHRvIGRldGVjdCBhbmQgZWxpbWluYXRlCi0gICAgICogZHVwbGljYXRlIGltcG9ydGVkIHhzZCBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkTWVzc2FnZURpZ2VzdCAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX01FU1NBR0VfRElHRVNUICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cwotICAgICAqIHRoZSBjdXJyZW50IG5vZGUgaW4gYSBxdWVyeSBleHByZXNzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YXJOYW1lIFRoZSBuZXcgdmFyaWFibGUgbmFtZSB0byB1c2UgZm9yIHRoZSBxdWVyeS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdCNleGVjUXVlcnkKLSAgICAgKiBAc2VlIFhtbEN1cnNvciNleGVjUXVlcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRYcXVlcnlDdXJyZW50Tm9kZVZhciAoU3RyaW5nIHZhck5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFhRVUVSWV9DVVJSRU5UX05PREVfVkFSLCB2YXJOYW1lICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHNldHMgdGhlIGRvY3VtZW50IHNvdXJjZSBuYW1lIGludG8gdGhlIHhtbCBzdG9yZQotICAgICAqIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgSWYgYSBkb2N1bWVudCBpcyBwYXJzZWQgZnJvbSBhCi0gICAgICogRmlsZSBvciBVUkksIGl0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBVUkkgb2YgdGhlCi0gICAgICogc291cmNlOyBvdGhlcndpc2UsIGZvciBleGFtcGxlLCB3aGVuIHBhcnNpbmcgYSBTdHJpbmcsCi0gICAgICogeW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc291cmNlIG5hbWUgeW91cnNlbGYuIAotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5sYW5nLlN0cmluZywgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXREb2N1bWVudFNvdXJjZU5hbWUgKFN0cmluZyBkb2N1bWVudFNvdXJjZU5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIERPQ1VNRU5UX1NPVVJDRV9OQU1FLCBkb2N1bWVudFNvdXJjZU5hbWUgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gYWxsb3dzIGZvciA8Y29kZT5RTmFtZTwvY29kZT4gc3Vic3RpdHV0aW9uIGR1cmluZyBzY2hlbWEgY29tcGlsYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVNYXAgYSBtYXAgZnJvbSA8Y29kZT5RTmFtZTwvY29kZT5zIHRvIHN1YnN0aXR1dGUgPGNvZGU+UU5hbWU8L2NvZGU+cy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlU3Vic3RpdHV0ZU5hbWVzIChNYXAgbmFtZU1hcCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9TVUJTVElUVVRFX05BTUVTLCBuYW1lTWFwICk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgb24gdGhlIFNjaGVtYSBYbWxCZWFucwotICAgICAqIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1ZhbGlkYXRpb24gKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19WQUxJREFUSU9OICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIGlzIG5vdAotICAgICAqIGVuZm9yY2VkIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPi4gU2VlCi0gICAgICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNub24tYW1iaWciPkFwcGVuZGl4IEggb2YgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbjwvYT4KLSAgICAgKiBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFVQQSBydWxlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1VwYVJ1bGUgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19VUEFfUlVMRSApOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgcGFydGljbGUgdmFsaWQgKHJlc3RyaWNpdG9uKSBydWxlIGlzIG5vdAotICAgICAqIGVuZm9yY2VkIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPi4gU2VlCi0gICAgICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QiPlNlY3Rpb24gMy45LjYgb2YgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbjwvYT4KLSAgICAgKiBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFBWUiBydWxlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1B2clJ1bGUgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19QVlJfUlVMRSApOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGVuIHRoZSBzY2hlbWEgY29tcGlsZXIgd2lsbCB0cnkgdG8gZG93bmxvYWQKLSAgICAgKiBzY2hlbWFzIHRoYXQgYXBwZWFyIGluIGltcG9ydHMgYW5kIGluY2x1ZGVzIGZyb20gbmV0d29yayBiYXNlZCBVUkxzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVEb3dubG9hZFVybHMgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9ET1dOTE9BRF9VUkxTKTsgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlbiB0aGUgc2NoZW1hIGNvbXBpbGVyIHdpbGwgcGVybWl0IGFuZAotICAgICAqIGlnbm9yZSBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBjb21wb25lbnQgKGVsZW1lbnQsIGF0dHJpYnV0ZSwKLSAgICAgKiB0eXBlLCBldGMpIG5hbWVzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2VzLiAgSWYgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgKiB3aXRoIHRoZSBzYW1lIG5hbWUgYXBwZWFyLCB0aGUgZGVmaW5pdGlvbnMgdGhhdCBoYXBwZW4gdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogbGFzdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1kZWZOYW1lc3BhY2VzIGEgc2V0IG9mIG5hbWVzcGFjZSBVUklzIGFzIFN0cmluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8gCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q29tcGlsZU1kZWZOYW1lc3BhY2VzKFNldCBtZGVmTmFtZXNwYWNlcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfTURFRl9OQU1FU1BBQ0VTLCBtZGVmTmFtZXNwYWNlcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB3aGVuIGFuIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRoZW4gdmFsdWUKLSAgICAgKiBmYWNldHMgd2lsbCBiZSBjaGVja2VkIG9uIGVhY2ggY2FsbCB0byBhIHNldHRlciBvciBnZXR0ZXIKLSAgICAgKiBtZXRob2Qgb24gaW5zdGFuY2VzIG9mIFhtbE9iamVjdCB3aXRoaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LgotICAgICAqIElmIHRoZSBmYWNldHMgYXJlIG5vdCBzYXRpc2ZpZWQsIHRoZW4gYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcwotICAgICAqIHRocm93biBpbW1lZGlhdGVseS4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgZmluZGluZyBjb2RlIHRoYXQKLSAgICAgKiBpcyBpbnRyb2R1Y2luZyBpbnZhbGlkIHZhbHVlcyBpbiBhbiBYTUwgZG9jdW1lbnQsIGJ1dCBpdAotICAgICAqIHNsb3dzIHBlcmZvcm1hbmNlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFZhbGlkYXRlT25TZXQoKSB7Ci0gICAgICAgIHJldHVybiBzZXQoIFZBTElEQVRFX09OX1NFVCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB3aGVuIGNvbXBpbGluZyBhIHNjaGVtYSwgdGhlbiB0aGUgZ2l2ZW4KLSAgICAgKiBFbnRpdHlSZXNvbHZlciB3aWxsIGJlIGNvbnN1bHRlZCBpbiBvcmRlciB0byByZXNvbHZlIGFueQotICAgICAqIFVSSXMgd2hpbGUgZG93bmxvYWRpbmcgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICAgKgotICAgICAqIEVudGl0eVJlc29sdmVycyBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCBieSBjb21waWxlWHNkOyB0aGV5Ci0gICAgICogYXJlIG5vdCBjb25zdWx0ZWQgYnkgb3RoZXIgZnVuY3Rpb25zLCBmb3IgZXhhbXBsZSwgcGFyc2UuCi0gICAgICogVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gc2V0KCBFTlRJVFlfUkVTT0xWRVIsIHJlc29sdmVyICk7Ci0gICAgfQotCi0KLSAgICAvLwotICAgIC8vIENvbXBsZXRlIHNldCBvZiBYbWxPcHRpb24ncwotICAgIC8vCi0gICAgICAgICAgICAKLSAgICAvLyBUT0RPIC0gQWRkIHNlbGVjdFBhdGggb3B0aW9uIHRvIHRyYWNrIHRoZSBzZWxldGlvbiAoZGVhdWx0IGlzIHRvIGNsZWFuIHNlbGVjdGlvbnMgZmFzdCkuIAotICAgIAotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfTkFNRVNQQUNFU19GSVJTVCAgICAgICAgICAgPSAgIlNBVkVfTkFNRVNQQUNFU19GSVJTVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCA9ICAiU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QUkVUVFlfUFJJTlQgICAgICAgICAgICAgICA9ICAiU0FWRV9QUkVUVFlfUFJJTlQiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCAgICAgICAgPSAgIlNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUICAgICAgICA9ICAiU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyAgICAgID0gICJTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgICAgICA9ICAiU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyAgICAgICAgPSAgIlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TVUdHRVNURURfUFJFRklYRVMgICAgICAgICA9ICAiU0FWRV9TVUdHRVNURURfUFJFRklYRVMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRklMVEVSX1BST0NJTlNUICAgICAgICAgICAgPSAgIlNBVkVfRklMVEVSX1BST0NJTlNUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UICAgICAgICAgID0gICJTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX09VVEVSICAgICAgICAgICAgICAgICAgICAgID0gICJTQVZFX09VVEVSIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lOTkVSICAgICAgICAgICAgICAgICAgICAgID0gICJTQVZFX0lOTkVSIjsKLSAgICAKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCAgID0gICJMT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9TVFJJUF9XSElURVNQQUNFICAgICAgICAgICA9ICAiTE9BRF9TVFJJUF9XSElURVNQQUNFIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NUUklQX0NPTU1FTlRTICAgICAgICAgICAgID0gICJMT0FEX1NUUklQX0NPTU1FTlRTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NUUklQX1BST0NJTlNUUyAgICAgICAgICAgID0gICJMT0FEX1NUUklQX1BST0NJTlNUUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9MSU5FX05VTUJFUlMgICAgICAgICAgICAgICA9ICAiTE9BRF9MSU5FX05VTUJFUlMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTICAgICAgPSAgIkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1RSSU1fVEVYVF9CVUZGRVIgICAgICAgICAgID0gICJMT0FEX1RSSU1fVEVYVF9CVUZGRVIiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTICAgICAgPSAgIkxPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX01FU1NBR0VfRElHRVNUICAgICAgICAgICAgID0gICJMT0FEX01FU1NBR0VfRElHRVNUIjsKLQotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhRVUVSWV9DVVJSRU5UX05PREVfVkFSICAgICAgICAgPSAgIlhRVUVSWV9DVVJSRU5UX05PREVfVkFSIjsKLQotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9FTkNPRElORyAgICAgICAgICAgICAgPSAgIkNIQVJBQ1RFUl9FTkNPRElORyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTElTVEVORVIgICAgICAgICAgICAgICAgICA9ICAiRVJST1JfTElTVEVORVIiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEUgICAgICAgICAgICAgICAgICAgPSAgIkRPQ1VNRU5UX1RZUEUiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1NPVVJDRV9OQU1FICAgICAgICAgICAgPSAgIkRPQ1VNRU5UX1NPVVJDRV9OQU1FIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX1NVQlNUSVRVVEVfTkFNRVMgICAgICAgID0gICJDT01QSUxFX1NVQlNUSVRVVEVfTkFNRVMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfTk9fVkFMSURBVElPTiAgICAgICAgICAgPSAgIkNPTVBJTEVfTk9fVkFMSURBVElPTiI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9OT19VUEFfUlVMRSAgICAgICAgICAgICA9ICAiQ09NUElMRV9OT19VUEFfUlVMRSI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9OT19QVlJfUlVMRSAgICAgICAgICAgICA9ICAiQ09NUElMRV9OT19QVlJfUlVMRSI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9ET1dOTE9BRF9VUkxTICAgICAgICAgICA9ICAiQ09NUElMRV9ET1dOTE9BRF9VUkxTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX01ERUZfTkFNRVNQQUNFUyAgICAgICAgID0gICJDT01QSUxFX01ERUZfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfT05fU0VUICAgICAgICAgICAgICAgICA9ICAiVkFMSURBVEVfT05fU0VUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUkVTT0xWRVIgICAgICAgICAgICAgICAgID0gICJFTlRJVFlfUkVTT0xWRVIiOwotICAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBFTVBUWV9PUFRJT05TOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEVNUFRZX09QVElPTlMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBFTVBUWV9PUFRJT05TLl9tYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoRU1QVFlfT1BUSU9OUy5fbWFwKTsKLSAgICB9Ci0KLSAgICAvKiogSWYgcGFzc2VkIG51bGwsIHJldHVybnMgYW4gZW1wdHkgb3B0aW9ucyBvYmplY3QuICBPdGhlcndpc2UsIHJldHVybnMgaXRzIGFyZ3VtZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgWG1sT3B0aW9ucyBtYXNrTnVsbChYbWxPcHRpb25zIG8pIHsKLSAgICAgICAgcmV0dXJuIChvID09IG51bGwpID8gRU1QVFlfT1BUSU9OUyA6IG87Ci0gICAgfQotCi0gICAgCi0gICAgLyoqIFVzZWQgdG8gc2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCAgcHV0ICggT2JqZWN0IG9wdGlvbiAgICAgICAgICAgICAgICkgeyBwdXQoIG9wdGlvbiwgbnVsbCApOyB9Ci0gICAgLyoqIFVzZWQgdG8gc2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCAgcHV0ICggT2JqZWN0IG9wdGlvbiwgT2JqZWN0IHZhbHVlICkgeyBfbWFwLnB1dChvcHRpb24sIHZhbHVlKTsgfQotICAgIC8qKiBVc2VkIHRvIHNldCBhIGdlbmVyaWMgb3B0aW9uICovCi0gICAgcHVibGljIHZvaWQgcHV0ICAoIE9iamVjdCBvcHRpb24sIGludCB2YWx1ZSAgICApIHsgcHV0KCBvcHRpb24sIG5ldyBJbnRlZ2VyKCB2YWx1ZSApICk7IH0KLQotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbikgICAgICAgICAgICAgICB7IHJldHVybiBzZXQob3B0aW9uLCBudWxsKTsgfQotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbiwgT2JqZWN0IHZhbHVlKSB7IF9tYXAucHV0KG9wdGlvbiwgdmFsdWUpOyByZXR1cm4gdGhpczt9Ci0gICAgcHJpdmF0ZSBYbWxPcHRpb25zIHNldChPYmplY3Qgb3B0aW9uLCBpbnQgdmFsdWUpICAgIHsgcmV0dXJuIHNldChvcHRpb24sIG5ldyBJbnRlZ2VyKHZhbHVlKSk7IH0KLQotICAgIC8qKiBVc2VkIHRvIHRlc3QgYSBnZW5lcmljIG9wdGlvbiAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc09wdGlvbiAgICggT2JqZWN0IG9wdGlvbiApIHsgcmV0dXJuIF9tYXAuY29udGFpbnNLZXkoIG9wdGlvbiApOyB9Ci0gICAgLyoqIFVzZWQgdG8gZ2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgT2JqZWN0ICBnZXQgICAgICAgICAoIE9iamVjdCBvcHRpb24gKSB7IHJldHVybiBfbWFwLmdldCggb3B0aW9uICk7IH0KLQotICAgIC8qKiBVc2VkIHRvIHRlc3QgYSBnZW5lcmljIG9wdGlvbiBvbiBhbiBvcHRpb25zIG9iamVjdCB0aGF0IG1heSBiZSBudWxsICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc2FmZUdldChYbWxPcHRpb25zIG8sIE9iamVjdCBvcHRpb24pIHsKLSAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCA/IG51bGwgOiBvLmdldChvcHRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWYyYWYxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxQb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIj54czpwb3NpdGl2ZUludGVnZXI8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgcG9zaXRpdmUgd2hlbiB2YWxpZGF0aW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXJ9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxQb3NpdGl2ZUludGVnZXIgZXh0ZW5kcyBYbWxOb25OZWdhdGl2ZUludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9wb3NpdGl2ZUludGVnZXIiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFFOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkYzQyMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jUU5hbWUiPnhzOlFOYW1lPC9hPiB0eXBlLgotICogPHA+Ci0gKiBBIFFOYW1lIGlzIHRoZSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFuIFhNTCBuYW1lc3BhY2UgVVJJIGFuZCBhIGxvY2FsTmFtZS4KLSAqIEFsdGhvdWdoIGluIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCwgYSBRTmFtZSBhcHBlYXJzIGFzICJwcmVmaXg6bG9jYWxOYW1lIiwKLSAqIHRoZSBsb2dpY2FsIHZhbHVlIG9mIGEgUU5hbWUgZG9lcyBOT1QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBwcmVmaXgsIG9ubHkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gd2hpY2ggdGhlIHByZWZpeCBtYXBzLiAgRm9yIGV4YW1wbGUsCi0gKiB0d28gUU5hbWVzICJhOmhlbGxvIiBhbmQgImI6aGVsbG8iIGFyZSBwZXJmZWN0bHkgZXF1aXZhbGVudCBpZiAiYToiIGluCi0gKiB0aGUgZmlyc3QgaW5zdGFuY2UgbWFwcyB0byB0aGUgc2FtZSBVUkkgYXMgImI6IiBpbiB0aGUgc2Vjb25kIGluc3RhbmNlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZX0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFFOYW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX1FOYW1lIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0gKi8KLSAgICBRTmFtZSBnZXRRTmFtZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0gKi8KLSAgICB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFFOYW1lVmFsdWV9Ci0gICAgICoqLwotICAgIFFOYW1lIHFOYW1lVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFFOYW1lVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sUU5hbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFFOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFFOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFFOYW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50IHhtbG5zOng9Imh0dHA6Ly9vcGVudXJpLm9yZy8iJmd0O3g6c2FtcGxlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50IHhtbG5zOng9Imh0dHA6Ly9vcGVudXJpLm9yZy8iJmd0O3g6c2FtcGxlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjU4ZTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBBbiB1bmNoZWNrZWQgWE1MIGV4Y2VwdGlvbi4KLSAqIE1heSBjb250YWluIGFueSBudW1iZXIgb2Yge0BsaW5rIFhtbEVycm9yfSBvYmplY3RzLgotICogCi0gKiBAc2VlIFhtbEVycm9yCi0gKiBAc2VlIFhtbEV4Y2VwdGlvbgotICovIAotcHVibGljIGNsYXNzIFhtbFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtICAgICAgICAgICAgICApIHsgc3VwZXIoIG0gKTsgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSBhbmQgYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQgKSB7IHN1cGVyKCBtLCB0ICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIGNhdXNlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFRocm93YWJsZSB0ICAgICAgICAgICApIHsgc3VwZXIoIHQgKTsgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSwgYSBjYXVzZSwgYW5kIGEgY29sbGVjdGlvbiBvZiBYbWxFcnJvcnMuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBDb2xsZWN0aW9uIGVycm9ycyApCi0gICAgewotICAgICAgICBzdXBlciggbSwgdCApOwotCi0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KGVycm9ycykgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhbiBYbWxFcnJvci4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBYbWxFcnJvciBlcnJvciApCi0gICAgewotICAgICAgICB0aGlzKCBlcnJvci50b1N0cmluZygpLCBudWxsLCBlcnJvciApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSwgYSBjYXVzZSwgYW5kIGFuIFhtbEVycm9yLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCwgWG1sRXJyb3IgZXJyb3IgKQotICAgIHsKLSAgICAgICAgdGhpcyggbSwgdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZXJyb3IgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhbiB7QGxpbmsgWG1sRXhjZXB0aW9ufS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBYbWxFeGNlcHRpb24geG1sRXhjZXB0aW9uICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB4bWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCB4bWxFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwotCi0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0geG1sRXhjZXB0aW9uLmdldEVycm9ycygpOwotCi0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KCBlcnJvcnMgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgWG1sRXJyb3J9IHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLCBpZiBhbnkuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFcnJvciBnZXRFcnJvciAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfZXJyb3JzID09IG51bGwgfHwgX2Vycm9ycy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoWG1sRXJyb3IpIF9lcnJvcnMuZ2V0KCAwICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFhtbEVycm9yIFhtbEVycm9yc30gdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24sIGlmIGFueS4KLSAgICAgKi8gCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lcnJvcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9lcnJvcnM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNheEhhbmRsZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTYXhIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YmRmMjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNheEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLQotLyoqCi0gKiBBIGhvbGRlciBmb3IgYSBTQVgge0BsaW5rIENvbnRlbnRIYW5kbGVyfSBhbmQge0BsaW5rIExleGljYWxIYW5kbGVyfSB0aGF0IGFyZQotICogY2FwYWJsZSBvZiBsb2FkaW5nIGFuIHtAbGluayBYbWxPYmplY3R9IGluc3RhbmNlLiAgT25jZSBhbGwgdGhlIFNBWCBldmVudHMgYXJlIHB1c2hlZAotICogdG8gdGhlIGhhbmRsZXJzLCBjYWxsIHtAbGluayAjZ2V0T2JqZWN0KCl9IHRvIGdldCB0aGUgbG9hZGVkIFhtbE9iamVjdC4KLSAqIAotICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNuZXdYbWxTYXhIYW5kbGVyCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjbmV3WG1sU2F4SGFuZGxlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNheEhhbmRsZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgQ29udGVudEhhbmRsZXIgZXhwZWN0aW5nIFNBWCBjb250ZW50IGV2ZW50cy4KLSAgICAgKiBAc2VlIENvbnRlbnRIYW5kbGVyCi0gICAgICovIAotICAgIENvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyICggKTsKLSAgICAvKioKLSAgICAgKiBUaGUgTGV4aWNhbEhhbmRsZXIgZXhwZWN0aW5nIFNBWCBsZXhpY2FsIGV2ZW50cy4KLSAgICAgKiBAc2VlIExleGljYWxIYW5kbGVyCi0gICAgICovIAotICAgIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyICggKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgbG9hZGVkIFhtbE9iamVjdCBhZnRlciBhbGwgdGhlIFNBWCBldmVudHMgaGF2ZSBiZWVuIGZpbmlzaGVkICovCi0gICAgWG1sT2JqZWN0IGdldE9iamVjdCAoICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2hvcnQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRmNGFkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCI+eHM6c2hvcnQ8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBhIEphdmEgc2hvcnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNob3J0IGV4dGVuZHMgWG1sSW50Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfc2hvcnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCBzKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sU2hvcnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFNob3J0fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNpbXBsZUxpc3QuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaW1wbGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjU2ZDQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNpbXBsZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgaW1tdXRhYmxlIHtAbGluayBMaXN0fSByZXR1cm5lZCBmb3IgWE1MIHNpbXBsZSBsaXN0IHZhbHVlcy4KLSAqIAotICogWG1sU2ltcGxlTGlzdCBpbXBsZW1lbnRzIGFuIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIHRoYXQgY29tcGFyZSBsaXN0Ci0gKiBjb250ZW50cywgc28gdHdvIFhtbFNpbXBsZUxpc3RzIGFyZSB0aGUgc2FtZSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUKLSAqIHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlci4KLSAqLyAKLXB1YmxpYyBjbGFzcyBYbWxTaW1wbGVMaXN0IGltcGxlbWVudHMgTGlzdCwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLQlwcml2YXRlIExpc3QgdW5kZXJseWluZzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGltbXV0YWJsZSBYbWxTaW1wbGVMaXN0IHRoYXQgd3JhcHMgKGRvZXMgbm90IGNvcHkpCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBMaXN0fS4gIEFsbCBub24tbXV0YXRpbmcgbWV0aG9kcyBkZWxlZ2F0ZSB0bwotICAgICAqIHRoZSB1bmRlcmx5aW5nIExpc3QgaW5zdGFuY2UuCi0gICAgICovIAotCXB1YmxpYyBYbWxTaW1wbGVMaXN0KExpc3QgbGlzdCkgICAgIHsgdGhpcy51bmRlcmx5aW5nID0gbGlzdDsgfQotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBsaXN0LiAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIAkJICAgICAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5zaXplKCk7IH0KLSAgICAvKiogVHJ1ZSBpZiB0aGUgbGlzdCBpcyBlbXB0eS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgCSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5pc0VtcHR5KCk7IH0KLSAgICAvKiogVHJ1ZSBpZiB0aGUgbGlzdCBpcyBjb250YWlucyBhbiBvYmplY3QgZXF1YWwgdG8gby4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgICB7IHJldHVybiB1bmRlcmx5aW5nLmNvbnRhaW5zKG8pOyB9Ci0gICAgLyoqIFRydWUgaWYgdGhlIGxpc3QgaXMgY29udGFpbnMgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgeyByZXR1cm4gdW5kZXJseWluZy5jb250YWluc0FsbChjb2xsKTsgfQotICAgIC8qKiBDb3BpZXMgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkuICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSAJICAgICAgICB7IHJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkoKTsgfQotICAgIC8qKiBDb3BpZXMgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkgb2YgYSBzcGVjaWZpZWQgdHlwZS4gKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7IHJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkoYSk7IH0KLSAgICAKLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgICAgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgICAgICAgICAgICAgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5nZXQoaW5kZXgpOyB9Ci0gICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBVbnN1cHBvcnRlZCBiZWNhdXNlIHRoaXMgbGlzdCBpcyBpbW11dGFibGUuICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSAgICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBSZXR1cm5zIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYW4gb2JqZWN0IGVxdWFsIHRvIG8uICovCi0gICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5pbmRleE9mKG8pOyB9Ci0gICAgLyoqIFJldHVybnMgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGFuIG9iamVjdCBlcXVhbCB0byBvLiAqLwotICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pICAgIHsgcmV0dXJuIHVuZGVybHlpbmcubGFzdEluZGV4T2Yobyk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBSZXR1cm5zIGEgdmlldyBvZiB0aGUgcG9ydGlvbiBvZiB0aGlzIGxpc3QgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGZyb21JbmRleCwgaW5jbHVzaXZlLCBhbmQgdG9JbmRleCwgZXhjbHVzaXZlLiAqLwotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb20sIGludCB0bykgeyByZXR1cm4gbmV3IFhtbFNpbXBsZUxpc3QodW5kZXJseWluZy5zdWJMaXN0KGZyb20sIHRvKSk7IH0KLQotICAgIC8qKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXIgc2VxdWVuY2UuICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgICB7IAotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSB1bmRlcmx5aW5nLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgICAgeyByZXR1cm4gaS5oYXNOZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIAkgICAgeyByZXR1cm4gaS5uZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QgaW4gcHJvcGVyIHNlcXVlbmNlLiAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgCXsgcmV0dXJuIGxpc3RJdGVyYXRvcigwKTsgfQotICAgIC8qKiBSZXR1cm5zIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGluIHByb3BlciBzZXF1ZW5jZSwgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuICovCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoZmluYWwgaW50IGluZGV4KQotICAgIHsgCi0gICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXJhdG9yKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIExpc3RJdGVyYXRvciBpID0gdW5kZXJseWluZy5saXN0SXRlcmF0b3IoaW5kZXgpOwotICAgIAotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpICAgIHsgcmV0dXJuIGkuaGFzTmV4dCgpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSAgICAgICAgeyByZXR1cm4gaS5uZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCl7IHJldHVybiBpLmhhc1ByZXZpb3VzKCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSAgICB7IHJldHVybiBpLnByZXZpb3VzKCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgICAgICB7IHJldHVybiBpLm5leHRJbmRleCgpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSAgeyByZXR1cm4gaS5wcmV2aW91c0luZGV4KCk7IH0KLSAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nVmFsdWUoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFNpbXBsZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpbykuc3RyaW5nVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIGFsbAotICAgICAqIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gIEZvciBtb3N0IGxpc3RzLCB0aGlzIGlzIGEgdmFsaWQgeG1sIGxleGljYWwKLSAgICAgKiB2YWx1ZSBmb3IgdGhlIGxpc3QuIChUaGUgbm90YWJsZSBleGNlcHRpb24gaXMgYSBsaXN0IG9mIFFOYW1lcy4pCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgU3RyaW5nIGZpcnN0ID0gc3RyaW5nVmFsdWUodW5kZXJseWluZy5nZXQoMCkpOwotICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIGZpcnN0OwotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1ZhbHVlKHVuZGVybHlpbmcuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUd28gWG1sU2ltcGxlTGlzdHMgYXJlIGVxdWFsIGlmIGFsbCB0aGVpciBpdGVtcyBhcmUgZXF1YWwuCi0gICAgICogKFRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcywgYW5kIHRoZSBpdGVtcyBtdXN0IGJlIGluCi0gICAgICogdGhlIHNhbWUgb3JkZXIuKQotICAgICAqLyAKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgeyAKLSAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBYbWxTaW1wbGVMaXN0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBmaW5hbCBYbWxTaW1wbGVMaXN0IHhtbFNpbXBsZUxpc3QgPSAoWG1sU2ltcGxlTGlzdClvOwotICAgICAgICBMaXN0IHVuZGVybHlpbmcyID0geG1sU2ltcGxlTGlzdC51bmRlcmx5aW5nOwotICAgICAgICBpbnQgc2l6ZSA9IHVuZGVybHlpbmcuc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSAhPSB1bmRlcmx5aW5nMi5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7IAotICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSB1bmRlcmx5aW5nLmdldChpKTsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtMiA9IHVuZGVybHlpbmcyLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwgPyBpdGVtMiAhPSBudWxsIDogIWl0ZW0uZXF1YWxzKGl0ZW0yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbWJpbmVzIHRoZSBoYXNoIGNvZGVzIG9mIGFsbCB0aGUgbGlzdCBpdGVtcy4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgeyAKLSAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKLSAgICAgICAgaW50IGhhc2ggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgeyAKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gdW5kZXJseWluZy5nZXQoaSk7Ci0gICAgICAgICAgICBoYXNoICo9IDE5OwotICAgICAgICAgICAgaGFzaCArPSBpdGVtLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YTc4MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPiB0eXBlLgotICogPHA+Ci0gKiBBIGJhc2ljIHN0cmluZyBpbiBYTUwgc2NoZW1hIGlzIG5vdCB3aGl0ZXNwYWNlIG5vcm1hbGl6ZWQuICBJZiB5b3UKLSAqIHdhbnQgeW91ciBzdHJpbmcgdHlwZSB0byBiZSBpbnNlbnNpdGl2ZSB0byB2YXJpYXRpb25zIGluIHJ1bnMgb2YKLSAqIHdoaXRlc3BhY2UsIGNvbnNpZGVyIHVzaW5nIAotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiI+eHM6dG9rZW48L2E+Ci0gKiAoYWthIHtAbGluayBYbWxUb2tlbn0pIGluc3RlYWQuCi0gKiBUbyBmb3JiaWQgd2hpdGVzcGFjZSBhbmQgcGVybWl0IGp1c3QgYWxwaGFudW1lcmljIGFuZCBvdGhlcgotICogY29tbW9uIGlkZW50aWZpZXIgY2hhcmFjdGVycyBjb25zaWRlcgotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIj54czpOTVRPS0VOPC9hPgotICogKGFrYSB7QGxpbmsgWG1sTk1UT0tFTn0pIGluc3RlYWQuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxTdHJpbmcgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfc3RyaW5nIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxTdHJpbmd9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFN0cmluZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFN0cmluZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFN0cmluZ30gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsgYXJiaXRyYXJ5IHN0cmluZyAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7IGFyYml0cmFyeSBzdHJpbmcgJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwYjgzYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiPnhzOnRpbWU8L2E+IHR5cGUuCi0gKiBBIGdEYXkgc3BlY2lmaWVzIG9ubHkgYSBkYXktb2YtbW9udGguCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0gb3Ige0BsaW5rIEdEYXRlfS4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxUaW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3RpbWUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLwotICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KLSAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotCi0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFRpbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRpbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRpbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFRpbWV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2NjQ5ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPnhzOnRva2VuPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBBIHRva2VuIGlzIFhNTCdzIGJlc3QgcmVwcmVzZW50YXRpb24gZm9yIGEgIndoaXRlc3BhY2UgaW5zZW5zaXRpdmUgc3RyaW5nLiIKLSAqIEFsbCBjYXJyaWFnZSByZXR1cm5zLCBsaW5lZmVlZHMsIGFuZCB0YWJzIGFyZSBjb252ZXJ0ZWQgdG8gb3JkaW5hcnkgc3BhY2UKLSAqIGNoYXJhY3RlcnMgKGFzIHdpdGggPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIj54czpub3JtYWxpemVkU3RyaW5nPC9hPiksCi0gKiBhbmQgZnVydGhlcm1vcmUsIGFsbCBjb250aWd1b3VzIHJ1bnMgb2Ygc3BhY2UgYXJlIGNvbGxhcHNlZCB0byBzaW5nbGUgc3BhY2VzLAotICogYW5kIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLSAqIDxwPgotICogSWYgeW91IHdhbnQgPGNvZGU+IiZuYnNwOyZuYnNwO2hpZ2gmbmJzcDsmbmJzcDtwcmlvcml0eSZuYnNwOyZuYnNwOyI8L2NvZGU+Ci0gKiB0byBiZSBlcXVpdmFsZW50IHRvIDxjb2RlPiJoaWdoIHByaW9yaXR5IjwvY29kZT4sIHlvdSBzaG91bGQgY29uc2lkZXIKLSAqIHVzaW5nIHhzOnRva2VuIG9yIGEgc3VidHlwZSBvZiB4czp0b2tlbi4KLSAqIDxwPgotICogV2hlbiB0aGUge0BsaW5rICNzdHJpbmdWYWx1ZX0gaXMgb2J0YWluZWQgZnJvbSBhbiBYbWxUb2tlbiwgdGhlIG5vcm1hbGl6ZWQsCi0gKiB0cmltbWVkLCB3aGl0ZXNwYWNlIGNvbGxhcHNlZCB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFRva2VuIGV4dGVuZHMgWG1sTm9ybWFsaXplZFN0cmluZwotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Rva2VuIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxUb2tlbn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVG9rZW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVG9rZW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sVG9rZW59IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7c3RyaW5nIHRvIGNvbGxhcHNlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3N0cmluZyB0byBjb2xsYXBzZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUb2tlblNvdXJjZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTk5NDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgaG9sZGVyIG9mIFhNTCB0aGF0IGNhbiByZXR1cm4gYW4ge0BsaW5rIFhtbEN1cnNvcn0KLSAqIG9yIGNvcHkgaXRzZWxmIHRvIHZhcmlvdXMgbWVkaWEgc3VjaCBhcwotICoge0BsaW5rIFdyaXRlciBXcml0ZXJzfSBvciB7QGxpbmsgRmlsZSBGaWxlc30uCi0gKiBCb3RoIHtAbGluayBYbWxPYmplY3R9Ci0gKiAoYW5kIHRodXMgYWxsIFhNTCBCZWFucykgYW5kIHtAbGluayBYbWxDdXJzb3J9IGFyZQotICogWG1sVG9rZW5Tb3VyY2UgaW1wbGVtZW50YXRpb25zLgotICogCi0gKiBAc2VlIFhtbE9iamVjdAotICogQHNlZSBYbWxDdXJzb3IKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVG9rZW5Tb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQuICBJZiBjb25jdXJyZW50Ci0gICAgICogbXVsdGl0aHJlYWRlZCBhY2Nlc3MgdG8gYSBkb2N1bWVudCBpcyByZXF1aXJlZCwgdGhlIGFjY2VzcyBzaG91bGQgc2hvdWxkCi0gICAgICogYmUgcHJvdGVjdGVkIGJ5IHN5bmNocm9uaXppbmcgb24gdGhpcyBtb25pdG9yKCkgb2JqZWN0LiAgVGhlcmUgaXMgb25lCi0gICAgICogbW9uaXRvciBwZXIgWE1MIGRvY3VtZW50IHRyZWUuCi0gICAgICovCi0gICAgT2JqZWN0IG1vbml0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYbWxEb2N1bWVudFByb3BlcnRpZXMgb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQgdGhpcyB0b2tlbgotICAgICAqIHNvdXJjZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICovCi0gICAgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBYTUwgY3Vyc29yLgotICAgICAqCi0gICAgICogQSBjdXJzb3IgcHJvdmlkZXMgcmFuZG9tIGFjY2VzcyB0byBhbGwgdGhlIHRva2VucyBpbiB0aGUgWE1MCi0gICAgICogZGF0YSwgcGx1cyB0aGUgYWJpbGl0eSB0byBleHRyYWN0IHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdHMKLSAgICAgKiBmb3IgdGhlIGRhdGEuIElmIHRoZSBkYXRhIGlzIG5vdCByZWFkLW9ubHksIHRoZSBYTUwgY3Vyc29yCi0gICAgICogYWxzbyBhbGxvd3MgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGF0YS4KLSAgICAgKgotICAgICAqIFVzaW5nIGEgY3Vyc29yIGZvciB0aGUgZmlyc3QgdGltZSB0eXBpY2FsbHkgZm9yY2VzIHRoZSBYTUwKLSAgICAgKiBkb2N1bWVudCBpbnRvIG1lbW9yeS4KLSAgICAgKi8KLSAgICBYbWxDdXJzb3IgbmV3Q3Vyc29yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFhtbElucHV0U3RyZWFtLgotICAgICAqCi0gICAgICogVGhlIHN0cmVhbSBzdGFydHMgYXQgdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50Ci0gICAgICogcG9zaXRpb24gYW5kIGVuZHMgYXQgdGhlIG1hdGNoaW5nIGVuZC10YWcgb3IgZW5kLWRvY3VtZW50LgotICAgICAqCi0gICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCBzdHJlYW0sIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAotICAgICAqIHdoaWxlIHRoZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCwgdGhlIHN0cmVhbSB0aHJvd3MgYQotICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKLSAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKLSAgICAgKiBhbiBhdHRyaWJ1dGUpLgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBzdGFuZGFyZCBYTUwgdGV4dC4KLSAgICAgKgotICAgICAqIFRoZSB0ZXh0IHJldHVybmVkIHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IGNvbnRlbnRzIHN0YXJ0aW5nIGF0Ci0gICAgICogdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IGFuZCBlbmRpbmcgYXQgdGhlIG1hdGNoaW5nCi0gICAgICogZW5kLXRhZyBvciBlbmQtZG9jdW1lbnQuIFRoaXMgaXMgc2FtZSBjb250ZW50IGFzIG5ld1JlYWRlciwgYnV0Ci0gICAgICogaXQgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgc3RyaW5nLgotICAgICAqCi0gICAgICogVGhyb3dzIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgWG1sVG9rZW5Tb3VyY2UgaXMgbm90Ci0gICAgICogcG9zaXRpb25lZCBhdCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgKGUuZy4sIGlmIGl0IGlzIGF0Ci0gICAgICogYW4gYXR0cmlidXRlKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgeG1sVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdHJlYW0gY29udGFpbmluZyBzdGFuZGFyZCBYTUwgdGV4dCwgZW5jb2RlZAotICAgICAqIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBUaGUgYnl0ZSBzdHJlYW0gY29udGFpbnMgY29udGVudHMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQKLSAgICAgKiBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdCB0aGUgbWF0Y2hpbmcKLSAgICAgKiBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIFRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgdXNlZAotICAgICAqIGFuZCBhbHNvIGVtaXR0ZWQgaW4gYSBQSSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGEgZmFpbC1mYXN0IHN0cmVhbSwgc28gaWYgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBjaGFuZ2VkCi0gICAgICogd2hpbGUgdGhlIHN0cmVhbSBpcyBiZWluZyByZWFkLCB0aGUgc3RyZWFtIHRocm93cyBhCi0gICAgICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIFRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIFhtbFRva2VuU291cmNlIGlzIG5vdAotICAgICAqIHBvc2l0aW9uZWQgYXQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IChlLmcuLCBpZiBpdCBpcyBhdAotICAgICAqIGFuIGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgY2hhcmFjdGVyIHJlYWRlciBjb250YWluaW5nIFhNTCB0ZXh0LgotICAgICAqCi0gICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSByZWFkZXIgcmVwcmVzZW50cyB0aGUgZG9jdW1lbnQgY29udGVudHMKLSAgICAgKiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdAotICAgICAqIHRoZSBtYXRjaGluZyBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIE5vIGVuY29kaW5nIGFubm90YXRpb24KLSAgICAgKiB3aWxsIGJlIG1hZGUgaW4gdGhlIHRleHQgaXRzZWxmLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCByZWFkZXIsIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAotICAgICAqIHdoaWxlIHRoZSByZWFkZXIgaXMgYmVpbmcgcmVhZCwgdGhlIHJlYWRlciB0aHJvd3MgYQotICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKLSAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKLSAgICAgKiBhbiBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIFJlYWRlciBuZXdSZWFkZXIoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVzNDIERPTSBOb2RlIGNvbnRhaW5pbmcgdGhlIFhNTAotICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLiAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFhNTCwgaXQgaXMKLSAgICAgKiBub3QgYSBsaXZlIHdpdGggdGhlIHVuZGVybHlpbmcgc3RvcmUgb2YgdGhpcyB0b2tlbiBzb3VyY2UuCi0gICAgICogSWYgdGhpcyBpcyB0aGUgZG9jdW1lbnQgbm9kZSwgdGhlbiBhIERvY3VtZW50IGlzIHJldHVybmVkLCBlbHNlCi0gICAgICogYSBEb2N1bWVudEZyYWdtZW50IGlzIHJldHVybmVkLgotICAgICAqLwotICAgIE5vZGUgbmV3RG9tTm9kZSgpOwotCi0vLyAgICAvKioKLS8vICAgICAqIFJldHVybnMgYSBXM0MgRE9NIE5vZGUgY29udGFpbmluZyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgotLy8gICAgICogVGhpcyBpcyBhIGxpdmUgRE9NIG5vZGUsIG5vdCBhIGNvcHkuICBBbnkgY2hhbmdlcyBtYWRlIHRocm91Z2ggdGhpcyBub2RlCi0vLyAgICAgKiBhcmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkIGluIHRoZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbgotLy8gICAgICogc291cmNlLiAgRGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIHRva2VuIHRoaXMgWG1sVG9rZW5Tb3VyY2UgcmVwcmVzZW50cywKLS8vICAgICAqIGFuIGFwcHJvcHJpYXRlIG5vZGUgd2lsbCBiZSByZXR1cm5lZC4KLS8vICAgICAqLwotLy8gICAgTm9kZSBnZXREb21Ob2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCi0gICAgICogbGV4aWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGggKSB0aHJvd3MgU0FYRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlIHRvIHRoZSBnaXZlbiBGaWxlLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBPdXRwdXRTdHJlYW0gb3MgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogPHA+SnVzdCBsaWtlIG5ld1hNTElucHV0U3RyZWFtKCkgYnV0IHdpdGggYW55IG9mIGEgbnVtYmVyIG9mIG9wdGlvbnMuIFVzZSB0aGUgCi0gICAgICogPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KLSAgICAgKiAKLSAgICAgKiA8dGFibGU+Ci0gICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiAgZGF0YSBpbiB0aGUgWE1MIHRvIGJ5dGVzcy48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2Rpbmd9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlByZWZpeC10by1uYW1lc3BhY2UgbWFwcGluZ3MgdGhhdCBzaG91bGQgYmUgYXNzdW1lZAotICAgICAqICB3aGVuIHNhdmluZyB0aGlzIFhNTC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgcmVzdWx0aW5nCi0gICAgICogIFhNTCB3aWxsIGJlIHBhcnQgb2YgYSBsYXJnZXIgWE1MIGRvY3VtZW50LCBlbnN1cmluZyB0aGF0IHRoaXMgCi0gICAgICogIGlubmVyIGRvY3VtZW50IHdpbGwgdGFrZSBhZHZhbnRhZ2Ugb2YgbmFtZXNwYWNlcyBkZWZpbmVkIGluIAotICAgICAqICB0aGUgb3V0ZXIgZG9jdW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVJbXBsaWNpdE5hbWVzcGFjZXN9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlN1Z2dlc3RlZCBuYW1lc3BhY2UgcHJlZml4ZXMgdG8gdXNlIHdoZW4gc2F2aW5nLiBVc2VkIG9ubHkKLSAgICAgKiAgd2hlbiBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUgbmVlZHMgdG8gYmUgc3ludGhlc2l6ZWQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVTdWdnZXN0ZWRQcmVmaXhlc308L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhhdCBuYW1lc3BhY2UgYXR0cmlidXRlcyBzaG91bGQgb2NjdXIgZmlyc3QgaW4gZWxlbWVudHMgd2hlbgotICAgICAqIHRoZSBYTUwgaXMgc2F2ZWQuIEJ5IGRlZmF1bHQsIHRoZXkgb2NjdXIgbGFzdC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZU5hbWVzcGFjZXNGaXJzdH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIFhNTCBzaG91bGQgYmUgcHJldHR5IHByaW50ZWQgd2hlbiBzYXZlZC4gTm90ZSB0aGF0IHRoaXMgCi0gICAgICogIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZy48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZVByZXR0eVByaW50fTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UaGUgbnVtYmVyIG9mIHNwYWNlcyB0byB1c2Ugd2hlbiBpbmRlbnRpbmcgZm9yIHByZXR0eSBwcmludGluZy4gCi0gICAgICogIFRoZSBkZWZhdWx0IGlzIDIuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVQcmV0dHlQcmludEluZGVudH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIHNwYWNlcyBpbmRlbnRlZCBmcm9tIHRoZSBsZWZ0Ci0gICAgICogIGZvciBwcmV0dHkgcHJpbnRlZCBYTUwuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVQcmV0dHlQcmludE9mZnNldH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBuYW1lc3BhY2UgYXR0cmlidXRlcyBnZW5lcmF0ZWQgZm9yIHRoZSAKLSAgICAgKiAgc2F2ZWQgWE1MLiBOb3RlIHRoYXQgdGhpcyBjYW4gcmVkdWNlIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVBZ2dyZXNpdmVOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHNhdmVkIGRvY3VtZW50Ci0gICAgICogIGJ5IGFsbG93aW5nIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLiBOb3RlIHRoYXQgdGhpcyBjYW4gCi0gICAgICogIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgc2VtYW50aWMgbWVhbmluZyBvZiB0aGUgWE1MIGlmIHVucHJlZml4ZWQgUU5hbWVzIGFyZSAKLSAgICAgKiAgcHJlc2VudCBhcyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIG9yIGVsZW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFVzZURlZmF1bHROYW1lc3BhY2V9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIGZpbHRlciBvdXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIHRhcmdldCBuYW1lLjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlRmlsdGVyUHJvY2luc3R9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPkNoYW5nZSB0aGUgUU5hbWUgb2YgdGhlIHN5bnRoZXNpemVkIHJvb3QgZWxlbWVudCB3aGVuIHNhdmluZy4gVGhpcyAKLSAgICAgKiAgcmVwbGFjZXMgInhtbC1mcmFnbWVudCIgd2l0aCAiZnJhZ21lbnQiIGluIHRoZSBuYW1lc3BhY2UgCi0gICAgICogIGh0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQ8L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZVVzZU9wZW5GcmFnfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5TYXZpbmcgc2hvdWxkIGJlZ2luIG9uIHRoZSBlbGVtZW50J3MgY29udGVudHMuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVJbm5lcn08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+U2F2aW5nIHNob3VsZCBiZWdpbiBvbiB0aGUgZWxlbWVudCwgcmF0aGVyIHRoYW4gaXRzIGNvbnRlbnRzLjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlT3V0ZXJ9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIHJlbmFtZSB0aGUgZG9jdW1lbnQgZWxlbWVudCwgb3IgdG8gc3BlY2lmeSB0aGUgZG9jdW1lbnQgZWxlbWVudAotICAgICAqICBmb3IgdGhpcyBYTUwuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVTeW50aGV0aWNEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDwvdGFibGU+Ci0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wdGlvbnMgQW55IG9mIHRoZSBkZXNjcmliZWQgb3B0aW9ucy4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICovCi0gICAgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKTsKLQotICAgIC8qKgotICAgICAqIEp1c3QgbGlrZSB4bWxUZXh0KCkgYnV0IHdpdGggb3B0aW9ucy4KLSAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMKLSAgICAgKi8KLSAgICBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpOwotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICogSnVzdCBsaWtlIG5ld0lucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgYnV0IHdpdGggb3B0aW9ucy4KLSAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMKLSAgICAgKi8KLSAgICBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpOwotICAgIAotICAgIC8qKgotICAgICAqIEp1c3QgbGlrZSBuZXdSZWFkZXIoKSBidXQgd2l0aCBvcHRpb25zLgotICAgICAqIE9wdGlvbnMgbWFwIG1heSBiZSBudWxsLgotICAgICAqIEBzZWUgWG1sT3B0aW9ucwotICAgICAqLwotICAgIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBKdXN0IGxpa2UgbmV3RG9tTm9kZSgpIGJ1dCB3aXRoIG9wdGlvbnMuCi0gICAgICogT3B0aW9ucyBtYXAgbWF5IGJlIG51bGwuCi0gICAgICogQHNlZSBYbWxPcHRpb25zCi0gICAgICovCi0KLSAgICBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCi0gICAgICogbGV4aWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBTQVhFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIEZpbGUuCi0gICAgICovCi0gICAgdm9pZCBzYXZlICggRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmZkZTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiPnhzOnVuc2lnbmVkQnl0ZTwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQXMgc3VnZ2VzdGVkIGJ5IEpBWEIsIGNvbnZlcnRpYmxlIHRvIEphdmEgc2hvcnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkQnl0ZSBleHRlbmRzIFhtbFVuc2lnbmVkU2hvcnQKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV91bnNpZ25lZEJ5dGUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCBzKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkSW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzkzYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRJbnQiPnhzOnVuc2lnbmVkSW50PC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi40Mjk0OTY3Mjk1IHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gSmF2YSBsb25nLgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxVbnNpZ25lZEludCBleHRlbmRzIFhtbFVuc2lnbmVkTG9uZwotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkSW50Iik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KLSAgICBsb25nIGdldExvbmdWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBsb25nICovCi0gICAgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TG9uZ1ZhbHVlfQotICAgICAqKi8KLSAgICBsb25nIGxvbmdWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0TG9uZ1ZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChsb25nIHYpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxVbnNpZ25lZEludH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVW5zaWduZWRJbnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVW5zaWduZWRJbnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDBhZjk3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkTG9uZyI+eHM6dW5zaWduZWRMb25nPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi4yPHN1cGVyPjY0PC9zdXBlcj4tMSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBCaWdJbnRlZ2VyfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVW5zaWduZWRMb25nIGV4dGVuZHMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfdW5zaWduZWRMb25nIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxVbnNpZ25lZExvbmd9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkU2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkOGMxZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZFNob3J0Ij54czp1bnNpZ25lZFNob3J0PC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi42NTUzNSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSBpbnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkU2hvcnQgZXh0ZW5kcyBYbWxVbnNpZ25lZEludAotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkU2hvcnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLwotICAgIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50ICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqKi8KLSAgICBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbCBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzZhODUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Ci0KLVByb3ZpZGVzIGNsYXNzZXMgZm9yIFhNTCBCZWFucyBzY2hlbWEsIGluZm9zZXQsIHhwYXRoLCBhbmQgeHF1ZXJ5IGhhbmRsaW5nLgotCi08cD4KLVRoZSBYTUwgQmVhbnMgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgWE1MIEJlYW5zIDxlbT5zY2hlbWEgY29tcGlsZXI8L2VtPi4KLVRoZSBzY2hlbWEgY29tcGlsZXIgcHJvZHVjZXMgWE1MIEJlYW4gY2xhc3NlcyB0aGF0IGV4dGVuZCBhbmQgaW50ZXJhY3QKLXdpdGggdGhlIGJhc2ljIFhNTCBCZWFuIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgaW4gdGhpcyBwYWNrYWdlLiAgSXQgaXMKLWFsc28gcG9zc2libGUgdG8gdXNlIFhNTCBCZWFucyB3aXRob3V0IHRoZSBzY2hlbWEgY29tcGlsZXIgdG8gbWFuaXB1bGF0ZQotYW5kIHZhbGlkYXRlIFhNTCBpbiBhIGxhdGUtYm91bmQgd2F5ICh3aXRoIG5vIHR5cGVzLCBvciB3aXRoCi1ydW50aW1lLWxvYWRlZCB0eXBlcyBvbmx5KS4KLQotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnM6Ci08b2w+Ci08bGk+QWxsIHRoZSBidWlsdC1pbiBYTUwgQmVhbiBjbGFzc2VzIAotc3VjaCBhcyB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3R9LCB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlfSwgYW5kCi17QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnR9Ci0ob25lIGZvciBlYWNoIG9mIHRoZSAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnVpbHQtaW4tZGF0YXR5cGVzIj40NiBidWlsdC1pbiBYTUwgU2NoZW1hIHR5cGVzPC9hPikuCi08bGk+U3VwcG9ydCBmb3IgZnVsbCBYTUwgaW5mb3NldCwgWFBhdGgsIGFuZCBYUXVlcnkKLSh2aWEge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yfSwge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0I3NlbGVjdFBhdGh9IGFuZCByZWxhdGVkIG1ldGhvZHMpLgotPGxpPlN1cHBvcnQgZm9yIGNvbXB1dGF0aW9uIHVzaW5nIFhNTCBTY2hlbWEgZGF0YSB0eXBlcyAodmlhIGRhdGF0eXBlCi1jbGFzc2VzIHN1Y2ggYXMge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9ufSkuCi08bGk+U3VwcG9ydCBmb3Igd29ya2luZyB3aXRoIFhNTCBTY2hlbWEgdHlwZSBtZXRhZGF0YSBpdHNlbGYKLSh2aWEge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZX0sIHtAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW19LCBhbmQgcmVsYXRlZCBjbGFzc2VzKS4KLTwvb2w+Ci0KLTxwPgotVGhlIHBsYWNlIHRvIGJlZ2luIHdoZW4gd29ya2luZyB3aXRoIHRoZSBYTUwgQmVhbnMgQVBJIGlzIHRoZSBmb2xsb3dpbmcKLWZ1bmRhbWVudGFsIGNsYXNzZXM6Ci0KLTxvbD4KLTxsaT57QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3R9IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWE1MIEJlYW5zLgotPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdC5GYWN0b3J5fSBpcyB1c2VkIHRvIGxvYWQgYW5kIGNyZWF0ZSBYTUwgQmVhbiBpbnN0YW5jZXMuCi1FYWNoIFhNTCBCZWFuIGNsYXNzIGhhcyBpdHMgb3duIG5lc3RlZCBmYWN0b3J5IGNsYXNzLgotPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcn0gaXMgYW4gZWZmaWNpZW50IHRyZWV3YWxraW5nIEFQSSBmb3IgdGhlIGZ1bGwgWE1MIGluZm9zZXQuCi08bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZX0gaXMgdGhlIHR5cGUgbWV0YWRhdGEgaW50ZXJmYWNlIGZvciBYTUwgU2NoZW1hIHR5cGVzCi08bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnN9IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB1dGlsaXR5IGZ1bmN0aW9ucy4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL1hNTC54c2QgYi92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS9YTUwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjhhZGQ5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL1hNTC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhRE9DVFlQRSB4czpzY2hlbWEgUFVCTElDICItLy9XM0MvL0RURCBYTUxTQ0hFTUEgMjAwMTAyLy9FTiIgIlhNTFNjaGVtYS5kdGQiID4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sOmxhbmc9ImVuIj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZyBvciB4bWw6c3BhY2UgYXR0cmlidXRlcwotICAgICAgICBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLQotICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAgICAgICAgJmx0O3NjaGVtYSAuIC4gLj4KLSAgICAgICAgIC4gLiAuCi0gICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIi8+Ci0KLSAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0KLSAgICAgICAgJmx0O3R5cGUgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvPgotIAotICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXM8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPkluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QuCi0gICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAgIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UgY2hhbmdlcywgdGhlIHZlcnNpb24KLSAgIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpsYW5ndWFnZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+SW4gZHVlIGNvdXJzZSwgd2Ugc2hvdWxkIGluc3RhbGwgdGhlIHJlbGV2YW50IElTTyAyLSBhbmQgMy1sZXR0ZXIKLSAgICAgICAgIGNvZGVzIGFzIHRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyAuIC4gLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6YXR0cmlidXRlPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJzcGFjZSIgZGVmYXVsdD0icHJlc2VydmUiPgotICA8eHM6c2ltcGxlVHlwZT4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVmYXVsdCIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6YW55VVJJIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj5TZWUgaHR0cDovL3d3dy53My5vcmcvVFIveG1sYmFzZS8gZm9yCi0gICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGF0dHJpYnV0ZS48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJzcGVjaWFsQXR0cnMiPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmJhc2UiLz4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6c3BhY2UiLz4KLSA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGY3ZmU0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxDaGFyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2xvYmFsTG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU2F2ZXIuWG1sSW5wdXRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5BdHRyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5CZWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ29tbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ3Vyc29yR29vYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Hb29iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LlByb2NpbnN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5YbWxuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5DaGFuZ2VTdGFtcDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb2N1bWVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBYbWxDdXJzb3IsIENoYW5nZUxpc3RlbmVyCi17Ci0gICAgQ3Vyc29yICggUm9vdCByLCBTcGxheSBzICkgICAgICAgIHsgYXNzZXJ0IHMgIT0gbnVsbDsgX2RhdGEgPSBDdXJzb3JEYXRhLmdldE9uZSggciApOyBzZXQoIHMgKTsgfQotICAgIEN1cnNvciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKSB7IGFzc2VydCBzICE9IG51bGw7IF9kYXRhID0gQ3Vyc29yRGF0YS5nZXRPbmUoIHIgKTsgc2V0KCBzLCBwICk7IH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCk7Ci0gICAgfQotCi0gICAgUm9vdCAgZ2V0Um9vdCAoICkgeyByZXR1cm4gX2RhdGEuX2dvb2Jlci5nZXRSb290KCk7IH0KLQotICAgIFNwbGF5IGdldFNwbGF5ICggKSB7IHJldHVybiBfZGF0YS5fZ29vYmVyLmdldFNwbGF5KCk7IH0KLSAgICBpbnQgICBnZXRQb3MgICAoICkgeyByZXR1cm4gX2RhdGEuX2dvb2Jlci5nZXRQb3MoKTsgfQotICAgIAotICAgIHZvaWQgc2V0ICggU3BsYXkgcywgaW50IHAgKSB7IF9kYXRhLl9nb29iZXIuc2V0KCBzLCBwICk7IH0KLSAgICB2b2lkIHNldCAoIFNwbGF5IHMgICAgICAgICkgeyBfZGF0YS5fZ29vYmVyLnNldCggcywgMCApOyB9Ci0gICAgdm9pZCBzZXQgKCBpbnQgcCAgICAgICAgICApIHsgX2RhdGEuX2dvb2Jlci5zZXQoIHAgKTsgfQotICAgIHZvaWQgc2V0ICggR29vYmVyIGcgICAgICAgKSB7IF9kYXRhLl9nb29iZXIuc2V0KCBnICk7IH0KLQotICAgIGludCBnZXRQb3N0Q2NoICggKQotICAgIHsKLSAgICAgICAgaW50IHAgPSBnZXRQb3MoKTsKLQotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgcGEgPSBzLmdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgYXNzZXJ0IHAgPj0gcGEgfHwgcy5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwID49IHBhID8gcy5nZXRDY2hBZnRlcigpIC0gcCArIHBhIDogcy5nZXRQb3NMZWFmRW5kKCkgLSBwOwotICAgIH0KLSAgICAKLSAgICBpbnQgZ2V0UHJlQ2NoICggKQotICAgIHsKLSAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsLCBpbXByb3ZlCi0KLSAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotCi0gICAgICAgIGludCBuID0gdG9QcmV2Q2hhciggLTEgKTsKLQotICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotCi0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXNwb3NlZCAoICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0Rpc3Bvc2VkICggQ3Vyc29yIGMgKQotICAgIHsKLSAgICAgICAgaWYgKGMuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCIgKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbGVhbiBpc0Rpc3Bvc2VkICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kYXRhID09IG51bGw7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBYbWxDdXJzb3IgTWV0aG9kcwotICAgIC8vCi0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RhdGEucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIF9kYXRhID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICghcy5pc1R5cGVhYmxlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBUeXBlIHQgPSBzLmdldFR5cGUoIHIgKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gdC5nZXRYbWxPYmplY3QoKTsKLSAgICAgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9DdXJzb3IgKCBYbWxDdXJzb3IgbW92ZVRvICkKLSAgICB7Ci0gICAgICAgIGlmIChtb3ZlVG8gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIGN1cnNvciIgKTsKLQotICAgICAgICBpZiAobW9uaXRvcigpID09IG1vdmVUby5tb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvQ3Vyc29ySW1wbCggbW92ZVRvICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW92ZVRvLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9DdXJzb3JJbXBsKCBtb3ZlVG8gKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiB0b0N1cnNvckltcGwgKCBYbWxDdXJzb3IgbW92ZVRvICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgCi0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChtb3ZlVG8gaW5zdGFuY2VvZiBDdXJzb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGMgPSAoQ3Vyc29yKSBtb3ZlVG87Ci0KLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoIGMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGMuZ2V0Um9vdCgpICE9IGdldFJvb3QoKSkKLSAgICAgICAgICAgICAgICBjID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzZXQoIGMuX2RhdGEuX2dvb2JlciApOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuZG9jdW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdDdXJzb3IgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHRvQm9va21hcmsgKCBYbWxCb29rbWFyayBibSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChibSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGlmICghKGJtLl9jdXJyZW50TWFyayBpbnN0YW5jZW9mIEFubm90YXRpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIEFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBibS5fY3VycmVudE1hcms7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYS5nZXRSb290KCkgIT0gZ2V0Um9vdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBhLmdldFNwbGF5KCkgIT0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgIHNldCggYSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIHRvTmV4dEJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgY3Vyc29yIHBhc3QgdGhlIGN1cnJlbnQgc3BvdCBieSB0aGUgbWluaW11biBhbW91bnQKLSAgICAKLSAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b05leHRDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgdHQgPSBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgodHQgPSB0b05leHRUb2tlbigpKS5pc05vbmUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBibSA9IGdldEJvb2ttYXJrKCBrZXkgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtOwotICAgIAotICAgICAgICAgICAgICAgIGludCBwb3N0Q2NoOwotICAgIAotICAgICAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSAmJiAocG9zdENjaCA9IGdldFBvc3RDY2goKSkgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgZCA9IHBvc3RDY2g7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBtYXJrOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuaXNBbm5vdGF0aW9uKCkgJiYgKGRpc3QgPSBnLmdldFBvcygpIC0gcCkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPCBkICYmIChtYXJrID0gZy5nZXRCb29rbWFyaygpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLmdldEtleSgpLmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBtYXJrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIHAgKyBkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCh0dCA9IHRvTmV4dFRva2VuKCkpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIHRvUHJldkJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gcHJldlRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgLy8gUmV0cmVhdCB0aGUgY3Vyc29yIHBhc3QgdGhlIGN1cnJlbnQgc3BvdCBieSB0aGUgbWluaW11biBhbW91bnQKLSAgICAKLSAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b1ByZXZDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0b1ByZXZUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldCggc09yaWcsIHBPcmlnICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEJvb2ttYXJrIGJtID0gZ2V0Qm9va21hcmsoIGtleSApOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgCi0gICAgICAgICAgICAgICAgaW50IHByZUNjaDsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAodHQuaXNUZXh0KCkgJiYgKHByZUNjaCA9IGdldFByZUNjaCgpKSA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBzOwotICAgICAgICAgICAgICAgICAgICBpbnQgICBwOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdldFNwbGF5KCkucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ2V0RW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBwcmVDY2g7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBtYXJrOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuaXNBbm5vdGF0aW9uKCkgJiYgKGRpc3QgPSBwIC0gZy5nZXRQb3MoKSkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPCBkICYmIChtYXJrID0gZy5nZXRCb29rbWFyaygpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLmdldEtleSgpLmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBtYXJrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIHAgLSBkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHR0LmlzVGV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9QcmV2Q2hhciggLTEgKTsKLSAgICAgICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvUHJldlRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0dCA9IHByZXZUb2tlblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVG9rZW5UeXBlIGN1cnJlbnRUb2tlblR5cGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRva2VuVHlwZSggZ2V0UG9zKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ZG9jICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnRkb2MoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kZG9jICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNFbmRkb2MoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnQgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNTdGFydCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbmQgICAgICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0VuZCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNUZXh0ICAgICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1RleHQoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0ciAgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNBdHRyKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZSAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzTmFtZXNwYWNlKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQ29tbWVudCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jaW5zdCAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1Byb2NpbnN0KCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lciAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQ29udGFpbmVyKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaCAgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzRmluaXNoKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FueUF0dHIgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQW55QXR0cigpOyB9Ci0gICAgCi0gICAgcHVibGljIFRva2VuVHlwZSBwcmV2VG9rZW5UeXBlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsZW1lbnRhdGlvbiwgaW1wcm92ZQotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWcgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIFRva2VuVHlwZSB0dDsKLSAgICAKLSAgICAgICAgICAgIGlmICh0b1ByZXZDaGFyKCAxICkgPT0gMSkKLSAgICAgICAgICAgICAgICB0dCA9IFRva2VuVHlwZS5URVhUOwotICAgICAgICAgICAgZWxzZSBpZiAoISh0dCA9IHRvUHJldlRva2VuKCkpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0dDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVG9rZW5UeXBlIHRvTmV4dFRva2VuICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBvcyA9IGdldFNwbGF5KCk7IC8vIE9yaWduYWwgc3BsYXkKLSAgICAgICAgICAgIFNwbGF5IHMgPSBvczsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIExvb2sgc2VlIGlmIHRoZXJlIGlzIGFuIGF0dHIgd2Ugc2hvdWxkIHZpc2l0IGJlZm9yZSB2aXNpdGluZwotICAgICAgICAgICAgICAgIC8vIGFueSBmb2xsb3dpbmcgY29udGVudCBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5uZXh0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCggdCwgMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSdyZSBnb2luZyBpbnRvIHRoZSBjb250ZW50IG9mIHRoaXMgY29udGFpbmVyLiAgRmx1c2gKLSAgICAgICAgICAgICAgICAgICAgLy8gb3V0IGFueSBjYWNoZWQgdHlwZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuZ2V0TWF4UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBwID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHAgPj0gcy5nZXRQb3NBZnRlcigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcCA8IHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5nZXRQb3NMZWFmRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5nZXRQb3NBZnRlcigpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBhbiBhdHRyIHRvIGEgbm9uIGF0dHIsIHNlZSBpZiB0aGVyZQotICAgICAgICAgICAgLy8gaXMgY29udGVudCBpbiBhIERPQyBvciBCRUdJTiB3aGljaCBuZWVkcyB0byBiZSB2aXNpdGVkIGFmdGVyCi0gICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlcy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBbHNvLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIGFuIGF0dHIgY29udGFpbmVyIChCRUdJTiBvcgotICAgICAgICAgICAgLy8gRE9DKSB0byBhbiBhdHRyLCB3aGVyZSB0aGUgYXR0ciBjb250YWluZXIgaGFzIGludGVyaW9yIGNvbnRlbnQsCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgdmlzaXRlZCB0aGUgYXR0cnMgYW5kIG11c3Qgc2tpcCB0aGVtIG5vdy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBbHNvLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIHBvcyAwIHRvIHBvcyAxIG9uIGFuIGF0dHIKLSAgICAgICAgICAgIC8vIGNvbnRhaW5lciwgd2UgbmVlZCB0byB2aXNpdCBhbnkgYXR0cmlidXRlcyBiZWZvcmUgdmlzaXRpbmcgdGhlCi0gICAgICAgICAgICAvLyBpbnRlcmlvciBjb250ZW50IG9mIHRoZSBhdHRyIGNvbnRhaW5lci4KLSAgICAgICAgICAgIC8vCi0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSAmJiBvcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBvcy5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5hdmlnYXRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgYSBjb250YWluZXIuICBGbHVzaAotICAgICAgICAgICAgICAgICAgICAvLyBvdXQgYW55IGNhY2hlZCB0eXBlIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdC5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0TWF4UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkgJiYgIW9zLmlzQXR0cigpICYmIG9zLmdldE1heFBvcygpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBvcy5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzLCBwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRva2VuVHlwZSB0b1ByZXZUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgIC8vIFRPRE8gLSBUaGlzIGNvZGUgaXMgbm90IGFzIGNvbXBhY3QgYXMgaXQgY2FuIGJlLCB0aGVyZSBpcyBzb21lIHJlZHVuZGFuY3kKLSAgICAvLyAtLSByZXRoaW5rIGl0IGxhdGVyIC4uLgotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAxICYmIHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgcCArPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMSAmJiBzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMubmV4dFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIHQgPSB0Lm5leHRTcGxheSgpIDsgdC5pc0F0dHIoKSA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0OwotICAgIAotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCAmJiAhcy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7Ci0gICAgCi0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMucHJldlNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ID0gdC5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0LmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRNYXhQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q2NoQWZ0ZXIoKSA+IDAgPyB0LmdldFBvc0FmdGVyKCkgOiB0LmdldE1heFBvcygpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMDsKLSAgICAKLSAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5wcmV2U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoIXQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBzZXQoIHQsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgICAgIHAgPSBzLmdldENjaEFmdGVyKCkgPiAwID8gcy5nZXRQb3NBZnRlcigpIDogcy5nZXRNYXhQb3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzUm9vdCgpOwotICAgIAotICAgICAgICAgICAgICAgIGludCBwb3NBZnRlciA9IHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocCA+PSBwb3NBZnRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPiAwOwotICAgICAgICAgICAgICAgICAgICBwID0gcG9zQWZ0ZXIgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1ZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcCA9IHAgPiAxICYmIHAgPT0gcG9zQWZ0ZXIgLSAxID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzLCBwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hhcnMgKCBTdHJpbmcgdGV4dCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkgfHwgcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkludmFsaWQgbG9jYXRpb24gZm9yIHRleHQiICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgcyA9IHMucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIHAgPSBzLmdldEVuZFBvcygpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBpbnQgY2NoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgIHMuaW5zZXJ0Q2hhcnMoIHAsIGdldFJvb3QoKSwgdGV4dCwgMCwgY2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTG9jYWxOYW1lICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlFOYW1lIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVMb2NhbE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgbnVsbCIgKTsKLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgZW1wdHkiICk7Ci0KLSAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUoIG5hbWUgKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOYW1lIGlzIG5vdCB2YWxpZCIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUHJlZml4ICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcmVmaXggaXMgbnVsbCIgKTsKLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBpcyBlbXB0eSIgKTsKLQotICAgICAgICBpZiAoU3BsYXkuYmVnaW5zV2l0aFhtbCggbmFtZSApKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBiZWdpbnMgd2l0aCAneG1sJyIgKTsKLQotICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZSggbmFtZSApKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBpcyBub3QgdmFsaWQiICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBuYW1lICksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIG5hbWUsIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIG5hbWUsIHVyaSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBuYW1lLCBudWxsLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoCi0gICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUgKTsKLQotICAgICAgICBpbnNlcnRBdHRyaWJ1dGUoIG5ldyBRTmFtZSggdXJpLCBuYW1lICksIHZhbHVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZSApOwotCi0gICAgICAgIGluc2VydEF0dHJpYnV0ZSggbmFtZSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZSApOwotCi0gICAgICAgIGluc2VydEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnROYW1lc3BhY2UgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVQcmVmaXgoIHByZWZpeCApOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBtYXAgYSBwcmVmaXggdG8gbm8gbmFtZXNwYWNlIiApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbmFtZXNwYWNlLCBwcmVmaXggKSApLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRDb21tZW50ICggU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydFByb2NJbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCB0YXJnZXQgKTsgLy8gdXNlZCBiZWN1YXNlICI8P3htbC4uLj8+IGlzIGRpc2FsbG93ZWQKLQotICAgICAgICBpZiAoU3BsYXkuYmVnaW5zV2l0aFhtbCggdGFyZ2V0ICkgJiYgdGFyZ2V0Lmxlbmd0aCgpID09IDMpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiVGFyZ2V0IGJlZ2lucyB3aXRoICd4bWwnIiApOwotICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnNlcnQoIG5ldyBQcm9jaW5zdCggdGFyZ2V0ICksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudFdpdGhUZXh0KCBuYW1lLCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIG5hbWUsIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnRXaXRoVGV4dCggbmFtZSwgbnVsbCwgdGV4dCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnQgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5hbWUsIHVyaSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRFbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5hbWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50KCBuYW1lICk7Ci0gICAgICAgIHRvUHJldlRva2VuKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnQoIG5hbWUgKTsKLSAgICAgICAgdG9QcmV2VG9rZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbGVtZW50ICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmkgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudCggbmFtZSwgdXJpICk7Ci0gICAgICAgIHRvUHJldlRva2VuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggUU5hbWUgbmFtZSwgU3RyaW5nIHRleHQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAKLSAgICAgICAgICAgIEJlZ2luIGIgPSBuZXcgQmVnaW4oIG5hbWUsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYi50b2dnbGVJc0xlYWYoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW5zZXJ0KCBiLCB0ZXh0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmksIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnRXaXRoVGV4dCggbmV3IFFOYW1lKCB1cmksIG5hbWUgKSwgdGV4dCApOwotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0ICggU3BsYXkgc0luc2VydCwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNEaXNwb3NlZCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc0luc2VydC5nZXRSb290U2xvdygpID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBzSW5zZXJ0LmdldENjaCgpID09IDA7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBzSW5zZXJ0LmFkanVzdENjaCggdmFsdWUubGVuZ3RoKCkgKTsKLQotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotCi0gICAgICAgIHNJbnNlcnQuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggMCwgcywgcCwgZmFsc2UgKTsKLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHMuaW5zZXJ0KCBnZXRSb290KCksIHAsIHNJbnNlcnQsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSwgdHJ1ZSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLmluc2VydCggZ2V0Um9vdCgpLCBwLCBzSW5zZXJ0LCBudWxsLCAwLCAwLCB0cnVlICk7Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0VmFsdWUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgcy5pc0ZpbmlzaCgpIHx8IHMuaXNYbWxucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgdGV4dCB2YWx1ZSwgY3VycmVudCB0b2tlbiBjYW4gaGF2ZSBubyB0ZXh0IHZhbHVlIiApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuZ2V0VGV4dCggZ2V0Um9vdCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRWYWx1ZSAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLS8vICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotLy8gICAgCi0vLyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotLy8gICAgCi0vLyAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgcy5pc0ZpbmlzaCgpIHx8IHMuaXNYbWxucygpKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgdGV4dCB2YWx1ZSwgY3VycmVudCB0b2tlbiBjYW4gaGF2ZSBubyB0ZXh0IHZhbHVlIiApOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAKLS8vICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuZ2V0VGV4dCggZ2V0Um9vdCgpICk7Ci0vLyAgICAgICAgfQotCi0gICAgICAgIC8vIEhhY2sgaW1wbCBmb3Igbm93Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcyA9IGdldFRleHRWYWx1ZSgpOwotCi0gICAgICAgIGludCBuID0gcy5sZW5ndGgoKTsKLQotICAgICAgICBpZiAobiA+IGNjaCkKLSAgICAgICAgICAgIG4gPSBjY2g7Ci0KLSAgICAgICAgaWYgKG4gPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHMuZ2V0Q2hhcnMoIDAsIG4sIGJ1Ziwgb2ZmICk7Ci0KLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRleHRWYWx1ZSAoIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgaWYgKHAgPiAwIHx8IHMuaXNYbWxucygpIHx8IHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHRleHQgdmFsdWUsIGN1cnJlbnQgdG9rZW4gY2FuIGhhdmUgbm8gdGV4dCB2YWx1ZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAKLSAgICAgICAgICAgIHMuc2V0VGV4dCggZ2V0Um9vdCgpLCB0ZXh0LCAwLCB0ZXh0ID09IG51bGwgPyAwIDogdGV4dC5sZW5ndGgoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dFZhbHVlICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCi0gICAgewotICAgICAgICBzZXRUZXh0VmFsdWUoIFN0cmluZy5jb3B5VmFsdWVPZiggYnVmLCBvZmYsIGxlbiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnMgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgY2NoID0gLTE7Ci0gICAgCi0gICAgICAgICAgICBpbnQgcG9zdENjaCA9IGdldFBvc3RDY2goKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKLSAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3BsYXkoKS5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBnZXRQb3MoKSApLCBjY2ggKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcnMgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGludCBwb3N0Q2NoID0gZ2V0UG9zdENjaCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gcG9zdENjaCkKLSAgICAgICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOwotICAgIAotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8IG9mZiA+PSBidWYubGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGggLSBvZmYgPCBjY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gYnVmLmxlbmd0aCAtIG9mZjsKLSAgICAKLSAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICBidWYsIG9mZiwgZ2V0U3BsYXkoKS5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBnZXRQb3MoKSApLCBjY2ggKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29rbWFyayAoIFhtbEJvb2ttYXJrIGFubm90YXRpb24gKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBjbGVhckJvb2ttYXJrKCBhbm5vdGF0aW9uLmdldEtleSgpICk7Ci0gICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSBuZXcgQW5ub3RhdGlvbiggZ2V0Um9vdCgpLCBhbm5vdGF0aW9uICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYS5fa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkFubm90YXRpb24ga2V5IGlzIG51bGwiICk7Ci0gICAgCi0gICAgICAgICAgICBhLnNldCggX2RhdGEuX2dvb2JlciApOwotICAgICAgICAgICAgYW5ub3RhdGlvbi5fY3VycmVudE1hcmsgPSBhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIGdldEJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gU3BsYXkuQU5OT1RBVElPTiAmJiBnLmdldFBvcygpID09IHApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZzsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgeGEgPSBhLmdldFhtbEJvb2ttYXJrKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh4YSAhPSBudWxsICYmIGEuX2tleS5lcXVhbHMoIGtleSApKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJCb29rbWFyayAoIE9iamVjdCBrZXkgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgZm9yICggR29vYmVyIGcgPSBzLmZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gcy5uZXh0R29vYmVyKCBnICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChnLmdldEtpbmQoKSA9PSBTcGxheS5BTk5PVEFUSU9OICYmIGcuZ2V0UG9zKCkgPT0gcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBnOwotICAgIAotICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayB4YSA9IGEuZ2V0WG1sQm9va21hcmsoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhhICE9IG51bGwgJiYgYS5fa2V5LmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBudWxsLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRBbGxCb29rbWFya1JlZnMgKCBDb2xsZWN0aW9uIGxpc3RUb0ZpbGwgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGxpc3RUb0ZpbGwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gU3BsYXkuQU5OT1RBVElPTiAmJiBnLmdldFBvcygpID09IHApCi0gICAgICAgICAgICAgICAgICAgIGxpc3RUb0ZpbGwuYWRkKCAoKEFubm90YXRpb24pIGcpLmdldFhtbEJvb2ttYXJrKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCAhZ2V0U3BsYXkoKS5pc1Jvb3QoKSB8fCBnZXRQb3MoKSA9PSAwOwotICAgICAgICAgICAgcmV0dXJuICFnZXRTcGxheSgpLmlzUm9vdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJldlRva2VuICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgICAgICByZXR1cm4gIWdldFNwbGF5KCkuaXNEb2MoKSB8fCBnZXRQb3MoKSA+IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgY2FzZSBTcGxheS5BVFRSIDoKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuUFJPQ0lOU1QgOgotICAgICAgICAgICAgICAgIHJldHVybiBzLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTmFtZSBpcyBudWxsIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhKHMuaXNCZWdpbigpIHx8IHMuaXNBdHRyKCkgfHwgcy5pc1Byb2NpbnN0KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IG5hbWUgaGVyZTogIiArIGN1cnJlbnRUb2tlblR5cGUoKSApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHMuaXNQcm9jaW5zdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJlZml4KCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2NpbnN0IG5hbWUgbXVzdCBoYXZlIG5vIFVSSSIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJlZml4KCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAKLSAgICAgICAgICAgIHMuc2V0TmFtZSggZ2V0Um9vdCgpLCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCB0b05leHRDaGFyICggaW50IGNjaCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGludCBtYXhDY2ggPSBnZXRQb3N0Q2NoKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAobWF4Q2NoID09IDAgfHwgY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBtYXhDY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gbWF4Q2NoOwotICAgIAotICAgICAgICAgICAgYXNzZXJ0IHAgKyBjY2ggPD0gcy5nZXRFbmRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwICsgY2NoID09IHMuZ2V0RW5kUG9zKCkpCi0gICAgICAgICAgICAgICAgdG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXQoIHAgKyBjY2ggKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHRvUHJldkNoYXIgKCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc1RleHQgPSBzOyAgLy8gVGhlIHNwbGF5IGFuZCBwb3Mgd2hlcmUgdGhlIHRleHQgZXhpc3RzCi0gICAgICAgICAgICBpbnQgICBwVGV4dCA9IHA7Ci0gICAgICAgICAgICBpbnQgICBtYXhDY2ggPSAwOyAvLyBNYXggY2hhcnMgdG8gbW92ZSBvdmVyCi0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcy5pc0RvYygpICYmICFzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc1RleHQgPSBzLnByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcFRleHQgPSBzVGV4dC5nZXRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgbWF4Q2NoID0gc1RleHQuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzTGVhZigpICYmIHAgPD0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGRDY2ggPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgICAgICAgICAgICAgIHAgKz0gZENjaDsKLSAgICAgICAgICAgICAgICBwVGV4dCA9IHA7Ci0gICAgICAgICAgICAgICAgbWF4Q2NoID0gcCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWF4Q2NoID0gcCAtIHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBwVGV4dCA8PSBzVGV4dC5nZXRFbmRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChtYXhDY2ggPT0gMCB8fCBjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IG1heENjaCkKLSAgICAgICAgICAgICAgICBjY2ggPSBtYXhDY2g7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHNUZXh0LCBwVGV4dCAtIGNjaCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGNjaDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRvRW5kRG9jICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgc2V0KCBnZXRSb290KCksIDAgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRvU3RhcnREb2MgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIGdldFJvb3QoKS5fZG9jLCAwICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVG9rZW5UeXBlIHRvRmlyc3RDb250ZW50VG9rZW4gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7Ci0gICAgCi0gICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoKCkgPiAwIHx8IHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgc2V0KCAxICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0KCBzLm5leHROb25BdHRyU3BsYXkoKSwgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUb2tlblR5cGUgdG9FbmRUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHNldCggcy5nZXRQb3NMZWFmRW5kKCkgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXQoIHMuZ2V0RmluaXNoU3BsYXkoKSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvUGFyZW50ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwICYmIHMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHMuZ2V0Q29udGFpbmVyKCBwICksIDAgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpLm5leHRTcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpICYmIHAgPD0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGZvciAoIDsgIXMuaXNCZWdpbigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b05leHRTaWJsaW5nICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvTmV4dFNpYmxpbmcoIG5ldyBRTmFtZSggbmFtZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b05leHRTaWJsaW5nKCBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgbmFtZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZ2luYWwgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWdpbmFsID0gZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0b05leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChnZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXQoIHNPcmlnaW5hbCwgcE9yaWdpbmFsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiB0b1ByZXZTaWJsaW5nICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkgfHwgcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIHMgPSBzLnByZXZTcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIDw9IHMuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCggMCApOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNwbGF5IGdldFN0YXJ0ICggKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpIHx8IGdldFBvcygpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2goKTsKLQotICAgICAgICAgICAgaWYgKHRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzID0gbnVsbDsKLQotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0ZpcnN0Q2hpbGQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gdG9DaGlsZCggKFFOYW1lKSBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b0NoaWxkKCBuZXcgUU5hbWUoIG5hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gdG9DaGlsZCggbmV3IFFOYW1lKCBuYW1lc3BhY2UsIG5hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGQgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRSb290KCkuZmluZE50aEJlZ2luKCBnZXRTdGFydCgpLCBuYW1lLCBudWxsLCAwICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggaW50IG4gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvQ2hpbGQoIG51bGwsIG4gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggUU5hbWUgbmFtZSwgaW50IG4gKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4oIGdldFN0YXJ0KCksIG5hbWUsIG51bGwsIG4gKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgc2V0KCBzLCAwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvTGFzdENoaWxkICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXNPcmlnaW5hbC5pc0NvbnRhaW5lcigpIHx8IHBPcmlnaW5hbCAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghdG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXRvRW5kVG9rZW4oKS5pc05vbmUoKSAmJiB0b1ByZXZTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHNPcmlnaW5hbCwgcE9yaWdpbmFsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvRmlyc3RBdHRyaWJ1dGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZ2luYWwgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWdpbmFsID0gZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc09yaWdpbmFsLmlzQ29udGFpbmVyKCkgfHwgcE9yaWdpbmFsICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IHNPcmlnaW5hbC5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9MYXN0QXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXNPcmlnaW5hbC5pc0NvbnRhaW5lcigpIHx8IHBPcmlnaW5hbCAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IGxhc3ROb3JtYWxBdHRyID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBzT3JpZ2luYWwubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgICAgICBsYXN0Tm9ybWFsQXR0ciA9IHM7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAobGFzdE5vcm1hbEF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoIGxhc3ROb3JtYWxBdHRyLCAwICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHNPcmlnaW5hbCwgcE9yaWdpbmFsICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b05leHRBdHRyaWJ1dGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9QcmV2QXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgZm9yICggcyA9IHMucHJldlNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMucHJldlNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVGV4dCAoIFFOYW1lIGF0dHJOYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBdHRyIG5hbWUgaXMgbnVsbCIgKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBhdHRyTmFtZSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCA/IG51bGwgOiBzLmdldFRleHQoIGdldFJvb3QoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QXR0cmlidXRlVGV4dCAoIFFOYW1lIGF0dHJOYW1lLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkF0dHIgbmFtZSBpcyBudWxsIiApOwotICAgIAotICAgICAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIGF0dHJOYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgIAotICAgICAgICAgICAgcyA9IGdldFNwbGF5KCkuZ2V0QXR0ciggYXR0ck5hbWUgKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBuZXdDdXJzb3IoKTsKLSAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IGF0dHIgYXQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggYy5pc0FueUF0dHIoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYy5pbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIGF0dHJOYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcy5zZXRUZXh0KCBnZXRSb290KCksIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUgKCBRTmFtZSBhdHRyTmFtZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXR0ciBuYW1lIGlzIG51bGwiICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpLmdldEF0dHIoIGF0dHJOYW1lICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcy5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOwotICAgIAotICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlbW92ZUNoYXJzICggaW50IGNjaCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgcG9zdENjaCA9IGdldFBvc3RDY2goKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwb3N0Q2NoID09IDAgfHwgY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQotICAgICAgICAgICAgICAgIGNjaCA9IHBvc3RDY2g7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5yZW1vdmVDaGFycyggZ2V0Um9vdCgpLCBnZXRQb3MoKSwgY2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBtb3ZlQ2hhcnMgKCBpbnQgY2NoLCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJEZXN0aW5hdGlvbiBpcyBudWxsIiApOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChtb25pdG9yKCkgPT0gZHN0Lm1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW92ZUNoYXJzSW1wbCggY2NoLCBkc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3ZlQ2hhcnNJbXBsKCBjY2gsIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgbW92ZUNoYXJzSW1wbCAoIGludCBjY2gsIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCAhKGRzdCBpbnN0YW5jZW9mIEN1cnNvcikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCBkZXN0aW5hdGlvbiBjdXJzb3IiICk7Ci0KLSAgICAgICAgQ3Vyc29yIGNEc3QgPSAoQ3Vyc29yKSBkc3Q7Ci0KLSAgICAgICAgY2hlY2tEaXNwb3NlZCggY0RzdCApOwotCi0gICAgICAgIFJvb3QgIHJEc3QgPSBjRHN0LmdldFJvb3QoKTsKLSAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7Ci0KLSAgICAgICAgaWYgKHBEc3QgPT0gMCAmJiAoc0RzdC5pc0RvYygpIHx8IHNEc3QuaXNBdHRyKCkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgZGVzdGluYXRpb24iICk7Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRTcGxheSgpLm1vdmVDaGFycygKLSAgICAgICAgICAgICAgICBnZXRSb290KCksIGdldFBvcygpLCBjY2gsIHJEc3QsIHNEc3QsIHBEc3QsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb3B5Q2hhcnMgKCBpbnQgY2NoLCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJEZXN0aW5hdGlvbiBpcyBudWxsIiApOwotICAgICAgICAKLSAgICAgICAgaWYgKGRzdC5tb25pdG9yKCkgPT0gbW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb3B5Q2hhcnNJbXBsKCBjY2gsIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlDaGFyc0ltcGwoIGNjaCwgZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjb3B5Q2hhcnNJbXBsICggaW50IGNjaCwgWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0KLSAgICAgICAgaWYgKGRzdCA9PSBudWxsIHx8ICEoZHN0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIGN1cnNvciIgKTsKLQotICAgICAgICBDdXJzb3IgY0RzdCA9IChDdXJzb3IpIGRzdDsKLQotICAgICAgICBjaGVja0Rpc3Bvc2VkKCBjRHN0ICk7Ci0KLSAgICAgICAgUm9vdCAgckRzdCA9IGNEc3QuZ2V0Um9vdCgpOwotICAgICAgICBTcGxheSBzRHN0ID0gY0RzdC5nZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwRHN0ID0gY0RzdC5nZXRQb3MoKTsKLQotICAgICAgICBpZiAocERzdCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0RzdC5pc0RvYygpIHx8IHNEc3QuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgZGVzdGluYXRpb24iICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNEc3QgPSBzRHN0LnByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgIHBEc3QgPSBzRHN0LmdldEVuZFBvcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRTcGxheSgpLmNvcHlDaGFycyggZ2V0Um9vdCgpLCBnZXRQb3MoKSwgY2NoLCByRHN0LCBzRHN0LCBwRHN0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBuYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJOb3Qgb24gYSBjb250YWluZXIiICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gcy5uYW1lc3BhY2VGb3JQcmVmaXgoIHByZWZpeCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmVmaXhGb3JOYW1lc3BhY2UgKCBTdHJpbmcgbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKG5zID09IG51bGwgfHwgbnMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTXVzdCBzcGVjaWZ5IGEgbmFtZXNwYWNlIiApOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8ICFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIk5vdCBvbiBhIGNvbnRhaW5lciIgKTsKLSAgICAKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBucywgbnVsbCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldEFsbE5hbWVzcGFjZXMgKCBNYXAgYWRkVG9UaGlzICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJOb3Qgb24gYSBjb250YWluZXIiICk7Ci0gICAgCi0gICAgICAgICAgICAvLyBEbyB0aGlzIHdpdGggY3Vyc29yIGZvciBub3cuLi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBuZXdDdXJzb3IoKTsKLSAgICAKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNDb250YWluZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBRTmFtZSBjTmFtZSA9IGMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICggIWMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSAmJiBjLmlzQW55QXR0cigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLmlzTmFtZXNwYWNlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgICAgPSBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgSSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwcGluZyB3aGljaCBpcyBub3QgZW1wdHkgb24gYSBub24gcm9vdCBjb250YWluZXIgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGluIGEgbmFtZXNwYWNlLiAgVGhpcyB0aGlzIGNhc2UsIEkgZG8gbm90IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1hcHBpbmcgYmVjYXVzZSBpdCBjb3VsZCBub3QgYmUgcGVyc2lzdGVkIG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCAmJiB1cmkubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNOYW1lICE9IG51bGwgJiYgY05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkVG9UaGlzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb1RoaXMucHV0KCBwcmVmaXgsIHVyaSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGMudG9QYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICggYy50b1BhcmVudCgpICk7Ci0gICAgCi0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zOgotICAgICAqCi0gICAgICogICAtMSBpcyB0aGlzIGlzIGxlZnQgb2YgdGhhdAotICAgICAqICAgIDAgaXMgdGhpcyBpcyBsZWZ0IGlzIGF0IHNhbWUgcG9zaXRpb24gYXMgdGhhdAotICAgICAqICAgIDEgaXMgdGhpcyBpcyByaWdodCBvZiB0aGF0Ci0gICAgICovCi0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVQb3NpdGlvbiAoIFhtbEN1cnNvciB4dGhhdCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4dGhhdCA9PSBudWxsIHx8ICEoeHRoYXQgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIHRoYXQgY3Vyc29yIiApOwotICAgIAotICAgICAgICAgICAgQ3Vyc29yIHRoYXQgPSAoQ3Vyc29yKSB4dGhhdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgIAotICAgICAgICAgICAgaWYgKHIgIT0gdGhhdC5nZXRSb290KCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkN1cnNvcnMgbm90IGluIHNhbWUgZG9jdW1lbnQiICk7Ci0gICAgCi0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCB0aGF0ICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBnZXRTcGxheSgpLmNvbXBhcmUoIHIsIGdldFBvcygpLCB0aGF0LmdldFNwbGF5KCksIHRoYXQuZ2V0UG9zKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xlZnRPZiAoIFhtbEN1cnNvciB0aGF0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlUG9zaXRpb24oIHRoYXQgKSA8IDA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXRTYW1lUG9zaXRpb25BcyAoIFhtbEN1cnNvciB0aGF0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlUG9zaXRpb24oIHRoYXQgKSA9PSAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JpZ2h0T2YgKCBYbWxDdXJzb3IgdGhhdCApCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9uKCB0aGF0ICkgPiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIG5ldyBTYXZlci5JbnB1dFN0cmVhbVNhdmVyKAotICAgICAgICAgICAgICAgICAgICBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld0lucHV0U3RyZWFtKCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIgKCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3UmVhZGVyKCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlci5UZXh0UmVhZGVyKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgbmV3IFhtbElucHV0U3RyZWFtSW1wbCggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdYTUxJbnB1dFN0cmVhbSggbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIF90b1N0cmluZ09wdGlvbnMgPQotICAgICAgICBidWlsZFByZXR0eU9wdGlvbnMoKTsKLQotICAgIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIGJ1aWxkUHJldHR5T3B0aW9ucyAoICkKLSAgICB7Ci0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfQUdHUkVTU0lWRV9OQU1FU1BBQ0VTICk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhtbFRleHQoIF90b1N0cmluZ09wdGlvbnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0ICggICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB4bWxUZXh0KCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBTYXZlci5UZXh0U2F2ZXIgc2F2ZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2F2ZXIgPSBuZXcgU2F2ZXIuVGV4dFNhdmVyKAotICAgICAgICAgICAgICAgICAgICBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNhdmVyLnNhdmVUb1N0cmluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDaGFuZ2VTdGFtcEltcGwgaW1wbGVtZW50cyBDaGFuZ2VTdGFtcAotICAgIHsKLSAgICAgICAgQ2hhbmdlU3RhbXBJbXBsICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgX3ZlcnNpb25TdGFtcCA9IF9yb290LmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdmVyc2lvblN0YW1wICE9IF9yb290LmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUm9vdCBfcm9vdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIF92ZXJzaW9uU3RhbXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDaGFuZ2VTdGFtcCBnZXREb2NDaGFuZ2VTdGFtcCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmV3IENoYW5nZVN0YW1wSW1wbCggZ2V0Um9vdCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlWG1sICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBwIDwgcy5nZXRFbmRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSAmJiBwID09IHMuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgaW50IGNjaFJlbW92ZSA9IHJlbW92ZUNoYXJzKCBnZXRQb3N0Q2NoKCkgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBhc3NlcnQgY2NoUmVtb3ZlID4gMDsKLSAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHJlbW92ZSBhIHdob2xlIGRvY3VtZW50LiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBzLnJlbW92ZSggZ2V0Um9vdCgpLCB0cnVlICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlWG1sICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW92ZVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxJbXBsICggZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbW92ZVhtbEltcGwgICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZHN0ID09IG51bGwgfHwgIShkc3QgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW4ndCBtb3ZlIHRvIGEgZm9yZWlnbiBkb2N1bWVudCIgKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIEN1cnNvciBjRHN0ID0gKEN1cnNvcikgZHN0OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY2hlY2tEaXNwb3NlZCggY0RzdCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUm9vdCAgckRzdCA9IGNEc3QuZ2V0Um9vdCgpOwotICAgICAgICBTcGxheSBzRHN0ID0gY0RzdC5nZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwRHN0ID0gY0RzdC5nZXRQb3MoKTsKLSAgICAgICAgICAgIAotICAgICAgICBSb290ICByU3JjID0gZ2V0Um9vdCgpOwotICAgICAgICBTcGxheSBzU3JjID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcFNyYyA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChzU3JjLmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIHBTcmMsIHNEc3QsIHBEc3QsIHRydWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgc1NyYy5tb3ZlQ2hhcnMoCi0gICAgICAgICAgICAgICAgICAgIHJTcmMsIHBTcmMsIGdldFBvc3RDY2goKSwgckRzdCwgc0RzdCwgcERzdCwgZmFsc2UgKSA+IDA7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydCBwU3JjID09IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbW92ZW1lbnQgb2Ygc3R1ZmYgaW50byBpdHNlbGYhICBUaGlzIGNhc2UgaXMgYmFzaWNhbGx5Ci0gICAgICAgIC8vIGEgbm8tb3AKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoclNyYyA9PSByRHN0ICYmIHNEc3QuYmV0d2VlbiggckRzdCwgcERzdCwgc1NyYyApKQotICAgICAgICB7Ci0vLyBUT0RPIC0gSSBtaWdodCBoYXZlIHRvIG9ycGhhbiB0eXBlcyBpbiB0aGUgcmFuZ2UgaGVyZSAuLi4uCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBhc3NlcnQgcFNyYyA9PSAwOwotICAgICAgICAgICAgCi0gICAgICAgIHNTcmMubW92ZSggclNyYywgY0RzdC5nZXRSb290KCksIGNEc3QuZ2V0U3BsYXkoKSwgY0RzdC5nZXRQb3MoKSwgdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjb3B5WG1sICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29weVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb3B5WG1sSW1wbCAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsIHx8ICEoZHN0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2FuJ3QgY29weSB0byBhIGZvcmVpZ24gZG9jdW1lbnQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBDdXJzb3IgY0RzdCA9IChDdXJzb3IpIGRzdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNoZWNrRGlzcG9zZWQoIGNEc3QgKTsKLSAgICAgICAgICAgIAotICAgICAgICBTcGxheSBzRHN0ID0gY0RzdC5nZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwRHN0ID0gY0RzdC5nZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHMuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggcCwgc0RzdCwgcERzdCwgdHJ1ZSApKQotICAgICAgICAgICAgcmV0dXJuIGNvcHlDaGFyc0ltcGwoIGdldFBvc3RDY2goKSwgZHN0ICkgPiAwOwotICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydCBwID09IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgc3BsYXkgY29weSBiZWZvcmUgZ2V0dGluZyB0aGUgdGV4dCBiZWNhdXNlIHRoZSBjb3B5Ci0gICAgICAgIC8vIHdpbGwgdmFsaWRhdGUgaW52YWxpZCBjb250ZW50cy92YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgUm9vdCByRHN0ID0gY0RzdC5nZXRSb290KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTcGxheSBjb3B5ID0gcy5jb3B5U3BsYXkoKTsKLQotICAgICAgICBPYmplY3QgdHh0ID0gci5fdGV4dDsKLSAgICAgICAgaW50IGNwID0gci5nZXRDcCggcyApOwotICAgICAgICBpbnQgY2NoID0gY29weS5nZXRDY2hMZWZ0KCkgKyBjb3B5LmdldENjaCgpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFJlbW92ZSB0ZXh0IGFmdGVyIHdoaWNoIG1pZ2h0IGJlIGJldHdlZW4gbGVhZiB2YWx1ZSBhbmQgZmlyc3QgYXR0ciB2YWx1ZQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNMZWFmKCkgJiYgcy5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gcy5nZXRDY2hWYWx1ZSgpOwotICAgICAgICAgICAgaW50IGNjaEFmdGVyID0gcy5nZXRDY2hBZnRlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2NoVmFsdWUgPT0gMCkKLSAgICAgICAgICAgICAgICBjcCArPSBjY2hBZnRlcjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMubmV4dFNwbGF5KCkuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyIFsgY2NoIF07Ci0gICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggYnVmLCAwLCBjcCwgY2NoVmFsdWUgKTsKLSAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCBidWYsIGNjaFZhbHVlLCBjcCArIGNjaFZhbHVlICsgY2NoQWZ0ZXIsIGNjaCAtIGNjaFZhbHVlICk7Ci0KLSAgICAgICAgICAgICAgICB0eHQgPSBidWY7Ci0gICAgICAgICAgICAgICAgY3AgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgc0RzdC5pbnNlcnQoIHJEc3QsIHBEc3QsIGNvcHksIHR4dCwgY3AsIGNjaCwgdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVYbWxDb250ZW50cyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBpbXBsZW1lbnQgdGhpcyB3aXRoIGludGVybmFscwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICAgICAgYXNzZXJ0ICF0dC5pc05vbmUoKTsKLSAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9ICFpc0ZpbmlzaCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoICFpc0ZpbmlzaCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHJlbW92ZVhtbCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9QYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiByZW1vdmVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoaXNJblNhbWVEb2N1bWVudCggZHN0ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzdC5wdXNoKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzdC5pc0F0U2FtZVBvc2l0aW9uQXMoIHRoaXMgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRzdC5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFkc3QudG9QYXJlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRzdC5wb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gbW92ZVhtbENvbnRlbnRzICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW92ZVhtbENvbnRlbnRzSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZHN0Lm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW92ZVhtbENvbnRlbnRzSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbW92ZVhtbENvbnRlbnRzSW1wbCAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCFpc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBkc3QgaXMgaW4gc3JjISAgSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgICAgIC8vIGRvLgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRhaW5zKCBkc3QgKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICBUb2tlblR5cGUgdHQgPSB0b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIG1vdmVkID0gIWlzRmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFtb3ZlWG1sSW1wbCggZHN0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoICFpc0ZpbmlzaCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBtb3ZlWG1sSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0b1BhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1vdmVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvcHlYbWxDb250ZW50cyAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxDb250ZW50c0ltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxDb250ZW50c0ltcGwoIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvcHlYbWxDb250ZW50c0ltcGwgKCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZHN0IGlzIGluIHNyYyEgIEluIHRoaXMgY2FzZSwgY29weSB0aGUgc3JjIHRvIGEgbmV3Ci0gICAgICAgIC8vIGRvY3VtZW50IGFuZCB0aGVuIG1vdmUgdGhlIGNvcGllZCBjb250ZW50cyB0byB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRhaW5zKCBkc3QgKSkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQ3Vyc29yIGNUbXAgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjVG1wLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghY29weVhtbENvbnRlbnRzSW1wbCggY1RtcCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNUbXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY1RtcC50b1N0YXJ0RG9jKCk7Ci0gICAgICAgICAgICAoKEN1cnNvciljVG1wKS5tb3ZlWG1sQ29udGVudHNJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgIGNUbXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBUb2tlblR5cGUgdHQgPSB0b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIGNvcGllZCA9ICFpc0ZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY29weVhtbEltcGwoIGRzdCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdGFydCgpKQotICAgICAgICAgICAgICAgICAgICB0b0VuZFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBjb3B5WG1sSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0b1BhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvcGllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luU2FtZURvY3VtZW50ICggWG1sQ3Vyc29yIHh0aGF0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICh4dGhhdCA9PSBudWxsIHx8ICEoeHRoYXQgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIEN1cnNvciB0aGF0ID0gKEN1cnNvcikgeHRoYXQ7Ci0gICAgCi0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCB0aGF0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkgPT0gdGhhdC5nZXRSb290KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3N0YWNrID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2RhdGEuX3N0YWNrID0gbmV3IFNlbGVjdGlvbnMoKTsKLSAgICAKLSAgICAgICAgICAgIF9kYXRhLl9zdGFjay5hZGQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCkgKTsKLSAgICAKLSAgICAgICAgICAgIGdldFJvb3QoKS5yZWdpc3RlckZvckNoYW5nZSggdGhpcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcG9wICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3N0YWNrID09IG51bGwgfHwgX2RhdGEuX3N0YWNrLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIF9kYXRhLl9zdGFjay5zZXRDdXJzb3IoIHRoaXMsIF9kYXRhLl9zdGFjay5zaXplKCkgLSAxICk7Ci0gICAgCi0gICAgICAgICAgICBfZGF0YS5fc3RhY2sucG9wKCk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvbkNvdW50ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gX2RhdGEuX3NlbGVjdGlvbnMgPT0gbnVsbCA/IDAgOiBfZGF0YS5fc2VsZWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9TZWxlY3Rpb24gKCBpbnQgaSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMgIT0gbnVsbCAmJiBpID49IDAgJiYgX2RhdGEuX3NlbGVjdGlvbnMuc2V0Q3Vyc29yKCB0aGlzLCBpICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPSBpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRTZWxlY3Rpb24gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoKCk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFNlbGVjdGlvbiA9IF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uOwotICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvTmV4dFNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgICAgICAgIF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiB0b05leHRTZWxlY3Rpb24gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMgPT0gbnVsbCB8fCBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA8IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGludCBuZXh0U2VsZWN0aW9uID0gX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gKyAxOwotICAgIAotICAgICAgICAgICAgaWYgKCFfZGF0YS5fc2VsZWN0aW9ucy5zZXRDdXJzb3IoIHRoaXMsIG5leHRTZWxlY3Rpb24gKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA9IC0yOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uID0gbmV4dFNlbGVjdGlvbjsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJTZWxlY3Rpb25zICggICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIF9kYXRhLmNsZWFyU2VsZWN0aW9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9TZWxlY3Rpb24gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfZGF0YS5fc2VsZWN0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9kYXRhLl9zZWxlY3Rpb25zID0gUGF0aC5uZXdTZWxlY3Rpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvLyBGb3JjZSBhbnkgc2VsZWN0aW9uIGVuZ2luZSB0byBzZWFyY2ggYWxsLi4uCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5zaXplKCk7Ci0gICAgCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5hZGQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCkgKTsKLSAgICAKLSAgICAgICAgICAgIGdldFJvb3QoKS5yZWdpc3RlckZvckNoYW5nZSggdGhpcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNoYW5nZU5vdGlmaWNhdGlvbiAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfZGF0YS5fc2VsZWN0aW9ucyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5zaXplKCk7ICAvLyBGb3JjZSBhIGZ1bGwgc2VsZWN0aW9uCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5jdXJzaWZ5KCBnZXRSb290KCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfZGF0YS5fc3RhY2sgIT0gbnVsbCkKLSAgICAgICAgICAgIF9kYXRhLl9zdGFjay5jdXJzaWZ5KCBnZXRSb290KCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKF9kYXRhLl9zZWxlY3Rpb25zID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMgPSBQYXRoLm5ld1NlbGVjdGlvbnMoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5kaXNwb3NlKCk7Ci0gICAgCi0gICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucy5pbml0KCAKLSAgICAgICAgICAgICAgICBQYXRoLnNlbGVjdCggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgcGF0aCwgb3B0aW9ucyApICk7Ci0gICAgCi0gICAgICAgICAgICBwdXNoKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMuc2V0Q3Vyc29yKCB0aGlzLCAwICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Um9vdCgpLnJlZ2lzdGVyRm9yQ2hhbmdlKCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA9IC0yOwotICAgIAotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoICkKLSAgICB7Ci0gICAgICAgIHNlbGVjdFBhdGgoIHBhdGgsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEN1cnNvciBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIFBhdGgucXVlcnkoIHRoaXMsIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYbWxDdXJzb3IgZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleGVjUXVlcnkoIHF1ZXJ5LCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdEb21Ob2RlKCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUgKCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNhdmVyLkRvbVNhdmVyIHNhdmVyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYXZlciA9IG5ldyBTYXZlci5Eb21TYXZlcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgIWlzRnJhZ21lbnQoKSwgb3B0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gc2F2ZXIuZXhwb3J0RG9tKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoKQotICAgIHsKLSAgICAgICAgaWYgKCEgaXNTdGFydGRvYygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgYm9vbGVhbiBzZWVuRWxlbWVudCA9IGZhbHNlOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0gbmV3Q3Vyc29yKCk7Ci0gICAgICAgIGludCB0b2tlbiA9IGMudG9OZXh0VG9rZW4oKS5pbnRWYWx1ZSgpOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIExPT1A6Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTV0lUQ0g6Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGMudG9FbmRUb2tlbigpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX1RFWFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBTcGxheS5pc1doaXRlU3BhY2UoYy5nZXRDaGFycygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gYy50b05leHRUb2tlbigpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX0VORERPQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIExPT1A7Ci0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfQVRUUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9FTkQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9DT01NRU5UOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfUFJPQ0lOU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGMudG9OZXh0VG9rZW4oKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVERPQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIExPT1A7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gISBzZWVuRWxlbWVudDsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGggKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzYXZlKCBjaCwgbGgsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F2ZSggZmlsZSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzYXZlKCBvcywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBXcml0ZXIgdyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F2ZSggdywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gdG9kbzogZG9uJ3QgaG9sZCB0aGUgbW9uaXRvciBhbGwgdGhpcyBsb25nLgotICAgICAgICAvLyBJZGVhbGx5LCB3ZSdkIHJlbGVhc2UgdGhlIG1vbml0b3IgZWFjaCB0aW1lIHdlJ3JlIGFib3V0IHRvIGNhbGwgdGhlCi0gICAgICAgIC8vIGNoIG9yIGxoIG9iamVjdHMuICBIb3dldmVyLCB0aGUgc2F2ZXIgY29kZSBpc24ndCBfcXVpdGVfIHN0cnVjdHVyZQotICAgICAgICAvLyBqdXN0IHJpZ2h0IHRvIGRvIHRoYXQuICBTbyBpbnN0ZWFkLCB0aGUgY3VycmVudCB2ZXJzaW9uIHdpbGwgaG9sZAotICAgICAgICAvLyB0aGUgbW9uaXRvciBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlbnRpcmUgU0FYIHNhdmUuCi0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbmV3IFNhdmVyLlNheFNhdmVyKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpLCBvcHRpb25zLCBjaCwgbGggKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmaWxlICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmUoIG9zLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBPdXRwdXRTdHJlYW0gb3MsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIG5vdCBob2xkIHRoZSBtb25pdG9yIGZvciB0aGUgZHVyYXRpb24gb2YgYSBzYXZlLgotICAgICAgICAvLyBJbnN0ZWFkLCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlCi0gICAgICAgIC8vIGRvY3VtZW50IGlzIG1vZGlmaWVkIHdoaWxlIHRoZSBzYXZlIGlzIGluIHByb2dyZXNzLiBJZiB0aGUgdXNlcgotICAgICAgICAvLyB3aXNoZXMgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoaXMsIGhlIGNhbiBzeW5jaHJvbml6ZSBvbiB0aGUgbW9uaXRvcgotICAgICAgICAvLyBoaW1zZWxmLgotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ld0lucHV0U3RyZWFtKCBvcHRpb25zICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWyA4MTkyIF07Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSBpcy5yZWFkKCBieXRlcyApOwotCi0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIG9zLndyaXRlKCBieXRlcywgMCwgbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhZGVyIHIgPSBuZXdSZWFkZXIoIG9wdGlvbnMgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbIDgxOTIgXTsKLQotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggY2hhcnMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICB3LndyaXRlKCBjaGFycywgMCwgbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9kYXRhLl9nb29iZXIuZ2V0Um9vdCgpLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCApIHsgX2RhdGEuX2dvb2Jlci5nZXRSb290KCkuZHVtcCgpOyB9Ci0gICAgcHVibGljIHZvaWQgZHVtcCAoIGJvb2xlYW4gdmVyYm9zZSApIHsgX2RhdGEuX2dvb2Jlci5nZXRSb290KCkuZHVtcCggdmVyYm9zZSApOyB9Ci0KLSAgICBpbnRlcmZhY2UgUGF0aEVuZ2luZQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBuZXh0ICggU2VsZWN0aW9ucyBzZWxlY3Rpb25zICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFNlbGVjdGlvbnMKLSAgICB7Ci0gICAgICAgIHZvaWQgaW5pdCAoIFBhdGhFbmdpbmUgcGF0aEVuZ2luZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX3BhdGhFbmdpbmUgPSBwYXRoRW5naW5lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFkZCAoIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggciwgcywgMCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFkZCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEN1cnNvckdvb2JlciBnID0gbmV3IEN1cnNvckdvb2JlciggciApOwotCi0gICAgICAgICAgICAgICAgZy5zZXQoIHMsIHAgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfY3Vyc29ycy5hZGQoIGcgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKF9zcGxheXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2NvdW50ID09IDA7Ci0gICAgICAgICAgICAgICAgX3NwbGF5cyA9IG5ldyBTcGxheSBbIDE2IF07Ci0gICAgICAgICAgICAgICAgX3Bvc2l0aW9ucyA9IG5ldyBpbnQgWyAxNiBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoX2NvdW50ID09IF9zcGxheXMubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5W10gbmV3U3BsYXlzID0gbmV3IFNwbGF5IFsgX2NvdW50ICogMiBdOwotICAgICAgICAgICAgICAgIGludFtdICAgbmV3UG9zaXRpb25zID0gbmV3IGludCBbIF9jb3VudCAqIDIgXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfc3BsYXlzLCAwLCBuZXdTcGxheXMsIDAsIF9jb3VudCApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9wb3NpdGlvbnMsIDAsIG5ld1Bvc2l0aW9ucywgMCwgX2NvdW50ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX3NwbGF5cyA9IG5ld1NwbGF5czsKLSAgICAgICAgICAgICAgICBfcG9zaXRpb25zID0gbmV3UG9zaXRpb25zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfc3BsYXlzWyBfY291bnQgXSA9IHM7Ci0gICAgICAgICAgICBfcG9zaXRpb25zWyBfY291bnQgXSA9IHA7Ci0KLSAgICAgICAgICAgIF9jb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwb3AgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzaXplKCkgPiAwOwotCi0gICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IF9jdXJzb3JzLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgKChDdXJzb3JHb29iZXIpIF9jdXJzb3JzLmdldCggaSApKS5zZXQoIG51bGwsIDAgKTsKLSAgICAgICAgICAgICAgICBfY3Vyc29ycy5yZW1vdmUoIGkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY291bnQtLTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY3Vyc2lmeSAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsIHx8IF9jb3VudCA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgX2N1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfY291bnQgOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEN1cnNvckdvb2JlciBnID0gbmV3IEN1cnNvckdvb2JlciggciApOwotCi0gICAgICAgICAgICAgICAgZy5zZXQoIF9zcGxheXNbIGkgXSwgX3Bvc2l0aW9uc1sgaSBdICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2N1cnNvcnMuYWRkKCBnICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9jb3VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9wYXRoRW5naW5lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBfcGF0aEVuZ2luZS5uZXh0KCB0aGlzICkgKQotICAgICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgICAgICAgICBfcGF0aEVuZ2luZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGN1cnJlbnRTaXplICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnNvcnMgIT0gbnVsbCA/IF9jdXJzb3JzLnNpemUoKSA6IF9jb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2V0Q3Vyc29yICggQ3Vyc29yIGMsIGludCBpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGkgPj0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKCBfcGF0aEVuZ2luZSAhPSBudWxsICYmIGN1cnJlbnRTaXplKCkgPD0gaSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFfcGF0aEVuZ2luZS5uZXh0KCB0aGlzICkpCi0gICAgICAgICAgICAgICAgICAgIF9wYXRoRW5naW5lID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPj0gY3VycmVudFNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgX2N1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGMuc2V0KCAoQ3Vyc29yR29vYmVyKSBfY3Vyc29ycy5nZXQoIGkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgX2NvdW50OwotICAgICAgICAgICAgICAgIGMuc2V0KCBfc3BsYXlzWyBpIF0sIF9wb3NpdGlvbnNbIGkgXSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZGlzcG9zZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJzb3JzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9jdXJzb3JzLnNpemUoKSA7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgICgoQ3Vyc29yR29vYmVyKSBfY3Vyc29ycy5nZXQoIGkgKSkuc2V0KCBudWxsLCAwICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2N1cnNvcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfY3Vyc29ycyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUT0RPIC0gY2FjaGUgdW51c2VkIFNlbGVjaXRvbiBvYmplY3RzIGZvciBsYXRlciByZXVzZQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTcGxheVtdIF9zcGxheXM7Ci0gICAgICAgIHByaXZhdGUgaW50W10gICBfcG9zaXRpb25zOwotICAgICAgICBwcml2YXRlIGludCAgICAgX2NvdW50OwotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IF9jdXJzb3JzOwotCi0gICAgICAgIHByaXZhdGUgUGF0aEVuZ2luZSBfcGF0aEVuZ2luZTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBDdXJzb3JEYXRhIF9kYXRhOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9DdXJzb3JEYXRhLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZDM0MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotICoNCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkN1cnNvckdvb2JlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi1wdWJsaWMgZmluYWwgY2xhc3MgQ3Vyc29yRGF0YQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDdXJzb3JEYXRhIGdldE9uZSAoIFJvb3QgciApDQotICAgIHsNCi0gICAgICAgIEFycmF5TGlzdCBkYXRhQ2FjaGUgPSAoQXJyYXlMaXN0KSB0bF9DYWNoZWRDdXJzb3JEYXRhLmdldCgpOw0KLQ0KLSAgICAgICAgQ3Vyc29yRGF0YSBjZDsNCi0NCi0gICAgICAgIGlmIChkYXRhQ2FjaGUuc2l6ZSgpID09IDApDQotICAgICAgICAgICAgY2QgPSBuZXcgQ3Vyc29yRGF0YSggciApOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNkID0gKEN1cnNvckRhdGEpIGRhdGFDYWNoZS5yZW1vdmUoIGRhdGFDYWNoZS5zaXplKCkgLSAxICk7DQotICAgICAgICAgICAgY2QuX2dvb2Jlci5zZXQoIHIgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGNkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ3Vyc29yRGF0YSAoIFJvb3QgciApDQotICAgIHsNCi0gICAgICAgIF9nb29iZXIgPSBuZXcgQ3Vyc29yR29vYmVyKCByICk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGxfQ2FjaGVkQ3Vyc29yRGF0YSA9DQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKSB7IHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkgeyByZXR1cm4gbmV3IEFycmF5TGlzdCgpOyB9IH07DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlICggKQ0KLSAgICB7DQotICAgICAgICBpZiAoX2dvb2Jlci5nZXRTcGxheSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xlYXJTZWxlY3Rpb25zKCk7DQotDQotICAgICAgICAgICAgaWYgKF9zdGFjayAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICBfc3RhY2suZGlzcG9zZSgpOw0KLQ0KLSAgICAgICAgICAgIF9nb29iZXIuc2V0KCBudWxsLCAwICk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQXJyYXlMaXN0IGRhdGFDYWNoZSA9IChBcnJheUxpc3QpIHRsX0NhY2hlZEN1cnNvckRhdGEuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKGRhdGFDYWNoZS5zaXplKCkgPCAxMjgpDQotICAgICAgICAgICAgICAgIGRhdGFDYWNoZS5hZGQoIHRoaXMgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUgKCApDQotICAgIHsNCi0gICAgICAgIFNwbGF5IHMgPSBfZ29vYmVyLmdldFNwbGF5KCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkICggX2dvb2Jlci5nZXRSb290KCkgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVsZWFzZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgIHZvaWQgY2xlYXJTZWxlY3Rpb25zICggICkNCi0gICAgew0KLSAgICAgICAgaWYgKF9zZWxlY3Rpb25zICE9IG51bGwpDQotICAgICAgICAgICAgX3NlbGVjdGlvbnMuZGlzcG9zZSgpOw0KLQ0KLSAgICAgICAgX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGZpbmFsIEN1cnNvckdvb2JlciBfZ29vYmVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQ3Vyc29yLlNlbGVjdGlvbnMgIF9zdGFjazsNCi0NCi0gICAgcHJvdGVjdGVkIEN1cnNvci5TZWxlY3Rpb25zICBfc2VsZWN0aW9uczsNCi0gICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgICAgICBfY3VycmVudFNlbGVjdGlvbjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9Hb29iZXJzLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0dvb2JlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlM2YzYy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0dvb2JlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5Lkdvb2JlcjsKLQotcHVibGljIGNsYXNzIEdvb2JlcnMKLXsKLSAgICBHb29iZXIgX2dvb2JlcnM7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1BhdGguamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUyNzliLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ3Vyc29yR29vYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5DdXJzb3IuU2VsZWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuQ3Vyc29yLlBhdGhFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWFBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHByZWNvbXBpbGVkIHBhdGggZXhwcmVzc2lvbgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXRoCi17Ci0gICAgc3RhdGljIFNlbGVjdGlvbnMgbmV3U2VsZWN0aW9ucyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9ucygpOwotICAgIH0KLQotICAgIHN0YXRpYyBQYXRoRW5naW5lIHNlbGVjdCAoCi0gICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFBhdGggcGF0aCA9IGdldFBhdGgoIHBhdGhFeHByLCBvcHRpb25zICk7Ci0gICAgICAgIHJldHVybiAocGF0aCA9PSBudWxsKSA/IG51bGwgOiBwYXRoLmV4ZWN1dGUoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBfdXNlWHFybEZvclhwYXRoID0gInVzZSB4cXJsIGZvciB4cGF0aCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBfdXNlWGJlYW5Gb3JYcGF0aCA9ICJ1c2UgeGJlYW4gZm9yIHhwYXRoIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBnZXRQYXRoICggU3RyaW5nIHBhdGhFeHByICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQYXRoKCBwYXRoRXhwciwgZmFsc2UsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBQYXRoIGdldFBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGdldFBhdGgoCi0gICAgICAgICAgICAgICAgcGF0aEV4cHIsCi0gICAgICAgICAgICAgICAgWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApLmhhc09wdGlvbiggX3VzZVhxcmxGb3JYcGF0aCApLAotICAgICAgICAgICAgICAgIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBhdGggZ2V0UGF0aCAoIFN0cmluZyBwYXRoRXhwciwgYm9vbGVhbiB4cXJsLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHBhdGggPSBudWxsOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkICggX3hiZWFuUGF0aENhY2hlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF4cXJsKQotICAgICAgICAgICAgICAgIHBhdGggPSBfeGJlYW5QYXRoQ2FjaGUuZ2V0KCBwYXRoRXhwciApOwotCi0gICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHBhdGggPSBfeHFybFBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHIgPSBnZXRDb21waWxlZFBhdGgoIHBhdGhFeHByLCB4cXJsLCBvcHRpb25zICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChwYXRoU3RyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0UGF0aCggcGF0aEV4cHIsIHhxcmwsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoUGF0aCkgcGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZWRQYXRoICggU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENvbXBpbGVkUGF0aCggcGF0aEV4cHIsIGZhbHNlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbnROb2RlVmFyICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50Tm9kZVZhciA9ICJ0aGlzIjsKLQotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlhRVUVSWV9DVVJSRU5UX05PREVfVkFSICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlVmFyID0gKFN0cmluZykgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuWFFVRVJZX0NVUlJFTlRfTk9ERV9WQVIgKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkIiApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiT21pdCB0aGUgJyQnIHByZWZpeCBmb3IgdGhlIGN1cnJlbnQgbm9kZSB2YXJpYWJsZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZVZhcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZWRQYXRoICggU3RyaW5nIHBhdGhFeHByLCBib29sZWFuIHhxcmwsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBQYXRoIHBhdGggPSBudWxsOwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjdXJyZW50Tm9kZVZhciA9IGdldEN1cnJlbnROb2RlVmFyKCBvcHRpb25zICk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkICggX3hiZWFuUGF0aENhY2hlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICh4cXJsIHw9IG9wdGlvbnMuaGFzT3B0aW9uKCBfdXNlWHFybEZvclhwYXRoICkpIHx8IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICgheHFybCB8fCBvcHRpb25zLmhhc09wdGlvbiggX3VzZVhiZWFuRm9yWHBhdGggKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gKFBhdGgpIF94YmVhblBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFhiZWFuUGF0aEltcGwuY3JlYXRlKCBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hiZWFuUGF0aENhY2hlLnB1dCggcGF0aC5nZXRQYXRoRXhwcigpLCBwYXRoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCAhIG9wdGlvbnMuaGFzT3B0aW9uKCBfdXNlWGJlYW5Gb3JYcGF0aCApOwotCi0gICAgICAgICAgICAgICAgcGF0aCA9IChQYXRoKSBfeHFybFBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFhxcmxQYXRoSW1wbC5jcmVhdGUoIHBhdGhFeHByLCBjdXJyZW50Tm9kZVZhciApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeHFybFBhdGhDYWNoZS5wdXQoIHBhdGguZ2V0UGF0aEV4cHIoKSwgcGF0aCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXRoID09IG51bGwgPyBudWxsIDogcGF0aC5nZXRQYXRoRXhwcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgUXVlcnkKLSAgICB7Ci0gICAgICAgIFBhdGhFbmdpbmUgIGV4ZWN1dGVQYXRoICAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgICAgICBYbWxDdXJzb3IgICBleGVjdXRlUXVlcnkgKCBDdXJzb3IgYywgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgICAgIFhtbE9iamVjdFtdIGV4ZWN1dGVRdWVyeSAoIFR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgICAgIFN0cmluZyAgICAgIGdldFF1ZXJ5RXhwciAoICk7Ci0gICAgfQotCi0vLyAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5IGdldFF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciApCi0vLyAgICB7Ci0vLyAgICAgICAgcmV0dXJuIGdldFF1ZXJ5KCBxdWVyeUV4cHIsIG51bGwgKTsKLS8vICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5IGdldFF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBxdWVyeSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKCBfeHFybFF1ZXJ5Q2FjaGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBxdWVyeSA9IF94cXJsUXVlcnlDYWNoZS5nZXQoIHF1ZXJ5RXhwciApOwotCi0gICAgICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlTdHIgPSBnZXRDb21waWxlZFF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBxdWVyeSA9Ci0gICAgICAgICAgICAgICAgICAgIChxdWVyeVN0ciA9PSBudWxsKSA/IG51bGwgOiBnZXRRdWVyeSggcXVlcnlFeHByLCBvcHRpb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFF1ZXJ5KSBxdWVyeTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZWRRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBRdWVyeSBxdWVyeSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50Tm9kZVZhciA9IGdldEN1cnJlbnROb2RlVmFyKCBvcHRpb25zICk7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKCBfeHFybFF1ZXJ5Q2FjaGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBxdWVyeSA9IChRdWVyeSkgX3hxcmxRdWVyeUNhY2hlLmdldCggcXVlcnlFeHByICk7Ci0KLSAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHF1ZXJ5ID0gWHFybERlbGVnYXRlLmNvbXBpbGVRdWVyeSggcXVlcnlFeHByLCBjdXJyZW50Tm9kZVZhciApOwotCi0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF94cXJsUXVlcnlDYWNoZS5wdXQoIHF1ZXJ5LmdldFF1ZXJ5RXhwcigpLCBxdWVyeSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHF1ZXJ5ID09IG51bGwgPyBudWxsIDogcXVlcnkuZ2V0UXVlcnlFeHByKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxDdXJzb3IgcXVlcnkgKAotICAgICAgICBDdXJzb3IgYywgU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gZ2V0UXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICByZXR1cm4gKHF1ZXJ5ID09IG51bGwpID8gbnVsbCA6IHF1ZXJ5LmV4ZWN1dGVRdWVyeSggYywgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0W10gcXVlcnkgKAotICAgICAgICBUeXBlIHR5cGUsIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBRdWVyeSBxdWVyeSA9IGdldFF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICAgICAgcmV0dXJuIChxdWVyeSA9PSBudWxsKSA/IG51bGwgOiBxdWVyeS5leGVjdXRlUXVlcnkoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUGF0aEVuZ2luZSBleGVjdXRlICgKLSAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhdGhFeHByICggKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhxcmxQYXRoSW1wbCBleHRlbmRzIFBhdGgKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgWHFybFBhdGhJbXBsICggU3RyaW5nIHBhdGhFeHByLCBRdWVyeSBjb21waWxlZFBhdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGF0aEV4cHIgPSBwYXRoRXhwcjsKLSAgICAgICAgICAgIF9jb21waWxlZFBhdGggPSBjb21waWxlZFBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfcGF0aEV4cHI7Ci0gICAgICAgIHByaXZhdGUgUXVlcnkgIF9jb21waWxlZFBhdGg7Ci0KLSAgICAgICAgc3RhdGljIFBhdGggY3JlYXRlICggU3RyaW5nIHBhdGhFeHByLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhxcmxQYXRoSW1wbCgKLSAgICAgICAgICAgICAgICBwYXRoRXhwciwKLSAgICAgICAgICAgICAgICBYcXJsRGVsZWdhdGUuY29tcGlsZVBhdGgoIHBhdGhFeHByLCBjdXJyZW50Tm9kZVZhciApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgUGF0aEVuZ2luZSBleGVjdXRlICgKLSAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29tcGlsZWRQYXRoLmV4ZWN1dGVQYXRoKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aEV4cHIgKCApIHsgcmV0dXJuIF9wYXRoRXhwcjsgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgWGJlYW5QYXRoSW1wbCBleHRlbmRzIFBhdGgKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgWGJlYW5QYXRoSW1wbCAoCi0gICAgICAgICAgICBYUGF0aCB4cGF0aCwgU3RyaW5nIHBhdGhFeHByLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGF0aEV4cHIgPSBwYXRoRXhwcjsKLSAgICAgICAgICAgIF94cGF0aCA9IHhwYXRoOwotICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID0gY3VycmVudE5vZGVWYXI7Ci0gICAgICAgIH0KLQotLy8gICAgICAgICAgICB0cnkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnROb2RlVmFyID0gInRoaXMiOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBpZiAoWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUi5oYXMoIG9wdGlvbnMgKSkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZVZhciA9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICIkIiArIFhtbE9wdGlvbnMuWFFVRVJZX0NVUlJFTlRfTk9ERV9WQVIuZ2V0KCBvcHRpb25zICk7Ci0vLwotLy8gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCQiICkpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT21pdCB0aGUgJyRwJyByZWZpeCBmb3IgdGhlIGN1cnJlbnQgIiArCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub2RlIHZhcmlhYmxlIiApOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUGF0aCBjcmVhdGUgKCBTdHJpbmcgcGF0aEV4cHIsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBuZXcgWGJlYW5QYXRoSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoLmNvbXBpbGVYUGF0aCggcGF0aEV4cHIsIGN1cnJlbnROb2RlVmFyICksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoRXhwciAoICkgeyByZXR1cm4gX3BhdGhFeHByOyB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgUGF0aEVuZ2luZSBleGVjdXRlICgKLSAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBidWlsdGluIFhQYXRoIGVuZ2luZSB3b3JrcyBvbmx5IG9uIGNvbnRhaW5lcnMuICBEZWxlZ2F0ZSB0bwotICAgICAgICAgICAgLy8geHFybCBvdGhlcndpc2UuICBBbHNvLCBpZiB0aGUgcGF0aCBoYWQgYSAvLy4gYXQgdGhlIGVuZCwgdGhlCi0gICAgICAgICAgICAvLyBzaW1wbGUgeHBhdGggZW5naW5lIGNhbid0IGRvIHRoZSBnZW5lcmF0ZSBjYXNlLCBpdCBvbmx5IGhhbmRsZXMKLSAgICAgICAgICAgIC8vIGF0dHJzIGFuZCBlbGVtZW50cy4KLQotICAgICAgICAgICAgaWYgKHAgIT0gMCB8fCAhcy5pc0NvbnRhaW5lcigpIHx8IF94cGF0aC5zYXdEZWVwRG90KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHhiZWFuIHBhdGggY29tcGlsZXIgY291bGQgY291bGQgaGFuZGxlIHRoZSBwYXRoLCB0aGVuCi0gICAgICAgICAgICAgICAgLy8gdGhlIHhxcmwgY29tcGlsZXIgYmV0dGVyIGJlIGFibGUgdG8hCi0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCggX3BhdGhFeHByLCB0cnVlLCBudWxsICkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSggciwgcywgcCwgb3B0aW9ucyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ2FuJ3QgY29tcGlsZSBwYXRoIiwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYQmVhblBhdGhFbmdpbmUoIF94cGF0aCwgciwgcyApOwotICAgICAgICB9Ci0KLS8vIFRPRE8gLSBiZWNhdXNlIHRoaXMgeHBhdGggZW5naW5lIGRvZXMgbm90IHVzZSBhIHNhdmVyLCBhbnkgYXR0cmlidXRlcyBpbiB0aGUKLS8vIHBhdGggd2hpY2ggcmVmZXIgdG8gbmFtZXNhcGNlIGF0dHJpYnV0ZXMgd2lsbCByZXF1aXJlIHVzIHRvIHJ1biB0aGUgWFFSTAotLy8gcGF0aCBlbmdpbmUgd2hpY2ggaXMgYmFzZWQgb24gdGhlIHNhdmVyLgotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhCZWFuUGF0aEVuZ2luZQotICAgICAgICAgICAgZXh0ZW5kcyBYUGF0aC5FeGVjdXRpb25Db250ZXh0IGltcGxlbWVudHMgUGF0aEVuZ2luZQotICAgICAgICB7Ci0gICAgICAgICAgICBYQmVhblBhdGhFbmdpbmUgKCBYUGF0aCB4cGF0aCwgUm9vdCByLCBTcGxheSBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgICAgIF9jdXJyID0gX3RvcCA9IHM7Ci0gICAgICAgICAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLQotICAgICAgICAgICAgICAgIGluaXQoIHhwYXRoICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG5leHQgKCBTZWxlY3Rpb25zIHNlbGVjdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpbml0aWFsU2l6ZSA9IHNlbGVjdGlvbnMuY3VycmVudFNpemUoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3Jvb3QuZ2V0VmVyc2lvbigpICE9IF92ZXJzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSggc2VsZWN0aW9ucyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsU2l6ZSA8IHNlbGVjdGlvbnMuY3VycmVudFNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBTcGxheSBkb0F0dHJzICggaW50IHJldCwgU3BsYXkgcywgU2VsZWN0aW9ucyBzZWxlY3Rpb25zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKHJldCAmIEFUVFJTKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoIHMgPSBfY3Vyci5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOwotICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmIGF0dHIoIHMuZ2V0TmFtZSgpICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZCggX3Jvb3QsIHMgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UgKCBTZWxlY3Rpb25zIHNlbGVjdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfY3VyciA9PSBfdG9wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgJiBISVQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZCggX3Jvb3QsIF9jdXJyICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGRvQXR0cnMoIHJldCwgX2N1cnIsIHNlbGVjdGlvbnMgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCAmIERFU0NFTkQpID09IDAgfHwgX2N1cnIuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gcyA9PSBudWxsID8gX2N1cnIubmV4dE5vbkF0dHJTcGxheSgpIDogczsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuZ2V0Q29udGFpbmVyKCkgPT0gX3RvcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBfY3Vyci5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IGVsZW1lbnQoIF9jdXJyLmdldE5hbWUoKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCAmIEhJVCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZCggX3Jvb3QsIF9jdXJyICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBkb0F0dHJzKCByZXQsIF9jdXJyLCBzZWxlY3Rpb25zICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IHMgPT0gbnVsbCA/IF9jdXJyLm5leHROb25BdHRyU3BsYXkoKSA6IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocmV0ICYgREVTQ0VORCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9ICgoU3BsYXkuQ29udGFpbmVyKSBfY3VycikuZ2V0RmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBzID09IG51bGwgPyBfY3Vyci5uZXh0Tm9uQXR0clNwbGF5KCkgOiBzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBSb290ICBfcm9vdDsKLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgX3ZlcnNpb247Ci0gICAgICAgICAgICBwcml2YXRlIFNwbGF5IF90b3A7Ci0gICAgICAgICAgICBwcml2YXRlIFNwbGF5IF9jdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3BhdGhFeHByOwotICAgICAgICBwcml2YXRlIFhQYXRoICBfeHBhdGg7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9jdXJyZW50Tm9kZVZhcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIF94cXJsUGF0aENhY2hlID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIF94YmVhblBhdGhDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBfeHFybFF1ZXJ5Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9Sb290LmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1Jvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzMThhOC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1Jvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkVuY29kaW5nTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5GaW5pc2g7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvY3VtZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQXR0cmlidXRlOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQXR0cmlidXRlSXRlcmF0b3I7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TcGFjZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSb290IGV4dGVuZHMgRmluaXNoIGltcGxlbWVudHMgWG1sU3RvcmUKLXsKLSAgICBwdWJsaWMgUm9vdCAoIFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzdXBlciggUk9PVCApOwotCi0gICAgICAgIGFzc2VydCBzdGwgIT0gbnVsbDsKLQotICAgICAgICBfc2NoZW1hVHlwZVN5c3RlbSA9IHN0bDsKLQotICAgICAgICBfbGVmdE9ubHkgPSB0cnVlOwotCi0gICAgICAgIF9wcm9wcyA9IG5ldyBEb2NQcm9wcygpOwotCi0gICAgICAgIF9kb2MgPSBuZXcgRG9jKCB0aGlzLCBudWxsICk7Ci0KLSAgICAgICAgX2xlZnRTcGxheSA9IF9kb2M7Ci0gICAgICAgIF9kb2MuX3BhcmVudFNwbGF5ID0gdGhpczsKLSAgICAgICAgYWRqdXN0Q2RvY0JlZ2luTGVmdCggX2RvYy5nZXRDZG9jQmVnaW4oKSApOwotCi0gICAgICAgIF90ZXh0ID0gbmV3IFRleHQoKTsKLQotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gbnVsbDsKLQotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKSkKLSAgICAgICAgICAgIHNUeXBlID0gKFNjaGVtYVR5cGUpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gdHlwZTsKLQotICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNUeXBlID0gWG1sT2JqZWN0LnR5cGU7Ci0KLSAgICAgICAgX3ZhbGlkYXRlT25TZXQgPSBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5WQUxJREFURV9PTl9TRVQgKTsKLQotICAgICAgICBfZmFjdG9yeSA9IChUeXBlU3RvcmVGYWN0b3J5KSBvcHRpb25zLmdldCggVHlwZVN0b3JlRmFjdG9yeS5LRVkgKTsKLQotICAgICAgICBfZG9jLnNldFR5cGUoIHRoaXMsIHNUeXBlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxTdG9yZSBuZXdTdG9yZSAoIFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFJvb3QoIHN0bCwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxEb2N1bWVudFByb3BlcnRpZXMgZG9jdW1lbnRQcm9wZXJ0aWVzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggdGhpcywgX2RvYyApOwotICAgIH0KLQotICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIF9kb2M7IH0KLQotICAgIGJvb2xlYW4gdmFsaWRhdGVPblNldCAoICkgeyByZXR1cm4gX3ZhbGlkYXRlT25TZXQ7IH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgVHlwZSB0ID0gX2RvYy5wZWVrVHlwZSgpOwotCi0gICAgICAgIHJldHVybiB0ID09IG51bGwgPyBudWxsIDogdC5nZXRYbWxPYmplY3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRTY2hlbWFUeXBlTG9hZGVyICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zY2hlbWFUeXBlU3lzdGVtOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNFbXB0eSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbGVmdFNwbGF5ID09IF9kb2MgJiYgX2RvYy5fcmlnaHRTcGxheSA9PSBudWxsICYmIF9kb2MuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNMZWZ0T25seSAoICkgeyByZXR1cm4gX2xlZnRPbmx5OyB9Ci0KLSAgICB2b2lkIGVuc3VyZUVtcHR5ICggKQotICAgIHsKLSAgICAgICAgaWYgKCFpc0VtcHR5KCkpCi0gICAgICAgICAgICBfZG9jLnJlbW92ZUNvbnRlbnQoIHRoaXMsIHRydWUgKTsKLQotICAgICAgICBhc3NlcnQgaXNFbXB0eSgpOwotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLSAgICAgICAgYXNzZXJ0IF9sZWZ0T25seTsKLSAgICAgICAgYXNzZXJ0IGdldENjaExlZnQoKSA9PSAwOwotICAgICAgICBhc3NlcnQgX3RleHQubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IGdldENkb2NCZWdpbkxlZnQoKSA9PSAxOwotICAgICAgICBhc3NlcnQgX2RvYyAhPSBudWxsICYmIF9sZWZ0U3BsYXkgPT0gX2RvYzsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUNjaCAoIFNwbGF5IHMsIGludCBkZWx0YUNjaCApCi0gICAgewotICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0KLSAgICAgICAgaWYgKGRlbHRhQ2NoICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKLQotICAgICAgICAgICAgcy5hZGp1c3RDY2goIGRlbHRhQ2NoICk7Ci0gICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldENwICggU3BsYXkgcyApCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBBIGxlZnQgb25seSB0cmVlIGhhcyB0aGUgbmljZSBwcm9wZXJ0eSB0aGF0IF9jY2hMZWZ0IGlzCi0gICAgICAgIC8vIGFsc28gdGhlIGNwIQotICAgICAgICAvLwotCi0gICAgICAgIGlmICghX2xlZnRPbmx5ICYmIHMgIT0gdGhpcykKLSAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKLQotICAgICAgICByZXR1cm4gcy5nZXRDY2hMZWZ0KCk7Ci0gICAgfQotCi0gICAgaW50IGdldERvY0JlZ2luSW5kZXggKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgbGVmdCBvbmx5IHRyZWUgaGFzIHRoZSBuaWNlIHByb3BlcnR5IHRoYXQgY2RvY0JlZ2luTGVmdCBpcwotICAgICAgICAvLyBhbHNvIHRoZSBwb3MhCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKCFfbGVmdE9ubHkpCi0gICAgICAgICAgICBzLnNwbGF5KCB0aGlzLCB0aGlzICk7Ci0KLSAgICAgICAgcmV0dXJuIHMuZ2V0Q2RvY0JlZ2luTGVmdCgpOwotICAgIH0KLSAgICAKLSAgICBCZWdpbiBmaW5kTnRoQmVnaW4gKCBTcGxheSBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgaW50IG4gKQotICAgIHsKLSAgICAgICAgLy8gb25seSBvbmUgb2YgKHNldCBvciBuYW1lKSBpcyBub3QgbnVsbAotICAgICAgICAvLyBvciBib3RoIGFyZSBudWxsIGZvciBhIHdpbGRjYXJkCi0gICAgICAgIGFzc2VydCAoIG5hbWUgPT0gbnVsbCB8fCBzZXQgPT0gbnVsbCApOwotICAgICAgICBhc3NlcnQgbiA+PSAwOwotCi0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuaXNMZWFmKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpbnQgZGEgPSBfbnRoQ2FjaGVfQS5kaXN0YW5jZSggcGFyZW50LCBuYW1lLCBzZXQsIG4gKTsKLSAgICAgICAgaW50IGRiID0gX250aENhY2hlX0IuZGlzdGFuY2UoIHBhcmVudCwgbmFtZSwgc2V0LCBuICk7Ci0KLSAgICAgICAgQmVnaW4gYiA9Ci0gICAgICAgICAgICBkYSA8PSBkYgotICAgICAgICAgICAgICAgID8gX250aENhY2hlX0EuZmV0Y2goIHBhcmVudCwgbmFtZSwgc2V0LCBuICkKLSAgICAgICAgICAgICAgICA6IF9udGhDYWNoZV9CLmZldGNoKCBwYXJlbnQsIG5hbWUsIHNldCwgbiApOwotCi0gICAgICAgIGlmIChkYSA9PSBkYikKLSAgICAgICAgewotICAgICAgICAgICAgbnRoQ2FjaGUgdGVtcCA9IF9udGhDYWNoZV9BOwotICAgICAgICAgICAgX250aENhY2hlX0EgPSBfbnRoQ2FjaGVfQjsKLSAgICAgICAgICAgIF9udGhDYWNoZV9CID0gdGVtcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIGludCBjb3VudCAoIENvbnRhaW5lciBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZmluZE50aEJlZ2luKCBwYXJlbnQsIG5hbWUsIHNldCwgMCApOwotCi0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpbnQgbiA9IDA7Ci0KLSAgICAgICAgZm9yICggOyA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCFzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKHNldCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHMuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHVwIHN0cm9uZyB0eXBlIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoaXMgc2NoZW1hIHR5cGUgc3lzdGVtLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZXNTYW1lICggUU5hbWUgbjEsIFFOYW1lIG4yICkKLSAgICB7Ci0gICAgICAgIGlmIChuMSA9PSBuMikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG4xLmdldE5hbWVzcGFjZVVSSSgpID09IG4yLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKG4xLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgbjIuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gbjEuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCBuMi5nZXROYW1lc3BhY2VVUkkoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2UgKCBTdHJpbmdCdWZmZXIgc2IsIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIjxubyBuYW1lc3BhY2U+IiApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIlwiIiApOwotICAgICAgICAgICAgc2IuYXBwZW5kKCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICJcIiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFhtbE9iamVjdCBhdXRvVHlwZWREb2N1bWVudCAoCi0gICAgICAgIFNjaGVtYVR5cGUgZmFjdG9yeVR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBUaGUgdHlwZSBpbiB0aGUgb3B0aW9ucyBoYXMgaGlnaGVzdCBwcmVjaWRlbmNlIGJlY2F1c2UgaXQgaXMKLSAgICAgICAgLy8gc3VwcGxpZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgIAotICAgICAgICBTY2hlbWFUeXBlIG92ZXJyaWRlVHlwZSA9Ci0gICAgICAgICAgICAoU2NoZW1hVHlwZSkgWG1sT3B0aW9ucy5zYWZlR2V0KCBvcHRpb25zLCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKLQotICAgICAgICAvLyBwcmVjZWRlbmNlIGlzIGdpdmVuIHRvIHRoZSBvdmVycmlkZSBhYm92ZSBhbGwKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGUgdGhlVHlwZSA9IG92ZXJyaWRlVHlwZTsKLQotICAgICAgICAvLyBEb2N1bWVudCBhbmQgYXR0cmlidXRlIHR5cGVzIGhhdmUgbm8gbmFtZQotICAgICAgICAKLSAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICghZmFjdG9yeVR5cGUuaXNEb2N1bWVudFR5cGUoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWZhY3RvcnlUeXBlLmlzQXR0cmlidXRlVHlwZSgpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGluZmVyIHR5cGUgZnJvbSB4c2k6dHlwZQotICAgICAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBfZG9jLmdldFhzaVR5cGVOYW1lKCB0aGlzICk7Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc25pZmZlZFR5cGUgPQotICAgICAgICAgICAgICAgIHR5cGVOYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogX3NjaGVtYVR5cGVTeXN0ZW0uZmluZFR5cGUoIHR5cGVOYW1lICk7Ci0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlUeXBlLmlzQXNzaWduYWJsZUZyb20oIHNuaWZmZWRUeXBlICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlVHlwZSA9IHNuaWZmZWRUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG9kbzoKLSAgICAgICAgLy8gdXNlIHRoZSBmb2xsb3dpbmcgd2hlbiBpbXBsZW1lbnRpbmcgc3Vic3QgZ3JvdXBzOgotICAgICAgICAvLyAgICAgZmFjdG9yeVR5cGUgPT0gbnVsbCB8fCBleHBlY3RlZFR5cGUuaXNEb2N1bWVudFR5cGUoKQotCi0gICAgICAgIGlmIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8IGZhY3RvcnlUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGVUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5mZXIgdHlwZSBiYXNlZCBvbiByb290IGVsdAotCi0gICAgICAgICAgICAgICAgUU5hbWUgZG9jRWxlbU5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLnRvRmlyc3RDaGlsZCgpICYmICFjLnRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgZG9jRWxlbU5hbWUgPSBjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1OYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRoZVR5cGUgPSBfc2NoZW1hVHlwZVN5c3RlbS5maW5kRG9jdW1lbnRUeXBlKCBkb2NFbGVtTmFtZSApOwotCi0gICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGVsdCBpbmhlcml0YW5jZSB3aGVuIGltcGxlbWVudGluZyBzdWJzdCBncm91cHMKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeVR5cGUgIT0gbnVsbCAmJiB0aGVUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBmYWN0b3J5RWxlbU5hbWUgPSBmYWN0b3J5VHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWN0b3J5RWxlbU5hbWUuZXF1YWxzKGRvY0VsZW1OYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWZhY3RvcnlUeXBlLmlzVmFsaWRTdWJzdGl0dXRpb24oZG9jRWxlbU5hbWUpKQotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZG9jRWxlbU5hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIHZhbGlkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZmFjdG9yeUVsZW1OYW1lKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2N1bWVudCBvciBhIHZhbGlkIHN1YnN0aXR1dGlvbi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpbmZlciB0eXBlIGJhc2VkIG9uIHJvb3QgYXR0cgotCi0gICAgICAgICAgICAgICAgUU5hbWUgYXR0ck5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLnRvRmlyc3RBdHRyaWJ1dGUoKSAmJiAhYy50b05leHRBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRoZVR5cGUgPSBfc2NoZW1hVHlwZVN5c3RlbS5maW5kQXR0cmlidXRlVHlwZSggYXR0ck5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNuaWZmaW5nIGRvZXNuJ3Qgc2F5IGFueXRoaW5nOiBhc3N1bWUgdGhlIGV4cGVjdGVkIHR5cGUKLSAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoZVR5cGUgPSBmYWN0b3J5VHlwZTsKLQotICAgICAgICAvLyBTdGlsbCBub3RoaW5nOiB0aGUgbm8gdHlwZS4KLSAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoZVR5cGUgPSBYbWxCZWFucy5OT19UWVBFOwotCi0gICAgICAgIC8vIGFzc2lnbiB0eXBlCi0gICAgICAgIF9kb2Muc2V0VHlwZSggdGhpcywgdGhlVHlwZSApOwotCi0gICAgICAgIC8vIHRvZG86IEhhdmUgYSBzaW1pbGFyIGF0dHJpYnV0ZSB0eXBlIGNoZWNrCi0gICAgICAgIGlmIChmYWN0b3J5VHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhlVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgICAgIHZlcmlmeURvY3VtZW50VHlwZSggdGhlVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCkgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRoZVR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgdmVyaWZ5QXR0cmlidXRlVHlwZSggdGhlVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiBhIHR5cGUgd2FzIHBhc3NlZCBpbiwgdXN1YWxseSBmcm9tIGdlbmVyYXRlZCBjb2RlIHdoaWNoIG5lZWRzIHRoZQotICAgICAgICAvLyB0eXBlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYyBiZWNhdXNlIG9mIGEgcGVuZGluZyBjYXN0LCB0aGVuIGNoZWNrCi0gICAgICAgIC8vIHRoZSByZXN1bHRpbmcgdHlwZSBhbmQgdGhyb3cgYSBuaWNlIGV4Y2VwdGlvbi4KLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoZmFjdG9yeVR5cGUgIT0gbnVsbCAmJiAhZmFjdG9yeVR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0aGVUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFjdG9yeSB0eXBlID0gIiArIGZhY3RvcnlUeXBlKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHR5cGUgPSAiICsgdGhlVHlwZSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2V0eXBlIG9mIHRoZSB0eXBlID0gIiArIHRoZVR5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBYbWxFeGNlcHRpb24oICJYTUwgb2JqZWN0IGlzIG5vdCBvZiB0eXBlICIgKyBmYWN0b3J5VHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEb2N1bWVudFR5cGUgKCBRTmFtZSBkb2NFbGVtTmFtZSApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gY3JlYXRlQ3Vyc29yKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy50b0ZpcnN0Q2hpbGQoKSB8fCBjLnRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGRvY0VsZW1OYW1lICkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbm8gZG9jdW1lbnQgZWxlbWVudCIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbXVsdGlwbGUgZG9jdW1lbnQgZWxlbWVudHMiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyggZG9jRWxlbU5hbWUgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBkb2NFbGVtTmFtZSApICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1OYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyggbmFtZS5nZXRMb2NhbFBhcnQoKSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbmFtZXNwYWNlIG1pc21hdGNoICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImV4cGVjdGVkICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZSggc2IsIGRvY0VsZW1OYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZShzYiwgIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lc3BhY2VzU2FtZSggZG9jRWxlbU5hbWUsIG5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBkb2N1bWVudCBlbGVtZW50IGxvY2FsIG5hbWUgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiArIGRvY0VsZW1OYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKyBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZ290ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBuYW1lICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNiICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gWG1sRXJyb3IuZm9yQ3Vyc29yKHNiLnRvU3RyaW5nKCksIGMubmV3Q3Vyc29yKCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUF0dHJpYnV0ZVR5cGUgKCBRTmFtZSBhdHRyTmFtZSApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gY3JlYXRlQ3Vyc29yKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy50b0ZpcnN0QXR0cmlidXRlKCkgfHwgYy50b05leHRBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbm8gYXR0cmlidXRlcyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbXVsdGlwbGUgYXR0cmlidXRlcyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCBhdHRyTmFtZSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiVGhlIGRvY3VtZW50IGlzIG5vdCBhICIgKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCBuYW1lLmdldExvY2FsUGFydCgpICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIG5hbWVzcGFjZSBtaXNtYXRjaCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJleHBlY3RlZCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2UoIHNiLCBhdHRyTmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiIGdvdCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2Uoc2IsICBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZXNwYWNlc1NhbWUoIGF0dHJOYW1lLCBuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIGxvY2FsIG5hbWUgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiArIGF0dHJOYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKyBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGF0dHJpYnV0ZSBlbGVtZW50IG1pc21hdGNoICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImdvdCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIFFOYW1lSGVscGVyLnByZXR0eSggbmFtZSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzYiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvckN1cnNvcihzYi50b1N0cmluZygpLCBjLm5ld0N1cnNvcigpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGxfU2F4TG9hZGVycyA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYXhMb2FkZXIgc2wgPSBQaWNjb2xvU2F4TG9hZGVyLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2wgPSBEZWZhdWx0U2F4TG9hZGVyLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJDYW4ndCBmaW5kIGFuIFhNTCBwYXJzZXIiICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTYXhMb2FkZXIgZ2V0U2F4TG9hZGVyICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTYXhMb2FkZXIpIHRsX1NheExvYWRlcnMuZ2V0KCk7Ci0gICAgfQotICAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGljY29sb1NheExvYWRlciBleHRlbmRzIFNheExvYWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTYXhMb2FkZXIgbmV3SW5zdGFuY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENsYXNzIHBjID0gQ2xhc3MuZm9yTmFtZSggImNvbS5ibHVlY2FzdC54bWwuUGljY29sbyIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYTUxSZWFkZXIgeHIgPSAoWE1MUmVhZGVyKSBwYy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAgICAgTWV0aG9kIG1fZ2V0RW5jb2RpbmcgICAgID0gcGMuZ2V0TWV0aG9kKCAiZ2V0RW5jb2RpbmciLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIG1fZ2V0VmVyc2lvbiAgICAgID0gcGMuZ2V0TWV0aG9kKCAiZ2V0VmVyc2lvbiIsIG51bGwgKTsKLSAgICAgICAgICAgICAgICBNZXRob2QgbV9nZXRTdGFydExvY2F0b3IgPSBwYy5nZXRNZXRob2QoICJnZXRTdGFydExvY2F0b3IiLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBMb2NhdG9yIHN0YXJ0TG9jYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChMb2NhdG9yKSBtX2dldFN0YXJ0TG9jYXRvci5pbnZva2UoIHhyLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBpY2NvbG9TYXhMb2FkZXIoIHhyLCBzdGFydExvY2F0b3IsIG1fZ2V0RW5jb2RpbmcsIG1fZ2V0VmVyc2lvbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHBvc3RMb2FkICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgci5fcHJvcHMuc2V0RW5jb2RpbmcoIChTdHJpbmcpIF9tX2dldEVuY29kaW5nLmludm9rZSggX3hyLCBudWxsICkgKTsKLSAgICAgICAgICAgICAgICByLl9wcm9wcy5zZXRWZXJzaW9uICggKFN0cmluZykgX21fZ2V0VmVyc2lvbiAuaW52b2tlKCBfeHIsIG51bGwgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgUGljY29sb1NheExvYWRlciAoCi0gICAgICAgICAgICBYTUxSZWFkZXIgeHIsIExvY2F0b3Igc3RhcnRMb2NhdG9yLCBNZXRob2QgbV9nZXRFbmNvZGluZywgTWV0aG9kIG1fZ2V0VmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCB4ciwgc3RhcnRMb2NhdG9yICk7Ci0KLSAgICAgICAgICAgIF9tX2dldEVuY29kaW5nID0gbV9nZXRFbmNvZGluZzsKLSAgICAgICAgICAgIF9tX2dldFZlcnNpb24gPSBtX2dldFZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1ldGhvZCBfbV9nZXRFbmNvZGluZzsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgX21fZ2V0VmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdFNheExvYWRlciBleHRlbmRzIFNheExvYWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTYXhMb2FkZXIgbmV3SW5zdGFuY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFNheExvYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERlZmF1bHRTYXhMb2FkZXIgKCBYTUxSZWFkZXIgeHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggeHIsIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNheExvYWRlcgotICAgICAgICBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlciwgRXJyb3JIYW5kbGVyLCBFbnRpdHlSZXNvbHZlcgotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIFNheExvYWRlciAoIFhNTFJlYWRlciB4ciwgTG9jYXRvciBzdGFydExvY2F0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfeHIgPSB4cjsKLSAgICAgICAgICAgIF9zdGFydExvY2F0b3IgPSBzdGFydExvY2F0b3I7Ci0KLSAgICAgICAgICAgIGlmICh4ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgIHhyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotCi0gICAgICAgICAgICAgICAgICAgIHhyLnNldFByb3BlcnR5KCAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyApOwotICAgICAgICAgICAgICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggdGhpcyApOwotICAgICAgICAgICAgICAgICAgICB4ci5zZXRFcnJvckhhbmRsZXIoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RW50aXR5UmVzb2x2ZXIoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0ICggTG9hZENvbnRleHQgY29udGV4dCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgICAgICBfd2FudExpbmVOdW1iZXJzID0KLSAgICAgICAgICAgICAgICBYbWxPcHRpb25zLm1hc2tOdWxsKAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICkuaGFzT3B0aW9uKCBYbWxPcHRpb25zLkxPQURfTElORV9OVU1CRVJTICkgJiYKLSAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvciAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9zdExvYWQgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBsb2FkICggUm9vdCByLCBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHIsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2V0Q29udGV4dCggY29udGV4dCwgb3B0aW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5kaXNhYmxlU3RvcmVWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBfeHIucGFyc2UoIGlucHV0U291cmNlICk7Ci0KLSAgICAgICAgICAgICAgICBwb3N0TG9hZCggciApOwotCi0vLyAgICAgICAgICAgICAgICAvLyBQaWNjb2xvIHNwZWNpZmljIGFjY2VzcyB0byBlbmNvZGluZyBhbmQgdmVyc2lvbgotLy8gICAgICAgICAgICAgICAgX3Byb3BzLnNldEVuY29kaW5nKCBwaWNjb2xvLmdldEVuY29kaW5nKCkgKTsKLS8vICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRWZXJzaW9uKCBwaWNjb2xvLmdldFZlcnNpb24oKSApOwotCi0gICAgICAgICAgICAgICAgY29udGV4dC5maW5pc2goKTsKLQotICAgICAgICAgICAgICAgIHIuYXNzb2NpYXRlU291cmNlTmFtZSggb3B0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYbWxSdW50aW1lRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKLQotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckxvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TGluZU51bWJlcigpLCBlLmdldENvbHVtbk51bWJlcigpLCAtMSApOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIGUsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvck1lc3NhZ2UoIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIGUsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCByLmVuYWJsZVN0b3JlVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2F4IENvbnRlbnRIYW5kbGVyCi0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZXQgY29udGV4dCB0byBudWxsCi0gICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyICh3aGljaCBpcyBoZWxkIGluIFRMUyBmcm9tIGtlZXBpbmcKLSAgICAgICAgICAgIC8vIHRoZSBlbnRpcmUgZG9jdW1lbnQgaW4gbWVtb3J5Ci0gICAgICAgICAgICBfY29udGV4dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQgKAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzICkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBxTmFtZTsKLQotICAgICAgICAgICAgLy8gT3V0IGN1cnJlbnQgcGFyc2VyIChQaWNjb2xvKSBkb2VzIG5vdCBlcnJvciB3aGVuIGEKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBpcyB1c2VkIGFuZCBub3QgZGVmaW5lZC4gIENoZWNrIGZvciB0aGVzZSBoZXJlCi0KLSAgICAgICAgICAgIGlmIChxTmFtZS5pbmRleE9mKCAnOicgKSA+PSAwICYmIG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVXNlIG9mIHVuZGVmaW5lZCBuYW1lc3BhY2UgcHJlZml4OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5zdWJzdHJpbmcoIDAsIHFOYW1lLmluZGV4T2YoICc6JyApICkpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2NvbnRleHQuYmVnaW4oIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJICk7Ci0KLSAgICAgICAgICAgIC8vIEJVR0JVRyAtIGRvIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB0byBnZXQgbGluZSBudW1iZXIgZm9yCi0gICAgICAgICAgICAvLyBhcyBtYW55IHBhcnRzIG9mIHRoZSBYTUwgYXMgd2UgY2FuCi0gICAgICAgICAgICBpZiAoX3dhbnRMaW5lTnVtYmVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgIF9zdGFydExvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgIC0xICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCwgbGVuID0gYXR0cy5nZXRMZW5ndGgoKSA7IGkgPCBsZW4gOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBhcW4gPSBhdHRzLmdldFFOYW1lKCBpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXFuLmVxdWFscyggInhtbG5zIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQueG1sbnMoICIiLCBhdHRzLmdldFZhbHVlKCBpICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXFuLnN0YXJ0c1dpdGgoICJ4bWxuczoiICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXFuLnN1YnN0cmluZyggNiApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JNZXNzYWdlKCAiUHJlZml4IG5vdCBzcGVjaWZpZWQiLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGF0dHMuZ2V0VmFsdWUoIGkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZpeCBjYW4ndCBiZSBtYXBwZWQgdG8gbm8gbmFtZXNwYWNlOiAiICsgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQueG1sbnMoIHByZWZpeCwgdXJpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVXJpID0gYXR0cy5nZXRVUkkoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJMb2NhbCA9IGF0dHMuZ2V0TG9jYWxOYW1lKCBpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJMb2NhbC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckxvY2FsID0gYXFuOwotCi0vLyBnaXZlbiB0aGUgZG9jIDxhIHg6eT0neicvPiwgcGljY29sbyB3aWxsIHJlcG9ydCB0aGUgdXJpIG9mIHRoZSB5Ci0vLyBhdHRyaWJ1dGUgYXMgJ3gnISAgQmFkIFBpY2NvbG8uICBUaHVzLCBJIGNhbid0IHBlcmZvcm0gdGhlIHVuZGVmaW5lZAotLy8gcHJlZml4IGNoZWNrIGhlcmUuCi0vLwotLy8gICAgICAgICAgICAgICAgICAgIGlmIChhcW4uaW5kZXhPZiggJzonICkgPj0gMCAmJiBhdHRyVXJpLmxlbmd0aCgpID09IDApCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1cnNvclhtbEVycm9yKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2Ugb2YgdW5kZWZpbmVkIG5hbWVzcGFjZSBwcmVmaXg6ICIgKwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcW4uc3Vic3RyaW5nKCAwLCBhcW4uaW5kZXhPZiggJzonICkgKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5hdHRyKCBhdHRyTG9jYWwsIGF0dHJVcmksIGF0dHMuZ2V0VmFsdWUoIGkgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQgKAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lICkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCi0KLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQudGV4dCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LnRleHQoIGNoLCBzdGFydCwgbGVuZ3RoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb21tZW50ICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dC5jb21tZW50KCBjaCwgc3RhcnQsIGxlbmd0aCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEgKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dC5wcm9jaW5zdCggdGFyZ2V0LCBkYXRhICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERURCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LmRvY3R5cGUoIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRFREICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVycm9yIEhhbmRsaW5nCi0gICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IgKCBTQVhQYXJzZUV4Y2VwdGlvbiBlICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IgKCBTQVhQYXJzZUV4Y2VwdGlvbiBlICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoICJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRocm93IGF3YXkgd2FyaW5ncyBmb3Igbm93Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbnRpdHkgUmVzb2x2ZXIKLSAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwdWJsaWMgaWQgPSAiICsgcHVibGljSWQpOwotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW0gaWQgPSAiICsgc3lzdGVtSWQpOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IgKCBMb2NhdG9yIGxvY2F0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbG9jYXRvciA9IGxvY2F0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJlZ2luc1dpdGhYbWwoIHByZWZpeCApICYmCi0gICAgICAgICAgICAgICAgISAoICJ4bWwiLmVxdWFscyggcHJlZml4ICkgJiYgX3htbDE5OThVcmkuZXF1YWxzKCB1cmkgKSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUHJlZml4IGNhbid0IGJlZ2luIHdpdGggWE1MOiAiICsgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IgKTsKLQotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWdub3JlZAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nICggU3RyaW5nIHByZWZpeCApIHRocm93cyBTQVhFeGNlcHRpb24ge30KLSAgICAgICAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkgKCBTdHJpbmcgbmFtZSApIHRocm93cyBTQVhFeGNlcHRpb24geyB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIF94cjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgTG9jYXRvciAgICAgX2xvY2F0b3I7Ci0gICAgICAgIHByaXZhdGUgTG9hZENvbnRleHQgX2NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX3dhbnRMaW5lTnVtYmVyczsKLSAgICAgICAgcHJpdmF0ZSBMb2NhdG9yICAgICBfc3RhcnRMb2NhdG9yOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIElucHV0U3RyZWFtIGluLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmdPdmVycmlkZSA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HICk7Ci0KLSAgICAgICAgaWYgKGVuY29kaW5nT3ZlcnJpZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoIGVuY29kaW5nT3ZlcnJpZGUgKTsKLQotICAgICAgICAgICAgaWYgKGphdmFFbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGphdmFFbmNvZGluZyA9IGVuY29kaW5nT3ZlcnJpZGU7Ci0KLSAgICAgICAgICAgIHJldHVybiBsb2FkWG1sKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluLCBqYXZhRW5jb2RpbmcgKSwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvYWRYbWwoIG5ldyBJbnB1dFNvdXJjZSggaW4gKSwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIFJlYWRlciByLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbG9hZFhtbCggbmV3IElucHV0U291cmNlKCByICksIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKCBJbnB1dFNvdXJjZSBpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaXMuc2V0U3lzdGVtSWQoICJmaWxlOi8vIiApOwotCi0gICAgICAgIGdldFNheExvYWRlcigpLmxvYWQoIHRoaXMsIGlzLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGF1dG9UeXBlZERvY3VtZW50KCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIFN0cmluZyBzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciByID0gbmV3IFN0cmluZ1JlYWRlciggcyApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbG9hZFhtbCggciwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlN0cmluZ1JlYWRlciBzaG91bGQgbm90IHRocm93IElPRXhjZXB0aW9uIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgeyByLmNsb3NlKCk7IH0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkgeyB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzb2NpYXRlU291cmNlTmFtZSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBTdHJpbmcgc291cmNlTmFtZSA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoCi0gICAgICAgICAgICAgICAgb3B0aW9ucywgWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSApOwotCi0gICAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICBfcHJvcHMuc2V0U291cmNlTmFtZSggc291cmNlTmFtZSApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gWG1sU2F4SGFuZGxlciBpcyByZXR1cm5lZCB0byBhIHVzZXIgc28gdGhhdCB1c2VyIG1heSBvYnRhaW4gdGhlIGNvbnRlbnQKLSAgICAvLyBhbmQgbGV4aWNhbCBoYW5kbGVycyB0byBwdXNoIGNvbnRlbnQgYW5kIHRoZW4gZ2V0IHRoZSBYbWxPYmplY3QgYXQgdGhlCi0gICAgLy8gZW5kIG9mIHRoZSBwYXJzZSBwdXNoLgotICAgIC8vCi0KLSAgICBwcml2YXRlIGNsYXNzIFhtbFNheEhhbmRsZXJJbXBsIGV4dGVuZHMgU2F4TG9hZGVyIGltcGxlbWVudHMgWG1sU2F4SGFuZGxlcgotICAgIHsKLSAgICAgICAgWG1sU2F4SGFuZGxlckltcGwgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBpc0VtcHR5KCk7Ci0KLSAgICAgICAgICAgIF9vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgICAgIF90eXBlID0gdHlwZTsKLQotICAgICAgICAgICAgX2NvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIFJvb3QudGhpcywgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBzZXRDb250ZXh0KCBfY29udGV4dCwgb3B0aW9ucyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3QgKCApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIF9jb250ZXh0LmZpbmlzaCgpOwotCi0gICAgICAgICAgICBfY29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgIFJvb3QudGhpcy5hc3NvY2lhdGVTb3VyY2VOYW1lKCBfb3B0aW9ucyApOwotCi0gICAgICAgICAgICByZXR1cm4gUm9vdC50aGlzLmF1dG9UeXBlZERvY3VtZW50KCBfdHlwZSwgX29wdGlvbnMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTG9hZENvbnRleHQgX2NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZSAgX3R5cGU7Ci0gICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyAgX29wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3U2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sU2F4SGFuZGxlckltcGwoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHByaXZhdGUgdm9pZCBuZXdQYXJzZVNheCAoIElucHV0U291cmNlIGluLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgTG9hZENvbnRleHQgY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggdGhpcywgb3B0aW9ucyApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gSGVscGVyIG9iamVjdCBmb3IgY3JlYXRpbmcgZG9jdW1lbnRzIGluIGEgImxvYWQiIGtpbmRhIHdheQotICAgIC8vCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZENvbnRleHQKLSAgICB7Ci0gICAgICAgIExvYWRDb250ZXh0ICggUm9vdCByb290LCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsOwotCi0gICAgICAgICAgICBfb3B0aW9ucyA9IG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIF9xbmFtZUNhY2hlID0gWG1sQmVhbnMuZ2V0UU5hbWVDYWNoZSgpOwotCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCApOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZCBSZXBsYWNlIERvY3VtZW50IEVsZW1lbnQ6IEludmFsaWQgbmFtZSwgbG9jYWwgcGFydCBlbXB0eSIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2Rpc2NhcmREb2NFbGVtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBfcmVwbGFjZURvY0VsZW0gPSBuYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfc3RyaXBXaGl0ZXNwYWNlID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1NUUklQX1dISVRFU1BBQ0UpOwotICAgICAgICAgICAgX3N0cmlwQ29tbWVudHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkxPQURfU1RSSVBfQ09NTUVOVFMpOwotICAgICAgICAgICAgX3N0cmlwUHJvY2luc3RzID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1NUUklQX1BST0NJTlNUUyk7Ci0KLSAgICAgICAgICAgIF9zdWJzdGl0dXRlTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgKE1hcCkgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5MT0FEX1NVQlNUSVRVVEVfTkFNRVNQQUNFUyk7Ci0KLSAgICAgICAgICAgIF9hZGRpdGlvbmFsTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgKE1hcCkgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5MT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUyk7Ci0KLSAgICAgICAgICAgIF9yb290ID0gcm9vdDsKLSAgICAgICAgICAgIF9yb290LmVuc3VyZUVtcHR5KCk7Ci0KLSAgICAgICAgICAgIF9sYXN0Tm9uQXR0ciA9IF9yb290Ll9kb2M7Ci0gICAgICAgICAgICBfbGFzdFNwbGF5ID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKLQotICAgICAgICAgICAgX2Zyb250aWVyID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUm9vdCBnZXRSb290ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBnZXRDcCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3Jvb3QuaXNMZWZ0T25seSgpOwotICAgICAgICAgICAgYXNzZXJ0IGR2ID4gMCB8fCBzLmdldENwU2xvdygpID09IHMuZ2V0Q2NoTGVmdCgpOwotICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoTGVmdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkanVzdENjaCAoIFNwbGF5IHMsIGludCBkZWx0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7Ci0KLSAgICAgICAgICAgIHMuYWRqdXN0Q2NoKCBkZWx0YSApOwotCi0gICAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYXR0cnMgYWZ0ZXIgdGhpcyBzcGxheSB3aGljaCBuZWVkIHRoZWlyIGNjaExlZnQncwotICAgICAgICAgICAgLy8gdG8gYmUgdXBkYXRlZC4gIFRvIGF2b2lkIHNwbGF5aW5nLCB1cGRhdGUgdGhlbSBieSBoYW5kLgotCi0gICAgICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0F0dHIoKSB8fCBzLmlzUm9vdCgpOwotICAgICAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggZGVsdGEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOwotCi0gICAgICAgICAgICBfcm9vdC5pbnNlcnRTcGxheSggcywgX3Jvb3QuX2xlZnRTcGxheSApOwotCi0gICAgICAgICAgICBfbGFzdFNwbGF5ID0gczsKLSAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKLQotICAgICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ciA9IHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0ICggU3BsYXkgcywgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoKCkgPT0gMDsKLSAgICAgICAgICAgIGluc2VydCggcyApOwotICAgICAgICAgICAgX3Jvb3QuX3RleHQuaW5zZXJ0KCBnZXRDcCggcyApLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBhZGp1c3RDY2goIHMsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydCAoIFNwbGF5IHMsIFN0cmluZyB0ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOwotICAgICAgICAgICAgaW5zZXJ0KCBzICk7Ci0gICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoIGdldENwKCBzICksIHRleHQgKTsKLSAgICAgICAgICAgIGFkanVzdENjaCggcywgdGV4dC5sZW5ndGgoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2hBZnRlciA9IF9sYXN0Tm9uQXR0ci5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgICAgICBpZiAoY2NoQWZ0ZXIgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjY2ggPSBjY2hBZnRlcjsKLQotICAgICAgICAgICAgICAgIGludCBjcEFmdGVyID0KLSAgICAgICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmdldENwRm9yUG9zKAotICAgICAgICAgICAgICAgICAgICAgICAgX3Jvb3QsIF9sYXN0Tm9uQXR0ci5nZXRQb3NBZnRlcigpICk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgb2ZmID0gX3Jvb3QuX3RleHQudW5PYnNjdXJlKCBjcEFmdGVyLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCBfcm9vdC5fdGV4dC5fYnVmWyBvZmYgKyBjY2ggLSAxIF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGRlbHRhID0gY2NoIC0gY2NoQWZ0ZXI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQucmVtb3ZlKCBjcEFmdGVyICsgY2NoQWZ0ZXIgKyBkZWx0YSwgLSBkZWx0YSApOwotICAgICAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGRlbHRhICk7Ci0gICAgICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBkZWx0YSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWJvcnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBzaGl0IG11c3QgaGF2ZSBoaXQgdGhlIGZhbiAuLi4KLQotICAgICAgICAgICAgLy8gQ2xvc2UgYWxsIGVsZW1lbnRzCi0KLSAgICAgICAgICAgIHdoaWxlICggX2Zyb250aWVyICE9IF9yb290Ll9kb2MgKQotICAgICAgICAgICAgICAgIGVuZCgpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoICggKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlKQotICAgICAgICAgICAgICAgIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UoKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogZGVhbCB3aXRoIHVudGVybWluYXRlZCBiZWdpbnMgaGVyZQotCi0gICAgICAgICAgICBpZiAoX2Zyb250aWVyICE9IF9yb290Ll9kb2MpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggIkRvY3VtZW50IG5vdCBlbmRlZCIgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IF9yb290Ll9sZWZ0T25seTsKLQotICAgICAgICAgICAgX2ZpbmlzaGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9yb290OwotICAgICAgICAgICAgX2xhc3RQb3MgPSAwOwotCi0gICAgICAgICAgICBpZiAoX29wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9UUklNX1RFWFRfQlVGRkVSKSkKLSAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC50cmltKCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYWRkaXRpb25hbCBuYW1lc3BhY2VzLCBhZGQgdGhlbSBub3csIG1ha2luZyBzdXJlIHdlCi0gICAgICAgICAgICAvLyBkb25lIG92ZXIgcmlkZSBleGlzaXRuZyBvbmVzLgotCi0gICAgICAgICAgICBpZiAoX2FkZGl0aW9uYWxOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IF9yb290Ll9kb2M7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoICFzLmlzUm9vdCgpICYmICFzLmlzQmVnaW4oKSApCi0gICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPQotICAgICAgICAgICAgICAgICAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXN1YWxseSwgdGhpcyBpcyB0aGUgcHJlZGVmaW5lZCB4bWwgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCggInhtbCIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX2FkZGl0aW9uYWxOYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLm5hbWVzcGFjZUZvclByZWZpeCggcHJlZml4ICkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcm9vdC5pbnNlcnRTaW5nbGVTcGxheVNhbnNTcGxheUluTGVmdE9ubHlUcmVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbmFtZXNwYWNlLCBwcmVmaXggKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWJvdmUgaW5zZXJ0IHNob3VsZCBub3Qgc3BsYXkgdGhlIHRyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3Jvb3QuaXNMZWZ0T25seSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3IgbW9zdCBvZiBsb2FkaW5nLCBJIGRvbid0IGludmFsaWRhdGUgdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICAvLyB2ZXJzaW9uIGJlY2F1c2Ugbm90aGluZyBzaG91bGQgYmUgc2Vuc2l0aXZlIHRvIGl0IHdoaWxlCi0gICAgICAgICAgICAvLyBsb2FkaW5nLiAgV2hlbiBmaW5pc2hlZCBsb2FkaW5nLCBidW1wIGl0LgotCi0gICAgICAgICAgICBfcm9vdC5pbnZhbGlkYXRlVmVyc2lvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgX3Jvb3QuaXNMZWZ0T25seSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBjaGVja05hbWUgKCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N1YnN0aXR1dGVOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVVcmkgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBfc3Vic3RpdHV0ZU5hbWVzcGFjZXMuZ2V0KCB1cmkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRlVXJpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcW5hbWVDYWNoZS5nZXROYW1lKCBzdWJzdGl0dXRlVXJpLCBsb2NhbCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gX3FuYW1lQ2FjaGUuZ2V0TmFtZSggdXJpLCBsb2NhbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBjaGVja05hbWUgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdWJzdGl0dXRlTmFtZXNwYWNlcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlVXJpID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJzdGl0dXRlTmFtZXNwYWNlcy5nZXQoIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRlVXJpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9xbmFtZUNhY2hlLmdldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0ZVVyaSwgbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIGNoZWNrTmFtZUF0dHIgKCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N1YnN0aXR1dGVOYW1lc3BhY2VzICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZVVyaSA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIF9zdWJzdGl0dXRlTmFtZXNwYWNlcy5nZXQoIHVyaSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGVVcmkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9xbmFtZUNhY2hlLmdldE5hbWUoIHN1YnN0aXR1dGVVcmksIGxvY2FsICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBfcW5hbWVDYWNoZS5nZXROYW1lKCB1cmksIGxvY2FsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIGNoZWNrTmFtZUF0dHIgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdWJzdGl0dXRlTmFtZXNwYWNlcyAhPSBudWxsICYmIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZVVyaSA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBfc3Vic3RpdHV0ZU5hbWVzcGFjZXMuZ2V0KCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0ZVVyaSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBfcW5hbWVDYWNoZS5nZXROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGVVcmksIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkb2N0eXBlICggU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jvb3QuX3Byb3BzLnNldERvY3R5cGVOYW1lKCBuYW1lICk7Ci0gICAgICAgICAgICBfcm9vdC5fcHJvcHMuc2V0RG9jdHlwZVB1YmxpY0lkKCBwdWJsaWNJRCApOwotICAgICAgICAgICAgX3Jvb3QuX3Byb3BzLnNldERvY3R5cGVTeXN0ZW1JZCggc3lzdGVtSUQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnRCZWdpbiAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSkKLSAgICAgICAgICAgICAgICBzdHJpcExlYWRpbmdXaGl0ZXNwYWNlKCk7Ci0KLSAgICAgICAgICAgIGlmIChfZnJvbnRpZXIuaXNEb2MoKSAmJiAhX2RvY0VsZW1EaXNjYXJkZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgKF9kaXNjYXJkRG9jRWxlbSB8fCBpc1htbEZyYWdtZW50KCBuYW1lICkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9kb2NFbGVtRGlzY2FyZGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGlmIChfcmVwbGFjZURvY0VsZW0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgY29udGVudCB1cCB0byBub3cgYmVjYXVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQgZWxlbWVudCBpcyB0byBiZSByZW1vdmVkLCBhbmQgSSBkb250Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdGhhdCBjb250ZW50IHRvIG1peCB3aXRoIHRoZSByZWFsIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBfcm9vdC5lbnN1cmVFbXB0eSgpOwotICAgICAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIgPSBfcm9vdC5fZG9jOwotICAgICAgICAgICAgICAgICAgICBfbGFzdFNwbGF5ID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3RQb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICBfZnJvbnRpZXIgPSBfcm9vdC5fZG9jOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5hbWUgPSBfcmVwbGFjZURvY0VsZW07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluc2VydCggX2Zyb250aWVyID0gbmV3IEJlZ2luKCBuYW1lLCBfZnJvbnRpZXIgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBiZWdpbiAoIFN0cmluZyBsb2NhbCwgU3RyaW5nIHVyaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc2VydEJlZ2luKCBjaGVja05hbWUoIGxvY2FsLCB1cmkgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBiZWdpbiAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnNlcnRCZWdpbiggY2hlY2tOYW1lKCBuYW1lICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZW5kICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSkKLSAgICAgICAgICAgICAgICBzdHJpcExlYWRpbmdXaGl0ZXNwYWNlKCk7Ci0KLSAgICAgICAgICAgIGlmIChfZnJvbnRpZXIuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9kb2NFbGVtRGlzY2FyZGVkKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiVG9vIG1hbnkgZW5kIGVsZW1lbnRzIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotICAgICAgICAgICAgICAgIGFzc2VydCBfZnJvbnRpZXIuaXNCZWdpbigpOwotICAgICAgICAgICAgICAgIGFzc2VydCAhX2Zyb250aWVyLmlzTGVhZigpOwotCi0gICAgICAgICAgICAgICAgaWYgKF9sYXN0Tm9uQXR0ciA9PSBfZnJvbnRpZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGFzdFNwbGF5ID0gX2Zyb250aWVyOwotICAgICAgICAgICAgICAgICAgICBfbGFzdFBvcyA9IDEgKyBfZnJvbnRpZXIuZ2V0Q2NoKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9mcm9udGllci50b2dnbGVJc0xlYWYoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNjaCA9IF9mcm9udGllci5nZXRDY2hBZnRlcigpOwotICAgICAgICAgICAgICAgICAgICBfZnJvbnRpZXIuYWRqdXN0Q2NoQWZ0ZXIoIC0gY2NoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIF9mcm9udGllcjsKLSAgICAgICAgICAgICAgICAgICAgRW5kIGUgPSBuZXcgRW5kKCBiICk7Ci0gICAgICAgICAgICAgICAgICAgIGIuX2VuZCA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIGluc2VydCggZSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9mcm9udGllciA9IF9mcm9udGllci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXR0ciAoIFFOYW1lIG5hbWUsIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBjaGVja05hbWVBdHRyKCBuYW1lICkgKSwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhdHRyICggUU5hbWUgbmFtZSwgU3RyaW5nIHZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgQXR0ciggY2hlY2tOYW1lQXR0ciggbmFtZSApICksIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGF0dHIgKCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmksIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc2VydCggbmV3IEF0dHIoIGNoZWNrTmFtZUF0dHIoIGxvY2FsLCB1cmkgKSApLCB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpc2NhcmRYbWxucyAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBfZG9jRWxlbURpc2NhcmRlZCAmJiBfZnJvbnRpZXIuaXNEb2MoKSAmJgotICAgICAgICAgICAgICAgICAgICBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggX29wZW5GcmFnVXJpICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHhtbG5zICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBjaGVja05hbWUoIHByZWZpeCwgdXJpICk7Ci0KLSAgICAgICAgICAgIGlmICghZGlzY2FyZFhtbG5zKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgaW5zZXJ0KCBuZXcgWG1sbnMoIG5hbWUgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB4bWxucyAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gY2hlY2tOYW1lKCBuYW1lICk7Ci0KLSAgICAgICAgICAgIGlmICghZGlzY2FyZFhtbG5zKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgaW5zZXJ0KCBuZXcgWG1sbnMoIG5hbWUgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjb21tZW50ICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmlwQ29tbWVudHMpCi0gICAgICAgICAgICAgICAgaW5zZXJ0KCBuZXcgQ29tbWVudCgpLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNvbW1lbnQgKCBTdHJpbmcgdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9zdHJpcENvbW1lbnRzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcHJvY2luc3QgKCBTdHJpbmcgdGFyZ2V0LCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfc3RyaXBQcm9jaW5zdHMpCi0gICAgICAgICAgICAgICAgaW5zZXJ0KCBuZXcgUHJvY2luc3QoIHRhcmdldCApLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHByb2NpbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfc3RyaXBQcm9jaW5zdHMpCi0gICAgICAgICAgICAgICAgaW5zZXJ0KCBuZXcgUHJvY2luc3QoIHRhcmdldCApLCB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gcmV0dXJucyB0aGUgY3Agd2hlcmUgbmV3IHRleHQgc2hvdWxkIGdvLgotICAgICAgICAvLwotCi0gICAgICAgIGludCBwcmVUZXh0ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLQotICAgICAgICAgICAgcmV0dXJuIGdldENwKCBfbGFzdE5vbkF0dHIgKSArIF9sYXN0Tm9uQXR0ci5nZXRDY2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5ldyB0ZXh0IGhhcyBiZWVuIHBsYWNlZCwgYWRqdXN0Li4uCi0gICAgICAgIC8vCi0KLSAgICAgICAgdm9pZCBwb3N0VGV4dCAoIGludCBjcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlICYmIF9sYXN0Tm9uQXR0ci5nZXRDY2hBZnRlcigpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG9mZiA9IF9yb290Ll90ZXh0LnVuT2JzY3VyZSggY3AsIGNjaCApOwotCi0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBpIDwgY2NoICYmIGlzV2hpdGVTcGFjZSggX3Jvb3QuX3RleHQuX2J1Zlsgb2ZmICsgaSBdICkgKQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC5yZW1vdmUoIGNwLCBpICk7Ci0gICAgICAgICAgICAgICAgICAgIGNjaCAtPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9sYXN0Tm9uQXR0cjsKLSAgICAgICAgICAgICAgICBfbGFzdFBvcyA9IF9sYXN0Tm9uQXR0ci5nZXRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGNjaCApOwotCi0gICAgICAgICAgICAgICAgYWRqdXN0Q2NoKCBfbGFzdE5vbkF0dHIsIGNjaCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0ZXh0ICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotCi0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvZmY7Ci0gICAgICAgICAgICBpbnQgZW5kID0gb2ZmICsgY2NoOwotCi0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggc3RhcnQgPCBlbmQgJiYgaXNXaGl0ZVNwYWNlKCBidWZbIHN0YXJ0IF0gKSApCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjY2hUZXh0ID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGlmIChjY2hUZXh0ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbGFzdFNwbGF5ID0gX2xhc3ROb25BdHRyOwotICAgICAgICAgICAgICAgIF9sYXN0UG9zID0gX2xhc3ROb25BdHRyLmdldEVuZFBvcygpOwotCi0gICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQuaW5zZXJ0KAotICAgICAgICAgICAgICAgICAgICBnZXRDcCggX2xhc3ROb25BdHRyICkgKyBfbGFzdE5vbkF0dHIuZ2V0Q2NoKCksCi0gICAgICAgICAgICAgICAgICAgIGJ1Ziwgc3RhcnQsIGNjaFRleHQgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ci5hZGp1c3RDY2hBZnRlciggY2NoVGV4dCApOwotICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2hUZXh0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRleHQgKCBTdHJpbmcgdGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotCi0gICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICAgICAgaW50IGVuZCA9IHRleHQubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlICYmIF9sYXN0Tm9uQXR0ci5nZXRDY2hBZnRlcigpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBzdGFydCA8IGVuZCAmJiBpc1doaXRlU3BhY2UoIHRleHQuY2hhckF0KCBzdGFydCApICkgKQotICAgICAgICAgICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2NoVGV4dCA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpZiAoY2NoVGV4dCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9sYXN0Tm9uQXR0cjsKLSAgICAgICAgICAgICAgICBfbGFzdFBvcyA9IF9sYXN0Tm9uQXR0ci5nZXRFbmRQb3MoKTsKLQotICAgICAgICAgICAgICAgIF9yb290Ll90ZXh0Lmluc2VydCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3AoIF9sYXN0Tm9uQXR0ciApICsgX2xhc3ROb25BdHRyLmdldENjaCgpLAotICAgICAgICAgICAgICAgICAgICB0ZXh0LCBzdGFydCwgY2NoVGV4dCApOwotCi0gICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmFkanVzdENjaEFmdGVyKCBjY2hUZXh0ICk7Ci0gICAgICAgICAgICAgICAgYWRqdXN0Q2NoKCBfbGFzdE5vbkF0dHIsIGNjaFRleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFubm90YXRlcyB0aGUgbGFzdCB0aGluZyBpbnNlcnRlZAotICAgICAgICB2b2lkIGFubm90YXRlICggWG1sQm9va21hcmsgeG1sQm9va21hcmsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXcgQW5ub3RhdGlvbiggX3Jvb3QsIHhtbEJvb2ttYXJrICkuCi0gICAgICAgICAgICAgICAgc2V0KCBfbGFzdFNwbGF5LCBfbGFzdFBvcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsaW5lTnVtYmVyQW5ub3RhdGlvbiAoIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgYW5ub3RhdGUoIG5ldyBYbWxMaW5lTnVtYmVyKCBsaW5lLCBjb2x1bW4sIG9mZnNldCApICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGxpbmVOdW1iZXJBbm5vdGF0aW9uICggWE1MRXZlbnQgeGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2NhdGlvbiBsb2MgPSB4ZS5nZXRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAobG9jICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGluZU51bWJlckFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgICAgIGxvYy5nZXRMaW5lTnVtYmVyKCksIGxvYy5nZXRDb2x1bW5OdW1iZXIoKSwgLTEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgamF2ZWxpbkFubm90YXRpb24gKCBYbWxDdXJzb3IuWG1sQm9va21hcmsgamEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoamEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgIGFubm90YXRlKCBqYSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBSb290ICAgICAgIF9yb290OwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICAgX2xhc3ROb25BdHRyOwotICAgICAgICBwcml2YXRlIENvbnRhaW5lciAgX2Zyb250aWVyOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICAgX2xhc3RTcGxheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgICAgIF9sYXN0UG9zOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgX2ZpbmlzaGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgX2Rpc2NhcmREb2NFbGVtOwotICAgICAgICBwcml2YXRlIFFOYW1lICAgICAgX3JlcGxhY2VEb2NFbGVtOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgX3N0cmlwV2hpdGVzcGFjZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcENvbW1lbnRzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgX3N0cmlwUHJvY2luc3RzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgX2RvY0VsZW1EaXNjYXJkZWQ7Ci0gICAgICAgIHByaXZhdGUgTWFwICAgICAgICBfc3Vic3RpdHV0ZU5hbWVzcGFjZXM7Ci0gICAgICAgIHByaXZhdGUgTWFwICAgICAgICBfYWRkaXRpb25hbE5hbWVzcGFjZXM7Ci0gICAgICAgIHByaXZhdGUgUU5hbWVDYWNoZSBfcW5hbWVDYWNoZTsKLSAgICAgICAgcHJpdmF0ZSBYbWxPcHRpb25zIF9vcHRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkTm9kZUNoaWxkcmVuICggTm9kZSBuLCBMb2FkQ29udGV4dCBjb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIGZvciAoIE5vZGUgYyA9IG4uZ2V0Rmlyc3RDaGlsZCgpIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0TmV4dFNpYmxpbmcoKSApCi0gICAgICAgICAgICBsb2FkTm9kZSggYywgY29udGV4dCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkTm9kZSAoIE5vZGUgbiwgTG9hZENvbnRleHQgY29udGV4dCApCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBuLmdldE5vZGVUeXBlKCkgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgbG9hZE5vZGVDaGlsZHJlbiggbiwgY29udGV4dCApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG4uZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRleHQuYmVnaW4oIGxvY2FsTmFtZSwgbi5nZXROYW1lc3BhY2VVUkkoKSApOwotCi0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGF0dHJzLmdldExlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb2RlIGEgPSBhdHRycy5pdGVtKCBpICk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBhLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGEuZ2V0Tm9kZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9jYWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSBhLmdldE5vZGVOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodXJpICE9IG51bGwgJiYgdXJpLmVxdWFscyggX3htbG5zVXJpICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCAieG1sbnMiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnhtbG5zKCAiIiwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC54bWxucyggbG9jYWwsIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXR0ciggbG9jYWwsIHVyaSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvYWROb2RlQ2hpbGRyZW4oIG4sIGNvbnRleHQgKTsKLQotICAgICAgICAgICAgY29udGV4dC5lbmQoKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LnRleHQoIG4uZ2V0Tm9kZVZhbHVlKCkgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmNvbW1lbnQoIG4uZ2V0Tm9kZVZhbHVlKCkgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LnByb2NpbnN0KCBuLmdldE5vZGVOYW1lKCksIG4uZ2V0Tm9kZVZhbHVlKCkgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuRU5USVRZX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6Ci0gICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5leHBlY3RlZCBub2RlIiApOwotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTG9hZENvbnRleHQgY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggdGhpcywgb3B0aW9ucyApOwotCi0gICAgICAgIGxvYWROb2RlKCBub2RlLCBjb250ZXh0ICk7Ci0KLSAgICAgICAgYXNzb2NpYXRlU291cmNlTmFtZSggb3B0aW9ucyApOwotCi0gICAgICAgIHJldHVybiBhdXRvVHlwZWREb2N1bWVudCggdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb2FkWG1sSW5wdXRTdHJlYW0oIHhpcywgb3B0aW9ucyApOwotCi0gICAgICAgIHJldHVybiBhdXRvVHlwZWREb2N1bWVudCggdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRYbWxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotCi0gICAgICAgIFhNTEV2ZW50IHggPSB4aXMucGVlaygpOwotICAgICAgICAKLSAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4LmdldFR5cGUoKSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAgbnNNYXAgPSAoKFN0YXJ0RWxlbWVudCkgeCkuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgICAgICAgIGlmIChuc01hcCAhPSBudWxsICYmIG5zTWFwLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMucHV0QWxsKCBuc01hcCApOwotCi0gICAgICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUywgbmFtZXNwYWNlcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9hZENvbnRleHQgY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggdGhpcywgb3B0aW9ucyApOwotCi0gICAgICAgIGJvb2xlYW4gbGluZU51bXMgPSBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5MT0FEX0xJTkVfTlVNQkVSUyApOwotCi0gICAgICAgIGV2ZW50czoKLSAgICAgICAgZm9yICggWE1MRXZlbnQgeGUgPSB4aXMubmV4dCgpIDsgeGUgIT0gbnVsbCA7IHhlID0geGlzLm5leHQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHhlLmdldFR5cGUoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UIDoKLSAgICAgICAgICAgICAgICAvLyBCVUdCVUcgKGVyaWN2YXMpIDEyMjU4IC0gRklYRUQgYmVsb3cKLSAgICAgICAgICAgICAgICBTdGFydERvY3VtZW50IGRvYyA9IChTdGFydERvY3VtZW50KSB4ZTsKLQotLy8gICAgICAgICAgICAgICAgY29udGV4dC5kb2N0eXBlKAotLy8gICAgICAgICAgICAgICAgICAgIGRvYy5nZXRuYW1lKCkuZ2V0TG9jYWxOYW1lKCksCi0vLyAgICAgICAgICAgICAgICAgICAgIiIsIGRvYy5nZXRQdWJsaWNJZCgpCi0KLSAgICAgICAgICAgICAgICBfcHJvcHMuc2V0RG9jdHlwZVN5c3RlbUlkKCBkb2MuZ2V0U3lzdGVtSWQoKSApOwotLy8gICAgICAgICAgICAgICAgX3B1YmxpY0lEID0gZG9jLmdldFB1YmxpY0lkKCk7Ci0gICAgICAgICAgICAgICAgX3Byb3BzLnNldEVuY29kaW5nKCBkb2MuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSApOwotICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRWZXJzaW9uKCBkb2MuZ2V0VmVyc2lvbigpICk7Ci0gICAgICAgICAgICAgICAgX3N0YW5kQWxvbmUgPSBkb2MuaXNTdGFuZGFsb25lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfRE9DVU1FTlQgOgotICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtcykKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrIGV2ZW50czsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5OVUxMX0VMRU1FTlQgOgotICAgICAgICAgICAgICAgIGlmICgheGlzLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXZlbnRzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgOgotICAgICAgICAgICAgICAgIGNvbnRleHQuYmVnaW4oIFhNTE5hbWVIZWxwZXIuZ2V0UU5hbWUoIHhlLmdldE5hbWUoKSApICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBBdHRyaWJ1dGVJdGVyYXRvciBhaSA9ICgoU3RhcnRFbGVtZW50KSB4ZSkuZ2V0QXR0cmlidXRlcygpCi0gICAgICAgICAgICAgICAgICAgICAgOyBhaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IGFpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmF0dHIoCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCBhdHRyLmdldE5hbWUoKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yICggQXR0cmlidXRlSXRlcmF0b3IgYWkgPSAoKFN0YXJ0RWxlbWVudCkgeGUpLmdldE5hbWVzcGFjZXMoKQotICAgICAgICAgICAgICAgICAgICAgIDsgYWkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgWE1MTmFtZSBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IG5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZ2V0UHJlZml4KCkgPT0gbnVsbCAmJiBsb2NhbC5lcXVhbHMoICJ4bWxucyIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gIiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC54bWxucyggbG9jYWwsIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkVORF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICBjb250ZXh0LmVuZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuU1BBQ0UgOgotICAgICAgICAgICAgICAgIGlmICgoKFNwYWNlKSB4ZSkuaWdub3JhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEEgOgotICAgICAgICAgICAgICAgIENoYXJhY3RlckRhdGEgY2QgPSAoQ2hhcmFjdGVyRGF0YSkgeGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2QuaGFzQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC50ZXh0KCBjZC5nZXRDb250ZW50KCkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNPTU1FTlQgOgotICAgICAgICAgICAgICAgIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ29tbWVudCBjb21tZW50ID0KLSAgICAgICAgICAgICAgICAgICAgKHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ29tbWVudCkgeGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29tbWVudC5oYXNDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbW1lbnQoIGNvbW1lbnQuZ2V0Q29udGVudCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLSAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcHJvY0luc3RyID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgeGU7Ci0KLSAgICAgICAgICAgICAgICBjb250ZXh0LnByb2NpbnN0KCBwcm9jSW5zdHIuZ2V0VGFyZ2V0KCksIHByb2NJbnN0ci5nZXREYXRhKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtcykKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBUaGVzZSBhcmUgaWdub3JlZAotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTlRJVFlfUkVGRVJFTkNFIDoKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkcgOgotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkcgOgotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkcgOgotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5YTUxfRVZFTlQgOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlVuaGFuZGxlZCB4bWwgZXZlbnQgdHlwZTogIiArIHhlLmdldFR5cGVBc1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LmZpbmlzaCgpOwotCi0gICAgICAgIGFzc29jaWF0ZVNvdXJjZU5hbWUoIG9wdGlvbnMgKTsKLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLSAgICAgICAgYXNzZXJ0IGlzTGVmdE9ubHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbE9iamVjdCB4ICkKLSAgICB7Ci0gICAgICAgIGR1bXAoIHgsIFN5c3RlbS5vdXQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbE9iamVjdCB4LCBQcmludFN0cmVhbSBwcyApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgeGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBSb290IHIgPSAoKEN1cnNvcikgeGMpLmdldFJvb3QoKTsKLSAgICAgICAgci5kdW1wKCBwcywgbnVsbCwgKChDdXJzb3IpIHhjKS5nZXRTcGxheSgpLCBmYWxzZSApOwotICAgICAgICB4Yy5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXAgKCBYbWxDdXJzb3IgeGMgKQotICAgIHsKLSAgICAgICAgZHVtcCggeGMsIFN5c3RlbS5vdXQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbEN1cnNvciB4YywgUHJpbnRTdHJlYW0gcHMgKQotICAgIHsKLSAgICAgICAgUm9vdCByID0gKChDdXJzb3IpIHhjKS5nZXRSb290KCk7Ci0gICAgICAgIHIuZHVtcCggcHMsIG51bGwsICgoQ3Vyc29yKSB4YykuZ2V0U3BsYXkoKSwgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wVGV4dCAoIFByaW50U3RyZWFtIHBzLCBpbnQgY3AsIGludCBjY2gsIFNwbGF5IHMsIGludCBwICkKLSAgICB7Ci0gICAgICAgIGlmIChjcCA+PSAwICYmIGNwICsgY2NoIDw9IF90ZXh0Lmxlbmd0aCgpKQotICAgICAgICAgICAgZHVtcFN0cmluZyggcHMsIF90ZXh0LmZldGNoKCBjcCwgY2NoICksIHMsIHAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHMucHJpbnQoICJbc3RyaW5nOiBjcD0iICsgY3AgKyAiLCBjY2g9IiArIGNjaCArICIgXSIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcFRleHQgKCBQcmludFN0cmVhbSBwcywgaW50IGNwLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIGlmIChjcCA+PSAwICYmIGNwICsgY2NoIDw9IF90ZXh0Lmxlbmd0aCgpKQotICAgICAgICAgICAgZHVtcFN0cmluZyggcHMsIF90ZXh0LmZldGNoKCBjcCwgY2NoICksIG51bGwsIDAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHMucHJpbnQoICJbc3RyaW5nOiBjcD0iICsgY3AgKyAiLCBjY2g9IiArIGNjaCArICIgXSIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcFN0cmluZyAoIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBkdW1wU3RyaW5nKCBwcywgcywgbnVsbCwgMCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wR29vYmVyc0lubGluZSAoIFByaW50U3RyZWFtIHBzLCBTcGxheSBzLCBpbnQgcCApCi0gICAgewotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7Ci0gICAgICAgICAgICAgIGcgPSBzLm5leHRHb29iZXIoIGcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnLmdldEtpbmQoKSA9PSBDVVJTT1IgJiYgZy5nZXRQb3MoKSA9PSBwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEN1cnNvckdvb2JlciBjZyA9IChDdXJzb3JHb29iZXIpIGc7Ci0KLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlsiICsgKChDdXJzb3JHb29iZXIpIGcpLmdldERlYnVnSWQoKSArICJdIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBTdHJpbmcgKCBQcmludFN0cmVhbSBwcywgU3RyaW5nIHN0ciwgU3BsYXkgcywgaW50IHAgKQotICAgIHsKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHN0ci5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZHVtcEdvb2JlcnNJbmxpbmUoIHBzLCBzLCBpICsgcCApOwotCi0gICAgICAgICAgICBpZiAoaSA9PSAzNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIi4uLiIgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoIGkgKTsKLQotICAgICAgICAgICAgaWYgKGNoID09ICdcbicpCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcXG4iICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHInKQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXFxyIiApOwotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlxcdCIgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcIicpCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcXFwiIiApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBzLnByaW50KCBjaCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBHb29iZXJzICggUHJpbnRTdHJlYW0gcHMsIEdvb2JlciBnICkKLSAgICB7Ci0gICAgICAgIGlmIChnID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IEFHR1JFR0FURSkKLSAgICAgICAgewotICAgICAgICAgICAgcHMucHJpbnQoICIgeyIgKTsKLSAgICAgICAgICAgIGR1bXBHb29iZXJzKCBwcywgZy5fZ29vYmVycyApOwotICAgICAgICAgICAgcHMucHJpbnQoICJ9IiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzLnByaW50KCAiIC0gIiArIGcuZ2V0S2luZE5hbWUoKSArICIgcG9zOiAiICsgZy5nZXRQb3MoKSApOwotCi0gICAgICAgIGlmIChnLmdldEtpbmQoKSA9PSBDVVJTT1IpCi0gICAgICAgICAgICBwcy5wcmludCggIiBpZDogIiArICgoQ3Vyc29yR29vYmVyKSBnKS5nZXREZWJ1Z0lkKCkgKTsKLQotICAgICAgICBpZiAoZy5fbmV4dCAhPSBnLl9wYXJlbnQuX2dvb2JlcnMpCi0gICAgICAgICAgICBkdW1wR29vYmVycyggcHMsIGcuX25leHQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcFNwbGF5VHJlZSggU3BsYXkgcywgUHJpbnRTdHJlYW0gcHMgKQotICAgIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocy5fcmlnaHRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgZHVtcFNwbGF5VHJlZSggcy5fcmlnaHRTcGxheSwgcHMgKTsKLQotICAgICAgICBmb3IgKCBTcGxheSB0ID0gcy5fcGFyZW50U3BsYXkgOyB0ICE9IG51bGwgOyB0ID0gdC5fcGFyZW50U3BsYXkgKQotICAgICAgICAgICAgcHMucHJpbnQoICIgICIgKTsKLQotICAgICAgICBwcy5wcmludCggIlsiICsgcy5nZXREZWJ1Z0lkKCkgKTsKLSAgICAgICAgcHMucHJpbnQoICIgYzoiICsgcy5nZXRDY2hMZWZ0KCkgKyAiKCIgKyBzLmdldENjaCgpICsgIikiKTsKLSAgICAgICAgcHMucHJpbnQoICIgYjoiICsgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgKyAiKCIgKyBzLmdldENkb2NCZWdpbigpICsgIikiKTsKLQotICAgICAgICBpZiAocy5fcGFyZW50U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHMucHJpbnQoICIgcDoiICsgcy5fcGFyZW50U3BsYXkuZ2V0RGVidWdJZCgpICk7Ci0gICAgICAgICAgICBwcy5wcmludCggcy5fcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9PSBzID8gIkwiIDogIlIiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcy5wcmludGxuKCAiXSIgKTsKLQotICAgICAgICBpZiAocy5fbGVmdFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICBkdW1wU3BsYXlUcmVlKCBzLl9sZWZ0U3BsYXksIHBzICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXAgKCBYbWxDdXJzb3IgYywgYm9vbGVhbiB2ZXJib3NlICkKLSAgICB7Ci0gICAgICAgICgoQ3Vyc29yKSBjKS5kdW1wKCB2ZXJib3NlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHVtcCAoICkKLSAgICB7Ci0gICAgICAgIGR1bXAoIFN5c3RlbS5vdXQsIG51bGwsIHRoaXMsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHVtcCAoIGJvb2xlYW4gdmVyYm9zZSApCi0gICAgewotICAgICAgICBkdW1wKCBTeXN0ZW0ub3V0LCBudWxsLCB0aGlzLCB2ZXJib3NlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHVtcCAoIFByaW50U3RyZWFtIHBzICkKLSAgICB7Ci0gICAgICAgIGR1bXAoIHBzLCBudWxsLCB0aGlzLCBmYWxzZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCBQcmludFN0cmVhbSBwcywgU3RyaW5nIG1zZywgT2JqZWN0IHNyYywgYm9vbGVhbiB2ZXJib3NlICkKLSAgICB7Ci0gICAgICAgIC8vIFVuZGVyIEludGVsbGlKLCBpZiB5b3UgY2FsbCBhIGZ1bmN0aW9uIGZyb20gdGhlIGV4cHJlc3Npb24KLSAgICAgICAgLy8gZXZhbHVhdG9yIGFuZCBpdCBwcm9kdWNlcyB0b28gbXVjaCBvdXRwdXQsIEludGVsbGlKIHdpbGwgbm90Ci0gICAgICAgIC8vIHNob3cgeW91IHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uLiAgU28sIEkgZHVtcCB0byBhIGZpbGUKLSAgICAgICAgLy8gaGVyZSBhcyB3ZWxsIGFuZCB0aGUgZ2l2ZW4gcHJpbnQgc3RyZWFtIQotCi0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCAiYzpcXCIgKTsKLQotICAgICAgICBpZiAoZi5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZiA9IG5ldyBGaWxlKCBmLCAieGJlYW4uZG1wIiApOwotCi0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotICAgICAgICAgICAgUHJpbnRTdHJlYW0gcHMyID0gbnVsbDsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwotICAgICAgICAgICAgICAgIHBzMiA9IG5ldyBQcmludFN0cmVhbSggb3MgKTsKLQotICAgICAgICAgICAgICAgIGRvRHVtcCggcHMyLCBtc2csIHNyYywgdmVyYm9zZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBzMiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHMyLnByaW50bG4oICJFeGNlcHRpb24gZHVyaW5nIGR1bXAuIiApOwotICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSggcHMyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgeyBvcy5jbG9zZSgpOyB9IGNhdGNoICggRXhjZXB0aW9uIGUgKSB7IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkb0R1bXAoIHBzLCBtc2csIHNyYywgdmVyYm9zZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFeGNlcHRpb24gZHVyaW5nIGR1bXAuIiApOwotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoIFN5c3RlbS5vdXQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBEdW1wTnNNYW5hZ2VyIGltcGxlbWVudHMgTmFtZXNwYWNlTWFuYWdlcgotICAgIHsKLSAgICAgICAgRHVtcE5zTWFuYWdlciAoIFByaW50U3RyZWFtIHBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcyA9IHBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkgKCBTdHJpbmcgdXJpLCBTdHJpbmcgc3VnZ2VzdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiZGVidWdfcHJlZml4XyIgKyBpKys7Ci0KLSAgICAgICAgICAgIHBzLnByaW50KCAiIFtmaW5kX3ByZWZpeF9mb3JfbnN1cmk6ICIgKTsKLSAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICsgdXJpICsgIlwiICgiICsgc3VnZ2VzdGlvbiArICIpIC0+ICIgKyBwcmVmaXggKTsKLSAgICAgICAgICAgIHBzLnByaW50KCAiXSIgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCAieG1sIiApKQotICAgICAgICAgICAgICAgIHJldHVybiBfeG1sMTk5OFVyaTsKLQotICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJkZWJ1Z19uc18iICsgaSsrOwotCi0gICAgICAgICAgICBwcy5wcmludCggIiBbbG9va3VwX25zdXJpX2Zvcl9wcmVmaXg6ICIgKTsKLSAgICAgICAgICAgIHBzLnByaW50KCBwcmVmaXggKyAiIC0+IFwiIiArIHVyaSArICJcIiIgKTsKLSAgICAgICAgICAgIHBzLnByaW50KCAiXSIgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIFByaW50U3RyZWFtIHBzOwotCi0gICAgICAgIHByaXZhdGUgaW50IGkgPSAxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvRHVtcCAoCi0gICAgICAgIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgbXNnLCBPYmplY3Qgc3JjLCBib29sZWFuIHZlcmJvc2UgKQotICAgIHsKLSAgICAgICAgaWYgKCFfYXNzZXJ0RW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcHMucHJpbnRsbiggIk5vIGR1bXAgcHJvZHVjZWQgKGFzc2VydCBuZWVkcyB0byBiZSBlbmFibGVkKSIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE5hbWVzcGFjZU1hbmFnZXIgbnNtID0gbmV3IER1bXBOc01hbmFnZXIoIHBzICk7Ci0KLSAgICAgICAgaWYgKG1zZyAhPSBudWxsKQotICAgICAgICAgICAgcHMucHJpbnRsbiggbXNnICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzLnByaW50bG4oICJEdW1wOiIgKTsKLQotICAgICAgICBpZiAoc3JjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBDdXJzb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgIiAgZnJvbSBjdXJzb3IgIiArICgoQ3Vyc29yR29vYmVyKSgoQ3Vyc29yKSBzcmMpLl9kYXRhLl9nb29iZXIpLmdldERlYnVnSWQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgU3BsYXkpCi0gICAgICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgZnJvbSBzcGxheSAiICsgKChTcGxheSkgc3JjKS5nZXREZWJ1Z0lkKCkgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcy5wcmludGxuKCAiICBmcm9tIHNyYyAiICsgc3JjICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGVwdGggPSAwOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSBfZG9jIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQga2luZCA9IHMuZ2V0S2luZCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgaWRzID0gIiIgKyBzLmdldERlYnVnSWQoKTsKLSAgICAgICAgICAgIGlkcyA9ICIgICAgICAgICIuc3Vic3RyaW5nKCAwLCA2IC0gaWRzLmxlbmd0aCgpICkgKyBpZHM7Ci0gICAgICAgICAgICBwcy5wcmludCggaWRzICsgIjogIiApOwotCi0gICAgICAgICAgICBpZiAoa2luZCA9PSBFTkQpCi0gICAgICAgICAgICAgICAgZGVwdGgtLTsKLQotICAgICAgICAgICAgaWYgKCFzLmlzUm9vdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBkZXB0aCA7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiICAiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGR1bXBHb29iZXJzSW5saW5lKCBwcywgcywgMCApOwotCi0gICAgICAgICAgICBzd2l0Y2ggKCBraW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgRE9DIDoKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIkRPQyIgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBCRUdJTiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgczsKLQotICAgICAgICAgICAgICAgIGlmICghYi5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgZGVwdGgrKzsKLQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPCIgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPiIgKTsKLQotICAgICAgICAgICAgICAgIGlmIChiLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGIuZ2V0Q2NoVmFsdWUoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wVGV4dCggcHMsIHMuZ2V0Q3BTbG93KCksIGIuZ2V0Q2NoVmFsdWUoKSwgcywgMSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGR1bXBHb29iZXJzSW5saW5lKCBwcywgcywgcy5nZXRQb3NMZWFmRW5kKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIjwvIiApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIvPiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBBVFRSIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIiN4bWxuczoiICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIj1cIiIgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiQCIgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPVwiIiApOwotICAgICAgICAgICAgICAgICAgICBkdW1wVGV4dCggcHMsIHMuZ2V0Q3BTbG93KCksIHMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEVORCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5kIGVzID0gKEVuZCkgczsKLSAgICAgICAgICAgICAgICBCZWdpbiBiID0gZXMuX2JlZ2luOwotCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICI8LyIgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggYi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIi8+IiApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQ09NTUVOVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNGcmFnbWVudCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJGUkFHIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIjwhLS0iICk7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBUZXh0KCBwcywgcy5nZXRDcFNsb3coKSwgcy5nZXRDY2hWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiLS0+IiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBQUk9DSU5TVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICI8PyIgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXRMb2NhbCgpICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICIgIiApOwotICAgICAgICAgICAgICAgIGR1bXBUZXh0KCBwcywgcy5nZXRDcFNsb3coKSwgcy5nZXRDY2hWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICI/PiIgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBST09UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlJPT1QiICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmtub3duIHNwbGF5IGtpbmQiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzLmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0KLSAgICAgICAgICAgICAgICBkdW1wVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgcHMsIHMuZ2V0Q3BTbG93KCkgKyBzLmdldENjaFZhbHVlKCksIHMuZ2V0Q2NoQWZ0ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgcywgcy5nZXRQb3NBZnRlcigpICk7Ci0KLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkdW1wR29vYmVyc0lubGluZSggcHMsIHMsIHMuZ2V0RW5kUG9zKCkgKTsKLQotICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcy5wZWVrVHlwZSgpLmJ1aWxkX3RleHQoIG5zbSApOwotCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICIgW2ludmFsaWQ6IiApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgZHVtcFN0cmluZyggcHMsIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIl0iICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGR1bXBHb29iZXJzKCBwcywgcy5fZ29vYmVycyApOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBraW5kICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCRUdJTiA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChiLmdldEZpbmlzaCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiIFtlbmQ6ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCBiLmdldEZpbmlzaCgpLmdldERlYnVnSWQoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJdIiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGIuZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbY29udGFpbmVyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5nZXRDb250YWluZXIoKS5nZXREZWJ1Z0lkKCkgKyAiXSIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRU5EIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVuZCBlcyA9IChFbmQpIHM7Ci0gICAgICAgICAgICAgICAgICAgIEJlZ2luIGIgPSBlcy5fYmVnaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIgW2JlZ2luOiAiICsgYi5nZXREZWJ1Z0lkKCkgKyAiXSIgKTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcy5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcy5wcmludGxuKCk7Ci0KLSAgICAgICAgaWYgKGdldENjaExlZnQoKSA+IF90ZXh0Lmxlbmd0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcy5wcmludGxuKAotICAgICAgICAgICAgICAgICJUZXh0IGJ1ZmZlciBoYXMgdG9vIGZldyBjaGFyYWN0ZXJzICgiICsKLSAgICAgICAgICAgICAgICAgICAgKGdldENjaExlZnQoKSAtIF90ZXh0Lmxlbmd0aCgpKSArICIpIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGdldENjaExlZnQoKSA8IF90ZXh0Lmxlbmd0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcy5wcmludGxuKAotICAgICAgICAgICAgICAgICJUZXh0IGJ1ZmZlciBoYXMgdG9vIG1hbnkgY2hhcmFjdGVycyAoIiArCi0gICAgICAgICAgICAgICAgICAgIChfdGV4dC5sZW5ndGgoKSAtIGdldENjaExlZnQoKSkgKyAiKTogIiApOwotCi0gICAgICAgICAgICBkdW1wU3RyaW5nKAotICAgICAgICAgICAgICAgIHBzLAotICAgICAgICAgICAgICAgIF90ZXh0LmZldGNoKCBnZXRDY2hMZWZ0KCksIF90ZXh0Lmxlbmd0aCgpIC0gZ2V0Q2NoTGVmdCgpICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCAiU3BsYXkgdHJlZToiICk7Ci0KLSAgICAgICAgICAgIHBzLnByaW50bG4oICIgIGlzTGVmdE9ubHk6ICIgKyBfbGVmdE9ubHkgKTsKLSAgICAgICAgICAgIHBzLnByaW50bG4oICIgIHZlcnNpb246ICIgKyBnZXRWZXJzaW9uKCkgKTsKLSAgICAgICAgICAgIHBzLnByaW50bG4oICIgIGZpcnN0OiAiICsgX2RvYy5nZXREZWJ1Z0lkKCkgKTsKLQotICAgICAgICAgICAgcHMucHJpbnRsbigpOwotICAgICAgICAgICAgZHVtcFNwbGF5VHJlZSggdGhpcywgcHMgKTsKLSAgICAgICAgICAgIHBzLnByaW50bG4oKTsKLSAgICAgICAgICAgIHBzLnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBzLnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnQgYSBzcGxheSAob3Igc3BsYXlzKSBpbnRvIHRoZSB0cmVlLiAgVGhpcyBpcyBhIGxvdyBsZXZlbAotICAgICAqIG9wZXJhdGlvbiwgYW5kIG9wZXJhdGVzIG9ubHkgb24gdGhlIHNwbGF5IGFzcGVjdCBvZiB0aGUgdHJlZS4KLSAgICAgKiBBbnkgaW52YWxpZGF0aW9uIG1haW50ZW5hbmNlIG11c3QgYmUgaGFuZGxlZCBieSBjYWxsZXJzLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRTcGxheSAoIFNwbGF5IHMsIFNwbGF5IGEgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0ICFzLmlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgYSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgdmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0ICFhLmlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgYS5nZXRSb290U2xvdygpID09IHRoaXM7Ci0gICAgICAgIGFzc2VydCBzLl9wYXJlbnRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgcy5fcmlnaHRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgcy5fbGVmdFNwbGF5ICE9IG51bGwgfHwgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSAhPSBudWxsIHx8IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7Ci0KLSAgICAgICAgaW50IGNjaCA9IHMuZ2V0Q2NoKCk7Ci0gICAgICAgIGludCBjYmVnaW4gPSBzLmdldENkb2NCZWdpbigpOwotCi0gICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY2NoICs9IHMuZ2V0Q2NoTGVmdCgpOwotICAgICAgICAgICAgY2JlZ2luICs9IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpOwotICAgICAgICAgICAgX2xlZnRPbmx5ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2xlZnRPbmx5ICYmIGEgPT0gX2xlZnRTcGxheSkKLSAgICAgICAgewotICAgICAgICAgICAgcy5fbGVmdFNwbGF5ID0gX2xlZnRTcGxheTsKLSAgICAgICAgICAgIHMuX3BhcmVudFNwbGF5ID0gdGhpczsKLQotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoTGVmdCgpID09IDA7Ci0gICAgICAgICAgICBzLmFkanVzdENjaExlZnQoCi0gICAgICAgICAgICAgICAgX2xlZnRTcGxheS5nZXRDY2hMZWZ0KCkgKyBfbGVmdFNwbGF5LmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSAwOwotICAgICAgICAgICAgcy5hZGp1c3RDZG9jQmVnaW5MZWZ0KAotICAgICAgICAgICAgICAgIF9sZWZ0U3BsYXkuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgX2xlZnRTcGxheS5nZXRDZG9jQmVnaW4oKSApOwotCi0gICAgICAgICAgICBfbGVmdFNwbGF5Ll9wYXJlbnRTcGxheSA9IHM7Ci0gICAgICAgICAgICBfbGVmdFNwbGF5ID0gczsKLQotICAgICAgICAgICAgYWRqdXN0Q2NoTGVmdCggY2NoICk7Ci0gICAgICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCBjYmVnaW4gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChfbGVmdE9ubHkgJiYgY2NoID09IDAgJiYgY2JlZ2luID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJZiB0aGUgc3BsYXkgdG8gaW5zZXJ0IGhhcyBubyBjY2ggb3IgY2JlZ2luLCB0aGVuIHdoZW4KLSAgICAgICAgICAgIC8vIHRoZSB0cmVlIGlzIGxlZnQgb25seSBjaGlsZHJlbiwgSSBuZWVkIG5vdCBzcGxheS4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIHMuX3BhcmVudFNwbGF5ID0gYS5fcGFyZW50U3BsYXk7Ci0gICAgICAgICAgICBzLl9sZWZ0U3BsYXkgPSBhOwotICAgICAgICAgICAgYS5fcGFyZW50U3BsYXkgPSBzOwotICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9IHM7Ci0KLSAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggYS5nZXRDY2hMZWZ0KCkgKyBhLmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgIHMuYWRqdXN0Q2RvY0JlZ2luTGVmdCgKLSAgICAgICAgICAgICAgICBhLmdldENkb2NCZWdpbkxlZnQoKSArIGEuZ2V0Q2RvY0JlZ2luKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNwbGF5IHA7Ci0KLSAgICAgICAgICAgIGlmIChhLl9yaWdodFNwbGF5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKHAgPSBhKS5fcmlnaHRTcGxheSA9IHM7Ci0gICAgICAgICAgICAgICAgX2xlZnRPbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggcCA9IGEuX3JpZ2h0U3BsYXkgOyBwLl9sZWZ0U3BsYXkgIT0gbnVsbCA7ICkKLSAgICAgICAgICAgICAgICAgICAgcCA9IHAuX2xlZnRTcGxheTsKLQotICAgICAgICAgICAgICAgIHAuX2xlZnRTcGxheSA9IHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuX3BhcmVudFNwbGF5ID0gcDsKLQotICAgICAgICAgICAgZm9yICggcCA9IHMgOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSB0ID0gcC5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmICh0Ll9sZWZ0U3BsYXkgPT0gcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQuYWRqdXN0Q2NoTGVmdCggY2NoICk7Ci0gICAgICAgICAgICAgICAgICAgIHQuYWRqdXN0Q2RvY0JlZ2luTGVmdCggY2JlZ2luICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcCA9IHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpYWwgaW5zZXJ0IHRvIGluc2VydCBhIHNpbmdsZSBzcGxheSBpbnRvIGEgbGVmdG9ubHkgdHJlZSB3aXRob3V0Ci0gICAgICogY2F1c2luZyB0aGUgdHJlZSB0byBnbyBub24gbGVmdCBvbmx5LiAgQmVjYXVzZSB0aGlzIGRvZXMgbm90IHNwbGF5LAotICAgICAqIGRvaW5nIHRoaXMgdG9vIG1hbnkgdGltZXMgY2FuIGJlIHZlcnkgaW5lZmZpY2llbnQuCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBpbnNlcnRTaW5nbGVTcGxheVNhbnNTcGxheUluTGVmdE9ubHlUcmVlICggU3BsYXkgcywgU3BsYXkgYSApCi0gICAgewotICAgICAgICBhc3NlcnQgX2xlZnRPbmx5OwotICAgICAgICBhc3NlcnQgcy5fcmlnaHRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgcy5fbGVmdFNwbGF5ID09IG51bGw7Ci0KLSAgICAgICAgcy5fbGVmdFNwbGF5ID0gYTsKLSAgICAgICAgcy5fcGFyZW50U3BsYXkgPSBhLl9wYXJlbnRTcGxheTsKLSAgICAgICAgYS5fcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9IHM7Ci0gICAgICAgIGEuX3BhcmVudFNwbGF5ID0gczsKLQotICAgICAgICBzLmFkanVzdENjaExlZnQoIGEuZ2V0Q2NoTGVmdCgpICsgYS5nZXRDY2goKSApOwotICAgICAgICBzLmFkanVzdENkb2NCZWdpbkxlZnQoIGEuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgYS5nZXRDZG9jQmVnaW4oKSApOwotICAgICAgICAKLSAgICAgICAgaW50IGNjaCA9IHMuZ2V0Q2NoKCk7Ci0gICAgICAgIGludCBjYmVnaW4gPSBzLmdldENkb2NCZWdpbigpOwotICAgICAgICAKLSAgICAgICAgZm9yICggU3BsYXkgcCA9IHMuX3BhcmVudFNwbGF5IDsgcCAhPSBudWxsIDsgcCA9IHAuX3BhcmVudFNwbGF5ICkKLSAgICAgICAgewotICAgICAgICAgICAgcC5hZGp1c3RDY2hMZWZ0KCBjY2ggKTsKLSAgICAgICAgICAgIHAuYWRqdXN0Q2RvY0JlZ2luTGVmdCggY2JlZ2luICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgWyBmaXJzdCwgbGFzdCApIHNwbGF5cyBmcm9tIHRvdGFsIHNlcXVlbmNlOgotICAgICAqCi0gICAgICogICAgIEEgLSBmaXJzdCAtIEIgLSB4IC0gbGFzdCAtIEMKLSAgICAgKgotICAgICAqIHdoZXJlIGZpcnN0LCBsYXN0IGFuZCB4IGFyZSBpbmRpdmlkdWFsIHNwbGF5cyBhbmQgQSwgQiBhbmQgQyBhcmUKLSAgICAgKiBtdWx0aXBsZSwgaW50ZXJ2ZW5pbmcgc3BsYXlzLiAgUmV0dXJuIHRoZSByZXN1bHQgd2l0aCB4IGF0IHRoZSB0b3AKLSAgICAgKiBhbmQgZmlyc3QgaGlzIGxlZnQgY2hpbGQuICBUaGlzIGFsbG93cyB4IHRvIGhhdmUgdGhlIHNwbGF5Ci0gICAgICogY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgd2hvbGUgcmVtb3ZlZCB0cmVlLgotICAgICAqLwotCi0gICAgU3BsYXkgcmVtb3ZlU3BsYXlzICggU3BsYXkgZmlyc3QsIFNwbGF5IGxhc3QgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgICAgIGFzc2VydCBmaXJzdCAhPSBsYXN0OzsKLSAgICAgICAgYXNzZXJ0ICFmaXJzdC5pc1Jvb3QoKTsKLSAgICAgICAgYXNzZXJ0ICFmaXJzdC5pc0RvYygpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZmlyc3QuZ2V0Um9vdFNsb3coKSA9PSB0aGlzOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgbGFzdC5nZXRSb290U2xvdygpID09IHRoaXM7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBmaXJzdC5jb21wYXJlU2xvdyggbGFzdCApID09IC0xOwotICAgICAgICBhc3NlcnQgIWxhc3QuaXNSb290KCkgfHwgbGFzdCA9PSB0aGlzOwotCi0gICAgICAgIFNwbGF5IHggPSBsYXN0LnByZXZTcGxheSgpOwotCi0gICAgICAgIGlmICh4ID09IGZpcnN0KQotICAgICAgICAgICAgcmV0dXJuIHgucmVtb3ZlU3BsYXkoIHRoaXMgKTsKLQotICAgICAgICAvLyBNYWtlIHRoZSBkb2cgbGVnIQotCi0gICAgICAgIGlmIChsYXN0ICE9IHRoaXMpCi0gICAgICAgICAgICBsYXN0LnNwbGF5KCB0aGlzLCB0aGlzICk7Ci0KLSAgICAgICAgeC5zcGxheSggdGhpcywgbGFzdCApOwotICAgICAgICBmaXJzdC5zcGxheSggdGhpcywgeCApOwotCi0gICAgICAgIGFzc2VydCB0aGlzID09IGxhc3QgfHwgdGhpcy5fbGVmdFNwbGF5ID09IGxhc3Q7Ci0gICAgICAgIGFzc2VydCBsYXN0Ll9sZWZ0U3BsYXkgPT0geDsKLSAgICAgICAgYXNzZXJ0IHguX2xlZnRTcGxheSA9PSBmaXJzdDsKLSAgICAgICAgYXNzZXJ0IHguX3JpZ2h0U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGZpcnN0Ll9sZWZ0U3BsYXkgIT0gbnVsbDsKLQotICAgICAgICBpbnQgZmlyc3RDY2hMZWZ0ID0gZmlyc3QuZ2V0Q2NoTGVmdCgpOwotICAgICAgICBpbnQgZmlyc3RDYmVnaW5MZWZ0ID0gZmlyc3QuZ2V0Q2RvY0JlZ2luTGVmdCgpOwotCi0gICAgICAgIGludCBkZWx0YUNjaExlZnQgPSBmaXJzdENjaExlZnQgLSBsYXN0LmdldENjaExlZnQoKTsKLSAgICAgICAgaW50IGRlbHRhQ2JlZ2luTGVmdCA9IGZpcnN0Q2JlZ2luTGVmdCAtIGxhc3QuZ2V0Q2RvY0JlZ2luTGVmdCgpOwotCi0gICAgICAgIGxhc3QuYWRqdXN0Q2NoTGVmdCggZGVsdGFDY2hMZWZ0ICk7Ci0gICAgICAgIGxhc3QuYWRqdXN0Q2RvY0JlZ2luTGVmdCggZGVsdGFDYmVnaW5MZWZ0ICk7Ci0KLSAgICAgICAgaWYgKGxhc3QgIT0gdGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgYWRqdXN0Q2NoTGVmdCggZGVsdGFDY2hMZWZ0ICk7Ci0gICAgICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCBkZWx0YUNiZWdpbkxlZnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHguYWRqdXN0Q2NoTGVmdCggLSBmaXJzdENjaExlZnQgKTsKLSAgICAgICAgeC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGZpcnN0Q2JlZ2luTGVmdCApOwotCi0gICAgICAgIGZpcnN0LmFkanVzdENjaExlZnQoIC0gZmlyc3RDY2hMZWZ0ICk7Ci0gICAgICAgIGZpcnN0LmFkanVzdENkb2NCZWdpbkxlZnQoIC0gZmlyc3RDYmVnaW5MZWZ0ICk7Ci0KLSAgICAgICAgYXNzZXJ0IGZpcnN0LmdldENjaExlZnQoKSA9PSAwOwotICAgICAgICBhc3NlcnQgZmlyc3QuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7Ci0KLSAgICAgICAgYXNzZXJ0IHguZ2V0Q2NoTGVmdCgpICsgZGVsdGFDY2hMZWZ0ICsgeC5nZXRDY2goKSA9PSAwOwotICAgICAgICBhc3NlcnQgeC5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBkZWx0YUNiZWdpbkxlZnQgKyB4LmdldENkb2NCZWdpbigpID09IDA7Ci0KLSAgICAgICAgZmlyc3QuX2xlZnRTcGxheS5fcGFyZW50U3BsYXkgPSBsYXN0OwotICAgICAgICBsYXN0Ll9sZWZ0U3BsYXkgPSBmaXJzdC5fbGVmdFNwbGF5OwotICAgICAgICB4Ll9wYXJlbnRTcGxheSA9IG51bGw7Ci0KLSAgICAgICAgZmlyc3QuX2xlZnRTcGxheSA9IG51bGw7Ci0gICAgICAgIGZpcnN0Ll9wYXJlbnRTcGxheSA9IG51bGw7Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNhYmxlU3RvcmVWYWxpZGF0aW9uICggKQotICAgICAgICB7IGR2Kys7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZVN0b3JlVmFsaWRhdGlvbiAgKCApCi0gICAgICAgIHsgZHYtLTsgcmV0dXJuIHRydWU7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGR2OwotCi0gICAgewotICAgICAgICBpZiAoISJ0cnVlIi5lcXVhbHMoIFN5c3RlbS5nZXRQcm9wZXJ0eSggInRyZWVhc3NlcnRzIiApKSkKLSAgICAgICAgICAgIGRpc2FibGVTdG9yZVZhbGlkYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSAoICkKLSAgICB7Ci0gICAgICAgIGlmIChkdiAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkb1ZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIHJ0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkRvY3VtZW50IGludmFsaWQ6ICIgKyBydGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICBydGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBkdW1wKCB0cnVlICk7Ci0gICAgICAgICAgICB0aHJvdyBydGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFJlY3Vyc2l2ZSBkZXNjZW50IHZhbGlkYXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50Ci0gICAgLy8KLSAgICAvLyBHcmFtbWVyIGZvciB2YWxpZCBjb250ZW50IG9mIGEgZG9jdW1lbnQKLSAgICAvLwotICAgIC8vIDxkb2M+ICAgICAgICA6Oj0gRE9DIDxhdHRyaWJ1dGVzPiA8Y29udGVudD4gUk9PVAotICAgIC8vIDxhdHRyaWJ1dGVzPiA6Oj0gKCBBVFRSICkqCi0gICAgLy8gPGNvbnRlbnQ+ICAgIDo6PSAoICggQ09NTUVOVCB8IFBST0NJTlNUIHwgPGVsZW1lbnQ+KSApKgotICAgIC8vIDxlbGVtZW50PiAgICA6Oj0gKCBMRUFGICA8YXR0cmlidXRlcz4gKSB8Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICggQkVHSU4gPGF0dHJpYnV0ZXM+IDxjb250ZW50PiBFTkQgKQotICAgIC8vCi0KLSAgICBwcml2YXRlIFNwbGF5IHZhbGlkYXRlQXR0cmlidXRlcyAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCBzLmdldEtpbmQoKSA9PSBBVFRSICkKLSAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotCi0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3BsYXkgdmFsaWRhdGVDb250ZW50ICggU3BsYXkgcyApCi0gICAgewotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgayA9IHMuZ2V0S2luZCgpOwotCi0gICAgICAgICAgICBpZiAoayA9PSBDT01NRU5UIHx8IGsgPT0gUFJPQ0lOU1QpCi0gICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcSA9IHM7Ci0gICAgICAgICAgICAgICAgcyA9IHZhbGlkYXRlRWxlbWVudCggcyApOwotCi0gICAgICAgICAgICAgICAgaWYgKHEgPT0gcykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNwbGF5IHZhbGlkYXRlRWxlbWVudCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgaWYgKHMuZ2V0S2luZCgpID09IEJFR0lOKQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBiID0gczsKLQotICAgICAgICAgICAgcyA9IHZhbGlkYXRlQXR0cmlidXRlcyggcy5uZXh0U3BsYXkoKSApOwotCi0gICAgICAgICAgICBpZiAoIWIuaXNMZWFmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcyA9IHZhbGlkYXRlQ29udGVudCggcyApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNFbmQoKTogIk1pc3NpbmcgRU5ELCBzcGxheTogIiArIHMuZ2V0RGVidWdJZCgpOwotCi0gICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVEb2MgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gX2RvYy5uZXh0U3BsYXkoKTsKLQotICAgICAgICBzID0gdmFsaWRhdGVBdHRyaWJ1dGVzKCBzICk7Ci0KLSAgICAgICAgcyA9IHZhbGlkYXRlQ29udGVudCggcyApOwotCi0gICAgICAgIGFzc2VydCBzLmlzUm9vdCgpOiAiRXhwZWN0ZWQgcm9vdCI7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsaWRhdGVDb250ZXh0Ci0gICAgewotICAgICAgICBpbnQgX251bVNwbGF5VHlwZXM7Ci0gICAgICAgIGludCBfY0ludmFsaWRhdGFibGVUeXBlczsKLSAgICAgICAgaW50IF9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlR29vYmVyICggR29vYmVyIGcsIFNwbGF5IHMsIFZhbGlkYXRlQ29udGV4dCBjb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIGlmIChnIGluc3RhbmNlb2YgVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGcuZ2V0S2luZCgpID09IFRZUEU7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQuX251bVNwbGF5VHlwZXMrKzsKLQotICAgICAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIGc7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlLnVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuX2NJbnZhbGlkYXRhYmxlVHlwZXMrKzsKLQotICAgICAgICAgICAgaWYgKHR5cGUuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0Ll9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBnLmdldEtpbmQoKSAhPSBUWVBFOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGcuZ2V0U3BsYXkoKSA9PSBzOwotICAgICAgICBhc3NlcnQgZy5nZXRSb290KCkgPT0gdGhpczsKLSAgICAgICAgYXNzZXJ0IGcuZ2V0UG9zKCkgPj0gMDsKLSAgICAgICAgYXNzZXJ0IGcuZ2V0UG9zKCkgPD0gcy5nZXRNYXhQb3MoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9WYWxpZGF0ZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZURvYygpOwotICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0IGdldENjaExlZnQoKSA9PSBfdGV4dC5sZW5ndGgoKTsKLQotICAgICAgICB2YWxpZGF0ZUNoYW5nZUxpc3RlbmVyU3RhdGUoKTsKLQotLy8gVE9ETzogVmFsaWRhdGUgdGhhdCBpcyB0aGUgcm9vdCB0eXBlIGlzIG51bGwsIHRoZXJlIGFyZSBubyB0eXBlcyBpbgotLy8gdHJlZSBhdCBhbGwKLQotLy8gVE9ETzogQ2hlY2sgdGhlIGludmFyaWVudCB0aGF0IGlmIHRoZXJlIGlzIGEgVHlwZSBhbnl3aGVyZQotLy8gaW4gdGhlIGRvY3VtZW50LCB0aGF0IHRoZXJlIGlzIGFuIGV4aXN0aW5nIGNoYWluIG9mIHR5cGVzCi0vLyBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCBhbmQgaXNfb2tfZWxlbWVudF91c2VyIG9yIGlzX29rX2F0dHJpYnV0ZV91c2VyLAotLy8gZGVwZW5kaW5nIG9uIHRoZSBjYXNlLCByZXR1cm5zIG9rLgotCi0gICAgICAgIFZhbGlkYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IFZhbGlkYXRlQ29udGV4dCgpOwotCi0gICAgICAgIENvbnRhaW5lciByZWNlbnRDb250YWluZXIgPSBudWxsOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSBfZG9jIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc1Jvb3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID09IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBzOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0TmFtZSgpICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICAgICAgYi5nZXRGaW5pc2goKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLmdldEZpbmlzaCgpLmdldENvbnRhaW5lcigpID09IGI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYi5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldEZpbmlzaCgpID09IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldEZpbmlzaCgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldEZpbmlzaCgpLmdldENvbnRhaW5lcigpID09IGI7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldENjaFZhbHVlKCkgPT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldE5hbWUoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPT0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHMuaXNQcm9jaW5zdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IHJlY2VudENvbnRhaW5lcjsKLQotICAgICAgICAgICAgICAgIGlmICghcy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVjZW50Q29udGFpbmVyID0gKENvbnRhaW5lcikgczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSByZWNlbnRDb250YWluZXI7Ci0gICAgICAgICAgICAgICAgcmVjZW50Q29udGFpbmVyID0gcmVjZW50Q29udGFpbmVyLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250ZXh0Ll9udW1TcGxheVR5cGVzID0gMDsKLQotICAgICAgICAgICAgZm9yICggR29vYmVyIGcgPSBzLmZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOwotICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUdvb2JlciggZywgcywgY29udGV4dCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLnBlZWtUeXBlKCkgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBjb250ZXh0Ll9udW1TcGxheVR5cGVzID09IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwOwotICAgICAgICAgICAgICAgICAgICBTcGxheSBuID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG4uaXNSb290KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaFZhbHVlKCkgPT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaFZhbHVlKCkgPT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQuX251bVNwbGF5VHlwZXMgPD0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBjb250ZXh0Ll9jSW52YWxpZGF0YWJsZVR5cGVzID09IF9jSW52YWxpZGF0YWJsZVR5cGVzOwotICAgICAgICBhc3NlcnQgY29udGV4dC5fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzID09X2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlczsKLQotICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSBpbmRpY2VzCi0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB2YWxpZGF0ZVNwbGF5VHJlZSAoICkKLSAgICB7Ci0gICAgICAgIGlmIChkdiAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkb1ZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIHJ0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlNwbGF5IHRyZWUgaW52YWxpZDogIiArIHJ0ZSApOwotCi0gICAgICAgICAgICBkdW1wKCB0cnVlICk7Ci0KLSAgICAgICAgICAgIHRocm93IHJ0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbGlkYXRlU3RhdHMgZXh0ZW5kcyBIYXNoTWFwCi0gICAgewotICAgICAgICBpbnQgZ2V0Q2NoICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTdGF0cyggcyApLl9jY2g7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkanVzdENjaCAoIFNwbGF5IHMsIGludCBjY2hEZWx0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXRzIHN0YXRzID0gZ2V0U3RhdHMoIHMgKTsKLSAgICAgICAgICAgIHN0YXRzLl9jY2ggKz0gY2NoRGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q2JlZ2luICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTdGF0cyggcyApLl9jYmVnaW47Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkanVzdENiZWdpbiAoIFNwbGF5IHMsIGludCBjYmVnaW5EZWx0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXRzIHN0YXRzID0gZ2V0U3RhdHMoIHMgKTsKLSAgICAgICAgICAgIHN0YXRzLl9jYmVnaW4gKz0gY2JlZ2luRGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0YXRzIGdldFN0YXRzICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXRzIHN0YXRzID0gKFN0YXRzKSBnZXQoIHMgKTsKLQotICAgICAgICAgICAgaWYgKHN0YXRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcHV0KCBzLCBzdGF0cyA9IG5ldyBTdGF0cygpICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdGF0czsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgX2NjaDsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgX2NiZWdpbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gZG9WYWxpZGF0ZVNwbGF5VHJlZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydEFzc2VydEVuYWJsZWQoKTsKLQotICAgICAgICBWYWxpZGF0ZVN0YXRzIHN0YXRzID0gbmV3IFZhbGlkYXRlU3RhdHMoKTsKLQotICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBfcmlnaHRTcGxheSAgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IF9kb2MuX2xlZnRTcGxheSA9PSBudWxsOwotCi0gICAgICAgIFNwbGF5IHMgPSB0aGlzOwotCi0gICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcyA9IHMuX2xlZnRTcGxheTsKLQotICAgICAgICAgICAgd2hpbGUgKCBzICE9IG51bGwgJiYgcy5fbGVmdFNwbGF5ICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHMgPSBzLl9sZWZ0U3BsYXk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgcyA9PSBfZG9jOwotCi0gICAgICAgIGxvb3A6Ci0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgPT0gbnVsbCAmJiBzLl9yaWdodFNwbGF5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2NoKCBzLCBzLmdldENjaCgpICk7Ci0gICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2JlZ2luKCBzLCBzLmdldENkb2NCZWdpbigpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzLl9yaWdodFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggcyA9IHMuX3JpZ2h0U3BsYXkgOyBzLl9sZWZ0U3BsYXkgIT0gbnVsbCA7ICkKLSAgICAgICAgICAgICAgICAgICAgcyA9IHMuX2xlZnRTcGxheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcCA9IHMuX3BhcmVudFNwbGF5OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwLl9yaWdodFNwbGF5ID09IG51bGwgfHwgcC5fcmlnaHRTcGxheSA9PSBzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2NoKCBzLCBzLmdldENjaCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oIHMsIHMuZ2V0Q2RvY0JlZ2luKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuX2xlZnRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENjaCggcywgc3RhdHMuZ2V0Q2NoKCBzLl9sZWZ0U3BsYXkgKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2JlZ2luKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBzdGF0cy5nZXRDYmVnaW4oIHMuX2xlZnRTcGxheSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLl9yaWdodFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2NoKCBzLCBzdGF0cy5nZXRDY2goIHMuX3JpZ2h0U3BsYXkgKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2JlZ2luKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBzdGF0cy5nZXRDYmVnaW4oIHMuX3JpZ2h0U3BsYXkgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHAuX2xlZnRTcGxheSA9PSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHAuX3JpZ2h0U3BsYXkgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHAuX3JpZ2h0U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggcy5fbGVmdFNwbGF5ICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggcyA9IF9kb2MgOyBzICE9IG51bGwgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2xlZnRPbmx5IHx8IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbDogIiIgKyBzLmdldERlYnVnSWQoKTsKLSAgICAgICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgID09IG51bGwgfHwgcy5fbGVmdFNwbGF5IC5fcGFyZW50U3BsYXkgPT0gczsKLSAgICAgICAgICAgIGFzc2VydCBzLl9yaWdodFNwbGF5ID09IG51bGwgfHwgcy5fcmlnaHRTcGxheS5fcGFyZW50U3BsYXkgPT0gczsKLQotICAgICAgICAgICAgaWYgKHMuX2xlZnRTcGxheSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaExlZnQoKSA9PSAwOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydAotICAgICAgICAgICAgICAgICAgICBzLmdldENjaExlZnQoKSA9PSBzdGF0cy5nZXRDY2goIHMuX2xlZnRTcGxheSApOgotICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBzLmdldERlYnVnSWQoKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSBzdGF0cy5nZXRDYmVnaW4oIHMuX2xlZnRTcGxheSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBpbnRlcmZhY2UgQ2hhbmdlTGlzdGVuZXIKLSAgICB7Ci0gICAgICAgIHZvaWQgY2hhbmdlTm90aWZpY2F0aW9uICggKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFuZ2VDbGllbnQKLSAgICB7Ci0gICAgICAgIENoYW5nZUxpc3RlbmVyIF9saXN0ZW5lcjsKLSAgICAgICAgQ2hhbmdlQ2xpZW50ICAgX25leHQ7Ci0gICAgfQotCi0gICAgbG9uZyBnZXRWZXJzaW9uICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9fdmVyc2lvbjsKLSAgICB9Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWZXJzaW9uICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9jaGFuZ2VDbGllbnRzID09IG51bGw7Ci0KLSAgICAgICAgX192ZXJzaW9uKys7Ci0KLSAgICAgICAgYXNzZXJ0IChfZGVidWdDaGFuZ2VWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWU7Ci0gICAgfQotCi0gICAgLy8gVXNlIHRoaXMgKm9ubHkqIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLSAgICB2b2lkIHJlc3RvcmVWZXJzaW9uICggbG9uZyBvbGRWZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfX3ZlcnNpb24gPj0gb2xkVmVyc2lvbjsKLSAgICAgICAgX192ZXJzaW9uID0gb2xkVmVyc2lvbjsKLSAgICAgICAgYXNzZXJ0IChfZGVidWdDaGFuZ2VWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWU7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB2YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKLSAgICAgICAgcmV0dXJuIF9jaGFuZ2VDbGllbnRzID09IG51bGw7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB2YWxpZGF0ZUNoYW5nZUxpc3RlbmVyU3RhdGUgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX2RlYnVnQ2hhbmdlVmVyc2lvbiA9PSBfX3ZlcnNpb247Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgcmVnaXN0ZXJGb3JDaGFuZ2UgKCBDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBhc3NlcnQgdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlKCk7Ci0KLSAgICAgICAgLy8gU2VlIGlmIHRoaXMgbGlzdGVuZXIgaXMgdGhlIGZpcnN0IG9uZSBvbiB0aGUgbGlzdC4gIEVhc3kgYnV0IG5vdAotICAgICAgICAvLyB0b3RhbGx5IGNvbXBsZXRlICBvcHRpbWl6YXRpb24KLQotICAgICAgICBpZiAoX2NoYW5nZUNsaWVudHMgIT0gbnVsbCAmJiBfY2hhbmdlQ2xpZW50cy5fbGlzdGVuZXIgPT0gbGlzdGVuZXIpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ2hhbmdlQ2xpZW50IGNsaWVudCA9IG5ldyBDaGFuZ2VDbGllbnQoKTsKLQotICAgICAgICBjbGllbnQuX25leHQgPSBfY2hhbmdlQ2xpZW50czsKLSAgICAgICAgY2xpZW50Ll9saXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICBfY2hhbmdlQ2xpZW50cyA9IGNsaWVudDsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0Q2hhbmdlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSgpOwotCi0gICAgICAgIGxvbmcgY3VycmVudFZlcnNpb24gPSAwOwotCi0gICAgICAgIGFzc2VydCAoY3VycmVudFZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZTsKLQotICAgICAgICB3aGlsZSAoIF9jaGFuZ2VDbGllbnRzICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY2hhbmdlQ2xpZW50cy5fbGlzdGVuZXIuY2hhbmdlTm90aWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICBfY2hhbmdlQ2xpZW50cyA9IF9jaGFuZ2VDbGllbnRzLl9uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGN1cnJlbnRWZXJzaW9uID09IF9fdmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIERvY3VtZW50IHByb3BlcnRpZXMKLSAgICAvLwotCi0gICAgc3RhdGljIGNsYXNzIERvY1Byb3BzCi0gICAgICAgIGV4dGVuZHMgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzCi0gICAgewotICAgICAgICBwcml2YXRlIEhhc2hNYXAgX21hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwdXQgKCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX21hcC5wdXQoIGtleSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0ICggT2JqZWN0IGtleSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbWFwLmdldCgga2V5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZSAoIE9iamVjdCBrZXkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX21hcC5yZW1vdmUoIGtleSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgbnRoQ2FjaGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBuYW1lc1NhbWUgKCBRTmFtZSBwYXR0ZXJuLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gbnVsbCB8fCBwYXR0ZXJuLmVxdWFscyggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNldHNTYW1lICggUU5hbWVTZXQgcGF0dGVyblNldCwgUU5hbWVTZXQgc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB2YWx1ZSBlcXVhbGl0eSBpcyBwcm9iYWJseSB0b28gZXhwZW5zaXZlLiBTaW5jZSB0aGUgdXNlIGNhc2UKLSAgICAgICAgICAgIC8vIGludm9sdmVzIFFOYW1lU2V0cyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLCB3ZQotICAgICAgICAgICAgLy8gY2FuIHVzZSBpZGVudGl0eSBjb21wYXJpc29uLgotICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm5TZXQgIT0gbnVsbCAmJiBwYXR0ZXJuU2V0ID09IHNldDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBuYW1lSGl0KFFOYW1lIG5hbWVQYXR0ZXJuLCAgUU5hbWVTZXQgc2V0UGF0dGVybiwgUU5hbWUgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNldFBhdHRlcm4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNTYW1lKG5hbWVQYXR0ZXJuLCBuYW1lKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0UGF0dGVybi5jb250YWlucyhuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjYWNoZVNhbWUgKFFOYW1lIG5hbWVQYXR0ZXJuLCAgUU5hbWVTZXQgc2V0UGF0dGVybikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNldFBhdHRlcm4gPT0gbnVsbCA/IG5hbWVzU2FtZShuYW1lUGF0dGVybiwgX25hbWUpIDoKLSAgICAgICAgICAgICAgICBzZXRzU2FtZShzZXRQYXR0ZXJuLCBfc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkaXN0YW5jZSAoIFNwbGF5IHBhcmVudCwgUU5hbWUgbmFtZSwgUU5hbWVTZXQgc2V0LCBpbnQgbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuID49IDA7Ci0KLSAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBSb290LnRoaXMuZ2V0VmVyc2lvbigpKQotICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRSAtIDE7Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gX3BhcmVudCB8fCAhY2FjaGVTYW1lKG5hbWUsIHNldCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCi0gICAgICAgICAgICByZXR1cm4gbiA+IF9uID8gbiAtIF9uIDogX24gLSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmVnaW4gZmV0Y2ggKCBTcGxheSBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgaW50IG4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbiA+PSAwOwotCi0gICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gUm9vdC50aGlzLmdldFZlcnNpb24oKSB8fCBfcGFyZW50ICE9IHBhcmVudCB8fAotICAgICAgICAgICAgICAgICAgISBjYWNoZVNhbWUobmFtZSwgc2V0KSB8fCBuID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ZlcnNpb24gPSBSb290LnRoaXMuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIF9wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgX25hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIF9jaGlsZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgX24gPSAtMTsKLQotICAgICAgICAgICAgICAgIGlmICghcGFyZW50LmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9vcDoKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IHBhcmVudC5uZXh0U3BsYXkoKSA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBzLmdldEtpbmQoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVORCAgOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBST09UIDogYnJlYWsgbG9vcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCRUdJTiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVIaXQoIG5hbWUsIHNldCwgcy5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGlsZCA9IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoX24gPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpZiAobiA+IF9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggbiA+IF9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBfY2hpbGQuZ2V0RmluaXNoU3BsYXkoKS5uZXh0U3BsYXkoKSA7IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVIaXQoIG5hbWUsIHNldCwgcy5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGlsZCA9IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuIDwgX24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBuIDwgX24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IF9jaGlsZDsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkgfHwgcy5pc0VuZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVIaXQoIG5hbWUsIHNldCwgcy5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGlsZCA9IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIChCZWdpbikgX2NoaWxkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBsb25nICAgICBfdmVyc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgICBfcGFyZW50OwotICAgICAgICBwcml2YXRlIFFOYW1lICAgIF9uYW1lOwotICAgICAgICBwcml2YXRlIFFOYW1lU2V0IF9zZXQ7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFNwbGF5IF9jaGlsZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICBfbjsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIERhIGZpZWxkcy4gIERhIEJlYXJzLiAgRGl0a2EgaXMgR29kLgotICAgIC8vCi0KLSAgICBib29sZWFuIF9sZWZ0T25seTsKLSAgICBEb2MgICAgIF9kb2M7Ci0gICAgVGV4dCAgICBfdGV4dDsKLSAgICBib29sZWFuIF92YWxpZGF0ZU9uU2V0OwotCi0gICAgLy8KLSAgICAvLyBEb2N1bWVudCB2ZXJzaW9uLiAgVGhlc2UgbnVtYmVycyBnZXQgaW5jcmVtZW50ZWQgd2hlbiB0aGUgZG9jdW1lbnQKLSAgICAvLyBjaGFuZ2VzIGluIGEgdmFyaWV0eSBvZiB3YXlzLgotICAgIC8vCi0KLSAgICBwcml2YXRlIGxvbmcgX192ZXJzaW9uID0gMTsKLSAgICBwcml2YXRlIGxvbmcgX2RlYnVnQ2hhbmdlVmVyc2lvbiA9IDE7IC8vIERlYnVnIG9ubHkKLQotICAgIHByaXZhdGUgQ2hhbmdlQ2xpZW50IF9jaGFuZ2VDbGllbnRzOwotCi0gICAgRG9jUHJvcHMgX3Byb3BzOwotCi0gICAgLy8KLSAgICAvLyBYbWxJbnB1dFN0cmVhbQotICAgIC8vCi0KLSAgICBib29sZWFuIF9zdGFuZEFsb25lOwotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBmaW5hbCBTY2hlbWFUeXBlTG9hZGVyIF9zY2hlbWFUeXBlU3lzdGVtOwotCi0gICAgaW50IF9jSW52YWxpZGF0YWJsZVR5cGVzOwotICAgIGludCBfY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzOwotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBudGhDYWNoZSBfbnRoQ2FjaGVfQSA9IG5ldyBudGhDYWNoZSgpOwotICAgIG50aENhY2hlIF9udGhDYWNoZV9CID0gbmV3IG50aENhY2hlKCk7Ci0gICAgVHlwZVN0b3JlRmFjdG9yeSBfZmFjdG9yeTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU2F2ZXIuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU2F2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3NWFlYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NhdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0Nzg5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5DaGFyczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkVuY29kaW5nTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2VuZXJpY1htbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFdmVudEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxOYW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LlhtbG5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ29tbWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZERvY3VtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRWxlbWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydFByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlciBpbXBsZW1lbnRzIE5hbWVzcGFjZU1hbmFnZXIKLXsKLSAgICAvLwotICAgIC8vCi0gICAgLy8KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtb25pdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcm9vdDsKLSAgICB9Ci0KLSAgICBTYXZlciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgcy5nZXRSb290U2xvdygpID09IHI7Ci0KLSAgICAgICAgLy8gSW5wdXQgcyBhbmQgcCBtdXN0IGJlIG5vcm1hbGl6ZWQgYWxyZWFkeQotICAgICAgICBhc3NlcnQgcCA8IHMuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICBfdG9wID0gX3NwbGF5ID0gczsKLSAgICAgICAgX3BvcyA9IHA7Ci0gICAgICAgIF92ZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIF9zYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgX2F0dHJzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgX2F0dHJOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIF9maXJzdFB1c2ggPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgX25ld0xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoICJsaW5lLnNlcGFyYXRvciIgKTsKLQotICAgICAgICBpZiAoX25ld0xpbmUgPT0gbnVsbCkKLSAgICAgICAgICAgIF9uZXdMaW5lID0gIlxuIjsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzdGF0ZSBvZiB0aGUgbmFtZXNwYWNlcwotICAgICAgICBfbmFtZXNwYWNlU3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIF91cmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBfcHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyBTdG9wcyB0aGUgc3ludGhlc2lzIG9mIHRoaXMgbmFtc3BhY2UgYW5kIG1ha2UgZm9yIGJldHRlcgotICAgICAgICAvLyByb3VuZHRyaXBwaW5nIAotICAgICAgICBhZGRNYXBwaW5nKCAieG1sIiwgU3BsYXkuX3htbDE5OThVcmkgKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgaW1wbGljaXQgbmFtZXNwYWNlcwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLQotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9JTVBMSUNJVF9OQU1FU1BBQ0VTICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcCBtID0gKE1hcCkgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9JTVBMSUNJVF9OQU1FU1BBQ0VTICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBtLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyggcHJlZml4LCAoU3RyaW5nKSBtLmdldCggcHJlZml4ICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1NVR0dFU1RFRF9QUkVGSVhFUyApKQotICAgICAgICAgICAgX3N1Z2dlc3RlZFByZWZpeGVzID0gKE1hcCkgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9TVUdHRVNURURfUFJFRklYRVMpOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgcHJlZml4IGhhcyBub3QgYmVlbiBtYXBwZWQsIGRvIHNvIG5vdwotICAgICAgICAKLSAgICAgICAgaWYgKGdldE5hbWVzcGFjZUZvclByZWZpeCggIiIgKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW5pdGlhbERlZmF1bHRVcmkgPSBuZXcgU3RyaW5nKCAiIiApOwotICAgICAgICAgICAgYWRkTWFwcGluZyggIiIsIF9pbml0aWFsRGVmYXVsdFVyaSApOwotICAgICAgICB9Ci0KLSAgICAgICAgX3NhdmVOYW1lc3BhY2VzRmlyc3QgPSBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX05BTUVTUEFDRVNfRklSU1QgKTsKLQotICAgICAgICBpZiAoX3ByZXR0eVByaW50ID0gb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlQgKSkKLSAgICAgICAgewotICAgICAgICAgICAgX3ByZXR0eUluZGVudCA9IDI7Ci0KLSAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVF9JTkRFTlQgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJldHR5SW5kZW50ID0KLSAgICAgICAgICAgICAgICAgICAgKChJbnRlZ2VyKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVF9JTkRFTlQgKSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UX09GRlNFVCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wcmV0dHlPZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAoKEludGVnZXIpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UX09GRlNFVCApKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfQUdHUkVTU0lWRV9OQU1FU1BBQ0VTICkgJiYKLSAgICAgICAgICAgICAgICAhKHRoaXMgaW5zdGFuY2VvZiBTeW50aE5hbWVzcGFjZVNhdmVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3ludGhOYW1lc3BhY2VTYXZlciBzYXZlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFN5bnRoTmFtZXNwYWNlU2F2ZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBzYXZlci5wcm9jZXNzKCkgKQotICAgICAgICAgICAgICAgIDsKLQotICAgICAgICAgICAgaWYgKCFzYXZlci5fc3ludGhOYW1lc3BhY2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzID0gc2F2ZXIuX3N5bnRoTmFtZXNwYWNlczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgX3VzZURlZmF1bHROYW1lc3BhY2UgPQotICAgICAgICAgICAgb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgKTsKLQotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9GSUxURVJfUFJPQ0lOU1QgKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZpbHRlclByb2NpbnN0ID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX0ZJTFRFUl9QUk9DSU5TVCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfVVNFX09QRU5fRlJBR01FTlQgKSkKLSAgICAgICAgICAgIF9mcmFnbWVudCA9IFNwbGF5Ll9vcGVudXJpRnJhZ21lbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9mcmFnbWVudCA9IFNwbGF5Ll94bWxGcmFnbWVudDsKLQotICAgICAgICAvLyBPdXRlciBvdmVycmlkZXMgaW5uZXIKLSAgICAgICAgCi0gICAgICAgIF9pbm5lciA9Ci0gICAgICAgICAgICBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0lOTkVSICkgJiYKLSAgICAgICAgICAgICAgICAhb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9PVVRFUiApOwotICAgICAgICAKLSAgICAgICAgaWYgKF9pbm5lciAmJiAhX3RvcC5pc0RvYygpKQotICAgICAgICAgICAgX3N5bnRoRWxlbSA9IF9mcmFnbWVudDsKLSAgICAgICAgCi0gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQgKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZyYWdtZW50ID0gX3N5bnRoRWxlbSA9Ci0gICAgICAgICAgICAgICAgKFFOYW1lKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX1NZTlRIRVRJQ19ET0NVTUVOVF9FTEVNRU5UICk7Ci0KLSAgICAgICAgICAgIGlmIChfc3ludGhFbGVtID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk51bGwgc3ludGhldGljIGVsZW1lbnQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF9wcmVQcm9jZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1ZlcnNpb24gKCApCi0gICAgewotICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIGR1cmluZyBzYXZlIiApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBSb290IGdldFJvb3QgKCApIHsgcmV0dXJuIF9yb290OyB9Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcCAgZ2V0VXJpTWFwICggKSB7IHJldHVybiBfdXJpTWFwOyB9Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcCAgZ2V0UHJlZml4TWFwICggKSB7IHJldHVybiBfcHJlZml4TWFwOyB9Ci0KLSAgICAvLyBlbWl0Q29udGFpbmVyIHdpbGwgcHJvY2VzcyBsZWFmIGNvbnRlbnRzIGFuZCB0aGUgdGV4dCBhZnRlciBhCi0gICAgLy8gc3RhcnQuICBBbGwgb3RoZXIgdGV4dCBpcyBwcm9jZXNzZWQgd2l0aCBlbWl0VGV4dEFmdGVyLgotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIGEgc3ludGhldGljIHByZWZpeCBpcyBjcmVhdGVkLgotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHN5bnRoZXRpY05hbWVzcGFjZSAoCi0gICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIGJvb2xlYW4gY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgKSB7IH0KLQotICAgIC8qCi0gICAgICogSXQgaXMgdml0YWwgdGhhdCB0aGUgc2F2ZXIgZG9lcyBub3QgbW9kaWZ5IHRoZSB0cmVlIGluIHRoZSBwcm9jZXNzIG9mCi0gICAgICogc2F2aW5nLiAgU28sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBjb250ZW50IG9yIGF0dHIgdmFsdWVzIHdoaWNoIG5lZWQKLSAgICAgKiBuZXcgbmFtZXNwYWNlL3ByZWZpeCBtYXBwaW5ncywgSSBjb21wdXRlIHRoZSBjb250ZW50L3ZhbHVlcyBieSBwYXNzaW5nCi0gICAgICogdGhlIE5hbWVzcGFjZU1hbmFnZXIgaW1wbGVtZW50ZWQgYnkgdGhlIHNhdmVyIHdoaWNoIGNhbiBjb25zIHVwIG1hcHBpbmdzCi0gICAgICoganVzdCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNhdmluZyB3aXRob3V0IG1vZGlmeWluZyB0aGUgdHJlZSBieSBhZGRpbmcKLSAgICAgKiBYbWxucyBzcGxheXMuCi0gICAgICoKLSAgICAgKiBUaHVzLCBJIG11c3Qgbm90LCBhcyBhIGJ5cHJvZHVjdCBvZiBzYXZpbmcsIHZhbGlkYXRlIGFueSBjb250ZW50L3ZhbHVlcwotICAgICAqIGludG8gdGhlIHRyZWUgd2hpY2ggY2FsbCBiYWNrIGZvciBuYW1lc3BhY2UgbWFwcGluZ3Mgd2hpY2ggbmVlZCB0byBiZQotICAgICAqIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBBbHNvLCBJIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsaWQgdGV4dCAoaWYgYSBzcGxheSBpcyBpbnZhbGlkKSBiZWZvcmUKLSAgICAgKiBJIGhhdmUgY2xvc2VkIHRoZSBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZW5jbG9zaW5nIGNvbnRhaW5lciBiZWNhdXNlCi0gICAgICogSSB3aWxsIGhhdmUgdG8gcGVyc2lzdCBvdXQgdGhlc2UgdGVtcG9yYXJ5IG1lcHBpbmdzIGJlZm9yZSB0aGV5IGFyZQotICAgICAqIHJlZmVyZW5jZWQgYnkgdGhlIHZhbHVlcyB3aGljaCBuZWVkIHRoZW0uCi0gICAgICovCi0KLSAgICBmaW5hbCBTdHJpbmcgdGV4dCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfdGV4dCAhPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIF90ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgZmluYWwgYm9vbGVhbiBub1RleHQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX3RleHQgIT0gbnVsbCB8fCBfc2IubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IF90ZXh0ID09IG51bGwgfHwgX3RleHQgPT0gX3NiOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIF90ZXh0ID09IG51bGw7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBjbGVhclRleHQgKCApCi0gICAgewotICAgICAgICBfdGV4dCA9IG51bGw7Ci0gICAgICAgIF9zYi5kZWxldGUoIDAsIF9zYi5sZW5ndGgoKSApOwotICAgIH0KLQotICAgIGZpbmFsIHN0YXRpYyB2b2lkIHNwYWNlcyAoIFN0cmluZ0J1ZmZlciBzYiwgaW50IG9mZnNldCwgaW50IGNvdW50ICkKLSAgICB7Ci0gICAgICAgIHdoaWxlICggY291bnQtLSA+IDAgKQotICAgICAgICAgICAgc2IuaW5zZXJ0KCBvZmZzZXQsICcgJyApOwotICAgIH0KLQotICAgIGZpbmFsIHN0YXRpYyB2b2lkIHRyaW0gKCBTdHJpbmdCdWZmZXIgc2IgKQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgc2IubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICAgICAgaWYgKCFTcGxheS5pc1doaXRlU3BhY2UoIHNiLmNoYXJBdCggaSApICkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgc2IuZGVsZXRlKCAwLCBpICk7Ci0KLSAgICAgICAgZm9yICggaSA9IHNiLmxlbmd0aCgpIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgaWYgKCFTcGxheS5pc1doaXRlU3BhY2UoIHNiLmNoYXJBdCggaSAtIDEgKSApKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHNiLmRlbGV0ZSggaSwgc2IubGVuZ3RoKCkgKTsKLSAgICB9Ci0KLSAgICAvLyBDYWxsIHByb2Nlc3MgdW50aWwgaXQgcmV0dXJucyBmYWxzZSB0byBzYXZlIGV2ZXJ5dGhpbmcuCi0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgaWYgKF9wcmVQcm9jZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wcmVQcm9jZXNzID0gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IF9zcGxheTsKLSAgICAgICAgICAgICAgICBpbnQgICBwID0gX3BvczsKLSAgICAKLSAgICAgICAgICAgICAgICBfc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgIF9wb3MgPSAwOwotICAgIAotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwb3NpdGlvbiByaWdodCBiZWZvcmUgZW5kIHRva2VuLiAgRWZmZWN0aXZlbHkgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBub3RoaW5nIHRvIHNhdmUgaGVyZSwgc28gc2F2ZSBvdXQgdGhlIGVtcHR5IGZyYWdtZW50LgotICAgIAotICAgICAgICAgICAgICAgIGlmICgocCA9PSAwICYmIHMuaXNGaW5pc2goKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAocy5pc0xlYWYoKSAmJiBwID09IHMuZ2V0UG9zTGVhZkVuZCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggbnVsbCwgMCwgMCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gSGVyZSwgaWYgcCA+IDAsIHRoZW4gd2UncmUgc2F2aW5nIHNvbWUgdGV4dAotICAgIAotICAgICAgICAgICAgICAgIGlmIChwID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCAhcy5pc0xlYWYoKSB8fCBwICE9IHMuZ2V0UG9zTGVhZkVuZCgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dEZyYWdtZW50KCBzLCBwLCBzLmdldFBvc3RDY2goIHAgKSApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5ID09IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoX2lubmVyICYmIChzLmlzQXR0cigpIHx8IHMuaXNDb21tZW50KCkgfHwgcy5pc1Byb2NpbnN0KCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggcywgMCwgcy5nZXRDY2hWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWG1sbnNGcmFnbWVudCggcyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXR0ckZyYWdtZW50KCBzICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0NvbW1lbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50RnJhZ21lbnQoIHMgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzUHJvY2luc3QoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfZmlsdGVyUHJvY2luc3QgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBfZmlsdGVyUHJvY2luc3QgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggbnVsbCwgMCwgMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2NpbnN0RnJhZ21lbnQoIHMgKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgX3NwbGF5ID0gczsKLSAgICAgICAgICAgICAgICBfZW5kU3BsYXkgPSBzLmlzQ29udGFpbmVyKCkgPyBzLmdldEZpbmlzaFNwbGF5KCkgOiBzOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgLy8gSSBuZWVkIHRvIGJyZWFrIHRoZSBwcm9jZXNzaW5nIG9mIGEgc3BsYXkgaW50byB0d28gcGFydHMuICBUaGUKLSAgICAgICAgICAgIC8vIGZpcnN0IHBhcnQgaXMgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHNwbGF5IGFuZCB0aGUgc2Vjb25kIHBhcnQgaXMKLSAgICAgICAgICAgIC8vIHRoZSBwb3N0IHByb2Nlc3Npbmcgb2YgdGhlIHNwbGF5LiAgSW4gcGFydGljdWxhciwgdGhlIHBvc3QKLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcsIGFtb25nIG90aGVyIHRoaW5ncywgcG9wcyB0aGUgbWFwcGluZyBzdGFjay4gIFRoaXMKLSAgICAgICAgICAgIC8vIGlzIGRvbmUgc28gc3R1ZmYgJ3NhdmVkJyBkdXJpbmcgdGhlIGZpcnN0IHBhcnQgKHRoZSBwcmUtcHJvY2VzcykKLSAgICAgICAgICAgIC8vIGNhbiB1c2UgdGhlIG1hcHBpbmcgc3RhY2suICBXaGVuIHRoZSBuZXh0IHByb2Nlc3MgY29tZXMgYXJvdW5kLAotICAgICAgICAgICAgLy8gdGhlIG1hcHBpbmcgc3RhY2sgd2lsbCB0aGVuIGJlIHVwZGF0ZWQuCi0gICAgCi0gICAgICAgICAgICBpZiAoX3Bvc3RQb3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9wTWFwcGluZ3MoKTsKLSAgICAgICAgICAgICAgICBfcG9zdFBvcCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKF9wb3N0UHJvY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5ICE9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBlbWl0dGVkID0gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKF9zcGxheSA9PSBfZW5kU3BsYXkpCi0gICAgICAgICAgICAgICAgICAgIF9zcGxheSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IF9zcGxheTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgX3NwbGF5ID0gX3NwbGF5Lm5leHROb25BdHRyU3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9za2lwQ29udGFpbmVyRmluaXNoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0JlZ2luKCkgJiYgIXMuaXNMZWFmKCkgJiYgcy5nZXRDY2hBZnRlcigpID09MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBfc3BsYXkuaXNGaW5pc2goKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIF9zcGxheSA9IF9zcGxheSA9PSBfZW5kU3BsYXkgPyBudWxsIDogX3NwbGF5Lm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfc2tpcENvbnRhaW5lckZpbmlzaCB8fCBzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIV9wb3N0UG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgX3Bvc3RQb3AgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICghcy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm9UZXh0KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2NoQWZ0ZXIgPSBzLmdldENjaEFmdGVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3ByZXR0eVByaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0ID0gX3NiOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjY2hBZnRlciA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIHMuZ2V0UG9zQWZ0ZXIoKSApLCBjY2hBZnRlciApOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltKCBfdGV4dCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgc3RvcCA9IChDb250YWluZXIpIF90b3A7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSBzdG9wLmdldENvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoIHMuZ2V0UG9zQWZ0ZXIoKSApOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgcCA9IGM7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgcCAhPSBzdG9wIDsgcCA9IHAuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgMCwgX3ByZXR0eUluZGVudCApOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3ByZXR0eUluZGVudCA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dC5pbnNlcnQoIDAsIF9uZXdMaW5lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCAxLCBfcHJldHR5T2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9wcmV0dHlJbmRlbnQgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0LmFwcGVuZCggX25ld0xpbmUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgX3RleHQubGVuZ3RoKCksIF9wcmV0dHlPZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIHAgPSBjOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLm5leHROb25BdHRyU3BsYXkoKS5pc0VuZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcC5nZXRDb250YWluZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IHAgIT0gbnVsbCAmJiBwICE9IHN0b3A7IHAgPSBwLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgX3RleHQubGVuZ3RoKCksIF9wcmV0dHlJbmRlbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsID8gY2NoQWZ0ZXIgPiAwIDogX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRUZXh0QWZ0ZXIoIHMsIHMuZ2V0UG9zQWZ0ZXIoKSwgY2NoQWZ0ZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIF9wb3N0UHJvY2VzcyA9IGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBJIG9ubHkgcmV0dXJuIGZhbHNlIGlmIHRoZXJlIGlzICpyZWFsbHkqIG5vdGhpbmcgbW9yZQotICAgICAgICAgICAgICAgIC8vIHRvIHByb2Nlc3MKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoZW1pdHRlZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKF9wb3N0UG9wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9wTWFwcGluZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgX3Bvc3RQb3AgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAoX3NwbGF5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IGdldFJvb3QoKS5nZXRWZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7Ci0gICAgCi0gICAgICAgICAgICBfc2tpcENvbnRhaW5lckZpbmlzaCA9IGZhbHNlOwotICAgIAotICAgICAgICAgICAgc3dpdGNoICggX3NwbGF5LmdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkRPQyA6Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGFpbmVyKCAoQ29udGFpbmVyKSBfc3BsYXkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuUk9PVCA6Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkVORCAgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb2Nlc3NFbmQoIF9zcGxheSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTcGxheS5DT01NRU5UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0Q29tbWVudCggX3NwbGF5ICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LlBST0NJTlNUIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2ZpbHRlclByb2NpbnN0ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFfc3BsYXkuZ2V0TG9jYWwoKS5lcXVhbHMoIF9maWx0ZXJQcm9jaW5zdCApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdFByb2NpbnN0KCBfc3BsYXkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkFUVFIgOgotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBzcGxheSBraW5kICIgKyBfc3BsYXkuZ2V0S2luZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIF9wb3N0UHJvY2VzcyA9IHRydWU7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzQ29udGFpbmVyICggQ29udGFpbmVyIGMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKSB8fCBjLmlzQmVnaW4oKTsKLQotICAgICAgICBRTmFtZSBuYW1lID0KLSAgICAgICAgICAgIF9zeW50aEVsZW0gIT0gbnVsbCAmJiBjID09IF90b3AKLSAgICAgICAgICAgICAgICA/IF9zeW50aEVsZW0KLSAgICAgICAgICAgICAgICA6IGMuaXNCZWdpbigpID8gYy5nZXROYW1lKCkgOiBudWxsOwotCi0gICAgICAgIFN0cmluZyBuYW1lVXJpID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgZG9jdHlwZSB0byBzYXZlIG91dAotCi0gICAgICAgIGlmIChjLmlzRG9jKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSBfcm9vdC5fcHJvcHMuZ2V0RG9jdHlwZVN5c3RlbUlkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZG9jVHlwZU5hbWUgPSBfcm9vdC5fcHJvcHMuZ2V0RG9jdHlwZU5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwgfHwgZG9jVHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZG9jVHlwZU5hbWUgPT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGRvY1R5cGVOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChkb2NUeXBlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIHhjID0gX3Jvb3QuY3JlYXRlQ3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoeGMudG9GaXJzdENoaWxkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlTmFtZSA9IHhjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9jVHlwZU5hbWUgPT0gbnVsbCAmJiBfZnJhZ21lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZG9jVHlwZU5hbWUgPSBfZnJhZ21lbnQuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSWQgPSBfcm9vdC5fcHJvcHMuZ2V0RG9jdHlwZVB1YmxpY0lkKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZW1pdERvY1R5cGUoIGRvY1R5cGVOYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBhIG5ldyBlbnRyeSB0byB0aGUgZnJvbnRpZXIuICBJZiB0aGlzIGVsZW1lbnQgaGFzIGEgbmFtZQotICAgICAgICAvLyB3aGljaCBoYXMgbm8gbmFtZXNwYWNlLCB0aGVuIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgcHVzaGluZwotICAgICAgICAvLyB0aGUgbWFwcGluZ3MgY2F1c2VzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB0byBiZSBlbXB0eQotCi0gICAgICAgIGJvb2xlYW4gZW5zdXJlRGVmYXVsdEVtcHR5ID0gbmFtZSAhPSBudWxsICYmIG5hbWVVcmkubGVuZ3RoKCkgPT0gMDsKLQotICAgICAgICBwdXNoTWFwcGluZ3MoIGMsIGVuc3VyZURlZmF1bHRFbXB0eSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZXJlIGFyZSBmb3VyIHRoaW5ncyB3aGljaCB1c2UgbWFwcGluZ3M6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vICAgMSkgVGhlIGVsZW1lbnQgbmFtZQotICAgICAgICAvLyAgIDIpIFRoZSBlbGVtZW50IHZhbHVlIChxbmFtZSBiYXNlZCkKLSAgICAgICAgLy8gICAzKSBBdHRyaWJ1dGUgbmFtZXMKLSAgICAgICAgLy8gICA0KSBUaGUgYXR0cmlidXRlIHZhbHVlcyAocW5hbWUgYmFzZWQpCi0gICAgICAgIC8vCi0KLSAgICAgICAgLy8gMSkgVGhlIGVsZW1lbnQgbmFtZSAobm90IGZvciBzdGFydHMpCi0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIGVuc3VyZU1hcHBpbmcoIG5hbWVVcmksIG51bGwsICFlbnN1cmVEZWZhdWx0RW1wdHksIGZhbHNlICk7Ci0KLSAgICAgICAgYXNzZXJ0IG5vVGV4dCgpOwotCi0gICAgICAgIGlmIChjLmlzSW52YWxpZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyAyKSBUaGUgZWxlbWVudCB2YWx1ZQotICAgICAgICAgICAgX3RleHQgPSBfc2IuYXBwZW5kKCBjLnBlZWtUeXBlKCkuYnVpbGRfdGV4dCggdGhpcyApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBfYXR0cnMuY2xlYXIoKTsKLSAgICAgICAgX2F0dHJOYW1lcy5jbGVhcigpOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKF93YW50RHVwQXR0cnMgfHwgIV9hdHRyTmFtZXMuY29udGFpbnMoIHMuZ2V0TmFtZSgpICkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9hdHRyTmFtZXMuYWRkKCBzLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIDMpIEF0dHJpYnV0ZSBuYW1lCi0gICAgICAgICAgICAgICAgZW5zdXJlTWFwcGluZyggcy5nZXRVcmkoKSwgbnVsbCwgZmFsc2UsIHRydWUgKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBpbnZhbGlkVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWUgPSBzLnBlZWtUeXBlKCkuYnVpbGRfdGV4dCggdGhpcyApOyAvLyAjNAotCi0gICAgICAgICAgICAgICAgX2F0dHJzLnB1dCggcywgaW52YWxpZFZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbWl0Q29udGFpbmVyIGhhbmRsZXMgdGV4dCBvbmx5IGZvciBsZWF2ZXMgYW5kIHN0YXJ0cwotCi0gICAgICAgIGlmIChfcHJldHR5UHJpbnQgJiYgKGMuaXNEb2MoKSB8fCBjLmlzTGVhZigpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgX3RleHQgPSBfc2IsCi0gICAgICAgICAgICAgICAgICAgIHIuZ2V0Q3AoIGMgKSwKLSAgICAgICAgICAgICAgICAgICAgYy5pc0xlYWYoKSA/IGMuZ2V0Q2NoVmFsdWUoKSA6IGMuZ2V0Q2NoKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJpbSggX3RleHQgKTsKLQotICAgICAgICAgICAgaWYgKGMuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcGFjZXMoIF90ZXh0LCAwLCBfcHJldHR5T2Zmc2V0ICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiBfcHJldHR5T2Zmc2V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9wcmV0dHlJbmRlbnQgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQuaW5zZXJ0KCAwLCBfbmV3TGluZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgMSwgX3ByZXR0eU9mZnNldCApOwotICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQuYXBwZW5kKCBfbmV3TGluZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgX3RleHQubGVuZ3RoKCksIF9wcmV0dHlPZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlcml2ZWQgc2F2ZXJzIG1heSB3YW50IHRvIHRlc3QgdGhlIHN0dWZmIGJlaW5nIHN0b3JlZCB0bwotICAgICAgICAvLyBzZWUgaWYgaXMgd2VsbCBmb3JtZWQgb3Igbm90IGluIG9yZGVyIHRvIHNhdmUgb3V0IGEKLSAgICAgICAgLy8gZnJhZ21lbnQuICBEbyB0aGlzIGhlcmUgd2hlbiBlbWl0dGluZyB0aGUgZmlyc3QgY29udGFpbmVyIGlmCi0gICAgICAgIC8vIHRoYXQgY29udGFpbmVyIGlzIHRoZSByb290IChpZiBub3QgdGhlIHJvb3QsIHRoZW4gd2UgYXJlCi0gICAgICAgIC8vIHdlbGwgZm9ybWVkKQotCi0gICAgICAgIGlmIChfd2FudEZyYWdUZXN0ICYmIG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChfdGV4dCAhPSBudWxsICYmICFTcGxheS5pc1doaXRlU3BhY2UoIF90ZXh0ICkpIHx8Ci0gICAgICAgICAgICAgICAgICAhYy5pc0FmdGVyV2hpdGVTcGFjZSggZ2V0Um9vdCgpICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICFjLmlzTGVhZigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGxlYWYgYW55d2F5cyAtLSBzb21ldGltZXMgaXQgaGFwcGVucyEKLSAgICAgICAgICAgICAgICBpZiAoYy5pc0xlYWYoKSB8fCBzLmlzQXR0cigpIHx8IGhhc01hcHBpbmdzKCkpCi0gICAgICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2F3QmVnaW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgY0VuZCA9IGMuZ2V0RmluaXNoU3BsYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IHMgIT0gY0VuZCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdCZWdpbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXdCZWdpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLmlzQWZ0ZXJXaGl0ZVNwYWNlKCBnZXRSb290KCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghc2F3QmVnaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBJIGFtIGRvaW5nIGFnZ3Jlc3NpdmUgbmFtZXNwYWNlcyBhbmQgd2UncmUgZW1pdHRpbmcgYQotICAgICAgICAvLyBjb250YWluZXIgd2hpY2ggY2FuIGNvbnRhaW4gY29udGVudCwgYWRkIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgIC8vIHdlJ3ZlIGNvbXB1dGVkLiAgQmFzaWNhbGx5LCBJJ20gbWFraW5nIHN1cmUgdGhlIHByZS1jb21wdXRlZAotICAgICAgICAvLyBuYW1lc3BhY2VzIGFyZSBtYXBwZWQgb24gdGhlIGZpcnN0IGNvbnRhaW5lciB3aGljaCBoYXMgYSBuYW1lLgotCi0gICAgICAgIGlmIChfcHJlQ29tcHV0ZWROYW1lc3BhY2VzICE9IG51bGwgJiYgKG5hbWUgIT0gbnVsbCB8fCBfbmVlZHNGcmFnKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9wcmVDb21wdXRlZE5hbWVzcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBlbnN1cmVNYXBwaW5nKAotICAgICAgICAgICAgICAgICAgICB1cmksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIF9wcmVDb21wdXRlZE5hbWVzcGFjZXMuZ2V0KCB1cmkgKSAhPSBudWxsICYmICFlbnN1cmVEZWZhdWx0RW1wdHksIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHNvIHdlIGRvIHRoaXMgb25jZSBhdCB0aGUgdG9wCi0gICAgICAgICAgICBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfd2FudEZyYWdUZXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZWUgaWYgSSBuZWVkIHRvIGdlbiBhIGZyYWdtZW50IGZvciB0aGUgZG9jdW1lbnQKLQotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbCB8fCAoYy5pc0RvYygpICYmIF9zeW50aEVsZW0gPT0gbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9uZWVkc0ZyYWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gX2ZyYWdtZW50OwotICAgICAgICAgICAgICAgICAgICBlbnN1cmVGcmFnbWVudE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICBfZG9jRWxlbSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYy5pc0RvYygpKQotICAgICAgICAgICAgICAgIF9kb2NFbGVtID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXRDb250YWluZXIoIGMsIG5hbWUgKTsKLQotICAgICAgICBjbGVhclRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0VuZCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgQ29udGFpbmVyIGMgPSBzLmdldENvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgbmFtZSA9Ci0gICAgICAgICAgICBfc3ludGhFbGVtICE9IG51bGwgJiYgYyA9PSBfdG9wCi0gICAgICAgICAgICAgICAgPyBfc3ludGhFbGVtCi0gICAgICAgICAgICAgICAgOiBjLmlzQmVnaW4oKSA/IGMuZ2V0TmFtZSgpIDogbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChfd2FudEZyYWdUZXN0ICYmIG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpc1Jvb3QgPSBzLmlzUm9vdCgpOwotCi0gICAgICAgICAgICBpZiAoIWlzUm9vdCB8fCBfZG9jRWxlbSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSAKLSAgICAgICAgICAgICAgICAgICAgaXNSb290Ci0gICAgICAgICAgICAgICAgICAgICAgICA/IF9kb2NFbGVtCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChzLmlzRW5kKCkgPyBzLmdldENvbnRhaW5lcigpIDogcyApLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVtaXRFbmQoIF9zcGxheSwgbmFtZSApOwotCi0gICAgICAgIGFzc2VydCAhX3Bvc3RQb3A7Ci0KLSAgICAgICAgX3Bvc3RQb3AgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwdXNoRnJhZ21lbnRNYXBwaW5ncyAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgLy8gbWFzayB0aGUgaW5pdGlhbCBmcmFtZSB0byBoaWRlIGRlZmF1bHQgbWFwcGluZ3MKLSAgICAgICAgCi0gICAgICAgIHB1c2hNYXBwaW5ncygKLSAgICAgICAgICAgIHMgPT0gbnVsbCA/IG51bGwgOiBzLmdldENvbnRhaW5lcigpLAotICAgICAgICAgICAgX2ZyYWdtZW50LmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGVuc3VyZUZyYWdtZW50TmFtZXNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgewotICAgICAgICAvLyBTYXZpbmcgYSBkZWZhdWx0IHhtbG5zIG1hcHBpbmcgaXMgZGFuZ2Vyb3VzLCBqdXN0IHNwaXQgb3V0IGVtcHR5Ci0gICAgICAgIC8vIHRleHQKLSAgICAgICAgCi0gICAgICAgIGlmIChzLmdldExvY2FsKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIG51bGwgKTsKLSAgICAgICAgICAgIF90ZXh0ID0gX3NiOwotICAgICAgICAgICAgZW1pdFRleHRGcmFnbWVudCggcywgMCwgMCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIG51bGwgKTsKLSAgICAgICAgICAgIGVuc3VyZU1hcHBpbmcoIHMuZ2V0VXJpKCksIHMuZ2V0TG9jYWwoKSwgZmFsc2UsIHRydWUgKTsKLSAgICAgICAgICAgIGVtaXRYbWxuc0ZyYWdtZW50KCBzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc0NvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIG51bGwgKTsKLSAgICAgICAgZW1pdENvbW1lbnRGcmFnbWVudCggcyApOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzUHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIG51bGwgKTsKLSAgICAgICAgZW1pdFByb2NpbnN0RnJhZ21lbnQoIHMgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIGEgc2luZ2xlIGF0dHIgaXMgYmVpbmcgc2F2ZWQuICBJdCBpcyBub3QgY2FsbGVkCi0gICAgICogYXMgYSBjb25zZXF1ZW5jZSBvZiBzYXZpbmcgb3V0IGEgY29udGFpbmVyLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBzICk7Ci0KLSAgICAgICAgZW5zdXJlTWFwcGluZyggcy5nZXRVcmkoKSwgbnVsbCwgZmFsc2UsIHRydWUgKTsKLQotICAgICAgICBhc3NlcnQgbm9UZXh0KCk7Ci0KLSAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBwYXNzIFN0cmluZ0J1ZmZlciB0byBidWlsZFRleHQgdG8gc2F2ZSBvYmplY3QgY3JlYXRpb24KLSAgICAgICAgICAgIF90ZXh0ID0gX3NiLmFwcGVuZCggcy5wZWVrVHlwZSgpLmJ1aWxkX3RleHQoIHRoaXMgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdEF0dHJGcmFnbWVudCggcyApOwotCi0gICAgICAgIGNsZWFyVGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiBhIHNpbmdsZSBjaHVuayBvZiB0ZXh0IGlzIHRvIGJlIHNhdmVkLgotICAgICAqIEl0IGlzIG5vdCBjYWxsZWQgYXMgYSBjb25zZXF1ZW5jZSBvZiBzYXZpbmcgb3V0IGEgY29udGFpbmVyLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgewotICAgICAgICAvLyBPbmx5IG5lZWQgdG8gc2F2ZSBhbmNlc3RvciBuYW1lc3BhY2UgbWFwcGluZ3MgaWYgdGhlcmUgY291bGQgYmUgYQotICAgICAgICAvLyBxbmFtZSBoZXJlLiAgSWYgdGhlIHRleHQgaXMgb2YgbGVuZ3RoIDAsIHRoZW4gdGhlcmUgaXMgbm8gcW5hbWUuCi0KLSAgICAgICAgU3BsYXkgYyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoKF90ZXh0ICE9IG51bGwgJiYgX3RleHQubGVuZ3RoKCkgPiAwKSB8fCAocyAhPSBudWxsICYmIGNjaCA+IDApKQotICAgICAgICAgICAgYyA9IHMuZ2V0Q29udGFpbmVyKCBwICk7Ci0gICAgICAgIAotICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggYyApOwotCi0gICAgICAgIGVtaXRUZXh0RnJhZ21lbnQoIHMsIHAsIGNjaCApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gTGF5b3V0IG9mIG5hbWVzcGFjZSBzdGFjazoKLSAgICAvLwotICAgIC8vICAgIFVSSSBVbmRvCi0gICAgLy8gICAgVVJJIFJlbmFtZQotICAgIC8vICAgIFByZWZpeCBVbmRvCi0gICAgLy8gICAgTWFwcGluZwotICAgIC8vCi0KLSAgICBib29sZWFuIGhhc01hcHBpbmdzICggKQotICAgIHsKLSAgICAgICAgaW50IGkgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpOwotCi0gICAgICAgIHJldHVybiBpID4gMCAmJiBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMSApICE9IG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBpdGVyYXRlTWFwcGluZ3MgKCApCi0gICAgewotICAgICAgICBfY3VycmVudE1hcHBpbmcgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpOwotCi0gICAgICAgIHdoaWxlICggX2N1cnJlbnRNYXBwaW5nID4gMCAmJgotICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nIC0gMSApICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY3VycmVudE1hcHBpbmcgLT0gODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaGFzTWFwcGluZyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY3VycmVudE1hcHBpbmcgPCBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpOwotICAgIH0KLQotICAgIHZvaWQgbmV4dE1hcHBpbmcgKCApCi0gICAgewotICAgICAgICBfY3VycmVudE1hcHBpbmcgKz0gODsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbWFwcGluZ1ByZWZpeCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBoYXNNYXBwaW5nKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBfY3VycmVudE1hcHBpbmcgKyA2ICk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG1hcHBpbmdVcmkgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaGFzTWFwcGluZygpOwotICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nICsgNyApOwotICAgIH0KLQotICAgIFN0cmluZyBtYXBwaW5nUHJldlByZWZpeFVyaSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBoYXNNYXBwaW5nKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBfY3VycmVudE1hcHBpbmcgKyA1ICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHVzaE1hcHBpbmdzICggQ29udGFpbmVyIGMsIGJvb2xlYW4gZW5zdXJlRGVmYXVsdEVtcHR5ICkKLSAgICB7Ci0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIG51bGwgKTsKLQotICAgICAgICBmb3IgKCA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlczoKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxucyB4ID0gKFhtbG5zKSBzOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0geC5nZXRMb2NhbCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0geC5nZXRVcmkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlRGVmYXVsdEVtcHR5ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4Lmxlbmd0aCgpID09IDAgJiYgdXJpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBub3QgYWxyZWFkeSBtYXBwZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBmcmFtZQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGluZ1ByZWZpeCgpLmVxdWFscyggcHJlZml4ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgbmFtZXNwYWNlczsKLQotICAgICAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKCBwcmVmaXgsIHVyaSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHVzaCBhbGwgYW5jZXN0b3JzIHRoZSBmaXJzdCB0aW1lCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghX2ZpcnN0UHVzaCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbnN1cmVEZWZhdWx0RW1wdHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VXJpID0gKFN0cmluZykgX3ByZWZpeE1hcC5nZXQoICIiICk7Ci0KLSAgICAgICAgICAgIC8vIEkgbWFwIHRoZSBkZWZhdWx0IHRvICIiIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgICAgICAgICAgYXNzZXJ0IGRlZmF1bHRVcmkgIT0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGRlZmF1bHRVcmkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoICIiLCAiIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgX2ZpcnN0UHVzaCA9IGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBkdW1wTWFwcGluZ3MgKCApCi0gICAgewotICAgICAgICBmb3IgKCBpbnQgaSA9IF9uYW1lc3BhY2VTdGFjay5zaXplKCkgOyBpID4gMCA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICItLS0tLS0tLS0tLS0tLS0tIiApOwotICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIk1hcHBpbmc6ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAyICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICIgLT4gIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICJQcmVmaXggVW5kbzogIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDQgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIiAtPiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMyApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIlVyaSBSZW5hbWU6ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA1ICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICIgLT4gIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDYgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICJVcmlVbmRvOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNyApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiIC0+ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA4ICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotICAgICAgICAgICAgaSAtPSA4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOwotCi0gICAgICAgIC8vIElmIHRoZSBwcmVmaXggYmVpbmcgbWFwcGVkIGhlcmUgaXMgYWxyZWFkeSBtYXBwZWQgdG8gYSB1cmksCi0gICAgICAgIC8vIHRoYXQgdXJpIHdpbGwgZWl0aGVyIGdvIG91dCBvZiBzY29wZSBvciBiZSBtYXBwZWQgdG8gYW5vdGhlcgotICAgICAgICAvLyBwcmVmaXguCi0KLSAgICAgICAgU3RyaW5nIHJlbmFtZVVyaSA9IChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCBwcmVmaXggKTsKLSAgICAgICAgU3RyaW5nIHJlbmFtZVByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHJlbmFtZVVyaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZWUgaWYgdGhpcyBwcmVmaXggaXMgYWxyZWFkeSBtYXBwZWQgdG8gdGhpcyB1cmkuICBJZgotICAgICAgICAgICAgLy8gc28sIHRoZW4gYWRkIHRvIHRoZSBzdGFjaywgYnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVuYW1lCi0gICAgICAgIAotICAgICAgICAgICAgaWYgKHJlbmFtZVVyaS5lcXVhbHMoIHVyaSApKQotICAgICAgICAgICAgICAgIHJlbmFtZVVyaSA9IG51bGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBpID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNyApLmVxdWFscyggcmVuYW1lVXJpICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByZWZpeCA9IChTdHJpbmcpIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA4ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVQcmVmaXggPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJlbmFtZVByZWZpeC5lcXVhbHMoIHByZWZpeCApKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSAtPSA4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydCBpID4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIF91cmlNYXAuZ2V0KCB1cmkgKSApOwotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCB1cmkgKTsKLQotICAgICAgICBpZiAocmVuYW1lVXJpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIF91cmlNYXAuZ2V0KCByZW5hbWVVcmkgKSApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggcmVuYW1lVXJpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBudWxsICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBwcmVmaXggKTsKLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggX3ByZWZpeE1hcC5nZXQoIHByZWZpeCApICk7Ci0KLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggcHJlZml4ICk7Ci0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHVyaSApOwotCi0gICAgICAgIF91cmlNYXAucHV0KCB1cmksIHByZWZpeCApOwotICAgICAgICBfcHJlZml4TWFwLnB1dCggcHJlZml4LCB1cmkgKTsKLQotICAgICAgICBpZiAocmVuYW1lVXJpICE9IG51bGwpCi0gICAgICAgICAgICBfdXJpTWFwLnB1dCggcmVuYW1lVXJpLCByZW5hbWVQcmVmaXggKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcG9wTWFwcGluZ3MgKCApCi0gICAgewotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaSA9IF9uYW1lc3BhY2VTdGFjay5zaXplKCk7Ci0KLSAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMSApID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDEgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IG9sZFVyaSA9IF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA3ICk7IAotICAgICAgICAgICAgT2JqZWN0IG9sZFByZWZpeCA9IF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA4ICk7IAotCi0gICAgICAgICAgICBpZiAob2xkUHJlZml4ID09IG51bGwpIAotICAgICAgICAgICAgICAgIF91cmlNYXAucmVtb3ZlKCBvbGRVcmkgKTsgCi0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIF91cmlNYXAucHV0KCBvbGRVcmksIG9sZFByZWZpeCApOyAKLQotICAgICAgICAgICAgb2xkUHJlZml4ID0gX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDQgKTsgCi0gICAgICAgICAgICBvbGRVcmkgPSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMyApOyAKLQotICAgICAgICAgICAgaWYgKG9sZFVyaSA9PSBudWxsKSAKLSAgICAgICAgICAgICAgICBfcHJlZml4TWFwLnJlbW92ZSggb2xkUHJlZml4ICk7IAotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBfcHJlZml4TWFwLnB1dCggb2xkUHJlZml4LCBvbGRVcmkgKTsgCi0KLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNSApOwotCi0gICAgICAgICAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX3VyaU1hcC5wdXQoIHVyaSwgX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDYgKSApOwotCi0gICAgICAgICAgICAvLyBIYWhhaGFoYWhhaGEgLS0gOi0oCi0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gMSApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDIgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSAzICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gNCApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDUgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA2ICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gNyApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDggKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VXJpTWFwcGluZyAoIFN0cmluZyB1cmkgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF91cmlNYXAuZ2V0KCB1cmkgKSAhPSBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZykgX3VyaU1hcC5nZXQoIHVyaSApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRyeVByZWZpeCAoIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsIHx8IFNwbGF5LmJlZ2luc1dpdGhYbWwoIHByZWZpeCApKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBleGlzdGluZ1VyaSA9IChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCBwcmVmaXggKTsKLQotICAgICAgICAvLyBJZiB0aGUgcHJlZml4IGlzIGN1cnJlbnRseSBtYXBwZWQsIHRoZW4gdHJ5IGFub3RoZXIgcHJlZml4LiAgQQotICAgICAgICAvLyBzcGVjaWFsIGNhc2UgaXMgdGhhdCBvZiB0cnlpbmcgdG8gbWFwIHRoZSBkZWZhdWx0IHByZWZpeCAoIiIpLgotICAgICAgICAvLyBIZXJlLCB0aGVyZSBhbHdheXMgZXhpc3RzIGEgZGVmYXVsdCBtYXBwaW5nLiAgSWYgdGhpcyBpcyB0aGUKLSAgICAgICAgLy8gbWFwcGluZyB3ZSBmb3VuZCwgdGhlbiByZW1hcCBpdCBhbnl3YXlzLiBJIHVzZSAhPSB0byBjb21wYXJlCi0gICAgICAgIC8vIHN0cmluZ3MgYmVjYXVzZSBJIHdhbnQgdG8gdGVzdCBmb3IgdGhlIHNwZWNpZmljIGluaXRpYWwgZGVmYXVsdAotICAgICAgICAvLyB1cmkgSSBhZGRlZCB3aGVuIEkgaW5pdGlhbGl6ZWQgdGhlIHNhdmVyLgotCi0gICAgICAgIGlmIChleGlzdGluZ1VyaSAhPSBudWxsICYmCi0gICAgICAgICAgICAgIChwcmVmaXgubGVuZ3RoKCkgPiAwIHx8IGV4aXN0aW5nVXJpICE9IF9pbml0aWFsRGVmYXVsdFVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZW5zdXJlTWFwcGluZyAoCi0gICAgICAgIFN0cmluZyB1cmksIFN0cmluZyBjYW5kaWRhdGVQcmVmaXgsCi0gICAgICAgIGJvb2xlYW4gY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQsIGJvb2xlYW4gbXVzdEhhdmVQcmVmaXggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgY2FuZGlkYXRlUHJlZml4ID09IG51bGwgfHwgY2FuZGlkYXRlUHJlZml4Lmxlbmd0aCgpID4gMDsKLQotICAgICAgICAvLyBDYW4gYmUgY2FsbGVkIGZvciBuby1uYW1lc3BhY2VkIHRoaW5ncwotCi0gICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBfdXJpTWFwLmdldCggdXJpICk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIChwcmVmaXgubGVuZ3RoKCkgPiAwIHx8ICFtdXN0SGF2ZVByZWZpeCkpCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEkgdHJ5IHByZWZpeGVzIGZyb20gYSBudW1iZXIgb2YgcGxhY2VzLCBpbiBvcmRlcjoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gIDEpIFdoYXQgd2FzIHBhc3NlZCBpbgotICAgICAgICAvLyAgMikgVGhlIG9wdGlvbmFsIHN1Z2dlc3Rpb25zIChmb3IgdXJpJ3MpCi0gICAgICAgIC8vICAzKSBUaGUgZGVmYXVsdCBtYXBwaW5nIGlzIGFsbG93ZWQKLSAgICAgICAgLy8gIDQpIG5zIysrCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICBpZiAoY2FuZGlkYXRlUHJlZml4ID09IG51bGwgfHwgIXRyeVByZWZpeCggY2FuZGlkYXRlUHJlZml4ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3VnZ2VzdGVkUHJlZml4ZXMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBfc3VnZ2VzdGVkUHJlZml4ZXMuY29udGFpbnNLZXkoIHVyaSApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnlQcmVmaXgoIChTdHJpbmcpIF9zdWdnZXN0ZWRQcmVmaXhlcy5nZXQoIHVyaSApICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlUHJlZml4ID0gKFN0cmluZykgX3N1Z2dlc3RlZFByZWZpeGVzLmdldCggdXJpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjb25zaWRlckNyZWF0aW5nRGVmYXVsdCAmJiBfdXNlRGVmYXVsdE5hbWVzcGFjZSAmJiB0cnlQcmVmaXgoICIiICkpCi0gICAgICAgICAgICAgICAgY2FuZGlkYXRlUHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VQcmVmaXggPSBRTmFtZUhlbHBlci5zdWdnZXN0UHJlZml4KCB1cmkgKTsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVQcmVmaXggPSBiYXNlUHJlZml4OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMSA7IDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cnlQcmVmaXgoIGNhbmRpZGF0ZVByZWZpeCApKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVQcmVmaXggPSBiYXNlUHJlZml4ICsgaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgY2FuZGlkYXRlUHJlZml4ICE9IG51bGw7Ci0KLSAgICAgICAgc3ludGhldGljTmFtZXNwYWNlKCBjYW5kaWRhdGVQcmVmaXgsIHVyaSwgY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgKTsKLQotICAgICAgICBhZGRNYXBwaW5nKCBjYW5kaWRhdGVQcmVmaXgsIHVyaSApOwotCi0gICAgICAgIHJldHVybiBjYW5kaWRhdGVQcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkgKCBTdHJpbmcgdXJpLCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHByZWZpeCA9PSBudWxsIHx8IHByZWZpeC5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBlbXB0eVVyaSA9IHVyaS5sZW5ndGgoKSA9PSAwOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGVuc3VyZU1hcHBpbmcoIHVyaSwgcHJlZml4LCBlbXB0eVVyaSwgIWVtcHR5VXJpICk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCAieG1sIiApKQotICAgICAgICAgICAgcmV0dXJuIFNwbGF5Ll94bWwxOTk4VXJpOwotCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBlbnN1cmVGcmFnbWVudE5hbWVzcGFjZSAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfZnJhZ21lbnQuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBlbnN1cmVNYXBwaW5nKCBfZnJhZ21lbnQuZ2V0TmFtZXNwYWNlVVJJKCksICJmcmFnIiwgZmFsc2UsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBTYXZlciB3aGljaCByZWNvcmRzIHN5bnRoZXRpYyBuYW1lc3BhY2VzCi0gICAgICovCi0gICAgCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFN5bnRoTmFtZXNwYWNlU2F2ZXIgZXh0ZW5kcyBTYXZlcgotICAgIHsKLSAgICAgICAgTGlua2VkSGFzaE1hcCBfc3ludGhOYW1lc3BhY2VzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIFN5bnRoTmFtZXNwYWNlU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzeW50aGV0aWNOYW1lc3BhY2UgKAotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgYm9vbGVhbiBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zeW50aE5hbWVzcGFjZXMucHV0KCB1cmksIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ID8gInVzZURlZmF1bHQiIDogbnVsbCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkgeyB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKSB7IH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFNhdmVyIHdoaWNoIGdlbmVyYXRlcyBjaGFyYWN0ZXJzLgotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRTYXZlciBleHRlbmRzIFNhdmVyCi0gICAgewotICAgICAgICBUZXh0U2F2ZXIgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgZW5jb2RpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBfd2FudEZyYWdUZXN0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSByLl9wcm9wcy5nZXRWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gIjEuMCI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZW1pdCggIjw/eG1sIHZlcnNpb249XCIiICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggdmVyc2lvbiApOwotICAgICAgICAgICAgICAgIGVtaXQoICJcIiBlbmNvZGluZz1cIiIgKyBlbmNvZGluZyArICJcIj8+IiArIF9uZXdMaW5lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYy5pc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggYywgbmFtZSwgbnVsbCwgbnVsbCwgZmFsc2UgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNjaCA9IF90ZXh0ID09IG51bGwgPyBjLmdldENjaFZhbHVlKCkgOiBfdGV4dC5sZW5ndGgoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggJz4nICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggYyApLCBjY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCBfdGV4dCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGl6ZUNvbnRlbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggIjwvIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdE5hbWUoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCAnLycgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFjLmlzTGVhZigpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjLmdldENjaEFmdGVyKCkgPT0gMCAmJiBjLm5leHROb25BdHRyU3BsYXkoKS5pc0VuZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCAnLycgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9za2lwQ29udGFpbmVyRmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVtaXQoICc+JyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzRG9jKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBjLCBuYW1lLCBudWxsLCBudWxsLCB0cnVlICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBjICksIGMuZ2V0Q2NoKCkgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIF90ZXh0ICk7Ci0KLSAgICAgICAgICAgICAgICBlbnRpdGl6ZUNvbnRlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0QXR0ckhlbHBlciAoIFNwbGF5IHMsIFN0cmluZyBpbnZhbGlkVmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdCggJyAnICk7Ci0gICAgICAgICAgICBlbWl0TmFtZSggcy5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIGVtaXQoICI9XCIiICk7Ci0KLSAgICAgICAgICAgIGlmIChpbnZhbGlkVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbWl0KCBpbnZhbGlkVmFsdWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIHMgKSwgcy5nZXRDY2goKSApOwotCi0gICAgICAgICAgICBlbnRpdGl6ZUF0dHJWYWx1ZSgpOwotCi0gICAgICAgICAgICBlbWl0KCAnIicgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0TmFtZXNwYWNlc0hlbHBlciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAnICcgKTsKLSAgICAgICAgICAgICAgICBlbWl0WG1sbnMoIG1hcHBpbmdQcmVmaXgoKSwgbWFwcGluZ1VyaSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDb250YWluZXJIZWxwZXIgKAotICAgICAgICAgICAgQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUsCi0gICAgICAgICAgICBTcGxheSBleHRyYUF0dHIsIFN0cmluZ0J1ZmZlciBleHRyYUF0dHJUZXh0LAotICAgICAgICAgICAgYm9vbGVhbiBjbG9zZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGVtaXQoICc8JyApOwotICAgICAgICAgICAgZW1pdE5hbWUoIG5hbWUgKTsKLQotICAgICAgICAgICAgaWYgKF9zYXZlTmFtZXNwYWNlc0ZpcnN0KQotICAgICAgICAgICAgICAgIGVtaXROYW1lc3BhY2VzSGVscGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gKFNwbGF5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEF0dHJIZWxwZXIoIHMsIChTdHJpbmcpIF9hdHRycy5nZXQoIHMgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4dHJhQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRBdHRySGVscGVyKAotICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHIsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0clRleHQgPT0gbnVsbCA/IG51bGwgOiBleHRyYUF0dHJUZXh0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFfc2F2ZU5hbWVzcGFjZXNGaXJzdCkKLSAgICAgICAgICAgICAgICBlbWl0TmFtZXNwYWNlc0hlbHBlcigpOwotCi0gICAgICAgICAgICBpZiAoY2xvc2UpCi0gICAgICAgICAgICAgICAgZW1pdCggJz4nICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCggcy5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBwICksIGNjaCApOwotICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKLSAgICAgICAgICAgICAgICBlbnRpdGl6ZUNvbnRlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCwgZmFsc2UgKTsKLQotICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoICI+IiApOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCBfdGV4dCApOwotICAgICAgICAgICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoICI+IiApOwotICAgICAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFbmRIZWxwZXIoIF9mcmFnbWVudCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0KCAiLz4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgcywgX3RleHQsIGZhbHNlICk7Ci0gICAgICAgICAgICBlbWl0KCAiLz4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwsIGZhbHNlICk7Ci0gICAgICAgICAgICBlbWl0KCAiLz4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCwgdHJ1ZSApOwotICAgICAgICAgICAgZW1pdENvbW1lbnQoIHMgKTsKLSAgICAgICAgICAgIGVtaXRFbmRIZWxwZXIoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsLCB0cnVlICk7Ci0gICAgICAgICAgICBlbWl0UHJvY2luc3QoIHMgKTsKLSAgICAgICAgICAgIGVtaXRFbmRIZWxwZXIoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLQotICAgICAgICAgICAgZW1pdCggInhtbG5zIiApOwotCi0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAiOiIgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCBwcmVmaXggKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1pdCggIj1cIiIgKTsKLQotICAgICAgICAgICAgLy8gVE9ETyAtIG11c3QgZW5jb2RlIHVyaSBwcm9wZXJseQotCi0gICAgICAgICAgICBlbWl0KCB1cmkgKTsKLSAgICAgICAgICAgIGVudGl0aXplQXR0clZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGVtaXQoICciJyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZEhlbHBlciAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCAiPC8iICk7Ci0gICAgICAgICAgICBlbWl0TmFtZSggbmFtZSApOwotICAgICAgICAgICAgZW1pdCggJz4nICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZW1pdEVuZEhlbHBlciggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRMaXRlcmFsICggU3RyaW5nIGxpdGVyYWwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGl0ZXJhbC5pbmRleE9mKCAiXCIiICkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCBsaXRlcmFsICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggIlwiIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICInIiApOwotICAgICAgICAgICAgICAgIGVtaXQoIGxpdGVyYWwgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCAiJyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAotICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBkb2N0eXBlTmFtZSAhPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0KCAiPCFET0NUWVBFICIgKTsKLSAgICAgICAgICAgIGVtaXQoIGRvY3R5cGVOYW1lICk7Ci0KLSAgICAgICAgICAgIGlmIChwdWJsaWNJRCA9PSBudWxsICYmIHN5c3RlbUlEICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggIiBTWVNURU0gIiApOwotICAgICAgICAgICAgICAgIGVtaXRMaXRlcmFsKCBzeXN0ZW1JRCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocHVibGljSUQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAiIFBVQkxJQyAiICk7Ci0gICAgICAgICAgICAgICAgZW1pdExpdGVyYWwoIHB1YmxpY0lEICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggIiAiICk7Ci0gICAgICAgICAgICAgICAgZW1pdExpdGVyYWwoIHN5c3RlbUlEICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtaXQoICI+IiArIF9uZXdMaW5lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzQ29tbWVudCgpOwotICAgICAgICAgICAgZW1pdCggIjwhLS0iICk7Ci0gICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIHMgKSwgcy5nZXRDY2hWYWx1ZSgpICk7Ci0gICAgICAgICAgICBlbnRpdGl6ZUNvbW1lbnQoKTsKLSAgICAgICAgICAgIGVtaXQoICItLT4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMuaXNQcm9jaW5zdCgpOwotICAgICAgICAgICAgZW1pdCggIjw/IiApOwotICAgICAgICAgICAgLy8gVE9ETyAtIGVuY29kaW5nIGlzc3VlcyBoZXJlPwotICAgICAgICAgICAgZW1pdCggcy5nZXRMb2NhbCgpICk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldENjaFZhbHVlKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICIgIiApOwotICAgICAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggcyApLCBzLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICBlbnRpdGl6ZVByb2NpbnN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtaXQoICI/PiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFbnN1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgY2NoIGNoYXJzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLgotICAgICAgICAgKiBSZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUuICBJZiBsZXNzIHRoYW4gY2NoLAotICAgICAgICAgKiB0aGVuIHRoYXQncyBhbGwgd2hpY2ggd2lsbCBldmVyIGJlY29tZSBhdmFpbGFibGUuCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgaW50IGVuc3VyZSAoIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBFdmVuIGlmIHdlJ3JlIGFza2VkIHRvIGVuc3VyZSBub3RoaW5nLCBzdGlsbCB0cnkgdG8gZW5zdXJlCi0gICAgICAgICAgICAvLyBhdGxlYXN0IG9uZSBjaGFyYWN0ZXIgc28gd2UgY2FuIGRldGVybWluZSBpZiB3ZSdyZSBhdCB0aGUKLSAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBpZiAoY2NoIDw9IDApCi0gICAgICAgICAgICAgICAgY2NoID0gMTsKLQotICAgICAgICAgICAgaW50IGF2YWlsYWJsZSA9IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICBmb3IgKCA7IGF2YWlsYWJsZSA8IGNjaCA7IGF2YWlsYWJsZSA9IGdldEF2YWlsYWJsZSgpICkKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3MoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGFzc2VydCBhdmFpbGFibGUgPT0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0TmFtZSAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgICAgICBTdHJpbmcgdXJpID0gbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotCi0gICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFVyaU1hcHBpbmcoIHVyaSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCBwcmVmaXggKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggIjoiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnQgbmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgICAgIGVtaXQoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcmVFbWl0ICggaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPj0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2xhc3RFbWl0Q2NoID0gY2NoOwotCi0gICAgICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChfZnJlZSA8IGNjaCkKLSAgICAgICAgICAgICAgICByZXNpemUoIGNjaCwgLTEgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IGNjaCA8PSBfZnJlZTsKLQotICAgICAgICAgICAgaW50IHVzZWQgPSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGFib3V0IHRvIGVtaXQgYW5kIHRoZXJlIGlzIG5vdGluZyBpbiB0aGUgYnVmZmVyLCByZXNldAotICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIHNvIGFzIHRvIG5vdCBncm93IGl0IGFueW1vcmUKLSAgICAgICAgICAgIC8vIHRoYW4gbmVlZGVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodXNlZCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfaW4gPT0gX291dDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPT0gX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgX2luID0gX291dCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9sYXN0RW1pdEluID0gX2luOwotCi0gICAgICAgICAgICBfZnJlZSAtPSBjY2g7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaCA9IHMgPT0gbnVsbCA/IDAgOiBzLmxlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAocHJlRW1pdCggY2NoICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgY2h1bms7Ci0KLSAgICAgICAgICAgIGlmIChfaW4gPD0gX291dCB8fCBjY2ggPCAoY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9pbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcy5nZXRDaGFycyggMCwgY2NoLCBfYnVmLCBfaW4gKTsKLSAgICAgICAgICAgICAgICBfaW4gKz0gY2NoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMuZ2V0Q2hhcnMoIDAsIGNodW5rLCBfYnVmLCBfaW4gKTsKLSAgICAgICAgICAgICAgICBzLmdldENoYXJzKCBjaHVuaywgY2NoLCBfYnVmLCAwICk7Ci0gICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNjaCkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggU3RyaW5nQnVmZmVyIHNiICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaCA9IHNiID09IG51bGwgPyAwIDogc2IubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChwcmVFbWl0KCBjY2ggKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBjaHVuazsKLQotICAgICAgICAgICAgaWYgKF9pbiA8PSBfb3V0IHx8IGNjaCA8IChjaHVuayA9IF9idWYubGVuZ3RoIC0gX2luKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5nZXRDaGFycyggMCwgY2NoLCBfYnVmLCBfaW4gKTsKLSAgICAgICAgICAgICAgICBfaW4gKz0gY2NoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmdldENoYXJzKCAwLCBjaHVuaywgX2J1ZiwgX2luICk7Ci0gICAgICAgICAgICAgICAgc2IuZ2V0Q2hhcnMoIGNodW5rLCBjY2gsIF9idWYsIDAgKTsKLSAgICAgICAgICAgICAgICBfaW4gPSAoX2luICsgY2NoKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBpbnQgY3AsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KAotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5fYnVmLAotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKSwKLSAgICAgICAgICAgICAgICBjY2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggY2hhciBjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZUVtaXQoIDEgKTsKLQotICAgICAgICAgICAgX2J1ZlsgX2luIF0gPSBjaDsKLQotICAgICAgICAgICAgX2luID0gKF9pbiArIDEpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID49IDA7Ci0KLSAgICAgICAgICAgIGlmIChwcmVFbWl0KCBjY2ggKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBjaHVuazsKLQotICAgICAgICAgICAgaWYgKF9pbiA8PSBfb3V0IHx8IGNjaCA8IChjaHVuayA9IF9idWYubGVuZ3RoIC0gX2luKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgX2J1ZiwgX2luLCBjY2ggKTsKLSAgICAgICAgICAgICAgICBfaW4gKz0gY2NoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGJ1Ziwgb2ZmLCBfYnVmLCBfaW4sIGNodW5rICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYgKyBjaHVuaywgX2J1ZiwgMCwgY2NoIC0gY2h1bmsgKTsKLSAgICAgICAgICAgICAgICBfaW4gPSAoX2luICsgY2NoKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVudGl0aXplQ29udGVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGkgPSBfbGFzdEVtaXRJbjsKLSAgICAgICAgICAgIGZpbmFsIGludCBuID0gX2J1Zi5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaGFzT3V0T2ZSYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcgfHwgY2ggPT0gJyYnKQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQmFkQ2hhciggY2ggKSkKLSAgICAgICAgICAgICAgICAgICAgaGFzT3V0T2ZSYW5nZSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKytpID09IG4pCi0gICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY291bnQgPT0gMCAmJiAhaGFzT3V0T2ZSYW5nZSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGkgPSBfbGFzdEVtaXRJbjsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhldXJpc3RpYyBmb3Iga25vd2luZyB3aGVuIHRvIHNhdmUgb3V0IHN0dWZmIGFzIGEgQ0RBVEEuCi0gICAgICAgICAgICAvLwotCi0gICAgICAgICAgICBpZiAoX2xhc3RFbWl0Q2NoID4gMzIgJiYgY291bnQgPiA1ICYmCi0gICAgICAgICAgICAgICAgICBjb3VudCAqIDEwMCAvIF9sYXN0RW1pdENjaCA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBsYXN0V2FzQnJhY2tldCA9IF9idWZbIGkgXSA9PSAnXSc7Ci0KLSAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIjwhW0NEQVRBWyIgKyBfYnVmWyBpIF0gKTsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kVG9MYXN0V2FzQnJhY2tldCA9IGxhc3RXYXNCcmFja2V0OwotCi0gICAgICAgICAgICAgICAgbGFzdFdhc0JyYWNrZXQgPSBfYnVmWyBpIF0gPT0gJ10nOwotCi0gICAgICAgICAgICAgICAgaWYgKCsraSA9PSBfYnVmLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc+JyAmJiBzZWNvbmRUb0xhc3RXYXNCcmFja2V0ICYmIGxhc3RXYXNCcmFja2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImZ3Q7IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgICAgICBzZWNvbmRUb0xhc3RXYXNCcmFja2V0ID0gbGFzdFdhc0JyYWNrZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXYXNCcmFja2V0ID0gY2ggPT0gJ10nOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IF9idWYubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZW1pdCggIl1dPiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc8JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmx0OyIgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJyYnKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImYW1wOyIgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNCYWRDaGFyKCBjaCApKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICI/IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gX2J1Zi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW50aXRpemVBdHRyVmFsdWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbGFzdEVtaXRDY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBpID0gX2xhc3RFbWl0SW47Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZsdDsiICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJyYnKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZhbXA7IiApOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICciJykKLSAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImcXVvdDsiICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBfYnVmLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW50aXRpemVDb21tZW50ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xhc3RFbWl0Q2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgaSA9IF9sYXN0RW1pdEluOwotCi0gICAgICAgICAgICBib29sZWFuIGxhc3RXYXNEYXNoID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNCYWRDaGFyKCBjaCApKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJy0nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RXYXNEYXNoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlICItLSIgd2l0aCAiLSAiIHRvIG1ha2Ugd2VsbCBmb3JtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNEYXNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FzRGFzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0Rhc2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpID09IF9idWYubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQmVjYXVzZSBJIGhhdmUgb25seSByZXBsYWNlZCBjaGFycyB3aXRoIHNpbmdsZSBjaGFycywKLSAgICAgICAgICAgIC8vIF9sYXN0RW1pdEluIHdpbGwgc3RpbGwgYmUgb2sKLQotICAgICAgICAgICAgaWYgKF9idWZbIF9sYXN0RW1pdEluICsgX2xhc3RFbWl0Q2NoIC0gMSBdID09ICctJykKLSAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggX2xhc3RFbWl0SW4gKyBfbGFzdEVtaXRDY2ggLSAxLCAiICIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnRpdGl6ZVByb2NpbnN0ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xhc3RFbWl0Q2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgaSA9IF9sYXN0RW1pdEluOwotCi0gICAgICAgICAgICBib29sZWFuIGxhc3RXYXNRdWVzdGlvbiA9IGZhbHNlOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2J1ZlsgaSBdOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQmFkQ2hhciggY2ggKSkKLSAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICI/IiApOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoID09ICc+JykKLSAgICAgICAgICAgICAgICB7Ci0gICAgLy8gVE9ETyAtIEhhZCB0byBjb252ZXJ0IHRvIGEgc3BhY2UgaGVyZSAuLi4gaW1wbGVzIG5vdCB3ZWxsIGZvcm1lZCBYTUwKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RXYXNRdWVzdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiICIgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgICAgIGxhc3RXYXNRdWVzdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYXN0V2FzUXVlc3Rpb24gPSBjaCA9PSAnPyc7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBfYnVmLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUZXN0IGlmIGEgY2hhcmFjdGVyIGlzIHZhbGlkIGluIHhtbCBjaGFyYWN0ZXIgY29udGVudC4gU2VlCi0gICAgICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtQ2hhcgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0JhZENoYXIgKCBjaGFyIGNoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICEgKAotICAgICAgICAgICAgICAgIChjaCA+PSAweDIwICYmIGNoIDw9IDB4RDdGRiApIHx8Ci0gICAgICAgICAgICAgICAgKGNoID49IDB4RTAwMCAmJiBjaCA8PSAweEZGRkQpIHx8Ci0gICAgICAgICAgICAgICAgKGNoID49IDB4MTAwMDAgJiYgY2ggPD0gMHgxMEZGRkYpIHx8Ci0gICAgICAgICAgICAgICAgKGNoID09IDB4OSkgfHwgKGNoID09IDB4QSkgfHwgKGNoID09IDB4RCkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgcmVwbGFjZSAoIGludCBpLCBTdHJpbmcgcmVwbGFjZW1lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwbGFjZW1lbnQubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgICAgICBpbnQgZENjaCA9IHJlcGxhY2VtZW50Lmxlbmd0aCgpIC0gMTsKLQotICAgICAgICAgICAgaWYgKGRDY2ggPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYnVmWyBpIF0gPSByZXBsYWNlbWVudC5jaGFyQXQoIDAgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotCi0gICAgICAgICAgICBpZiAoZENjaCA+IF9mcmVlKQotICAgICAgICAgICAgICAgIGkgPSByZXNpemUoIGRDY2gsIGkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0KLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSBkQ2NoOwotICAgICAgICAgICAgYXNzZXJ0IGdldEF2YWlsYWJsZSgpID4gMDsKLQotICAgICAgICAgICAgaWYgKF9vdXQgPiBfaW4gJiYgaSA+PSBfb3V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIF9idWYsIF9vdXQgLSBkQ2NoLCBpIC0gX291dCApOwotICAgICAgICAgICAgICAgIF9vdXQgLT0gZENjaDsKLSAgICAgICAgICAgICAgICBpIC09IGRDY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGkgPCBfaW47Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgaSwgX2J1ZiwgaSArIGRDY2gsIF9pbiAtIGkgKTsKLSAgICAgICAgICAgICAgICBfaW4gKz0gZENjaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbGFjZW1lbnQuZ2V0Q2hhcnMoIDAsIGRDY2ggKyAxLCBfYnVmLCBpICk7Ci0KLSAgICAgICAgICAgIF9mcmVlIC09IGRDY2g7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotCi0gICAgICAgICAgICByZXR1cm4gaSArIGRDY2ggKyAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEF2YWlsYWJsZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9idWYgPT0gbnVsbCA/IDAgOiBfYnVmLmxlbmd0aCAtIF9mcmVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSBmb3IgY2NoIGNoYXJzIGluIHRoZSBidWZmZXIKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgcmVzaXplICggaW50IGNjaCwgaW50IGkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOwotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IF9mcmVlOwotCi0gICAgICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gX2luaXRpYWxCdWZTaXplIDogX2J1Zi5sZW5ndGggKiAyOwotICAgICAgICAgICAgaW50IHVzZWQgPSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBuZXdMZW4gLSB1c2VkIDwgY2NoICkKLSAgICAgICAgICAgICAgICBuZXdMZW4gKj0gMjsKLQotICAgICAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbmV3TGVuIF07Ci0KLSAgICAgICAgICAgIGlmICh1c2VkID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2luID4gX291dCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpID09IC0xIHx8IChpID49IF9vdXQgJiYgaSA8IF9pbik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIG5ld0J1ZiwgMCwgdXNlZCApOwotICAgICAgICAgICAgICAgICAgICBpIC09IF9vdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpID09IC0xIHx8IChpID49IF9vdXQgfHwgaSA8IF9pbik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIG5ld0J1ZiwgMCwgdXNlZCAtIF9pbiApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCAwLCBuZXdCdWYsIHVzZWQgLSBfaW4sIF9pbiApOwotICAgICAgICAgICAgICAgICAgICBpID0gaSA+PSBfb3V0ID8gaSAtIF9vdXQgOiBpICsgX291dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX291dCA9IDA7Ci0gICAgICAgICAgICAgICAgX2luID0gdXNlZDsKLSAgICAgICAgICAgICAgICBfZnJlZSArPSBuZXdCdWYubGVuZ3RoIC0gX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2luID09IDAgJiYgX291dCA9PSAwOwotICAgICAgICAgICAgICAgIGFzc2VydCBpID09IC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfYnVmID0gbmV3QnVmOwotCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbnN1cmUoIDEgKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgYXNzZXJ0IGdldEF2YWlsYWJsZSgpID4gMDsKLQotICAgICAgICAgICAgaW50IGNoID0gX2J1ZlsgX291dCBdOwotCi0gICAgICAgICAgICBfb3V0ID0gKF9vdXQgKyAxKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgX2ZyZWUrKzsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHN0cmVhbSBldmVuIGlmIHRoZXJlIGlzIG5vIHdheSB0byByZXR1cm4KLSAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgYmVjYXVzZSB0aGUgUmVhZGVyIGRvYyBzYXlzIHRvIHJldHVybiAtMSBhdCBlbmQgb2YKLSAgICAgICAgICAgIC8vIHN0cmVhbS4KLQotICAgICAgICAgICAgaW50IG47Ci0KLSAgICAgICAgICAgIGlmICgobiA9IGVuc3VyZSggbGVuICkpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBpZiAoY2J1ZiA9PSBudWxsIHx8IGxlbiA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICBpZiAobiA8IGxlbikKLSAgICAgICAgICAgICAgICBsZW4gPSBuOwotCi0gICAgICAgICAgICBpZiAoX291dCA8IF9pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBjYnVmLCBvZmYsIGxlbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjaHVuayA9IF9idWYubGVuZ3RoIC0gX291dDsKLQotICAgICAgICAgICAgICAgIGlmIChjaHVuayA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGNidWYsIG9mZiwgbGVuICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgY2J1Ziwgb2ZmLCBjaHVuayApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCAwLCBjYnVmLCBvZmYgKyBjaHVuaywgbGVuIC0gY2h1bmsgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9vdXQgPSAoX291dCArIGxlbikgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgIF9mcmVlICs9IGxlbjsKLQotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHdyaXRlICggV3JpdGVyIHdyaXRlciwgaW50IGNjaE1pbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICggZ2V0QXZhaWxhYmxlKCkgPCBjY2hNaW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2hhcnNBdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgaWYgKGNoYXJzQXZhaWxhYmxlID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHRoZSBjaXJjdWxhciBjYXNlcwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IF9vdXQgPT0gMDsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCBfYnVmLCAwLCBjaGFyc0F2YWlsYWJsZSApOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgX2ZyZWUgKz0gY2hhcnNBdmFpbGFibGU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2luID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNoYXJzQXZhaWxhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEVuc3VyZSBhbGwgdGV4dCBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLgotICAgICAgICAgKi8KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHNhdmVUb1N0cmluZyAoICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gV2UncmUgZ29ubmEgYnVpbGQgYSBzdHJpbmcuICBJbnN0ZWFkIG9mIHVzaW5nIFN0cmluZ0J1ZmZlciwgbWF5Ci0gICAgICAgICAgICAvLyBhcyB3ZWxsIHVzZSBteSBidWZmZXIgaGVyZS4gIEZpbGwgdGhlIHdob2xlIHN1Y2tlciB1cCBhbmQKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFN0cmluZyEKLQotICAgICAgICAgICAgd2hpbGUgKCBwcm9jZXNzKCkgKQotICAgICAgICAgICAgICAgIDsKLQotICAgICAgICAgICAgYXNzZXJ0IF9vdXQgPT0gMDsKLQotICAgICAgICAgICAgaW50IGF2YWlsYWJsZSA9IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlID09IDAgPyAiIiA6IG5ldyBTdHJpbmcoIF9idWYsIF9vdXQsIGF2YWlsYWJsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9pbml0aWFsQnVmU2l6ZSA9IDQwOTY7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgX2xhc3RFbWl0SW47Ci0gICAgICAgIHByaXZhdGUgaW50IF9sYXN0RW1pdENjaDsKLQotICAgICAgICBwcml2YXRlIGludCAgICBfZnJlZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgX2luOwotICAgICAgICBwcml2YXRlIGludCAgICBfb3V0OwotICAgICAgICBwcml2YXRlIGNoYXJbXSBfYnVmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgUmVhZGVyIHdoaWNoIGV4cG9zZXMgdGhlIHRleHQgb2YgYSBwYXJ0IG9mIHRoZSB0cmVlLgotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRSZWFkZXIgZXh0ZW5kcyBSZWFkZXIKLSAgICB7Ci0gICAgICAgIFRleHRSZWFkZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdGV4dFNhdmVyID0gbmV3IFRleHRTYXZlciggciwgcywgcCwgb3B0aW9ucywgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UgKCApIHRocm93cyBJT0V4Y2VwdGlvbiB7IH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSAoICkgdGhyb3dzIElPRXhjZXB0aW9uIHsgcmV0dXJuIHRydWU7IH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3RleHRTYXZlci5yZWFkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCBjaGFyW10gY2J1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3RleHRTYXZlci5yZWFkKCBjYnVmLCAwLCBjYnVmID09IG51bGwgPyAwIDogY2J1Zi5sZW5ndGggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoIGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGV4dFNhdmVyLnJlYWQoIGNidWYsIG9mZiwgbGVuICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRleHRTYXZlciBfdGV4dFNhdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgSW5wdXRTdHJlYW1TYXZlciBleHRlbmRzIElucHV0U3RyZWFtCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbVNhdmVyICgKLSAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKG9wdGlvbnMpOwotICAgICAgICAgICAgX2J5dGVCdWZmZXIgPSBuZXcgT3V0cHV0U3RyZWFtSW1wbCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoci5fcHJvcHMuZ2V0RW5jb2RpbmcoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdNYXAuZ2V0SUFOQTJKYXZhTWFwcGluZyggci5fcHJvcHMuZ2V0RW5jb2RpbmcoKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DSEFSQUNURVJfRU5DT0RJTkcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5DSEFSQUNURVJfRU5DT0RJTkcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWFuYUVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdNYXAuZ2V0SmF2YTJJQU5BTWFwcGluZyggZW5jb2RpbmcgKTsKLQotICAgICAgICAgICAgICAgIGlmIChpYW5hRW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBpYW5hRW5jb2Rpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SmF2YTJJQU5BTWFwcGluZyggIlVURjgiICk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXZhRW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKCBlbmNvZGluZyApOwotCi0gICAgICAgICAgICBpZiAoamF2YUVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnZlcnRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIF9ieXRlQnVmZmVyLCBqYXZhRW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF90ZXh0U2F2ZXIgPSBuZXcgVGV4dFNhdmVyKCByLCBzLCBwLCBvcHRpb25zLCBlbmNvZGluZyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2J5dGVCdWZmZXIucmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggYnl0ZVtdIGJidWYsIGludCBvZmYsIGludCBsZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2J5dGVCdWZmZXIucmVhZCAoIGJidWYsIG9mZiwgbGVuICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBlbnN1cmUgKCBpbnQgY2J5dGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBFdmVuIGlmIHdlJ3JlIGFza2VkIHRvIGVuc3VyZSBub3RoaW5nLCBzdGlsbCB0cnkgdG8gZW5zdXJlCi0gICAgICAgICAgICAvLyBhdGxlYXN0IG9uZSBieXRlIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgYXQgdGhlCi0gICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHN0cmVhbS4KLQotICAgICAgICAgICAgaWYgKGNieXRlIDw9IDApCi0gICAgICAgICAgICAgICAgY2J5dGUgPSAxOwotCi0gICAgICAgICAgICBpbnQgYnl0ZXNBdmFpbGFibGUgPSBfYnl0ZUJ1ZmZlci5nZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgZm9yICggOyBieXRlc0F2YWlsYWJsZSA8IGNieXRlIDsKLSAgICAgICAgICAgICAgICAgIGJ5dGVzQXZhaWxhYmxlID0gX2J5dGVCdWZmZXIuZ2V0QXZhaWxhYmxlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dFNhdmVyLndyaXRlKCBfY29udmVydGVyLCAyMDQ4ICkgPCAyMDQ4KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZXNBdmFpbGFibGUgPSBfYnl0ZUJ1ZmZlci5nZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgaWYgKGJ5dGVzQXZhaWxhYmxlID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBieXRlc0F2YWlsYWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgT3V0cHV0U3RyZWFtSW1wbCBleHRlbmRzIE91dHB1dFN0cmVhbQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmVhZCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW1TYXZlci50aGlzLmVuc3VyZSggMSApID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA+IDA7Ci0KLSAgICAgICAgICAgICAgICBpbnQgYml0ZSA9IF9idWZbIF9vdXQgXTsKLQotICAgICAgICAgICAgICAgIF9vdXQgPSAoX291dCArIDEpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgX2ZyZWUrKzsKLQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcmVhZCAoIGJ5dGVbXSBiYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHN0cmVhbSBldmVuIGlmIHRoZXJlIGlzIG5vIHdheSB0byByZXR1cm4KLSAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGJlY2F1c2UgdGhlIFJlYWRlciBkb2Mgc2F5cyB0byByZXR1cm4gLTEgYXQgZW5kIG9mCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtLgotCi0gICAgICAgICAgICAgICAgaW50IG47Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG4gPSBlbnN1cmUoIGxlbiApKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmJ1ZiA9PSBudWxsIHx8IGxlbiA8PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICAgIGlmIChuIDwgbGVuKQotICAgICAgICAgICAgICAgICAgICBsZW4gPSBuOwotCi0gICAgICAgICAgICAgICAgaWYgKF9vdXQgPCBfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBiYnVmLCBvZmYsIGxlbiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9vdXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGJidWYsIG9mZiwgbGVuICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgYmJ1Ziwgb2ZmLCBjaHVuayApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idWYsIDAsIGJidWYsIG9mZiArIGNodW5rLCBsZW4gLSBjaHVuayApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgX291dCA9IChfb3V0ICsgbGVuKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIF9mcmVlICs9IGxlbjsKLQotICAgICAgICAgICAgICAgIHJldHVybiBsZW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBnZXRBdmFpbGFibGUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9idWYgPT0gbnVsbCA/IDAgOiBfYnVmLmxlbmd0aCAtIF9mcmVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZSAoIGludCBiaXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2ZyZWUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmVzaXplKCAxICk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPiAwOwotCi0gICAgICAgICAgICAgICAgX2J1ZlsgX2luIF0gPSAoYnl0ZSkgYml0ZTsKLQotICAgICAgICAgICAgICAgIF9pbiA9IChfaW4gKyAxKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIF9mcmVlLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlICggYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGNieXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY2J5dGUgPj0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChjYnl0ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBpZiAoX2ZyZWUgPCBjYnl0ZSkKLSAgICAgICAgICAgICAgICAgICAgcmVzaXplKCBjYnl0ZSApOwotCi0gICAgICAgICAgICAgICAgaWYgKF9pbiA9PSBfb3V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGdldEF2YWlsYWJsZSgpID09IDA7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBfZnJlZSA9PSBfYnVmLmxlbmd0aCAtIGdldEF2YWlsYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBfaW4gPSBfb3V0ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgY2h1bms7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX2luIDw9IF9vdXQgfHwgY2J5dGUgPCAoY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9pbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgX2J1ZiwgX2luLCBjYnl0ZSApOwotICAgICAgICAgICAgICAgICAgICBfaW4gKz0gY2J5dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGJ1Ziwgb2ZmLCBfYnVmLCBfaW4sIGNodW5rICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Ziwgb2ZmICsgY2h1bmssIF9idWYsIDAsIGNieXRlIC0gY2h1bmsgKTsKLQotICAgICAgICAgICAgICAgICAgICBfaW4gPSAoX2luICsgY2J5dGUpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgX2ZyZWUgLT0gY2J5dGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvaWQgcmVzaXplICggaW50IGNieXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY2J5dGUgPiBfZnJlZTsKLQotICAgICAgICAgICAgICAgIGludCBuZXdMZW4gPSBfYnVmID09IG51bGwgPyBfaW5pdGlhbEJ1ZlNpemUgOiBfYnVmLmxlbmd0aCAqIDI7Ci0gICAgICAgICAgICAgICAgaW50IHVzZWQgPSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggbmV3TGVuIC0gdXNlZCA8IGNieXRlICkKLSAgICAgICAgICAgICAgICAgICAgbmV3TGVuICo9IDI7Ci0KLSAgICAgICAgICAgICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGUgWyBuZXdMZW4gXTsKLQotICAgICAgICAgICAgICAgIGlmICh1c2VkID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfb3V0ID09IF9pbikKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgMCwgdXNlZCApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfaW4gPiBfb3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgbmV3QnVmLCAwLCB1c2VkICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgLSBfaW4gKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnVmLCAwLCBuZXdCdWYsIHVzZWQgLSBfaW4sIF9pbiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX291dCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIF9pbiA9IHVzZWQ7Ci0gICAgICAgICAgICAgICAgICAgIF9mcmVlICs9IG5ld0J1Zi5sZW5ndGggLSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9pbiA9PSAwICYmIF9vdXQgPT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfYnVmID0gbmV3QnVmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX2luaXRpYWxCdWZTaXplID0gNDA5NjsKLQotICAgICAgICAgICAgaW50ICAgIF9mcmVlOwotICAgICAgICAgICAgaW50ICAgIF9pbjsKLSAgICAgICAgICAgIGludCAgICBfb3V0OwotICAgICAgICAgICAgYnl0ZVtdIF9idWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbUltcGwgICBfYnl0ZUJ1ZmZlcjsKLSAgICAgICAgcHJpdmF0ZSBUZXh0U2F2ZXIgICAgICAgICAgX3RleHRTYXZlcjsKLSAgICAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW1Xcml0ZXIgX2NvbnZlcnRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFhtbElucHV0U3RyZWFtU2F2ZXIgZXh0ZW5kcyBTYXZlcgotICAgIHsKLSAgICAgICAgWG1sSW5wdXRTdHJlYW1TYXZlciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxFdmVudCBkZXF1ZXVlICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfb3V0ID09IG51bGwgJiYgIXByb2Nlc3MoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKF9vdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgWG1sRXZlbnRJbXBsIGUgPSBfb3V0OwotCi0gICAgICAgICAgICBpZiAoKF9vdXQgPSBfb3V0Ll9uZXh0KSA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9pbiA9IG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVucXVldWUgKCBYbWxFdmVudEltcGwgZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBlLl9uZXh0ID09IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChfaW4gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX291dCA9PSBudWxsOwotICAgICAgICAgICAgICAgIF9vdXQgPSBfaW4gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pbi5fbmV4dCA9IGU7Ci0gICAgICAgICAgICAgICAgX2luID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vCi0gICAgICAgIC8vCi0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkNhbid0IHN0cmVhbSBhbiBhdHRyaWJ1dGUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7Ci0gICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIGdldFJvb3QoKSwgcywgcCwgbnVsbCApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBCVUdCVUcgLSB0aGVyZSBjb3VsZCBiZSBuYW1lc3BhY2VzIHB1c2hlZCBmb3IgdGhpcyB0ZXh0LCBub3QKLSAgICAgICAgICAgIC8vIHN1cmUgaG93IHRvIGNvbW11bmljYXRlIHRob3NlLCBob3dldmVyCi0KLSAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVtaXRUZXh0KCBzLCBwLCBjY2ggKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzICE9IG51bGwgJiYgY2NoID4gMCkKLSAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCBnZXRSb290KCksIHMsIC0xLCB0ZXh0KCkgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZFByZWZpeE1hcHBpbmdzICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZXZQcmVmaXhVcmkgPSBtYXBwaW5nUHJldlByZWZpeFVyaSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZXZQcmVmaXhVcmkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZFByZWZpeE1hcHBpbmdJbXBsKCByLCBtYXBwaW5nUHJlZml4KCkgKSApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVucXVldWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlUHJlZml4TWFwcGluZ0ltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgbWFwcGluZ1ByZWZpeCgpLCBtYXBwaW5nVXJpKCksIHByZXZQcmVmaXhVcmkgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICBpZiAocy5pc1Jvb3QoKSkKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgRW5kRG9jdW1lbnRJbXBsKCByLCBzICkgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgRW5kRWxlbWVudEltcGwoIHIsIHMsIG5hbWUsIGdldFVyaU1hcCgpICkgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgRW5kRWxlbWVudEltcGwoIHIsIHMsIG5hbWUsIGdldFVyaU1hcCgpICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1pdEVuZFByZWZpeE1hcHBpbmdzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb21tZW50KCBzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0UHJvY2luc3QoIHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAotICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENvbW1lbnRJbXBsKCBnZXRSb290KCksIHMgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVucXVldWUoIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCBnZXRSb290KCksIHMgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiQ2FuJ3Qgc3RyZWFtIGFuIGF0dHJpYnV0ZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RhcnRQcmVmaXhNYXBwaW5nSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHIsIG1hcHBpbmdQcmVmaXgoKSwgbWFwcGluZ1VyaSgpICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgU3RhcnREb2N1bWVudEltcGwoIHIsIGMgKSApOwotCi0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVucXVldWUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdGFydEVsZW1lbnRJbXBsKCByLCBjLCBuYW1lLCB0aGlzICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGMuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCByLCBjLCAtMSwgdGV4dCgpICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2goKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggciwgYywgMSwgbnVsbCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjLmlzTGVhZigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggciwgYywgLTEsIHRleHQoKSApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2hWYWx1ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCByLCBjLCAxLCBudWxsICkgKTsKLQotICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRFbGVtZW50SW1wbCggciwgYywgbmFtZSwgZ2V0VXJpTWFwKCkgKSApOwotCi0gICAgICAgICAgICAgICAgZW1pdEVuZFByZWZpeE1hcHBpbmdzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vCi0gICAgICAgIC8vCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWE1MTmFtZSBjb21wdXRlTmFtZSAoIFFOYW1lIG4sIE1hcCB1cmlNYXAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gbi5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGFzc2VydCBuLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID4gMDsKLQotICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhc3NlcnQgbWF5IGZpcmUgaWYgc29tZW9uZSBjb21wdXRlcyBhIG5hbWUKLSAgICAgICAgICAgIC8vIG9mIGFuIGVsZW1lbnQvYXR0ciB0b28gbGF0ZSAoYWZ0ZXIgb3RoZXIgZXZlbnRzIGhhdmUgYmVlbgotICAgICAgICAgICAgLy8gZW5xdWV1ZWQgYW5kIHRoZSB1cmkgbWFwIGhhcyBiZWVuIHVwZGF0ZWQuICBJIGNoZWNrIGxhdGVyCi0gICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY3Jhc2gsIGhvd2V2ZXIuCi0KLSAgICAgICAgICAgIGFzc2VydCB1cmkgPT0gbnVsbCB8fCB1cmlNYXAuY29udGFpbnNLZXkoIHVyaSApIDogIlByb2JsZW0gdXJpICIgKyB1cmk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gKFN0cmluZykgdXJpTWFwLmdldCggdXJpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwoIHVyaSwgbi5nZXRMb2NhbFBhcnQoKSwgcHJlZml4ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBYbWxFdmVudEltcGwgZXh0ZW5kcyBYbWxFdmVudEJhc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbEV2ZW50SW1wbCAoIGludCB0eXBlLCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCB0eXBlICk7Ci0gICAgICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgICAgIF9zcGxheSA9IHM7Ci0gICAgICAgICAgICAgICAgX3ZlcnNpb24gPSBfcm9vdC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldE5hbWUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXRTY2hlbWFUeXBlICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTllJIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgZmluYWwgTG9jYXRpb24gZ2V0TG9jYXRpb24gKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHBlcmhhcHMgSSBjYW4gc2F2ZSBhIGxvY2F0aW9uIGdvb2JlciBzb21ldGltZXM/Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tWZXJzaW9uICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBfcm9vdC5nZXRWZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFJvb3QgZ2V0Um9vdCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTcGxheSBnZXRTcGxheSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3NwbGF5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFJvb3QgIF9yb290OwotICAgICAgICAgICAgcHJpdmF0ZSBTcGxheSBfc3BsYXk7Ci0gICAgICAgICAgICBwcml2YXRlIGxvbmcgIF92ZXJzaW9uOwotCi0gICAgICAgICAgICBYbWxFdmVudEltcGwgX25leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGFydERvY3VtZW50SW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBTdGFydERvY3VtZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXJ0RG9jdW1lbnRJbXBsICggUm9vdCByLCBTcGxheSBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuU1RBUlRfRE9DVU1FTlQsIHIsIHMgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLl9wcm9wcy5nZXREb2N0eXBlU3lzdGVtSWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5fcHJvcHMuZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLl9zdGFuZEFsb25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuX3Byb3BzLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGFydEVsZW1lbnRJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIFN0YXJ0RWxlbWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBTdGFydEVsZW1lbnRJbXBsICggUm9vdCByLCBTcGxheSBzLCBRTmFtZSBuYW1lLCBTYXZlciBzYXZlciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQsIHIsIHMgKTsKLQotICAgICAgICAgICAgICAgIF9uYW1lID0gY29tcHV0ZU5hbWUoIG5hbWUsIHNhdmVyLmdldFVyaU1hcCgpICk7Ci0KLSAgICAgICAgICAgICAgICBfcHJlZml4TWFwID0gc2F2ZXIuZ2V0UHJlZml4TWFwKCk7Ci0KLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIGxhc3RBdHRyID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBzYXZlci5fYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBhID0gKFNwbGF5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgYXR0ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9ybWFsQXR0cmlidXRlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBhLCAoU3RyaW5nKSBzYXZlci5fYXR0cnMuZ2V0KCBhICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZXIuZ2V0VXJpTWFwKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBhdHRyOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QXR0ci5fbmV4dCA9IGF0dHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHIgPSBhdHRyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RBdHRyID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoIHNhdmVyLml0ZXJhdGVNYXBwaW5ncygpIDsKLSAgICAgICAgICAgICAgICAgICAgICBzYXZlci5oYXNNYXBwaW5nKCkgOyBzYXZlci5uZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgYXR0ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgWG1sbnNBdHRyaWJ1dGVJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIHNhdmVyLm1hcHBpbmdQcmVmaXgoKSwgc2F2ZXIubWFwcGluZ1VyaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVyLmdldFVyaU1hcCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcyA9IGF0dHI7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBdHRyLl9uZXh0ID0gYXR0cjsKLQotICAgICAgICAgICAgICAgICAgICBsYXN0QXR0ciA9IGF0dHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldE5hbWUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldEF0dHJpYnV0ZXMgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSXRlcmF0b3JJbXBsKCBnZXRSb290KCksIF9hdHRyaWJ1dGVzLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0TmFtZXNwYWNlcyAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVJdGVyYXRvckltcGwoIGdldFJvb3QoKSwgbnVsbCwgX25hbWVzcGFjZXMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXRBdHRyaWJ1dGVzQW5kTmFtZXNwYWNlcyAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVJdGVyYXRvckltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBfYXR0cmlidXRlcywgX25hbWVzcGFjZXMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlOYW1lICggWE1MTmFtZSB4bWxOYW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IgKCBBdHRyaWJ1dGVJbXBsIGEgPSBfYXR0cmlidXRlcyA7IGEgIT0gbnVsbCA7IGEgPSBhLl9uZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbE5hbWUuZXF1YWxzKCBhLmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkgKCBTdHJpbmcgcHJlZml4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZU1hcCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ByZWZpeE1hcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZUl0ZXJhdG9ySW1wbAotICAgICAgICAgICAgICAgIGltcGxlbWVudHMgQXR0cmlidXRlSXRlcmF0b3IKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yb290OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJdGVyYXRvckltcGwgKAotICAgICAgICAgICAgICAgICAgICBSb290IHIsIEF0dHJpYnV0ZUltcGwgYXR0cmlidXRlcywgQXR0cmlidXRlSW1wbCBuYW1lc3BhY2VzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZSBuZXh0ICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBhdHRyID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBfYXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlcyA9IGF0dHIuX25leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfbmFtZXNwYWNlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBfbmFtZXNwYWNlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcyA9IGF0dHIuX25leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZXMgIT0gbnVsbCB8fCBfbmFtZXNwYWNlcyAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZSBwZWVrICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX25hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX25hbWVzcGFjZXM7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNraXAgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlcyA9IF9hdHRyaWJ1dGVzLl9uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX25hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcyA9IF9uYW1lc3BhY2VzLl9uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNoZWNrVmVyc2lvbiAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBfcm9vdC5nZXRWZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIFJvb3QgICAgICAgICAgX3Jvb3Q7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nICAgICAgICAgIF92ZXJzaW9uOwotICAgICAgICAgICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW1wbCBfYXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZUltcGwgX25hbWVzcGFjZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBBdHRyaWJ1dGUKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yb290OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsICggUm9vdCByICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIC8vIFRPRE8gLSBNYWtlIHN1cmUgdGhyb3dpbmcgYXdheSB0aGlzIERURCBpbmZvIGlzIG9rLgotICAgIC8vIElzIHRoZXJlIHNjaGVtYSBpbmZvIHdoaWNoIGNhbiByZXR1cm4gbW9yZSB1c2VmdWwgaW5mbz8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ0RBVEEiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0U2NoZW1hVHlwZSAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAvLyBUT0RPIC0gQ2FuIEkgcmV0dXJuIHNvbWV0aGluZyByZWFzb25hYmxlIGhlcmU/Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNoZWNrVmVyc2lvbiAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBfcm9vdC5nZXRWZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIF9uZXh0OwotCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFhNTE5hbWUgX25hbWU7Ci0KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgUm9vdCAgX3Jvb3Q7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nICBfdmVyc2lvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sbnNBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgQXR0cmlidXRlSW1wbAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbG5zQXR0cmlidXRlSW1wbCAoCi0gICAgICAgICAgICAgICAgICAgIFJvb3QgciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgTWFwIHVyaU1hcCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdXBlciggciApOwotCi0gICAgICAgICAgICAgICAgICAgIF91cmkgPSB1cmk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gInhtbG5zIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gcHJlZml4OwotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gInhtbG5zIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9uYW1lID0gbmV3IFhtbE5hbWVJbXBsKCBudWxsLCBsb2NhbCwgcHJlZml4ICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdXJpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3VyaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9ybWFsQXR0cmlidXRlSW1wbCBleHRlbmRzIEF0dHJpYnV0ZUltcGwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb3JtYWxBdHRyaWJ1dGVJbXBsICgKLSAgICAgICAgICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBTdHJpbmcgdmFsdWUsIE1hcCB1cmlNYXAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIoIHIgKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9zcGxheSA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IGNvbXB1dGVOYW1lKCBzLmdldE5hbWUoKSwgdXJpTWFwICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWUgIT0gbnVsbCA/IF92YWx1ZSA6IF9zcGxheS5nZXRUZXh0KCBfcm9vdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOyAvLyBJZiBpbnZhbGlkIGluIHRoZSBzdG9yZQotICAgICAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX3NwbGF5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFhNTE5hbWUgX25hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIE1hcCAgICAgX3ByZWZpeE1hcDsKLQotICAgICAgICAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVJbXBsIF9hdHRyaWJ1dGVzOwotICAgICAgICAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVJbXBsIF9uYW1lc3BhY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhcnRQcmVmaXhNYXBwaW5nSW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBTdGFydFByZWZpeE1hcHBpbmcKLSAgICAgICAgewotICAgICAgICAgICAgU3RhcnRQcmVmaXhNYXBwaW5nSW1wbCAoIFJvb3QgciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HLCByLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBfcHJlZml4ID0gcHJlZml4OwotICAgICAgICAgICAgICAgIF91cmkgPSB1cmk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdXJpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXggKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfcHJlZml4LCBfdXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhbmdlUHJlZml4TWFwcGluZ0ltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgQ2hhbmdlUHJlZml4TWFwcGluZwotICAgICAgICB7Ci0gICAgICAgICAgICBDaGFuZ2VQcmVmaXhNYXBwaW5nSW1wbCAoCi0gICAgICAgICAgICAgICAgUm9vdCByLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgb2xkVXJpLCBTdHJpbmcgbmV3VXJpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HLCByLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBfb2xkVXJpID0gb2xkVXJpOwotICAgICAgICAgICAgICAgIF9uZXdVcmkgPSBuZXdVcmk7Ci0gICAgICAgICAgICAgICAgX3ByZWZpeCA9IHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRPbGROYW1lc3BhY2VVcmkgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vbGRVcmk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05hbWVzcGFjZVVyaSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX25ld1VyaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJlZml4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX29sZFVyaSwgX25ld1VyaSwgX3ByZWZpeDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVuZFByZWZpeE1hcHBpbmdJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIEVuZFByZWZpeE1hcHBpbmcKLSAgICAgICAgewotICAgICAgICAgICAgRW5kUHJlZml4TWFwcGluZ0ltcGwgKCBSb290IHIsIFN0cmluZyBwcmVmaXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkcsIHIsIG51bGwgKTsKLSAgICAgICAgICAgICAgICBfcHJlZml4ID0gcHJlZml4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ByZWZpeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF9wcmVmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyYWN0ZXJEYXRhSW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBDaGFyYWN0ZXJEYXRhCi0gICAgICAgIHsKLSAgICAgICAgICAgIENoYXJhY3RlckRhdGFJbXBsICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgU3RyaW5nIGNoYXJEYXRhICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEEsIHIsIHMgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMCB8fCAoY2hhckRhdGEgIT0gbnVsbCAmJiBjaGFyRGF0YS5sZW5ndGgoKSA+IDApOwotCi0gICAgICAgICAgICAgICAgX3BvcyA9IHA7Ci0gICAgICAgICAgICAgICAgX2NoYXJEYXRhID0gY2hhckRhdGE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9wb3MgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJEYXRhOwotICAgIAotICAgICAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCBfcG9zICksIHMuZ2V0UG9zdENjaCggX3BvcyApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgICAgX3BvczsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF9jaGFyRGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVuZEVsZW1lbnRJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIEVuZEVsZW1lbnQKLSAgICAgICAgewotICAgICAgICAgICAgRW5kRWxlbWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMsIFFOYW1lIG5hbWUsIE1hcCB1cmlNYXAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5FTkRfRUxFTUVOVCwgciwgcyApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCkgfHwgcy5pc0VuZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfbmFtZSA9IGNvbXB1dGVOYW1lKCBuYW1lLCB1cmlNYXAgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldE5hbWUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBYTUxOYW1lIF9uYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW5kRG9jdW1lbnRJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIEVuZERvY3VtZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVuZERvY3VtZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkVORF9ET0NVTUVOVCwgciwgcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tbWVudEltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgQ29tbWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkNPTU1FTlQsIHIsIHMgKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbW1lbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXRDY2goKSA9PSAwID8gbnVsbCA6IHMuZ2V0VGV4dCggZ2V0Um9vdCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldENjaCgpID4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsICggUm9vdCByLCBTcGxheSBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgciwgcyApOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzUHJvY2luc3QoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkuZ2V0TG9jYWwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoKCkgPT0gMCA/IG51bGwgOiBzLmdldFRleHQoIGdldFJvb3QoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWG1sRXZlbnRJbXBsIF9pbiwgX291dDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgWG1sSW5wdXRTdHJlYW1JbXBsIGV4dGVuZHMgR2VuZXJpY1htbElucHV0U3RyZWFtCi0gICAgewotICAgICAgICBYbWxJbnB1dFN0cmVhbUltcGwgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfeG1sSW5wdXRTdHJlYW1TYXZlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFhtbElucHV0U3RyZWFtU2F2ZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgLy8gTWFrZSB0aGUgc2F2ZXIgZ3JpbmQgYXdheSBqdXN0IGEgYml0IHRvIHRocm93IGFueSBleGNlcHRpb25zCi0gICAgICAgICAgICAvLyByZWxhdGVkIHRvIHRoZSBpbmFiaWxpdHkgdG8gY3JlYXRlIGEgc3RyZWFtIG9uIHRoaXMgeG1sCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIF94bWxJbnB1dFN0cmVhbVNhdmVyLnByb2Nlc3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBYTUxFdmVudCBuZXh0RXZlbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF94bWxJbnB1dFN0cmVhbVNhdmVyLmRlcXVldWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWG1sSW5wdXRTdHJlYW1TYXZlciBfeG1sSW5wdXRTdHJlYW1TYXZlcjsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBWYWxpZGF0b3JTYXZlcgotICAgICAgICBleHRlbmRzIFNhdmVyIGltcGxlbWVudHMgVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQKLSAgICB7Ci0gICAgICAgIFZhbGlkYXRvclNhdmVyICgKLSAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsCi0gICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMsIFZhbGlkYXRvckxpc3RlbmVyIHZFdmVudFNpbmsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOwotCi0gICAgICAgICAgICBfd2FudER1cEF0dHJzID0gdHJ1ZTsKLQotICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMDsKLQotICAgICAgICAgICAgX3N0YXJ0U3BsYXkgPSBzOwotICAgICAgICAgICAgX3ZFdmVudFNpbmsgPSB2RXZlbnRTaW5rOwotCi0gICAgICAgICAgICB3aGlsZSAoIHByb2Nlc3MoKSApCi0gICAgICAgICAgICAgICAgOyAgLy8gRW1wdHkKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7Ci0gICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBzLCBwLCBudWxsLCBzLCBwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBzLCBwLCBudWxsLCB0ZXh0KCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQsIHMsIDAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAotICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBzLCAwLCBudWxsLCBzLCAxICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBzLCAwLCBudWxsLCBzLCAxICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQkVHSU4sIHMsIDAsIG51bGwgKTsKLQotICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBzLCAwLCBudWxsLCB0ZXh0KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMuZ2V0Q2NoKCkgPiAwKQotICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgcywgMCApOwotCi0gICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCwgcywgMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF94c2lOb0xvYyA9PSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF94c2lMb2MgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpVHlwZSA9PSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF94c2lOaWwgPT0gbnVsbDsKLQotICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IGMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzWHNpQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gcy5nZXRMb2NhbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbC5lcXVhbHMoICJ0eXBlIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hzaVR5cGUgPSBzOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJuaWwiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeHNpTmlsID0gczsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAic2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeHNpTG9jID0gczsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF94c2lOb0xvYyA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbWl0RXZlbnQoCi0gICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuQkVHSU4sIGMsIDAsCi0gICAgICAgICAgICAgICAgYyA9PSBfc3RhcnRTcGxheSA/IG51bGwgOiBuYW1lICk7Ci0KLSAgICAgICAgICAgIF94c2lOb0xvYyA9IF94c2lMb2MgPSBfeHNpVHlwZSA9IF94c2lOaWwgPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBzID0gKFNwbGF5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc1hzaUF0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCAidHlwZSIgKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwuZXF1YWxzKCAibmlsIiApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5lcXVhbHMoICJzY2hlbWFMb2NhdGlvbiIgKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwuZXF1YWxzKCAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaW52YWxpZEF0dHJWYWx1ZSA9IChTdHJpbmcpIF9hdHRycy5nZXQoIHMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkQXR0clZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSLCBzLCAwLCBzLmdldE5hbWUoKSwgcywgMCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSLCBzLCAwLCBzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRBdHRyVmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5EQVRUUlMsIGMsIDAgKTsKLQotICAgICAgICAgICAgaWYgKGMuaXNEb2MoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBjLCAxLCBudWxsLCB0ZXh0KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2goKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgYywgMSwgbnVsbCwgYywgMSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY2NoID0gX3RleHQgIT0gbnVsbCA/IF90ZXh0Lmxlbmd0aCgpIDogYy5nZXRDY2hWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIGMsIDEsIG51bGwsIHRleHQoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIGMsIDEsIG51bGwsIGMsIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5ELCBjLCBjLmdldFBvc0xlYWZFbmQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICggaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jICkKLSAgICAgICAgICAgIHsgZW1pdEV2ZW50KCBraW5kLCBzTG9jLCBwTG9jLCBudWxsLCBudWxsLCAwLCBudWxsICk7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKCBpbnQga2luZCwgU3BsYXkgc0xvYywgaW50IHBMb2MsIFFOYW1lIG5hbWUgKQotICAgICAgICAgICAgeyBlbWl0RXZlbnQoIGtpbmQsIHNMb2MsIHBMb2MsIG5hbWUsIG51bGwsIDAsIG51bGwgKTsgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFdmVudCAoCi0gICAgICAgICAgICBpbnQga2luZCwgU3BsYXkgc0xvYywgaW50IHBMb2MsIFFOYW1lIG5hbWUsIFN0cmluZyB0ZXh0ICkKLSAgICAgICAgICAgICAgICB7IGVtaXRFdmVudCAoIGtpbmQsIHNMb2MsIHBMb2MsIG5hbWUsIG51bGwsIDAsIHRleHQgKTsgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFdmVudCAoCi0gICAgICAgICAgICBpbnQga2luZCwgU3BsYXkgc0xvYywgaW50IHBMb2MsIFFOYW1lIG5hbWUsIFNwbGF5IHNUZXh0LCBpbnQgcFRleHQgKQotICAgICAgICAgICAgICAgIHsgZW1pdEV2ZW50ICgga2luZCwgc0xvYywgcExvYywgbmFtZSwgc1RleHQsIHBUZXh0LCBudWxsICk7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKAotICAgICAgICAgICAgaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lLAotICAgICAgICAgICAgU3BsYXkgc1RleHQsIGludCBwVGV4dCwgU3RyaW5nIHRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoa2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUICYmIF9lbWl0dGVkVGV4dCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGV4dCA9IHRleHQgIT0gbnVsbCB8fCBzVGV4dCAhPSBudWxsOwotCi0gICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICAhaGFzVGV4dCB8fAotICAgICAgICAgICAgICAgICAgICAoa2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID09IFZhbGlkYXRvckxpc3RlbmVyLlRFWFQpOwotCi0gICAgICAgICAgICBhc3NlcnQga2luZCAhPSBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSIHx8IGhhc1RleHQ7Ci0gICAgICAgICAgICBhc3NlcnQga2luZCAhPSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUIHx8IGhhc1RleHQ7Ci0KLSAgICAgICAgICAgIGFzc2VydCBraW5kICE9IFZhbGlkYXRvckxpc3RlbmVyLkFUVFIgfHwgbmFtZSAhPSBudWxsOwotCi0gICAgICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBfc1RleHQgPSBzVGV4dDsKLSAgICAgICAgICAgIF9wVGV4dCA9IHBUZXh0OwotICAgICAgICAgICAgX2V2ZW50VGV4dCA9IHRleHQ7Ci0gICAgICAgICAgICBfaGFzVGV4dCA9IGhhc1RleHQ7Ci0gICAgICAgICAgICBfc0xvYyA9IHNMb2M7Ci0gICAgICAgICAgICBfcExvYyA9IHBMb2M7Ci0KLSAgICAgICAgICAgIF92RXZlbnRTaW5rLm5leHRFdmVudCgga2luZCwgdGhpcyApOwotCi0gICAgICAgICAgICBfZW1pdHRlZFRleHQgPSBraW5kID09IFZhbGlkYXRvckxpc3RlbmVyLlRFWFQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICAvLwotCi0gICAgICAgIHB1YmxpYyBYbWxDdXJzb3IgZ2V0TG9jYXRpb25Bc0N1cnNvciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBfc0xvYywgX3BMb2MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFhzaVR5cGUgKCBDaGFycyBjaGFycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfeHNpVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgc2V0Q2hhcnMoIGNoYXJzLCBQUkVTRVJWRSwgbnVsbCwgX3hzaVR5cGUsIDAgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lOaWwgKCBDaGFycyBjaGFycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfeHNpTmlsID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0KLSAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgUFJFU0VSVkUsIG51bGwsIF94c2lOaWwsIDAgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lMb2MgKCBDaGFycyBjaGFycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfeHNpTG9jID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIFBSRVNFUlZFLCBudWxsLCBfeHNpTG9jLCAwICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTm9Mb2MgKCBDaGFycyBjaGFycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfeHNpTm9Mb2MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgUFJFU0VSVkUsIG51bGwsIF94c2lOb0xvYywgMCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0Q2hhcnMgKAotICAgICAgICAgICAgQ2hhcnMgY2hhcnMsIGludCB3c3IsIFN0cmluZyBzdHJpbmcsIFNwbGF5IHNUZXh0LCBpbnQgcFRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgc3RyaW5nICE9IG51bGwgfHwgc1RleHQgIT0gbnVsbDsKLQotICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgIGNoYXJzLnN0cmluZyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFycy5zdHJpbmcgPSBzdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwVGV4dCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IHIuX3RleHQuX2J1ZjsKLSAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggPSBzVGV4dC5nZXRDY2goKTsKLQotICAgICAgICAgICAgICAgIGNoYXJzLm9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQudW5PYnNjdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRDcCggc1RleHQgKSwgY2hhcnMubGVuZ3RoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwVGV4dCA9PSAxICYmIHNUZXh0LmlzTGVhZigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IHIuX3RleHQuX2J1ZjsKLSAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggPSBzVGV4dC5nZXRDY2hWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgY2hhcnMub2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICByLmdldENwKCBzVGV4dCApLCBjaGFycy5sZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcFRleHQgPT0gc1RleHQuZ2V0UG9zQWZ0ZXIoKTsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9yZVRleHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHQgPSBzVGV4dC5uZXh0Tm9uQXR0clNwbGF5KCkgOyA7Ci0gICAgICAgICAgICAgICAgICAgICAgdCA9IHQubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0LmlzQ29tbWVudCgpICYmICF0LmlzUHJvY2luc3QoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3JlVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghbW9yZVRleHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSByLl90ZXh0Ll9idWY7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCA9IHNUZXh0LmdldENjaEFmdGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhcnMub2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQudW5PYnNjdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUZXh0LmdldENwRm9yUG9zKCByLCBwVGV4dCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGNjaCA9IHNUZXh0LmdldENjaEFmdGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IG9mZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGV4dC5nZXRDcEZvclBvcyggciwgcFRleHQgKSwgY2NoICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCByLl90ZXh0Ll9idWYsIG9mZiwgY2NoICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgdCA9IHNUZXh0Lm5leHROb25BdHRyU3BsYXkoKSA7IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQuaXNDb21tZW50KCkgJiYgIXQuaXNQcm9jaW5zdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2ggPSB0LmdldENjaEFmdGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q3BGb3JQb3MoIHIsIDEgKSwgY2NoICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIHIuX3RleHQuX2J1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCA9IHNiLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSBuZXcgY2hhciBbIGNoYXJzLmxlbmd0aCBdOwotICAgICAgICAgICAgICAgICAgICBjaGFycy5vZmZzZXQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHNiLmdldENoYXJzKCAwLCBjaGFycy5sZW5ndGgsIGNoYXJzLmJ1ZmZlciwgMCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdzciAhPSBQUkVTRVJWRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdGhpcyBpcyBxdWljaywgZGlydHkgYW5kIHZlcnkgaW5lZmZpY2llbnQKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgbWFrZSBpdCBmYXN0ZXIhCi0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gY2hhcnMuYXNTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gLTEsIG5TcGFjZXMgPSAwLCBjY2ggPSBzdHIubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgY2NoIDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KCBpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnICc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzciA9PSBDT0xMQVBTRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgblNwYWNlcysrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuU3BhY2VzID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3BhY2VzID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggOyBuU3BhY2VzID4gMCA7IG5TcGFjZXMtLSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnICcgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoYXJzLnN0cmluZyA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldFRleHQoIGNoYXJzLCBQUkVTRVJWRSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzLCBpbnQgd3NyICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfaGFzVGV4dCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vIHRleHQgZm9yIHRoaXMgZXZlbnQiKTsKLQotICAgICAgICAgICAgc2V0Q2hhcnMoIGNoYXJzLCB3c3IsIF9ldmVudFRleHQsIF9zVGV4dCwgX3BUZXh0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIC0gcmF0aGVyIGV4cGVuc2l2ZSB0byBtYWtlIENoYXJzIGFuZCBnZXRUZXh0IGFuZCBnZXQKLSAgICAgICAgLy8gU3RyaW5nCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRleHRJc1doaXRlc3BhY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENoYXJzIGNoYXJzID0gbmV3IENoYXJzKCk7Ci0gICAgICAgICAgICBnZXRUZXh0KCBjaGFycyApOwotICAgICAgICAgICAgU3RyaW5nIHMgPSBjaGFycy5hc1N0cmluZygpOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgcy5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggcy5jaGFyQXQoIGkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFZhbGlkYXRvckxpc3RlbmVyIF92RXZlbnRTaW5rOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICAgICAgICAgIF9zdGFydFNwbGF5OwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIF9lbWl0dGVkVGV4dDsKLQotICAgICAgICBwcml2YXRlIFFOYW1lICAgX25hbWU7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICBfeHNpVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF94c2lOaWw7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICBfeHNpTG9jOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3hzaU5vTG9jOwotICAgICAgICBwcml2YXRlIFN0cmluZyAgX2V2ZW50VGV4dDsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF9zVGV4dDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgIF9wVGV4dDsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF9zTG9jOwotICAgICAgICBwcml2YXRlIGludCAgICAgX3BMb2M7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzVGV4dDsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTYXhTYXZlciBleHRlbmRzIFNhdmVyCi0gICAgewotICAgICAgICBTYXhTYXZlciAoCi0gICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMsCi0gICAgICAgICAgICBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIgbGV4aWNhbGhhbmRsZXIgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX3dhbnRGcmFnVGVzdCA9IHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9jb250ZW50SGFuZGxlciA9IGNvbnRlbnRIYW5kbGVyOwotICAgICAgICAgICAgX2xleGljYWxoYW5kbGVyID0gbGV4aWNhbGhhbmRsZXI7Ci0KLS8vICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvciggaGhtbW1tICApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIHByb2Nlc3MoKSApCi0gICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU2F2ZXJTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZS5fc2F4RXhjZXB0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgU2F2ZXJTQVhFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNhdmVyU0FYRXhjZXB0aW9uICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zYXhFeGNlcHRpb24gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTQVhFeGNlcHRpb24gX3NheEV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB0aHJvd1NheEV4Y2VwdGlvbiAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNhdmVyU0FYRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYy5pc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggYywgbmFtZSwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgaWYgKGMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2NoID0gX3RleHQgPT0gbnVsbCA/IGMuZ2V0Q2NoVmFsdWUoKSA6IF90ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggYywgMCwgY2NoICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIF90ZXh0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBjLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggYywgbmFtZSwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBjLCAwLCBjLmdldENjaCgpICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggX3RleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0QXR0ckhlbHBlciAoIFNwbGF5IHMsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBzLmdldExvY2FsKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gcy5nZXRVcmkoKTsKLQotICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIHMuZ2V0VXJpKCksIHMuZ2V0TG9jYWwoKSwKLSAgICAgICAgICAgICAgICBnZXRQcmVmaXhlZE5hbWUoIHMuZ2V0TmFtZSgpICksCi0gICAgICAgICAgICAgICAgIkNEQVRBIiwKLSAgICAgICAgICAgICAgICB2YWx1ZSA9PSBudWxsID8gcy5nZXRUZXh0KCBnZXRSb290KCkgKSA6IHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkTmFtZXNwYWNlQXR0ciAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKCBwcmVmaXgsIHVyaSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSggIiIsICIiLCAieG1sbnMiLCAiQ0RBVEEiLCB1cmkgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICIiLCAiIiwgInhtbG5zOiIgKyBwcmVmaXgsICJDREFUQSIsIHVyaSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdE5hbWVzcGFjZXNIZWxwZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICAgICAgYWRkTmFtZXNwYWNlQXR0ciggbWFwcGluZ1ByZWZpeCgpLCBtYXBwaW5nVXJpKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q29udGFpbmVySGVscGVyICgKLSAgICAgICAgICAgIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lLAotICAgICAgICAgICAgU3BsYXkgZXh0cmFBdHRyLCBTdHJpbmdCdWZmZXIgZXh0cmFBdHRyVGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChfc2F2ZU5hbWVzcGFjZXNGaXJzdCkKLSAgICAgICAgICAgICAgICBlbWl0TmFtZXNwYWNlc0hlbHBlcigpOwotCi0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBzID0gKFNwbGF5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBlbWl0QXR0ckhlbHBlciggcywgKFN0cmluZykgX2F0dHJzLmdldCggcyApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHRyYUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0QXR0ckhlbHBlcigKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyLAotICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJUZXh0ID09IG51bGwgPyBudWxsIDogZXh0cmFBdHRyVGV4dC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghX3NhdmVOYW1lc3BhY2VzRmlyc3QpCi0gICAgICAgICAgICAgICAgZW1pdE5hbWVzcGFjZXNIZWxwZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdEVsZW1lbnQoIG5hbWUsIGdldFByZWZpeGVkTmFtZSggbmFtZSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENoYXJhY3RlcnMgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoIGJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q2hhcmFjdGVycyAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIHMuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgcCApLCBjY2ggKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDaGFyYWN0ZXJzICggaW50IGNwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoCi0gICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0Ll9idWYsIGdldFJvb3QoKS5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKSwKLSAgICAgICAgICAgICAgICBjY2ggKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDaGFyYWN0ZXJzICggU3RyaW5nQnVmZmVyIHNiICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHNiLnRvU3RyaW5nKCk7IC8vIEluZWZmaWNpZW50LCB1c2UgYSBzaGFyZWQgY2hhcltdCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCB0ZXh0LnRvQ2hhckFycmF5KCksIDAsIHRleHQubGVuZ3RoKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRFbmRFbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRQcmVmaXhlZE5hbWUoIG5hbWUgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKCBtYXBwaW5nUHJlZml4KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVuZE5hbWVzcGFjZXMgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfYXR0cmlidXRlcy5nZXRMZW5ndGgoKSA7IGkgKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuID0gX2F0dHJpYnV0ZXMuZ2V0UU5hbWUoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICghcW4uc3RhcnRzV2l0aCggInhtbG5zIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGogPSBxbi5pbmRleE9mKCAnOicgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbi5zdWJzdHJpbmcoIGogKyAxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyggIiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFByZWZpeGVkTmFtZSAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgU3RyaW5nIGxwID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgICAgaWYgKG5zLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxwOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0VXJpTWFwcGluZyggbnMgKTsKLQotICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBscDsKLQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIGxwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRFbGVtZW50ICggUU5hbWUgbmFtZSwgU3RyaW5nIHByZWZpeGVkTmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldFByZWZpeGVkTmFtZSggbmFtZSApLCBfYXR0cmlidXRlcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIHMsIHAsIGNjaCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBfdGV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sZXhpY2FsaGFuZGxlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xleGljYWxoYW5kbGVyLnN0YXJ0RFREKCBkb2N0eXBlTmFtZSwgcHVibGljSUQsIHN5c3RlbUlEICk7Ci0gICAgICAgICAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlci5lbmREVEQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sZXhpY2FsaGFuZGxlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjcCA9IGdldFJvb3QoKS5nZXRDcCggcyApOwotICAgICAgICAgICAgICAgIGludCBjY2ggPSBzLmdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlci5jb21tZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0Ll9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2ggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKAotICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCksIHMuZ2V0VGV4dCggZ2V0Um9vdCgpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIF90ZXh0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzICE9IG51bGwgJiYgY2NoID4gMCkKLSAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggcywgcCwgY2NoICk7Ci0KLSAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIHMsIF90ZXh0ICk7Ci0gICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZW1pdENvbW1lbnQoIHMgKTsKLSAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZW1pdFByb2NpbnN0KCBzICk7Ci0gICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgX2F0dHJpYnV0ZXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBTQVhFeGNlcHRpb24gX3NheEV4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgQ29udGVudEhhbmRsZXIgX2NvbnRlbnRIYW5kbGVyOwotICAgICAgICBwcml2YXRlIExleGljYWxIYW5kbGVyIF9sZXhpY2FsaGFuZGxlcjsKLSAgICB9Ci0KLSAgICAgICAgICAgIAotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgX3RocmVhZERvY3VtZW50QnVpbGRlckZhY3RvcnkgPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIERvbVNhdmVyIGV4dGVuZHMgU2F2ZXIKLSAgICB7Ci0gICAgICAgIERvbVNhdmVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgYm9vbGVhbiBjcmVhdGVEb2MsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgICAgICAgICBfY3JlYXRlRG9jID0gY3JlYXRlRG9jOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZSBleHBvcnREb20gKCApCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBhZGQgYW4gb3B0aW9ucyB3aGljaCBzcGVjaWZpZXMgYSBEb2N1bWVudCB3aXRoIHdoaWNoCi0gICAgICAgICAgICAvLyB0byBjcmVhdGUgdGhlIGZyYWdtZW50Ci0KLSAgICAgICAgICAgIF9kb2MgPSAoKERvY3VtZW50QnVpbGRlcikgX3RocmVhZERvY3VtZW50QnVpbGRlckZhY3RvcnkuZ2V0KCkpLm5ld0RvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIE5vZGUgcmVzdWx0OwotCi0gICAgICAgICAgICBpZiAoX2NyZWF0ZURvYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBfY3VycmVudE5vZGUgPSBfZG9jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgZnJhZyA9IF9kb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9jdXJyZW50Tm9kZSA9IGZyYWc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlICggcHJvY2VzcygpICkKLSAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc01hcHBpbmdzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVzcGFjZSBhdHRyaWJ1dGUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2goKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSByLl90ZXh0LmZldGNoKCAwLCBjLmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmIF9jdXJyZW50Tm9kZSAhPSBfZG9jKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSwgbnVsbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0JlZ2luKCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWUgPSBjLmdldExvY2FsKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYy5nZXRVcmkoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0VXJpTWFwcGluZyggYy5nZXRVcmkoKSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBwcmVmaXggKyAiOiIgKyBxbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnROUyggYy5nZXRVcmkoKSwgcW5hbWUgKTsKLQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGUsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbWFwcGluZ1ByZWZpeCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gInhtbG5zIjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSAieG1sbnM6IiArIHByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKCBTcGxheS5feG1sbnNVcmksIHFuYW1lLCBtYXBwaW5nVXJpKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSAoU3BsYXkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBzLmdldExvY2FsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuZ2V0VXJpKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0VXJpTWFwcGluZyggcy5nZXRVcmkoKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludmFsaWRBdHRyVmFsdWUgPSAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUygKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0VXJpKCksIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEF0dHJWYWx1ZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzLmdldFRleHQoIHIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZEF0dHJWYWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2hWYWx1ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRDcEZvclBvcyggciwgMSApLCBjLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmluc2VydEJlZm9yZSggX2RvYy5jcmVhdGVUZXh0Tm9kZSggdGV4dCApLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZSA9IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY3VycmVudE5vZGUgPSBfY3VycmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7Ci0KLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2NoID4gMCkKLSAgICAgICAgICAgICAgICB0ZXh0ID0gci5fdGV4dC5mZXRjaCggcy5nZXRDcEZvclBvcyggciwgcCApLCBjY2ggKTsKLQotICAgICAgICAgICAgaWYgKF9jdXJyZW50Tm9kZSAhPSBfZG9jKQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIF9kb2MuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZUNvbW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCAwICksIHMuZ2V0Q2NoVmFsdWUoKSApICksIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIDAgKSwgcy5nZXRDY2hWYWx1ZSgpICkgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBhIG5vZGUgZm9yIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBhIG5vZGUgZm9yIGEgYXR0cmlidXRlIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQlVHQlVHIC0gdGhlcmUgY291bGQgYmUgbmFtZXNwYWNlcyBwdXNoZWQgZm9yIHRoaXMgdGV4dCwgYnV0IG5vdAotICAgICAgICAgICAgLy8gc3VyZSBob3cgdG8gcmVwcmVzZW50IHRoZW0gaGVyZS4uLi4gIEkgc2hvdWxkIHJlYWxseSBwdXQgdGhlCi0gICAgICAgICAgICAvLyBmcmFnbWVudCBsb2dpYyBpbiB0aGUgYmFzZSBzYXZlciBhbmQgaGF2ZSB0aGUgYmFzZSBzYXZlcgotICAgICAgICAgICAgLy8gc3ludGhlc2l6ZSB3ZWxsIGZvcm1lZCBvdXRwdXQuLi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAotICAgICAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZVRleHROb2RlKAotICAgICAgICAgICAgICAgICAgICBfdGV4dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IF90ZXh0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogcyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByLl90ZXh0LmZldGNoKCBzLmdldENwRm9yUG9zKCByLCBwICksIGNjaCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiIgKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVDb21tZW50KAotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgMCApLCBzLmdldENjaFZhbHVlKCkgKSApLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIDAgKSwgcy5nZXRDY2hWYWx1ZSgpICkgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgX2RvYzsKLSAgICAgICAgTm9kZSAgICAgX2N1cnJlbnROb2RlOwotICAgICAgICBib29sZWFuICBfY3JlYXRlRG9jOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciAgX3RleHQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciAgX3NiOwotICAgIHByb3RlY3RlZCBib29sZWFuICAgICAgIF9za2lwQ29udGFpbmVyRmluaXNoOwotICAgIHByb3RlY3RlZCBMaW5rZWRIYXNoTWFwIF9hdHRyczsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hTZXQgX2F0dHJOYW1lczsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfaW5uZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSb290ICAgIF9yb290OwotICAgIHByaXZhdGUgZmluYWwgU3BsYXkgICBfdG9wOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyAgICBfdmVyc2lvbjsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIF93YW50RHVwQXR0cnM7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3dhbnRGcmFnVGVzdDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfbmVlZHNGcmFnOwotICAgIHByb3RlY3RlZCBRTmFtZSAgIF9mcmFnbWVudDsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgICBfZG9jRWxlbTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUU5hbWUgX3N5bnRoRWxlbTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIF9zYXZlTmFtZXNwYWNlc0ZpcnN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIF91c2VEZWZhdWx0TmFtZXNwYWNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9wcmV0dHlQcmludDsKLSAgICBwcml2YXRlIGludCAgICAgX3ByZXR0eUluZGVudDsKLSAgICBwcml2YXRlIGludCAgICAgX3ByZXR0eU9mZnNldDsKLQotICAgIHByaXZhdGUgU3BsYXkgICBfc3BsYXk7Ci0gICAgcHJpdmF0ZSBpbnQgICAgIF9wb3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wcmVQcm9jZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcG9zdFByb2Nlc3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wb3N0UG9wOwotICAgIHByaXZhdGUgU3BsYXkgICBfZW5kU3BsYXk7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBfbmFtZXNwYWNlU3RhY2s7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgX2N1cnJlbnRNYXBwaW5nOwotICAgIHByaXZhdGUgSGFzaE1hcCAgIF91cmlNYXA7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwICAgX3ByZWZpeE1hcDsKLSAgICBwcml2YXRlIGJvb2xlYW4gICBfZmlyc3RQdXNoOwotICAgIHByaXZhdGUgU3RyaW5nICAgIF9pbml0aWFsRGVmYXVsdFVyaTsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hNYXAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlczsKLSAgICBwcml2YXRlIFN0cmluZyAgX2ZpbHRlclByb2NpbnN0OwotICAgIHByaXZhdGUgTWFwICAgICBfc3VnZ2VzdGVkUHJlZml4ZXM7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nICBfbmV3TGluZTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiM2RlOC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NwbGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQ1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxNYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3BsYXkgZXh0ZW5kcyBHb29iZXJzCi17Ci0gICAgLy8KLSAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGtpbmQgb2YgYSBiYXNlIHRva2VuCi0gICAgLy8KLQotICAgIFNwbGF5ICggaW50IGtpbmQsIGJvb2xlYW4gaXMgKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBraW5kOwotCi0gICAgICAgIGlmIChpcykKLSAgICAgICAgICAgIF9iaXRzICs9IDB4ODsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFNwbGF5IGtpbmRzCi0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9DICAgICAgPSAgMDsgLy8gRE9DIG11c3QgYmUgMAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU4gICAgPSAgMTsgLy8gQkVHSU4gbXVzdCBiZSAxCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSICAgICA9ICAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCAgPSAgMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0NJTlNUID0gIDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBST09UICAgICA9ICA1OyAvLyBST09UIG11c3QgYmUgc2Vjb25kIHRvIGxhc3QKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORCAgICAgID0gIDY7IC8vIEVORCBtdXN0IGJlIGxhc3QKLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgZmluYWwgaW50IGdldEtpbmQgKCApIHsgcmV0dXJuIF9iaXRzICYgMHg3OyB9Ci0KLSAgICBmaW5hbCBib29sZWFuIGlzRG9jICAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gRE9DOyAgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzUm9vdCAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gUk9PVDsgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQmVnaW4gICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQkVHSU47ICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gRU5EOyAgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQXR0ciAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQVRUUjsgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQ29tbWVudCAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQ09NTUVOVDsgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gUFJPQ0lOU1Q7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzQ29udGFpbmVyICggKSB7IHJldHVybiBnZXRLaW5kKCkgPD0gQkVHSU47ICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzRmluaXNoICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPj0gUk9PVDsgICAgIH0KLQotICAgIGZpbmFsIGludCBnZXRDY2ggICAgICAgICAgICggKSB7IHJldHVybiBfY2NoOyAgICAgICAgICAgICAgfQotCi0gICAgZmluYWwgaW50IGdldENkb2NCZWdpbiAgICAgKCApIHsgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaExlZnQgICAgICAgKCApIHsgcmV0dXJuIF9jY2hMZWZ0OyAgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENkb2NCZWdpbkxlZnQgKCApIHsgcmV0dXJuIF9iaXRzID4+IDU7ICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaEFmdGVyICAgICAgKCApIHsgcmV0dXJuIF9jY2hBZnRlcjsgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaFZhbHVlICAgICAgKCApIHsgcmV0dXJuIF9jY2ggLSBfY2NoQWZ0ZXI7ICB9Ci0KLSAgICBRTmFtZSAgZ2V0TmFtZSAgKCApIHsgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyB9Ci0gICAgU3RyaW5nIGdldFVyaSAgICggKSB7IHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgfQotICAgIFN0cmluZyBnZXRMb2NhbCAoICkgeyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IH0KLQotICAgIC8vIEZvdXJ0aCBiaXQgaW4gX2JpdHMgaGFzIHNldmVyYWwgbWVhbmluZ3MsIGRlcGVuZGluZyBvbiBzcGxheSBraW5kCi0KLSAgICBmaW5hbCBib29sZWFuIGlzTm9ybWFsQXR0ciAoICkgeyByZXR1cm4gKF9iaXRzICYgMHhGKSA9PSAoMHgwICsgQVRUUik7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzWG1sbnMgICAgICAoICkgeyByZXR1cm4gKF9iaXRzICYgMHhGKSA9PSAoMHg4ICsgQVRUUik7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzTGVhZiAgICAgICAoICkgeyByZXR1cm4gKF9iaXRzICYgMHhGKSA9PSAoMHg4ICsgQkVHSU4pOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc0ZyYWdtZW50ICAgKCApIHsgcmV0dXJuIChfYml0cyAmIDB4RikgPT0gKDB4OCArIENPTU1FTlQpOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc1hzaUF0dHIgICAgKCApIHsgcmV0dXJuIGlzTm9ybWFsQXR0cigpICYmIGdldFVyaSgpLmVxdWFscyggX3hzaSApOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc1hzaU5pbCAgICAgKCApIHsgcmV0dXJuIGlzTm9ybWFsQXR0cigpICYmIGdldE5hbWUoKS5lcXVhbHMoX3hzaU5pbCApOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc1hzaVR5cGUgICAgKCApIHsgcmV0dXJuIGlzTm9ybWFsQXR0cigpICYmIGdldE5hbWUoKS5lcXVhbHMoIF94c2lUeXBlICk7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzVHlwZWFibGUgICAoICkgeyByZXR1cm4gaXNDb250YWluZXIoKSB8fCBpc05vcm1hbEF0dHIoKTsgfQotCi0gICAgZmluYWwgdm9pZCB0b2dnbGVJc0xlYWYgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpOwotICAgICAgICBfYml0cyBePSAweDg7Ci0gICAgfQotCi0gICAgZmluYWwgYm9vbGVhbiBpc1ZhbGlkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICgoX2JpdHMgJiAweDEwKSA9PSAwKSB8fCBpc1R5cGVhYmxlKCk7Ci0gICAgICAgIHJldHVybiAoX2JpdHMgJiAweDEwKSA9PSAwOwotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gaXNJbnZhbGlkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICgoX2JpdHMgJiAweDEwKSA9PSAwKSB8fCBpc1R5cGVhYmxlKCk7Ci0gICAgICAgIHJldHVybiAoX2JpdHMgJiAweDEwKSAhPSAwOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgdG9nZ2xlSXNJbnZhbGlkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLSAgICAgICAgX2JpdHMgXj0gMHgxMDsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGFkanVzdENjaCAoIGludCBkZWx0YSApCi0gICAgewotICAgICAgICBfY2NoICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaCA+PSAwOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgYWRqdXN0Q2NoQWZ0ZXIgKCBpbnQgZGVsdGEgKQotICAgIHsKLSAgICAgICAgX2NjaEFmdGVyICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaEFmdGVyID49IDA7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBhZGp1c3RDY2hMZWZ0ICggaW50IGRlbHRhICkKLSAgICB7Ci0gICAgICAgIF9jY2hMZWZ0ICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaExlZnQgPj0gMDsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGFkanVzdENkb2NCZWdpbkxlZnQgKCBpbnQgZCApCi0gICAgewotICAgICAgICBfYml0cyArPSBkICogMzI7Ci0gICAgICAgIGFzc2VydCBnZXRDZG9jQmVnaW5MZWZ0KCkgPj0gMDsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcGxheSBnZXRGaW5pc2hTcGxheSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotICAgICAgICByZXR1cm4gaXNMZWFmKCkgPyB0aGlzIDogKChDb250YWluZXIpIHRoaXMpLmdldEZpbmlzaCgpOwotICAgIH0KLQotICAgIGZpbmFsIGludCBnZXRQb3NBZnRlciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbmRQb3MoKSAtIGdldENjaEFmdGVyKCk7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IGdldFBvc0xlYWZFbmQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNMZWFmKCk7Ci0gICAgICAgIHJldHVybiAxICsgZ2V0Q2NoVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgZ2V0Q3BGb3JQb3MgKCBSb290IHIsIGludCBwICkKLSAgICB7Ci0gICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKLQotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGNwOwotCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgaXNMZWFmKCkKLSAgICAgICAgICAgICAgICA/IHAgLSAocCA8PSBnZXRQb3NMZWFmRW5kKCkgPyAxIDogMikgKyBjcAotICAgICAgICAgICAgICAgIDogcCAtIDEgKyBnZXRDY2hWYWx1ZSgpICsgY3A7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IGdldFBvc3RDY2ggKCBpbnQgcCApCi0gICAgewotICAgICAgICBhc3NlcnQgcCA+PSAwICYmIHAgPD0gZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBpc0xlYWYoKSAmJiBwIDw9IGdldFBvc0xlYWZFbmQoKQotICAgICAgICAgICAgICAgID8gZ2V0UG9zTGVhZkVuZCgpIC0gcAotICAgICAgICAgICAgICAgIDogZ2V0RW5kUG9zKCkgLSBwOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgX3hzaSA9Ci0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF9zY2hlbWEgPQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBfb3BlbkZyYWdVcmkgPQotICAgICAgICAiaHR0cDovL3d3dy5vcGVudXJpLm9yZy9mcmFnbWVudCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF94bWwxOTk4VXJpID0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF94bWxuc1VyaSA9Ci0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ci0KLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgX3hzaU5pbCAgPSBuZXcgUU5hbWUoIF94c2ksICJuaWwiICk7Ci0gICAgc3RhdGljIGZpbmFsIFFOYW1lIF94c2lUeXBlID0gbmV3IFFOYW1lKCBfeHNpLCAidHlwZSIgKTsKLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgX29wZW51cmlGcmFnbWVudCA9IG5ldyBRTmFtZSggX29wZW5GcmFnVXJpLCAiZnJhZ21lbnQiICk7Ci0gICAgc3RhdGljIGZpbmFsIFFOYW1lIF94bWxGcmFnbWVudCA9IG5ldyBRTmFtZSggIiIsICJ4bWwtZnJhZ21lbnQiICk7Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1htbEZyYWdtZW50ICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gX29wZW51cmlGcmFnbWVudC5lcXVhbHMoIG5hbWUgKSB8fCBfeG1sRnJhZ21lbnQuZXF1YWxzKCBuYW1lICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gYmVnaW5zV2l0aFhtbCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjaGFyIGNoOwotCi0gICAgICAgIGlmICgoKGNoID0gbmFtZS5jaGFyQXQoIDAgKSkgPT0gJ3gnIHx8IGNoID09ICdYJykgJiYKLSAgICAgICAgICAgICAgICAoKGNoID0gbmFtZS5jaGFyQXQoIDEgKSkgPT0gJ20nIHx8IGNoID09ICdNJykgJiYKLSAgICAgICAgICAgICAgICAoKGNoID0gbmFtZS5jaGFyQXQoIDIgKSkgPT0gJ2wnIHx8IGNoID09ICdMJykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgcG9zIG9mIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgc3BsYXkuICBUaGlzIGlzIG5vdAotICAgICAqIGdlbmVyYWxseSBhIHZhbGlkIHBvc2l0aW9uIHRvIGV4aXN0IGJlY2F1c2UgaW4gdGhlc2UgY2FzZXMsIEkKLSAgICAgKiBmb3JjZSB0aGUgcG9zaXRpb24gdG8gYmUgMCBvbiB0aGUgbmV4dCBzcGxheS4KLSAgICAgKi8KLQotICAgIGZpbmFsIGludCBnZXRFbmRQb3MgKCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWF4UG9zKCkgKyAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgbGFyZ2VzdCBwb3MgcG9zc2libGUgd2l0aG91dCBhY3R1YWxseSBiZWluZyBhdAotICAgICAqIHRoZSBlbmQgb2YgdGhlIHNwbGF5LgotICAgICAqLwotCi0gICAgZmluYWwgaW50IGdldE1heFBvcyAoICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBBVFRSICAgICA6Ci0gICAgICAgIGNhc2UgUk9PVCAgICAgOiByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBCRUdJTiAgICA6IHJldHVybiAoaXNMZWFmKCkgPyAxIDogMCkgKyBnZXRDY2goKTsKLSAgICAgICAgY2FzZSBET0MgICAgICA6Ci0gICAgICAgIGNhc2UgQ09NTUVOVCAgOgotICAgICAgICBjYXNlIFBST0NJTlNUIDoKLSAgICAgICAgY2FzZSBFTkQgICAgICA6IHJldHVybiBnZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBzcGxheSBraW5kICIgK2dldEtpbmQoKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaGl0ZVNwYWNlICggY2hhciBjaCApCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1doaXRlU3BhY2UgKCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBpbnQgbCA9IHMubGVuZ3RoKCk7Ci0KLSAgICAgICAgd2hpbGUgKCBsLS0gPiAwKQotICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoIHMuY2hhckF0KCBsICkpKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2hpdGVTcGFjZSAoIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgewotICAgICAgICBpbnQgbCA9IHNiLmxlbmd0aCgpOwotCi0gICAgICAgIHdoaWxlICggbC0tID4gMCkKLSAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCBzYi5jaGFyQXQoIGwgKSkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZmluYWwgYm9vbGVhbiBpc0FmdGVyV2hpdGVTcGFjZSAoIFJvb3QgciApCi0gICAgewotICAgICAgICBpbnQgY2NoQWZ0ZXIgPSBnZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGlmIChjY2hBZnRlciA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaW50IG9mZiA9Ci0gICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICByLmdldENwKCB0aGlzICkgKyBnZXRDY2goKSAtIGNjaEFmdGVyLCBjY2hBZnRlciApOwotCi0gICAgICAgIHdoaWxlICggY2NoQWZ0ZXItLSA+IDAgKQotICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoIHIuX3RleHQuX2J1Zlsgb2ZmICsgY2NoQWZ0ZXIgXSApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIHNldE5hbWUgKCBSb290IHIsIFFOYW1lIG5ld05hbWUgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKSB8fCBpc0F0dHIoKSB8fCBpc1Byb2NpbnN0KCk7Ci0KLSAgICAgICAgLy8gQlVHQlVHIC0gZGVhbCB3aXRoIHhzaTpuaWwgaGVyZSB0b28KLQotICAgICAgICBRTmFtZSBvbGROYW1lID0gZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmICghbmV3TmFtZS5lcXVhbHMoIG9sZE5hbWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgci5zdGFydENoYW5nZSgpOwotCi0gICAgICAgICAgICAoKFFOYW1lU3BsYXkpIHRoaXMpLmNoYW5nZU5hbWUoIG5ld05hbWUgKTsKLQotICAgICAgICAgICAgaWYgKCFpc1Byb2NpbnN0KCkgJiYgIWlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaXNBdHRyKCkgfHwgaXNCZWdpbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3hzaVR5cGUuZXF1YWxzKCBvbGROYW1lICkgfHwgX3hzaVR5cGUuZXF1YWxzKCBuZXdOYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmRpc2Nvbm5lY3RUeXBlcyggciApOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKF94c2lOaWwuZXF1YWxzKCBvbGROYW1lICkgfHwgX3hzaU5pbC5lcXVhbHMoIG5ld05hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuaW52YWxpZGF0ZU5pbCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgaXMgYW4gaW52YWxpZCBsZWFmLCB0aGVuIHJlZnJlc2ggaXQncyB2YWx1ZSBhbmQgcmV0dXJuIHRoZQotICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFkZGVkLgotICAgICAqLwotCi0gICAgZmluYWwgaW50IGVuc3VyZUNvbnRlbnRWYWxpZCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChpc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgIHJldHVybiB0LnZhbGlkYXRlQ29udGVudCggdGhpcywgdCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBFbnN1cmUgdGhhdCB0aGUgdmFsdWUgKEFUVFIsIENPTU1FTlQgYW5kIFBST0NJTlNUKSBpcyB2YWxpZC4gIFJlYWxseQotICAgICAgKiBvbmx5IGRvZXMgYW55dGhpbmcgZm9yIGF0dHJzLgotICAgICAgKi8KLQotICAgIGZpbmFsIHZvaWQgZW5zdXJlVmFsdWVWYWxpZCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKLQotICAgICAgICBpZiAoaXNJbnZhbGlkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGUgdCA9IHBlZWtUeXBlKCk7Ci0gICAgICAgICAgICB0LnZhbGlkYXRlVmFsdWUoIHRoaXMsIHQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhpcyBzcGxheSwgcmV0dXJuIHRoZSBUb2tlblR5cGUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uLgotICAgICAqLwotCi0gICAgZmluYWwgVG9rZW5UeXBlIGdldFRva2VuVHlwZSAoIGludCBwICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwID49IDAgJiYgcCA8PSBnZXRNYXhQb3MoKTsKLQotICAgICAgICAvLyBObyBuZWVkIHRvIHJldmFsaWRhdGUgdGV4dCB2YWx1ZSBoZXJlIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG5vIHBvcwotICAgICAgICAvLyB3aGljaCBjb3VsZCBleGlzdHMgd2hlbiB0aGlzIHNwbGF5IGlzIGludmFsaWQgd2hpY2ggY291bGQgYmUgb24KLSAgICAgICAgLy8gdGV4dC4KLQotICAgICAgICAvLyBGaXJzdCwgc2VlIGlmIHdlJ3JlIGluL2F0IHRoZSB0ZXh0IGFmdGVyIHRoZSBzcGxheQotCi0gICAgICAgIGlmIChwID49IGdldFBvc0FmdGVyKCkpCi0gICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLlRFWFQ7Ci0KLSAgICAgICAgc3dpdGNoICggZ2V0S2luZCgpICkKLSAgICAgICAgewotICAgICAgICBjYXNlIEFUVFIgOgotICAgICAgICAgICAgcmV0dXJuIGlzWG1sbnMoKSA/IFRva2VuVHlwZS5OQU1FU1BBQ0UgOiBUb2tlblR5cGUuQVRUUjsKLQotICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgICAgIGlmIChwID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZS5TVEFSVDsKLQotICAgICAgICAgICAgYXNzZXJ0IGlzTGVhZigpOwotCi0gICAgICAgICAgICByZXR1cm4gcCA9PSBnZXRQb3NMZWFmRW5kKCkgPyBUb2tlblR5cGUuRU5EIDogVG9rZW5UeXBlLlRFWFQ7Ci0KLSAgICAgICAgY2FzZSBST09UICAgICA6IHJldHVybiBUb2tlblR5cGUuRU5ERE9DOwotICAgICAgICBjYXNlIERPQyAgICAgIDogcmV0dXJuIFRva2VuVHlwZS5TVEFSVERPQzsKLSAgICAgICAgY2FzZSBDT01NRU5UICA6IHJldHVybiBUb2tlblR5cGUuQ09NTUVOVDsKLSAgICAgICAgY2FzZSBQUk9DSU5TVCA6IHJldHVybiBUb2tlblR5cGUuUFJPQ0lOU1Q7Ci0gICAgICAgIGNhc2UgRU5EICAgICAgOiByZXR1cm4gVG9rZW5UeXBlLkVORDsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICsgZ2V0S2luZCgpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYXVzZSB0aGlzIHNwbGF5IHRvIGJlY29tZSBhIGxlYWYuICBUaGlzIGRvZXMgbm90IGxvZ2ljYWxseQotICAgICAqIGFsdGVyIHRoZSBkb2N1bWVudCwgYnV0IGRvZXMgYWx0ZXIgdGhlIHBoeXNpY2FsIHNwbGF5IHRyZWUgd2hpY2gKLSAgICAgKiBkZW1hbmRzIHRoYXQgSSBpc3N1ZSBhIGNoYW5nZSBub3RpY2UuCi0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIGZvbGlhdGUgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKTsKLSAgICAgICAgYXNzZXJ0ICFpc0xlYWYoKTsKLQotICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSB0aGlzOwotICAgICAgICBTcGxheSBlID0gYi5nZXRGaW5pc2goKTsKLQotICAgICAgICBhc3NlcnQgYi5uZXh0Tm9uQXR0clNwbGF5KCkgPT0gZTsKLSAgICAgICAgYXNzZXJ0IGIuX2VuZCA9PSBlOwotICAgICAgICBhc3NlcnQgZS5pc0VuZCgpOwotICAgICAgICBhc3NlcnQgIWIuaXNMZWFmKCk7Ci0KLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOwotCi0gICAgICAgIGludCBjY2hCZWZvcmUgPSBnZXRDY2goKTsKLQotICAgICAgICBlLnNhdmVUZXh0QWZ0ZXIoIHIgKTsKLQotICAgICAgICBiLl9lbmQgPSBudWxsOwotICAgICAgICBiLnRvZ2dsZUlzTGVhZigpOwotCi0gICAgICAgIGIuYWRqdXN0Q2NoQWZ0ZXIoIC0gY2NoQmVmb3JlICk7Ci0KLSAgICAgICAgLy8gTW92ZSB0aGUgZ29vYmVycyBmcm9tIHRoZSBlbmQgdG8gdGhlIGJlZ2luCi0KLSAgICAgICAgR29vYmVyIG5leHRHb29iZXI7Ci0gICAgICAgIGZvciAoIEdvb2JlciBnID0gZS5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gZS5uZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBnLmdldFBvcygpID09IDA7Ci0gICAgICAgICAgICBnLnNldCggdGhpcywgY2NoQmVmb3JlICsgMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOwotCi0gICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOwotCi0gICAgICAgICAgICBpZiAoZ3AgPiBjY2hCZWZvcmUgKyAxKQotICAgICAgICAgICAgICAgIGcuc2V0KCB0aGlzLCBncCArIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGUucmVtb3ZlU3BsYXkoIHIgKTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGRlZm9saWF0ZSAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNMZWFmKCk7Ci0KLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOwotCi0gICAgICAgIC8vIENhbGxlciBtdXN0IGVuc3VyZSBsZWFmIGlzIHZhbGlkCi0gICAgICAgIGFzc2VydCBpc1ZhbGlkKCk7Ci0KLSAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdGhpczsKLQotICAgICAgICBpbnQgcG9zTGVhZkVuZCA9IGdldFBvc0xlYWZFbmQoKTsKLSAgICAgICAgaW50IGNjaEFmdGVyID0gZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgaW50IGNjaFZhbHVlID0gZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICBTcGxheSBhID0gdGhpczsKLQotICAgICAgICBpbnQgY2NoQXR0ciA9IDA7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IG5leHRTcGxheSgpIDsgdC5pc0F0dHIoKSA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2NoQXR0ciArPSB0LmdldENjaCgpOwotICAgICAgICAgICAgYSA9IHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByLmluc2VydFNwbGF5KCBiLl9lbmQgPSBuZXcgRW5kKCAoQmVnaW4pIHRoaXMgKSwgYSApOwotCi0gICAgICAgIGIudG9nZ2xlSXNMZWFmKCk7Ci0KLSAgICAgICAgYi5hZGp1c3RDY2hBZnRlciggY2NoVmFsdWUgLSBjY2hBZnRlciApOwotICAgICAgICBiLl9lbmQuYWRqdXN0Q2NoQWZ0ZXIoIGNjaEFmdGVyICk7Ci0KLSAgICAgICAgci51cGRhdGVDY2goIGIsIC0gY2NoQWZ0ZXIgKTsKLSAgICAgICAgci51cGRhdGVDY2goIGIuX2VuZCwgY2NoQWZ0ZXIgKTsKLQotICAgICAgICBpZiAoY2NoQXR0ciA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIGIgKTsKLQotICAgICAgICAgICAgci5fdGV4dC5tb3ZlKAotICAgICAgICAgICAgICAgIGNwICsgY2NoVmFsdWUgKyBjY2hBZnRlciArIGNjaEF0dHIsCi0gICAgICAgICAgICAgICAgci5fdGV4dCwgY3AgKyBjY2hWYWx1ZSwgY2NoQWZ0ZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdvb2JlciBuZXh0R29vYmVyOwotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwb3NMZWFmRW5kKQotICAgICAgICAgICAgICAgIGcuc2V0KCBiLl9lbmQsIGdwIC0gcG9zTGVhZkVuZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSB0ZXh0IGFmdGVyICp0aGlzKiBzcGxheS4KLSAgICAgKiBObyB2YWxpZGF0aW9uIGlzIGRvbmUsIGNhbGxlciBtdXN0IGRvIHRoYXQKLSAgICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVUZXh0QWZ0ZXIgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHIgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKLSAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKSAmJiAhaXNBdHRyKCk7Ci0KLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOwotCi0gICAgICAgIGludCBjY2hUZXh0QWZ0ZXIgPSBnZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGlmIChjY2hUZXh0QWZ0ZXIgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbnQgY3BUZXh0QWZ0ZXIgPSByLmdldENwKCB0aGlzICkgKyBnZXRDY2goKSAtIGNjaFRleHRBZnRlcjsKLSAgICAgICAgaW50IHBvc1RleHRBZnRlciA9IGdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgYWRqdXN0Q2NoQWZ0ZXIoIC0gY2NoVGV4dEFmdGVyICk7Ci0KLSAgICAgICAgci51cGRhdGVDY2goIHRoaXMsIC0gY2NoVGV4dEFmdGVyICk7Ci0KLSAgICAgICAgci5fdGV4dC5yZW1vdmUoIGNwVGV4dEFmdGVyLCBjY2hUZXh0QWZ0ZXIgKTsKLQotICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOwotCi0gICAgICAgICAgICBpbnQgayA9IGcuZ2V0S2luZCgpOwotCi0gICAgICAgICAgICBpZiAoZy5nZXRQb3MoKSA+PSBwb3NUZXh0QWZ0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGsgPT0gQU5OT1RBVElPTikKLSAgICAgICAgICAgICAgICAgICAgZy5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoayA9PSBDVVJTT1IpCi0gICAgICAgICAgICAgICAgICAgIGcuc2V0KCBuZXh0U3BsYXkoKSwgMCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmZXJzIHRoZSB0ZXh0IGFmdGVyIHRoaXMgIm5vZGUiIHRvIGJlIGFmdGVyIHRoZSAibm9kZSIgYmVmb3JlIGl0LgotICAgICAqIE5vIHR5cGUgaW52YWxpZGF0aW9uIGlzIGRvbmUgaGVyZS4gIE5vIGNoZWNraW5nIGZvciBpc0ludmFsaWQgaXMgbmVlZGVkCi0gICAgICogZWl0aGVyLiAgTm8gdmFsaWRhdGlvbiBpcyBkb25lLCBjYWxsZXIgbXVzdCBkbyB0aGF0LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2F2ZVRleHRBZnRlciAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgciAhPSBudWxsOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotCi0gICAgICAgIC8vIENhbGxlciBtdXN0IGluaXRpYXRlIGNoYW5nZQotICAgICAgICBhc3NlcnQgci52YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQoKTsKLQotICAgICAgICBTcGxheSBlbmRUZXh0ID0gdGhpczsKLQotICAgICAgICBpZiAoaXNCZWdpbigpICYmICFpc0xlYWYoKSkKLSAgICAgICAgICAgIGVuZFRleHQgPSBnZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgIGludCBjY2hFbmRUZXh0ID0gZW5kVGV4dC5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGlmIChjY2hFbmRUZXh0ID09IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpICYmICFpc0RvYygpICYmICFpc0F0dHIoKTsKLQotICAgICAgICBTcGxheSBnZXRzVGV4dCA9IHByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgaW50IGdldHNUZXh0TGFzdFBvcyA9IGdldHNUZXh0LmdldEVuZFBvcygpOwotCi0gICAgICAgIGludCBjcEdldHNUZXh0ID0gci5nZXRDcCggZ2V0c1RleHQgKSArIGdldHNUZXh0LmdldENjaCgpOwotICAgICAgICBpbnQgY3BFbmRUZXh0ID0gci5nZXRDcCggZW5kVGV4dCApICsgZW5kVGV4dC5nZXRDY2goKSAtIGNjaEVuZFRleHQ7Ci0KLSAgICAgICAgZ2V0c1RleHQuYWRqdXN0Q2NoQWZ0ZXIoIGNjaEVuZFRleHQgKTsKLSAgICAgICAgZW5kVGV4dC5hZGp1c3RDY2hBZnRlciggLSBjY2hFbmRUZXh0ICk7Ci0KLSAgICAgICAgci51cGRhdGVDY2goIGdldHNUZXh0LCBjY2hFbmRUZXh0ICk7Ci0gICAgICAgIHIudXBkYXRlQ2NoKCBlbmRUZXh0LCAtIGNjaEVuZFRleHQgKTsKLQotICAgICAgICBhc3NlcnQgY3BHZXRzVGV4dCA8PSBjcEVuZFRleHQ7Ci0KLSAgICAgICAgaWYgKGNwR2V0c1RleHQgIT0gY3BFbmRUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByLl90ZXh0Lmluc2VydCggY3BHZXRzVGV4dCwgci5fdGV4dCwgY3BFbmRUZXh0LCBjY2hFbmRUZXh0ICk7Ci0gICAgICAgICAgICByLl90ZXh0LnJlbW92ZSggY3BFbmRUZXh0ICsgY2NoRW5kVGV4dCwgY2NoRW5kVGV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHBvc0VuZFRleHQgPSBlbmRUZXh0LmdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgR29vYmVyIG5leHRHb29iZXI7Ci0gICAgICAgIGZvciAoIEdvb2JlciBnID0gZW5kVGV4dC5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gZW5kVGV4dC5uZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwb3NFbmRUZXh0KQotICAgICAgICAgICAgICAgIGcuc2V0KCBnZXRzVGV4dCwgZ2V0c1RleHRMYXN0UG9zICsgZ3AgLSBwb3NFbmRUZXh0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICByZXR1cm4gY2NoRW5kVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIHNwbGF5LCBhbGwgb2YgaXRzIGNvbnRlbnQgYW5kIGF0dHJpYnV0ZXMuICBJZiBubyBkZXN0aW5hdGlvbgotICAgICAqIGlzIHByb3ZpZGVkLCB0aGVuIG9ubHkgYSByZW1vdmFsIGlzIHBlcmZvcm1lZC4KLSAgICAgKi8KLQotICAgIGZpbmFsIHZvaWQgbW92ZSAoCi0gICAgICAgIFJvb3QgciwgUm9vdCByRHN0LCBTcGxheSBzRHN0LCBpbnQgcERzdCwgYm9vbGVhbiBpbnZhbGlkYXRlICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCByICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCAhaXNEb2MoKSAmJiAhaXNGaW5pc2goKTsKLQotICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IChyICE9IHJEc3QgfHwgIXNEc3QuYmV0d2VlbiggciwgcERzdCwgdGhpcyApICk7Ci0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgc0RzdCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IFJvb3QuZHYgPiAwIHx8IHNEc3QuZ2V0Um9vdFNsb3coKSA9PSByRHN0OwotICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IHBEc3QgPj0gMCAmJiBwRHN0IDwgc0RzdC5nZXRFbmRQb3MoKTsKLQotICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgIHJEc3QgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICh0cnVlIHx8IGNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIDAsIHNEc3QsIHBEc3QsIGZhbHNlICkpOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICBpZiAockRzdCAhPSBudWxsKQotICAgICAgICAgICAgckRzdC5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIC8vIFRoZSB0ZXh0IGFmdGVyIHRoZSBsb2dpY2FsIGVudGl0eSB0byBtb3ZlL3JlbW92ZSBpcyBub3QgcGFydCBvZgotICAgICAgICAvLyB0aGlzIG9wZXJhdGlvbi4gIFRyYW5zZmVyIGl0IHRvIGEgcHJldmlvdXMgc3BsYXkuICBObyBuZWVkIHRvCi0gICAgICAgIC8vIGZyZXQgYWJvdXQgaW52YWxpZGl0eSBoZXJlLCBiZWNhdXNlIGl0J3MgdGV4dCAqYWZ0ZXIqLgotCi0gICAgICAgIGludCBjY2hTYXZlZCA9IHNhdmVUZXh0QWZ0ZXIoIHIgKTsKLQotICAgICAgICAvLyBJZiBhbnkgdGV4dCB3YXMgc2F2ZWQsIEkgbmVlZCB0byBtb3ZlIHRoZSBjdXJzb3JzIGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgLy8gb2YgdGhpcyBzcGxheSB0byB3aGVyZSB0aGUgdGV4dCB3YXMgc2F2ZWQuICBJIGRvIHRoaXMgYmVjYXVzZSB0aGlzCi0gICAgICAgIC8vIGNvbnRlbnQgaXMgZ29pbmcgYXdheSBhbmQgY3Vyc29ycyBuZWVkIHRvIGNvbGxhcHNlIHRvIHRoZSByaWdodAotICAgICAgICAvLyBsb2NhdGlvbiB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBiZWZvcmUgdGhlIGFmdGVyIHRleHQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vIG5lZWQgdG8gZGVhbCB3aXRoIGdvb2JlcnMgb3RoZXIgdGhhbiBjdXJzb3IgYmVjYXVzZSBhbm5vdGF0aW9ucwotICAgICAgICAvLyBhbmQgdHlwZXMgd2lsbCBiZSBkZWFsdCB3aXRoIGFwcHJvcHJpYXRlbHkgbGF0ZXIuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFsc28sIHVwZGF0ZSB0aGUgdGFyZ2V0IGlmIGl0IHdhcyBpbiB0aGUgbW92ZWQgdGV4dCEKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVE9ETyAtIGlmIG1vdmluZyB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLQotICAgICAgICBpZiAoY2NoU2F2ZWQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBnb3RUZXh0ID0gcHJldk5vbkF0dHJTcGxheSgpOwotCi0gICAgICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOwotCi0gICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IENVUlNPUikKLSAgICAgICAgICAgICAgICAgICAgZy5zZXQoIGdvdFRleHQsIGdvdFRleHQuZ2V0RW5kUG9zKCkgLSBjY2hTYXZlZCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAockRzdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IGhhZFRleHQgPQotICAgICAgICAgICAgICAgICAgICBpc0JlZ2luKCkgJiYgIWlzTGVhZigpID8gZ2V0RmluaXNoU3BsYXkoKSA6IHRoaXM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc0RzdCA9PSBoYWRUZXh0ICYmIHBEc3QgPj0gaGFkVGV4dC5nZXRFbmRQb3MoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNEc3QgPSBnb3RUZXh0OwotCi0gICAgICAgICAgICAgICAgICAgIHBEc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ290VGV4dC5nZXRFbmRQb3MoKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNjaFNhdmVkIC0gKHBEc3QgLSBoYWRUZXh0LmdldEVuZFBvcygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHNEc3QgIT0gdGhpczsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBzcGxheSwgdXAgdG8gd2hpY2gsIEkgd2lsbCByZW1vdmUKLQotICAgICAgICBTcGxheSBsYXN0ID0KLSAgICAgICAgICAgIGlzQmVnaW4oKSA/IGdldEZpbmlzaFNwbGF5KCkubmV4dE5vbkF0dHJTcGxheSgpIDogbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLQotICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgaW50IGNwID0gci5nZXRDcCggdGhpcyApOwotICAgICAgICBpbnQgY2NoID0gMDsKLQotICAgICAgICBmb3IgKCBTcGxheSBzID0gdGhpcyA7IHMgIT0gbGFzdCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSSdtIGdvaW5nIHRvIGJsb3cgYXdheSB0aGUgVHlwZXMgaGVyZSwgbWFrZSBzdXJlIEkgaGF2ZQotICAgICAgICAgICAgLy8gYWxsIHRoZSB0ZXh0LgotCi0gICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlVmFsdWVWYWxpZCgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNjaCArPSBzLmdldENjaCgpOwotCi0gICAgICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5leHRHb29iZXIgPSBzLm5leHRHb29iZXIoIGcgKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoIGcuZ2V0S2luZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFIDoKLSAgICAgICAgICAgICAgICAgICAgZy5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBBTk5PVEFUSU9OIDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJEc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggckRzdCApOyAvLyBQb3RlbnRpYWwgbW92ZSB0byBhIG5ldyB0cmVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDVVJTT1IgOgotICAgICAgICAgICAgICAgICAgICBnLnNldCggbGFzdCwgMCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHNwbGF5cyBhbmQgdGhlIHRleHQuICBVbmZvcnR1bmF0ZWx5LCBJIG5lZWQgdG8gcmVtb3ZlCi0gICAgICAgIC8vIHRoZSB0ZXh0IGhlcmUuICBJIGNhbid0IHRoaW5rIG9mIGEgd2F5IHRvIGtlZXAgdGhlIHRyZWUgdmFsaWQgYW5kCi0gICAgICAgIC8vIGhhdmUgdGhlIHRleHQgbW92ZWQgaW4gb25lIGNvcHkgLi4uLiBDYW4geW91PwotCi0gICAgICAgIFNwbGF5IHNSZW1vdmVkID0gci5yZW1vdmVTcGxheXMoIHRoaXMsIGxhc3QgKTsKLQotICAgICAgICBTcGxheSBmaXJzdCA9Ci0gICAgICAgICAgICBzUmVtb3ZlZC5fbGVmdFNwbGF5ID09IG51bGwgPyBzUmVtb3ZlZCA6IHNSZW1vdmVkLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgaWYgKGZpcnN0LmlzQmVnaW4oKSkKLSAgICAgICAgICAgICgoQmVnaW4pIGZpcnN0KS5fY29udGFpbmVyID0gbnVsbDsKLQotICAgICAgICBjaGFyW10gdGV4dFJlbW92ZWQgPSByRHN0ID09IG51bGwgfHwgY2NoID09IDAgPyBudWxsIDogbmV3IGNoYXIgWyBjY2ggXTsKLQotICAgICAgICByLl90ZXh0LnJlbW92ZSggY3AsIGNjaCwgdGV4dFJlbW92ZWQsIDAgKTsKLQotICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgaWYgKHJEc3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc0RzdC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgckRzdCwgcERzdCwgc1JlbW92ZWQsIHRleHRSZW1vdmVkLCAwLCBjY2gsIGludmFsaWRhdGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnZhbGlkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBjb250YWluZXIucGVla1R5cGUoKTsKLQotICAgICAgICAgICAgaWYgKHBhcmVudFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlLmludmFsaWRhdGVFbGVtZW50KCBjb250YWluZXIsIGxhc3QgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0F0dHIoKSAmJiBpc1hzaU5pbCgpKQotICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlLmludmFsaWRhdGVOaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlKCk7Ci0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgckRzdC52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhpcyBzcGxheSwgYWxsIG9mIGl0cyBjb250ZW50IGFuZCBhdHRyaWJ1dGVzLgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCByZW1vdmUgKCBSb290IHIsIGJvb2xlYW4gaW52YWxpZGF0ZSApCi0gICAgewotICAgICAgICBtb3ZlKCByLCBudWxsLCBudWxsLCAwLCBpbnZhbGlkYXRlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNvbXBsYWluICggU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBpZiB0aGUgaW5zZXJ0aW9uIG9mIGEgIm5vZGUiIGludG8gdGhlIGRlc3RpbmF0aW9uIGlzIGFsbG93ZWQuCi0gICAgICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHNvdXJjZSBpcyBhIHNpbmdsZSBwaWVjZSBvZiBjb250ZW50cyAobGlrZSBhIG5vZGUpLgotICAgICAqIEZyYWdtZW50cyBhcmUgc3RyaW5ncyBvZiBjb250ZW50LCBub3QgY29udGFpbmVkLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgKiB2YWxpZGF0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KLSAgICAgKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3JjIHRvIGNvcHkgaXMgY2hhcmFjdGVycyAocG90ZW50aWFsbHkgMCBjaGFycyB0b28pCi0gICAgICovCi0KLSAgICBmaW5hbCBib29sZWFuIGNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkgKAotICAgICAgICBpbnQgcCwgU3BsYXkgc0RzdCwgaW50IHBEc3QsIGJvb2xlYW4gZW5kT2sgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHAgPj0gMDsKLSAgICAgICAgYXNzZXJ0IHAgPCBnZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHBEc3QgPj0gMDsKLSAgICAgICAgYXNzZXJ0IHBEc3QgPCBzRHN0LmdldEVuZFBvcygpOwotCi0gICAgICAgIGJvb2xlYW4gc3JjQ2hhcnMgPSBmYWxzZTsKLQotICAgICAgICBpZiAocCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZW5kT2sgJiYgaXNMZWFmKCkgJiYgcCA9PSBnZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgY29tcGxhaW4oICJDYW4ndCBtb3ZlL2NvcHkvaW5zZXJ0IGFuIGVuZCB0b2tlbi4iICk7Ci0KLSAgICAgICAgICAgIHNyY0NoYXJzID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gdmFsaWQgdGV4dCB0YXJnZXQgd2lsbCBiZSB0ZXN0ZWQgZm9yIGZ1cnRoZXIgZG93bgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzRG9jKCkpCi0gICAgICAgICAgICAgICAgY29tcGxhaW4oICJDYW4ndCBtb3ZlL2NvcHkvaW5zZXJ0IGEgd2hvbGUgZG9jdW1lbnQuIiApOwotCi0gICAgICAgICAgICBpZiAoaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVuZE9rKQotICAgICAgICAgICAgICAgICAgICBjb21wbGFpbiggIkNhbid0IG1vdmUvY29weS9pbnNlcnQgYW4gZW5kIHRva2VuLiIgKTsKLQotICAgICAgICAgICAgICAgIHNyY0NoYXJzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlzRnJhZ21lbnQoKSkKLSAgICAgICAgICAgICAgICBzcmNDaGFycyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocERzdCA9PSAwICYmIHNEc3QuaXNEb2MoKSkKLSAgICAgICAgICAgIGNvbXBsYWluKCAiQ2FuJ3QgaW5zZXJ0IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LiIgKTsKLQotICAgICAgICBpZiAocCA+IDAgJiYgc0RzdC5pc0F0dHIoKSkKLSAgICAgICAgICAgIGNvbXBsYWluKCAiQ2FuJ3QgaW5zZXJ0IHRleHQgYmVmb3JlIGFuIGF0dHJpYnV0ZS4iICk7Ci0KLSAgICAgICAgaWYgKGlzQXR0cigpICYmIHBEc3QgPiAwICYmICghc0RzdC5pc0NvbnRhaW5lcigpIHx8IHBEc3QgIT0gMSkpCi0gICAgICAgICAgICBjb21wbGFpbiggIkNhbid0IGluc2VydCBhbiBhdHRyaWJ1dGUgaW4gdGV4dC4iICk7Ci0KLSAgICAgICAgaWYgKHAgPD0gMCAmJiBwRHN0IDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzT2sgPSBzRHN0LmlzQXR0cigpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFpc09rKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgdCA9IHNEc3QucHJldk5vbkF0dHJTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzQ29udGFpbmVyKCkgJiYgdC5nZXRDY2hBZnRlcigpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzT2spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wbGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBtb3ZlL2NvcHkvaW5zZXJ0IGF0dHJpYnV0ZSBhZnRlciBhbm90aGVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG9yIHN0YXJ0IHRva2VuLiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzRHN0LmlzQXR0cigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBsYWluKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbW92ZS9jb3B5L2luc2VydCBhIG5vbi1hdHRyaWJ1dGUgYmVmb3JlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImFuIGF0dHJpYnV0ZS4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3JjQ2hhcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGluIHRoaXMgc3BsYXkgYXQgcG9zaXRpb24gcCB3aG9zZSByb290IGlzIHIgdGhlIHNwbGF5cyByb290SW5zZXJ0Ci0gICAgICogd2l0aCB0ZXh0IHR4dCBhdCBvZmZzZXQgY3BUeHQgYW5kIGxlbmd0aCBjY2hUeHQKLSAgICAgKi8KLQotICAgIGZpbmFsIHZvaWQgaW5zZXJ0ICgKLSAgICAgICAgUm9vdCByLCBpbnQgcCwgU3BsYXkgcm9vdEluc2VydCwKLSAgICAgICAgT2JqZWN0IHR4dCwgaW50IG9mZlR4dCwgaW50IGNjaFR4dCwKLSAgICAgICAgYm9vbGVhbiBpbnZhbGlkYXRlICkKLSAgICB7Ci0vLyBCVUdCVUcgLSB3aGF0IGlzIGEgbmV3IHhzaXR5cGUgYXR0ciBpcyBpbnNlcnRlZD8gLS0gbXVzdCBkaXNjb25uZWN0IHR5cGVzCi0KLSAgICAgICAgYXNzZXJ0IHAgPCBnZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IGNjaFR4dCA+PSAwOwotICAgICAgICBhc3NlcnQgcm9vdEluc2VydCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcm9vdEluc2VydC5fcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJvb3RJbnNlcnQuZ2V0Q2NoTGVmdCgpICsgcm9vdEluc2VydC5nZXRDY2goKSA9PSBjY2hUeHQ7Ci0KLSAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBhIHRyZWUgaGVyZS4gIEdldCB0aGUgZmlyc3Qgc3BsYXkgaW4gdGhlIHRyZWUKLSAgICAgICAgLy8gSXQgbXVzdCBlaXRoZXIgYmUgYXQgdGhlIHJvb3Qgb3IganVzdCB0byB0aGUgbGVmdCBvZiB0aGUgcm9vdC4KLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgImNsYXNzaWMiIGRvZyBsZWcgcGF0dGVybiBJIHVzZSB0byBwYXNzIHNwbGF5IHRyZWVzLgotCi0gICAgICAgIGFzc2VydAotICAgICAgICAgICAgcm9vdEluc2VydC5fbGVmdFNwbGF5ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICByb290SW5zZXJ0Ll9sZWZ0U3BsYXkuX2xlZnRTcGxheSA9PSBudWxsOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICBTcGxheSBzSW5zZXJ0ID0KLSAgICAgICAgICAgIHJvb3RJbnNlcnQuX2xlZnRTcGxheSA9PSBudWxsID8gcm9vdEluc2VydCA6IHJvb3RJbnNlcnQuX2xlZnRTcGxheTsKLQotICAgICAgICBhc3NlcnQgIXNJbnNlcnQuaXNEb2MoKSAmJiAhc0luc2VydC5pc0ZpbmlzaCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotCi0gICAgICAgIC8vIFdoZW4gdGhpcyBtZW1iZXIgaXMgY2FsbGVkLCB3ZSBiZXR0ZXIgYmUgYWJsZSB0byBkbyB0aGUgaW5zZXJ0LgotCi0gICAgICAgIGFzc2VydCB0cnVlIHx8IHNJbnNlcnQuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggMCwgdGhpcywgcCwgZmFsc2UgKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGZyYWdtZW50LCB0aGVyZSBiZXR0ZXIgYmUgdGV4dCBpbiBpdAotCi0gICAgICAgIGFzc2VydCAhc0luc2VydC5pc0ZyYWdtZW50KCkgfHwgc0luc2VydC5nZXRDY2goKSA+IDA7Ci0KLSAgICAgICAgLy8KLQotICAgICAgICBTcGxheSBzID0gdGhpczsKLQotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc0luc2VydC5nZXRSb290U2xvdygpID09IG51bGw7Ci0KLSAgICAgICAgU3BsYXkgc09yaWcgPSBudWxsOwotICAgICAgICBpbnQgICBwT3JpZyA9IDA7Ci0gICAgICAgIGludCAgIGNjaEJ5cGFzc2VkID0gMDsKLQotICAgICAgICAvLyBQcmVwYXJlIGZvciBpbnNlcnRpbmcgaW50byB0aGUgbWlkZGxlIG9mIGEgc3BsYXkKLQotICAgICAgICBpZiAocCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBwbGU7Ci0KLSAgICAgICAgICAgIGlmIChzLmlzTGVhZigpICYmIHAgPD0gKHBsZSA9IHMuZ2V0UG9zTGVhZkVuZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBwbGUgPT0gMTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY2NoVmFsaWQgPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHAgKz0gY2NoVmFsaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHBsZSArPSBjY2hWYWxpZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRGaW5pc2hTcGxheSgpID09IHM7Ci0KLSAgICAgICAgICAgICAgICBkZWZvbGlhdGUoIHIgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldEZpbmlzaFNwbGF5KCkgIT0gczsKLQotICAgICAgICAgICAgICAgIGlmIChwID09IHBsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBnZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBwID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzLmluc2VydCggciwgcCwgcm9vdEluc2VydCwgdHh0LCBvZmZUeHQsIGNjaFR4dCwgaW52YWxpZGF0ZSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBZb3UgY2FuIGNvcHkgYW4gYXR0ciB0byBhIGRzdCB3aGVyZSBpdCBpcyB0aGUgZmlyc3QgYXR0ciwgb3IKLSAgICAgICAgICAgIC8vIGFmdGVyIGFsbCBwcmUtZXhpc2l0bmcgYXR0cnMuICBUaGlzIHRoZXNlIGNhc2VzLCBwID09IDEgb24KLSAgICAgICAgICAgIC8vIHRoZSBiZWdpbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBtb3ZlIHRleHQgbGF0ZXIuCi0KLSAgICAgICAgICAgIGFzc2VydCAhc0luc2VydC5pc0F0dHIoKSB8fCAocCA9PSAxICYmIHMuaXNDb250YWluZXIoKSk7Ci0KLSAgICAgICAgICAgIHNPcmlnID0gczsKLSAgICAgICAgICAgIHBPcmlnID0gcDsKLSAgICAgICAgICAgIGNjaEJ5cGFzc2VkID0gZ2V0RW5kUG9zKCkgLSBwOwotCi0gICAgICAgICAgICBzID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICBwID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBwID09IDA7Ci0gICAgICAgIGFzc2VydCAhcy5pc0RvYygpOwotCi0gICAgICAgIC8vIEdldCB0aGUgY29udGFpbmVyIHJlY2VpdmluZyBhbGwgb2YgdGhpcwotCi0gICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAvLyBSdW4gb3ZlciB0aGUgdG9wIGxldmVsIGNvbnRlbnQsIHBhcmVudGluZyBhbnkgQkVHSU5TLiAgQWxzbywKLSAgICAgICAgLy8gY2hhcmFjdGVyaXplIHRoZSBjb250ZW50IGJlaW5nIGluc2VydGVkIGZvciBmdXR1cmUgaW52YWxpZGF0aW9uLgotICAgICAgICAvLyBPbmx5IGZyYWdtZW50cyB3aWxsIGhhdmUgbXVsdGlwbGUgdG9wIGxldmVsIGJlZ2lucy4KLQotICAgICAgICBib29sZWFuIGluc2VydGluZ0VsZW1lbnRzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaW5zZXJ0aW5nVGV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGluc2VydGluZ05pbEF0dHIgPSBmYWxzZTsKLSAgICAgICAgU3BsYXkgICBpbnNlcnRpbmdGcmFnbWVudCA9IG51bGw7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IHNJbnNlcnQgOyB0ICE9IG51bGwgOyB0ID0gdC5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0LmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnNlcnRpbmdFbGVtZW50cyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSB0OwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGIuX2NvbnRhaW5lciA9PSBudWxsOwotCi0gICAgICAgICAgICAgICAgYi5fY29udGFpbmVyID0gYzsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0LmlzRnJhZ21lbnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaW5zZXJ0aW5nRnJhZ21lbnQgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnNlcnRpbmdGcmFnbWVudCA9IHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0LmlzWHNpTmlsKCkpCi0gICAgICAgICAgICAgICAgaW5zZXJ0aW5nTmlsQXR0ciA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICh0LmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgICAgIGluc2VydGluZ1RleHQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93LCBpbnNlcnQgdGhlIHRleHQgKGlmIGFueSkKLQotICAgICAgICByLl90ZXh0Lmluc2VydCggci5nZXRDcCggcyApLCB0eHQsIG9mZlR4dCwgY2NoVHh0ICk7Ci0KLSAgICAgICAgLy8gSW5zZXJ0IHRoZSB0cmVlCi0KLSAgICAgICAgci5pbnNlcnRTcGxheSggcm9vdEluc2VydCwgcy5wcmV2U3BsYXkoKSApOwotCi0gICAgICAgIC8vIElmIHRoZSBmaXJzdCBzcGxheSB0byBpc25lcnQgd2FzIGEgZnJhZ21lbnQsIHJlbW92ZSBpdCwgbGVhdmluZwotICAgICAgICAvLyB0aGUgdGV4dCBpdCBjYXJyaWVkIGluIHRoZSB0cmVlLiAgRG9uJ3QgcGVyZm9ybSBpbnZhbGlkYXRpb24uCi0KLSAgICAgICAgaWYgKGluc2VydGluZ0ZyYWdtZW50ICE9IG51bGwpCi0gICAgICAgICAgICBpbnNlcnRpbmdGcmFnbWVudC5yZW1vdmUoIHIsIGZhbHNlICk7Ci0KLSAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgcGFyZW50IGlmIHJlcXVlc3RlZAotCi0gICAgICAgIGlmIChpbnZhbGlkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIGNUeXBlID0gYy5wZWVrVHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoY1R5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW5nRWxlbWVudHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjVHlwZS5pbnZhbGlkYXRlRWxlbWVudCggYywgcyApOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnRpbmdUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW5nVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgY1R5cGUuaW52YWxpZGF0ZVRleHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpbmdOaWxBdHRyKQotICAgICAgICAgICAgICAgICAgICBjVHlwZS5pbnZhbGlkYXRlTmlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBwb3N0IHRleHQgdG8gbW92ZSwgbW92ZSBpdCB0byB0aGUgZW5kIG9mIHRoZSBzdHVmZgotICAgICAgICAvLyBpbnNlcnRlZC4gIERvbid0IGRvIHRoaXMgaXMgaWYgYW4gYXR0ciB3YXMgaW5zZXJ0ZWQgYmVjYXVzZSBpbiB0aGlzCi0gICAgICAgIC8vIGNhc2UsIHRoZSBhdHRyIGlzIGxvZ2ljYWxseSBhZnRlciB0aGUgdGV4dCB0byBiZSBtb3ZlZCBhbnl3YXlzLgotCi0gICAgICAgIGlmIChzT3JpZyAhPSBudWxsICYmICFzSW5zZXJ0LmlzQXR0cigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2NoTW92ZWQgPSBzT3JpZy5tb3ZlQ2hhcnMoIHIsIHBPcmlnLCAtMSwgciwgcywgMCwgdHJ1ZSApOwotICAgICAgICAgICAgYXNzZXJ0IGNjaE1vdmVkID4gMDsKLSAgICAgICAgICAgIGFzc2VydCBjY2hNb3ZlZCA9PSBjY2hCeXBhc3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIGEgbGVhZiBpZiBwb3NzaWJsZQotCi0gICAgICAgIGlmIChzLmlzRW5kKCkgJiYgcy5nZXRDb250YWluZXIoKS5uZXh0Tm9uQXR0clNwbGF5KCkgPT0gcykKLSAgICAgICAgICAgIHMuZ2V0Q29udGFpbmVyKCkuZm9saWF0ZSggciApOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICBhc3NlcnQgci52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIChhdHRyaWJ1dGVzIGFzIHdlbGwpIHdpdGggYSBjb3B5IG9mIHRoZQotICAgICAqIGNvbnRlbnRzIG9mIHNTcmMuICBJZiBwcmVzZXJ2ZVR5cGUgaXMgdHJ1ZSwgdGhlbiB0aGUgeHNpOnR5cGUgYXR0cgotICAgICAqIG9mIHRoZSBzb3VyY2UgaXMgbm90IGNvcGllZCwgYW5kIHRoZSB4c2k6dHlwZSBvZiB0aGUgdGFyZ2V0ICh0aGlzKQotICAgICAqIGlzIG5vdCBhbHRlcmVkLgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCByZXBsYWNlQ29udGVudHMgKAotICAgICAgICBSb290IHIsIFNwbGF5IHNTcmMsIFJvb3QgclNyYywKLSAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZVR5cGUsIGJvb2xlYW4gcHJlc2VydmVOYW1lc3BhY2VzICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKSAmJiAhc1NyYy5pc0ZpbmlzaCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc1NyYy5nZXRSb290U2xvdygpID09IHJTcmM7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHNyYyBhbmQgZHN0IGFyZSB0aGUgc2FtZSBzcGxheSwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0KLSAgICAgICAgaWYgKHRoaXMgPT0gc1NyYykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBJZiB3ZSBhcmUgdG8gcHJlc2VydmUgbmFtZXNwYWNlIG1hcHBpbmdzLCBtYWtlIGEgY29weSBvZiB0aGUKLSAgICAgICAgLy8gbmFtc3BhY2VzIGluIHNjb3BlIGhlcmUKLQotICAgICAgICBNYXAgc291cmNlTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICBwcmVzZXJ2ZU5hbWVzcGFjZXMgPyBzU3JjLmxvb2t1cEFsbFByZWZpeE1hcHBpbmdzKCkgOiBudWxsOwotCi0gICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIHNpbXBsZSBjb250YWluZXIgb2YgdGV4dCwgdGhlbiB0aGUgY29udGVudAotICAgICAgICAvLyBtb2RlbCBpcyBsaW1pdGVkIHRvIHRleHQuICBIYW5kbGUgdGhpcyBzcGVjaWFsbHkuCi0KLSAgICAgICAgaWYgKGlzQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyAtIERvIHRoaXMgd2l0aG91dCBjcmVhdGluZyBhIHN0cmluZz8KLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBzU3JjLmdldFRleHQoIHJTcmMgKTsKLSAgICAgICAgICAgIHNldFRleHQoIHIsIHN0ciwgMCwgc3RyLmxlbmd0aCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyBuZWVkIHRvIHN0YXJ0Q2hhbmdlKCkgaGVyZSwgZmNucyBJIGNhbGwgd2lsbCBkbyBpdCBmb3IgbWUKLQotICAgICAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2UgY29weSBvZiBzb3VyY2UKLQotICAgICAgICAgICAgQ29weUNvbnRleHQgY29weUNvbnRleHQgPSBzU3JjLmNvcHlTcGxheUNvbnRlbnRzKCByU3JjICk7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSwgdGhlbiBmZXRjaCBpdC4KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHRoZSBmaXJzdCBvbmUgd2lucy4KLQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFhzaVR5cGUgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1hzaVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WHNpVHlwZSA9IHMuZ2V0VGV4dCggciApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJlY2F1c2UgSSBoYXZlIHJlbW92ZWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0LCBJIGNhbgotICAgICAgICAgICAgLy8gaW5zZXJ0IGZyYWdtZW50IG9yIG5vZGUuCi0KLSAgICAgICAgICAgIHJlbW92ZUNvbnRlbnQoIHIsIHRydWUgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IGlzTGVhZigpIHx8IGdldEZpbmlzaFNwbGF5KCkgPT0gbmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICBhc3NlcnQgZ2V0Q2NoVmFsdWUoKSA9PSAwOwotCi0gICAgICAgICAgICBTcGxheSBjb3B5ID0gY29weUNvbnRleHQuZ2V0VHJlZSgpOwotCi0gICAgICAgICAgICBpZiAoY29weSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29tcHV0ZSBhIG5vcm1hbGl6ZWQgc3BsYXkvcG9zIHRvIGluc2VydCBhdC4gIE9ubHkKLSAgICAgICAgICAgICAgICAvLyB0d28gY2FzZXMsIGVpdGhlciB3ZSdyZSBpbnNlcnRpbmcgaW4gYSBsZWFmIG9yIGEKLSAgICAgICAgICAgICAgICAvLyBjb250YWluZXIvZmluaXNoIHBhaXIuCi0KLSAgICAgICAgICAgICAgICBTcGxheSBpbnNlcnRTcGxheSA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgaW50IGluc2VydFBvcyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3BsYXkgPSBuZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGFyW10gdGV4dENvcHkgPSBjb3B5Q29udGV4dC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnNlcnRTcGxheS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgIHIsIGluc2VydFBvcywgY29weSwKLSAgICAgICAgICAgICAgICAgICAgdGV4dENvcHksIDAsIHRleHRDb3B5ID09IG51bGwgPyAwIDogdGV4dENvcHkubGVuZ3RoLCB0cnVlICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3csIGdvIHRob3J1Z2ggYWxsIHRoZSBhdHRycywgcmVtb3ZpbmcgdHlwZXMgYW5kIHBsYWNlIHRoZQotICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGJhY2sgaW4uCi0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgbmV4dCA9IG5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0IDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWHNpVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVtb3ZlKCByLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0WHNpVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyIGEgPSBuZXcgQXR0ciggX3hzaVR5cGUgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNjaFR5cGUgPSB0YXJnZXRYc2lUeXBlLmxlbmd0aCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBhLmFkanVzdENjaCggY2NoVHlwZSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RW5kUG9zKCkgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCggciwgMSwgYSwgdGFyZ2V0WHNpVHlwZSwgMCwgY2NoVHlwZSwgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb25BdHRyU3BsYXkoKS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIDAsIGEsIHRhcmdldFhzaVR5cGUsIDAsIGNjaFR5cGUsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2VOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICBhcHBseU5hbWVzcGFjZXMoIHIsIHNvdXJjZU5hbWVzcGFjZXMgKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29weUNvbnRleHQKLSAgICB7Ci0gICAgICAgIHZvaWQgY29weVRleHQgKCBjaGFyW10gdGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90ZXh0ID0gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29weVNwbGF5ICggU3BsYXkgcywgYm9vbGVhbiBjb3B5VGV4dEFmdGVyICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFzLmlzRG9jKCkgJiYgIXMuaXNSb290KCk7Ci0KLSAgICAgICAgICAgIFNwbGF5IHQ7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQkVHSU4gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0KLSAgICAgICAgICAgICAgICB0ID0gX2Zyb250aWVyID0gbmV3IEJlZ2luKCBzLmdldE5hbWUoKSwgX2Zyb250aWVyICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQudG9nZ2xlSXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9mcm9udGllciA9IF9mcm9udGllci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQVRUUiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IFhtbG5zKCBzLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlVmFsdWVWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IEF0dHIoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDT01NRU5UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ID0gbmV3IENvbW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUFJPQ0lOU1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQgPSBuZXcgUHJvY2luc3QoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVORCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgX2Zyb250aWVyOwotICAgICAgICAgICAgICAgIHQgPSBiLl9lbmQgPSBuZXcgRW5kKCBiICk7Ci0gICAgICAgICAgICAgICAgX2Zyb250aWVyID0gX2Zyb250aWVyLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnQgcy5pc1ZhbGlkKCk7Ci0KLSAgICAgICAgICAgIGludCBjY2ggPSBzLmdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjb3B5VGV4dEFmdGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgICAgICBjY2ggKz0gY2NoQWZ0ZXI7Ci0gICAgICAgICAgICAgICAgdC5hZGp1c3RDY2hBZnRlciggY2NoQWZ0ZXIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICAgICAgdC5hZGp1c3RDY2goIGNjaCApOwotCi0gICAgICAgICAgICBjb3B5KCB0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWF5IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBhbnkgb3RoZXIgY29weQotICAgICAgICAgKi8KLQotICAgICAgICB2b2lkIGNvcHlGcmFnbWVudCAoIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLQotICAgICAgICAgICAgU3BsYXkgcyA9IG5ldyBGcmFnbWVudCgpOwotCi0gICAgICAgICAgICBzLmFkanVzdENjaEFmdGVyKCBjY2ggKTsKLSAgICAgICAgICAgIHMuYWRqdXN0Q2NoKCBjY2ggKTsKLQotICAgICAgICAgICAgY29weSggcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgU3BsYXkgZ2V0VHJlZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9mcm9udGllciA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX2xhc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKF9maXJzdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENjaExlZnQoIF9maXJzdC5nZXRDY2hMZWZ0KCkgKyBfZmlyc3QuZ2V0Q2NoKCkgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENkb2NCZWdpbkxlZnQoCi0gICAgICAgICAgICAgICAgICAgIF9maXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfZmlyc3QuZ2V0Q2RvY0JlZ2luKCkgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0Ll9sZWZ0U3BsYXkgPSBfZmlyc3Q7Ci0gICAgICAgICAgICAgICAgX2ZpcnN0Ll9wYXJlbnRTcGxheSA9IF9sYXN0OwotCi0gICAgICAgICAgICAgICAgaWYgKF90YWlsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGFzdC5hZGp1c3RDY2hMZWZ0KCBfdGFpbC5nZXRDY2hMZWZ0KCkgKyBfdGFpbC5nZXRDY2goKSApOwotCi0gICAgICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENkb2NCZWdpbkxlZnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBfdGFpbC5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfdGFpbC5nZXRDZG9jQmVnaW4oKSApOwotCi0gICAgICAgICAgICAgICAgICAgIF9maXJzdC5fcmlnaHRTcGxheSA9IF90YWlsOwotICAgICAgICAgICAgICAgICAgICBfdGFpbC5fcGFyZW50U3BsYXkgPSBfZmlyc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gX2xhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyW10gZ2V0VGV4dCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF90ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNvcHkgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhlcmUgSSBtYWtlIHN1cmUgdGhhdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBzcGxheSB0cmVlIHJldHVybmVkCi0gICAgICAgICAgICAvLyBieSB0aGUgY29weSBpcyBzdWNoIHRoYXQgdGhlIGxhc3Qgc3BsYXkgY29waWVkIGlzIGF0IHRoZSByb290LAotICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHNwbGF5IGNvcGllZCBpcyB0aGUgbGVmdCBjaGlsZCBvZiB0aGUgbGFzdCBjb3BpZWQsCi0gICAgICAgICAgICAvLyB0aGUgc2Vjb25kIHRvIGxhc3Qgc3BsYXkgY29waWVkIGlzIHRoZSByaWdodCBjaGlsZCBvZiB0aGUgZmlyc3QsCi0gICAgICAgICAgICAvLyBhbmQgdGhlIHRoaXJkIHRocm91Z2ggdGhlIHNlY29uZCB0byBsYXN0IGFyZSBhIGxlZnQgb25seSBsaXN0Ci0gICAgICAgICAgICAvLyBvZmYgb2YgdGhlIGxlZnQgY2hpbGQgb2YgdGhlIHNlY29uZCEKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBZb3UgbWF5IGJlIGFza2luZyB5b3VyIHNlbGYsICJTZWxmLCB3aHkgYWxsIHRoaXMgbWFkbmVzcz8iCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gU2V2ZXJhbCByZWFzb25zLiAgRmlyc3QsIGJ5IG1ha2luZyB0aGUgZmlyc3QgaGFuZyBvZmYgdGhlCi0gICAgICAgICAgICAvLyBsZWZ0IGNoaWxkIG9mIHRoZSBsYXN0IGFuZCBoYXZlIHRoZSByaWdodCBjaGlsZCBvZiBsYXN0IGJlIG51bGwsCi0gICAgICAgICAgICAvLyB0aGUgcm9vdCB3aWxsIGhhdmUgdGhlIHRvdGFsIHNwbGF5IHN0YXRpc3RpY3MgZm9yIHRoZSB3aG9sZQotICAgICAgICAgICAgLy8gdHJlZS4gIFNlY29uZCwgeW91IGhhdmUgcXVpY2sgYWNjZXNzIHRvIHRoZSBmaXJzdCBzcGxheSBjb3BpZWQuCi0gICAgICAgICAgICAvLyBUaGlyZCwgYnVpbGRpbmcgdGhlIHRoaXJkIHRocm91Z2ggdGhlIHNlY29uZCB0byBsYXN0IGRvCi0gICAgICAgICAgICAvLyBub3QgcmVxdWlyZSB3YWxraW5nIHRvIHVwZGF0ZSBzdGF0aWN0aWNzLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFVsdGltYXRlbHksIEkgZG8gdGhpcyB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGZvcm1hdCBvZiB0aGUKLSAgICAgICAgICAgIC8vIHRyZWUgd2hlbiBhIHJhbmdlIG9mIHNwbGF5cyBhcmUgcmVtb3ZlZCBmcm9tIGEgdHJlZS4gIFRvIGF2b2lkCi0gICAgICAgICAgICAvLyBhbiBhZGRpdGlvbmFsIHNwbGF5LCB0aGUgcmVtb3ZhbCBvZiBhIHN1YiB0cmVlIGlzIHNoYXBlZCBsaWtlCi0gICAgICAgICAgICAvLyB0aGlzLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKF9sYXN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maXJzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBfbGFzdDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGFpbCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfdGFpbCA9IF9sYXN0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENjaExlZnQoIF90YWlsLmdldENjaExlZnQoKSArIF90YWlsLmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2xhc3QuYWRqdXN0Q2RvY0JlZ2luTGVmdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIF90YWlsLmdldENkb2NCZWdpbkxlZnQoKSArIF90YWlsLmdldENkb2NCZWdpbigpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2xhc3QuX2xlZnRTcGxheSA9IF90YWlsOwotICAgICAgICAgICAgICAgICAgICBfdGFpbC5fcGFyZW50U3BsYXkgPSBfbGFzdDsKLSAgICAgICAgICAgICAgICAgICAgX3RhaWwgPSBfbGFzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9sYXN0ID0gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2hhcltdICAgIF90ZXh0OwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICBfZmlyc3Q7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICAgIF90YWlsOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICBfbGFzdDsKLSAgICAgICAgcHJpdmF0ZSBDb250YWluZXIgX2Zyb250aWVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhpcyBzcGxheSAoZGVlcGx5KS4KLSAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIGFueSBpbnZhbGlkIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBCZWNhdXNlIHRoaXMgY2FuIHJldHVybiBvbmx5IHRleHQsIGlmIHRoZXJlIGlzIHRleHQgYXQgdGhlIGJlZ2lubmluZwotICAgICAqIG9mIHRoZSBjb250ZW50cywgSSB3aWxsIGNyZWF0ZSBhIEZSQUcgYXMgdGhlIGZpcnN0IHNwbGF5IChhZnRlciBhbnkKLSAgICAgKiBhdHRyaWJ1dGVzKS4KLSAgICAgKi8KLQotICAgIGZpbmFsIENvcHlDb250ZXh0IGNvcHlTcGxheUNvbnRlbnRzICggUm9vdCByICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKSAmJiAhaXNYbWxucygpOwotCi0gICAgICAgIGlmIChpc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgZW5zdXJlVmFsdWVWYWxpZCgpOwotCi0gICAgICAgIENvcHlDb250ZXh0IGNvcHlDb250ZXh0ID0gbmV3IENvcHlDb250ZXh0KCk7Ci0KLSAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2hBdHRycyA9IDA7Ci0KLSAgICAgICAgICAgIFNwbGF5IHQgPSBuZXh0U3BsYXkoKSwgcyA9IHQ7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5U3BsYXkoIHMsIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgY2NoQXR0cnMgKz0gcy5nZXRDY2goKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gaXNMZWFmKCkgPyBnZXRDY2hWYWx1ZSgpIDogZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNjaFZhbHVlID4gMCkKLSAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5RnJhZ21lbnQoIGNjaFZhbHVlICk7Ci0KLSAgICAgICAgICAgIGludCBjY2hDb250ZW50cyA9IDA7Ci0KLSAgICAgICAgICAgIGlmICghaXNMZWFmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgZmluaXNoID0gZ2V0RmluaXNoU3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHUgPSBzIDsgdSAhPSBmaW5pc2ggOyB1ID0gdS5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5U3BsYXkoIHUsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgY2NoQ29udGVudHMgKz0gdS5nZXRDY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjY2hBbGwgPSBjY2hBdHRycyArIGNjaFZhbHVlICsgY2NoQ29udGVudHM7Ci0KLSAgICAgICAgICAgIGlmIChjY2hBbGwgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0ID0gbmV3IGNoYXIgWyBjY2hBbGwgXTsKLQotICAgICAgICAgICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICBpbnQgY2NoID0gZ2V0Q2NoKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2NoQXR0cnMgPiAwKQotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCB0ZXh0LCAwLCBjcCArIGNjaCwgY2NoQXR0cnMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2hWYWx1ZSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goIHRleHQsIGNjaEF0dHJzLCBjcCwgY2NoVmFsdWUgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2hDb250ZW50cyA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgY2NoQXR0cnMgKyBjY2hWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwICsgY2NoICsgY2NoQXR0cnMsIGNjaENvbnRlbnRzICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weVRleHQoIHRleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKSB8fCBpc0NvbW1lbnQoKSB8fCBpc1Byb2NpbnN0KCk7Ci0KLSAgICAgICAgICAgIGludCBjY2hWYWx1ZSA9IGdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjY2hWYWx1ZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weUZyYWdtZW50KCBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICAgICAgY2hhcltdIHRleHQgPSBuZXcgY2hhciBbIGNjaFZhbHVlIF07Ci0KLSAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCB0ZXh0LCAwLCByLmdldENwKCB0aGlzICksIGNjaFZhbHVlICk7Ci0KLSAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5VGV4dCggdGV4dCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvcHlDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGlzIHNwbGF5IChkZWVwbHkpLiAgQWxzbyBjb3BpZXMgYXR0cmlidXRlcyBhZnRlciBhIGJlZ2luCi0gICAgICogVGhpcyB3aWxsIHVwZGF0ZSBhbnkgaW52YWxpZCBjb250ZW50LgotICAgICAqLwotCi0gICAgZmluYWwgU3BsYXkgY29weVNwbGF5ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICFpc0RvYygpICYmICFpc0ZpbmlzaCgpOwotCi0gICAgICAgIC8vIENvbXB1dGUgc3BsYXkgdG8gc3RvcCBhdCAoZG9lcyBub3QgZ2V0IGNvcGllZCkuICBBbHNvIGNvbXB1dGUKLSAgICAgICAgLy8gYSBzcGxheSwgdG8gYmUgY29waWVkLCB3aGljaCBzaG91bGQgbm90IGhhdmUgaXQncyB0ZXh0IGFmdGVyIGNvcGllZC4KLQotICAgICAgICBTcGxheSBzdG9wSGVyZSwgbm9UZXh0QWZ0ZXI7Ci0KLSAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgewotICAgICAgICAgICAgbm9UZXh0QWZ0ZXIgPSBnZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgc3RvcEhlcmUgPSBub1RleHRBZnRlci5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBub1RleHRBZnRlciA9IG51bGw7Ci0gICAgICAgICAgICBzdG9wSGVyZSA9IG5leHRTcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSB0aGUgY29weQotCi0gICAgICAgIENvcHlDb250ZXh0IGNvcHlDb250ZXh0ID0gbmV3IENvcHlDb250ZXh0KCk7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgbmV4dCwgcyA9IHRoaXMgOyBzICE9IHN0b3BIZXJlIDsgcyA9IG5leHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0ID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICAgICAgY29weUNvbnRleHQuY29weVNwbGF5KCBzLCBzICE9IG5vVGV4dEFmdGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29weUNvbnRleHQuZ2V0VHJlZSgpOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgcmVtb3ZlQXR0cmlidXRlcyAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGNvbnRlbnQgZnJvbSBzcGxheS4KLSAgICAgKiBCZWdpbiB3aWxsIGJlIGEgbGVhZiB1cG9uIGV4aXQuCi0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIHJlbW92ZUNvbnRlbnQgKCBSb290IHIsIGJvb2xlYW4gcmVtb3ZlQXR0cnMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKLQotICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgaWYgKGlzSW52YWxpZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0b2dnbGVJc0ludmFsaWQoKTsKLQotICAgICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgICAgICBpZiAoaXNDb250YWluZXIoKSAmJiByZW1vdmVBdHRycykKLSAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVzKCByICk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBET0MgOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCRUdJTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDaGFycyggciwgMSwgZ2V0Q2NoVmFsdWUoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbW92ZUF0dHJzKQotICAgICAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVzKCByICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBBVFRSIDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHJlbW92ZUNvbnRlbnQiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQ09NTUVOVCAgOgotICAgICAgICBjYXNlIFBST0NJTlNUIDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKGNjaFZhbHVlID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICByLl90ZXh0LnJlbW92ZSggci5nZXRDcCggdGhpcyApLCBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgLSBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICBpZiAoZ2V0S2luZCgpID09IEFUVFIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVRleHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc1hzaVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuZGlzY29ubmVjdFR5cGVzKCByICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHJlbW92ZUNvbnRlbnQiOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGlzRG9jKCkgfHwgKGlzQmVnaW4oKSAmJiAhaXNMZWFmKCkpOwotCi0gICAgICAgIFNwbGF5IHMgPSBuZXh0Tm9uQXR0clNwbGF5KCk7Ci0KLSAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpc0RvYygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIHNwbGF5cy4gIEluaGliaXQgaW52YWxpZGF0aW9uIG9uIGVhY2ggcmVtb3ZlIHRvCi0gICAgICAgICAgICAvLyBwcmV2ZW50IGEgZmxvb2Qgb2YgaW52YWxpZGF0aW9ucyB0byB0aGUgcGFyZW50IHR5cGUgKGlmIHRoZXJlKS4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIFNwbGF5IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKCBzID0gbmV4dE5vbkF0dHJTcGxheSgpIDsgIXMuaXNGaW5pc2goKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNBdHRyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dE5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcy5nZXRGaW5pc2hTcGxheSgpLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBzLnJlbW92ZSggciwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhhdmUgdG8gcmVtb3ZlIHRoZSB0ZXh0IGFmdGVyIHRoaXMgaGVyZSBiZWNhdXNlIHRoZSBhYm92ZQotICAgICAgICAgICAgLy8gcmVtb3ZlcyBjb3VsZCBoYXZlIHN1dWZmbGVkIHRleHQgdG8gYWZ0ZXIgdGhpcy4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIGFzc2VydCAhaXNMZWFmKCk7Ci0KLSAgICAgICAgICAgIGlmIChnZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICByZW1vdmVUZXh0QWZ0ZXIoIHIgKTsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFRyaWNreSBjb2RlLiAgTWVyZ2UgdGhlIEVORCBhbmQgdGhlIEJFR0lOIHRvIGZvcm0gYSBsZWFmLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICBmb2xpYXRlKCByICk7Ci0KLSAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgfQotCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0KLQotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotCi0gICAgICAgIGlmIChyZW1vdmVBdHRycykKLSAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZXMoIHIgKTsKLQotICAgICAgICAvLyBJZiB0aGUgdHJlZSBiZWNhbWUgZW1wdHksIHJlc2V0IF9sZWZ0T25seQotCi0gICAgICAgIGlmIChyLl9sZWZ0U3BsYXkgPT0gci5fZG9jICYmIHIuX2RvYy5fcmlnaHRTcGxheSA9PSBudWxsKQotICAgICAgICAgICAgci5fbGVmdE9ubHkgPSB0cnVlOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIGZpbmFsIGludCBjb3B5Q2hhcnMgKAotICAgICAgICBSb290IHIsIGludCBwLCBpbnQgY2NoLCBSb290IHJEc3QsIFNwbGF5IHNEc3QsIGludCBwRHN0ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwRHN0ID4gMCAmJiBwRHN0IDw9IHNEc3QuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCBwICk7Ci0KLSAgICAgICAgaWYgKHAgPT0gMCB8fCBjY2ggPT0gMCB8fCBwb3N0Q2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQotICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKLQotICAgICAgICBhc3NlcnQgY2NoID4gMDsKLQotLy8gVE9ETyAtIHVzZXMgc3RyaW5nIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc291cmNlIGFuZCBkZXN0IGZyb20gc2FtZSBidWZmZXIKLS8vICAgICAgICByZXdyaXRlIHRvIG5vdCBjcmVhdGUgc3RyaW5nIG9iamVjdAotCi0gICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyIFsgY2NoIF07Ci0KLSAgICAgICAgci5fdGV4dC5mZXRjaCggY2hhcnMsIDAsIGdldENwRm9yUG9zKCByLCBwICksIGNjaCApOwotCi0gICAgICAgIHNEc3QuaW5zZXJ0Q2hhcnMoIHBEc3QsIHJEc3QsIGNoYXJzLCAwLCBjY2ggKTsKLQotICAgICAgICByZXR1cm4gY2NoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmUgY2NoIGNoYXJzIGZyb20gcG9zIHAgb24gdGhpcyBzcGxheSB0byBwb3MgcERzdCBvbiBzRHN0LgotICAgICAqIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gY2FuIGJlIGRpZmZlcmVudCBkb2N1bWVudHMuICBOb3JtYWxseSBjdXJzb3JzCi0gICAgICogc3RheSBwdXQgd2hlbiB0aGVpciBjaGFyIGlzIG1vdmVkLCBidXQgbW92ZUN1cnNvcnMgY2FuIGNhdXNlIGN1cnNvcnMKLSAgICAgKiB0b21vdmUgd2l0aCB0aGUgY2hhcnMgKHVzZWQgaW50ZXJuYWxseSkuCi0gICAgICovCi0KLSAgICBmaW5hbCBpbnQgbW92ZUNoYXJzICgKLSAgICAgICAgUm9vdCByLCBpbnQgcCwgaW50IGNjaCwgUm9vdCByRHN0LCBTcGxheSBzRHN0LCBpbnQgcERzdCwKLSAgICAgICAgYm9vbGVhbiBtb3ZlQ3Vyc29ycyApCi0gICAgewotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCBwICk7Ci0KLSAgICAgICAgaWYgKGNjaCA9PSAwIHx8IHBvc3RDY2ggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCi0gICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLSAgICAgICAgckRzdC5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIGFzc2VydCBjY2ggPiAwOwotCi0gICAgICAgIC8vIEkgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgaW52YWxpZGl0eSBvZiB0aGUgc291cmNlIGJlY2F1c2UgdGhlCi0gICAgICAgIC8vIG9ubHkgaW52YWxpZCB0ZXh0IEkgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggaXMgdGhhdCBpbiBhIGxlYWYsIGFuZAotICAgICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGluIGEgbGVhZiBoZXJlLCB0aGVuIGl0IG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUKLSAgICAgICAgLy8gZW5kICgxKSB3aGljaCBpcyBub3Qgc2Vuc2l0aXZlIHRvIHRoZSBpbnZhbGlkaXR5LgotICAgICAgICAvLwotICAgICAgICAvLyBIb3dldmVyLCBJIG11Y2ggY2hlY2sgdGhlIGRlc3RpbmF0aW9uIGZvciB2YWxpZGl0eSBiZWNhdXNlIEkgbWF5Ci0gICAgICAgIC8vIGJlIGFwcGVuZGluZyB0ZXh0IHRvIGFuIGV4aXN0aW5nIHZhbHVlLgotCi0gICAgICAgIGlmIChzRHN0LmlzQ29udGFpbmVyKCkgJiYgcERzdCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2NoVmFsaWQgPSBzRHN0LmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotCi0gICAgICAgICAgICBwRHN0ICs9IGNjaFZhbGlkOwotCi0gICAgICAgICAgICBpZiAoc0RzdCA9PSB0aGlzICYmIHAgPT0gMSkKLSAgICAgICAgICAgICAgICBwICs9IGNjaFZhbGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLQotICAgICAgICBpZiAocERzdCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzRHN0ID0gc0RzdC5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICBwRHN0ID0gc0RzdC5nZXRFbmRQb3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpZiBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHNvdXJjZSwgdGhlbiB0aGlzIGlzCi0gICAgICAgIC8vIGVmZmVjdGl2ZWx5IGEgbm8tb3AuCi0KLS8vIFRPRE8gLSBQcm9iYWJseSBzaG91bGQgZGlzY29ubmVjdCBUeXBlcyBpbiB0aGUgcmFuZ2UKLQotICAgICAgICBpZiAoc0RzdCA9PSB0aGlzICYmIHBEc3QgPj0gcCAmJiBwRHN0IDw9IHAgKyBjY2gpCi0gICAgICAgICAgICByZXR1cm4gY2NoOwotCi0gICAgICAgIGFzc2VydCBwRHN0ID4gMDsKLQotICAgICAgICBDb250YWluZXIgY0RzdCA9IHNEc3QuZ2V0Q29udGFpbmVyKCBwRHN0ICk7Ci0gICAgICAgIENvbnRhaW5lciBjID0gZ2V0Q29udGFpbmVyKCBwICk7Ci0KLSAgICAgICAgLy8gTW92ZSB0aGUgdGV4dAotCi0gICAgICAgIHJEc3QuX3RleHQubW92ZSgKLSAgICAgICAgICAgIHNEc3QuZ2V0Q3BGb3JQb3MoIHJEc3QsIHBEc3QgKSwgci5fdGV4dCwgZ2V0Q3BGb3JQb3MoIHIsIHAgKSwgY2NoICk7Ci0KLSAgICAgICAgLy8gUGVyZm9ybSB0aGUgImluc2VydGlvbiIgZmlyc3QKLQotICAgICAgICBpZiAoIXNEc3QuaXNMZWFmKCkgfHwgcERzdCA+IHNEc3QuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgc0RzdC5hZGp1c3RDY2hBZnRlciggY2NoICk7Ci0KLSAgICAgICAgckRzdC51cGRhdGVDY2goIHNEc3QsIGNjaCApOwotCi0gICAgICAgIGZvciAoIEdvb2JlciBnID0gc0RzdC5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgZyA9IHNEc3QubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGdwID0gZy5nZXRQb3MoKTsKLQotICAgICAgICAgICAgaWYgKGdwID49IHBEc3QpCi0gICAgICAgICAgICAgICAgZy5zZXQoIGdwICsgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgc0RzdCAhPSB0aGlzIHx8IHBEc3QgPCBwIHx8IHBEc3QgPiBwICsgY2NoOwotCi0gICAgICAgIGlmIChzRHN0ID09IHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBwRHN0U2F2ZSA9IHBEc3Q7Ci0KLSAgICAgICAgICAgIGlmIChwRHN0ID4gcCArIGNjaCkKLSAgICAgICAgICAgICAgICBwRHN0IC09IGNjaDsKLQotICAgICAgICAgICAgaWYgKHAgPj0gcERzdFNhdmUpCi0gICAgICAgICAgICAgICAgcCArPSBjY2g7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVuIHBlcmZvcm0gdGhlICJyZW1vdmFsIgotCi0gICAgICAgIGlmICghaXNMZWFmKCkgfHwgcCA+IGdldFBvc0xlYWZFbmQoKSkKLSAgICAgICAgICAgIGFkanVzdENjaEFmdGVyKCAtIGNjaCApOwotCi0gICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCAtIGNjaCApOwotCi0gICAgICAgIEdvb2JlciBuZXh0R29vYmVyOwotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwICsgY2NoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGcuc2V0KCBncCAtIGNjaCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZ3AgPj0gcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1vdmVDdXJzb3JzICYmIGcuZ2V0S2luZCgpID09IENVUlNPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwID09IGdldEVuZFBvcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZy5zZXQoIG5leHRTcGxheSgpLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZy5zZXQoIHJEc3QsIHNEc3QsIHBEc3QgKyBncCAtIHAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNEc3QuaW52YWxpZGF0ZVRleHQoKTsKLSAgICAgICAgYy5pbnZhbGlkYXRlVGV4dCgpOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgckRzdC5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgIHJldHVybiBjY2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGNjaCBjaGFycyBzdGFydGluZyBhdCBwb3NpdGlvbiBwIG9uIHRoaXMgc3BsYXkuCi0gICAgICovCi0KLSAgICBmaW5hbCBpbnQgcmVtb3ZlQ2hhcnMgKCBSb290IHIsIGludCBwLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIGludCBtYXhQb3MgPSBnZXRNYXhQb3MoKTsKLQotICAgICAgICBhc3NlcnQgcCA+IDAgJiYgcCA8PSBtYXhQb3M7Ci0KLSAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotLy8gVE9ETyAtIG1lcmdlIHRoZSB0d28gZm9sbG93aW5nIGNodW5rcyBvZiBjb2RlPz8/Pz8/Ci0KLSAgICAgICAgaWYgKGlzTGVhZigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcGxlID0gZ2V0UG9zTGVhZkVuZCgpOwotCi0gICAgICAgICAgICBpZiAocCA8PSBwbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgcGxlIC0gcCA8IGNjaCkKLSAgICAgICAgICAgICAgICAgICAgY2NoID0gcGxlIC0gcDsKLQotICAgICAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICByLl90ZXh0LnJlbW92ZSggci5nZXRDcCggdGhpcyApICsgcCAtIDEsIGNjaCApOwotCi0gICAgICAgICAgICAgICAgci51cGRhdGVDY2goIHRoaXMsIC0gY2NoICk7Ci0KLSAgICAgICAgICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLQotICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGsgPSBnLmdldEtpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGdwID0gZy5nZXRQb3MoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZ3AgPj0gcCArIGNjaCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBncCAtIGNjaCApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChncCA+PSBwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSBDVVJTT1IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5zZXQoIHAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgayA9PSBBTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVRleHQoKTsKLQotICAgICAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcG9zQWZ0ZXIgPSBnZXRQb3NBZnRlcigpOwotCi0gICAgICAgIGFzc2VydCBwID49IHBvc0FmdGVyOwotCi0gICAgICAgIGludCBtYXhDY2ggPSBtYXhQb3MgLSBwICsgMTsKLQotICAgICAgICBhc3NlcnQgbWF4Q2NoID49IDA7Ci0KLSAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gbWF4Q2NoKQotICAgICAgICAgICAgY2NoID0gbWF4Q2NoOwotCi0gICAgICAgIGlmIChjY2ggPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIENvbnRhaW5lciBjID0gZ2V0Q29udGFpbmVyKCBwICk7Ci0KLSAgICAgICAgci5fdGV4dC5yZW1vdmUoIGdldENwRm9yUG9zKCByLCBwICksIGNjaCApOwotCi0gICAgICAgIGFkanVzdENjaEFmdGVyKCAtIGNjaCApOwotCi0gICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCAtIGNjaCApOwotCi0gICAgICAgIEdvb2JlciBuZXh0R29vYmVyOwotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBrID0gZy5nZXRLaW5kKCk7Ci0gICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOwotCi0gICAgICAgICAgICBpZiAoZ3AgPj0gcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoayA9PSBDVVJTT1IpCi0gICAgICAgICAgICAgICAgICAgIGcuc2V0KCBuZXh0Tm9uQXR0clNwbGF5KCksIDAgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYy5pbnZhbGlkYXRlVGV4dCgpOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICByZXR1cm4gY2NoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0ZXh0IGEgcG9zaXRpb24gcCBpbiB0aGlzIHNwbGF5Ci0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIGluc2VydENoYXJzICggaW50IHAsIFJvb3QgciwgT2JqZWN0IHR4dCwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgewotICAgICAgICBhc3NlcnQgcCA+IDAgJiYgcCA8PSBnZXRFbmRQb3MoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgci5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBnZXRDb250YWluZXIoIHAgKTsKLQotICAgICAgICBpZiAoaXNDb250YWluZXIoKSAmJiBwID09IDEpCi0gICAgICAgICAgICBwICs9IGVuc3VyZUNvbnRlbnRWYWxpZCgpOwotCi0gICAgICAgIHIuX3RleHQuaW5zZXJ0KCBnZXRDcEZvclBvcyggciwgcCApLCB0eHQsIG9mZiwgY2NoICk7Ci0KLSAgICAgICAgaWYgKHAgPj0gZ2V0UG9zQWZ0ZXIoKSkKLSAgICAgICAgICAgIGFkanVzdENjaEFmdGVyKCBjY2ggKTsKLQotICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgY2NoICk7Ci0KLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIoIGcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwKQotICAgICAgICAgICAgICAgIGcuc2V0KCBncCArIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGFpbmVyLmludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNFX1NFRU5fU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1NQQUNFX1NUQVRFID0gMjsKLQotICAgIHB1YmxpYyBmaW5hbCBpbnQgc2NydWJUZXh0KAotICAgICAgICBUZXh0IHRleHQsIGludCB3cywgaW50IGNwLCBpbnQgY2NoLCBTdHJpbmdCdWZmZXIgc2IsIGludCBzdGF0ZSApCi0gICAgewotICAgICAgICBhc3NlcnQgdGV4dCAhPSBudWxsOwotCi0gICAgICAgIGlmICh0ZXh0Ll9idWYgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA9PSAwOwotICAgICAgICAgICAgYXNzZXJ0IGNwID09IDA7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0KLSAgICAgICAgYm9vbGVhbiByZXBsYWNlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29sbGFwc2UgPSBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKCB3cyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfVU5TUEVDSUZJRUQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfUFJFU0VSVkUgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfUkVQTEFDRSAgICAgOiAgICAgICAgICAgIHJlcGxhY2UgPSB0cnVlOyBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfQ09MTEFQU0UgICAgOiBjb2xsYXBzZSA9IHJlcGxhY2UgPSB0cnVlOyBicmVhazsKLQotCQlkZWZhdWx0IDogYXNzZXJ0IGZhbHNlOiAiVW5rbm93biB3aGl0ZSBzcGFjZSBydWxlICIgK3dzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBsYWNlICYmICFjb2xsYXBzZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGV4dC5mZXRjaChzYiwgY3AsIGNjaCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgb2ZmID0gdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKTsKLSAgICAgICAgaW50IHN0YXJ0cHQgPSAwOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBjY2ggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5fYnVmWyBvZmYgKyBpIF07Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRleHQuX2J1Ziwgb2ZmICsgc3RhcnRwdCwgaSAtIHN0YXJ0cHQpOwotICAgICAgICAgICAgICAgIHN0YXJ0cHQgPSBpICsgMTsKLQotICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBOT1NQQUNFX1NUQVRFKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTUEFDRV9TRUVOX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTUEFDRV9TRUVOX1NUQVRFKQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICcgJyApOwotCi0gICAgICAgICAgICAgICAgc3RhdGUgPSBOT1NQQUNFX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCB0ZXh0Ll9idWYsIG9mZiArIHN0YXJ0cHQsIGNjaCAtIHN0YXJ0cHQgKTsKLQotICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIGdldFRleHQgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFRleHQoIHIsIFR5cGVTdG9yZS5XU19QUkVTRVJWRSApOwotICAgIH0KLQotLy8gICAgZmluYWwgaW50IGdldFRleHQgKCBSb290IHIsIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQotLy8gICAgewotLy8gICAgICAgIGlmIChsZW4gPD0gMCkKLS8vICAgICAgICAgICAgcmV0dXJuIDA7Ci0vLwotLy8gICAgICAgIGlmIChpc0ludmFsaWQoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmIChpc05vcm1hbEF0dHIoKSkKLS8vICAgICAgICAgICAgICAgIGVuc3VyZVZhbHVlVmFsaWQoKTsKLS8vICAgICAgICAgICAgZWxzZSBpZiAoaXNMZWFmKCkpCi0vLyAgICAgICAgICAgICAgICBlbnN1cmVDb250ZW50VmFsaWQoKTsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKLS8vCi0vLyAgICAgICAgaWYgKGlzTm9ybWFsQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKSB8fCBpc0xlYWYoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGludCBjY2ggPSBnZXRDY2hWYWx1ZSgpOwotLy8KLS8vICAgICAgICAgICAgaWYgKGNjaCA9PSAwKQotLy8gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0vLwotLy8gICAgICAgICAgICBpZiAoY2NoID4gbGVuKQotLy8gICAgICAgICAgICAgICAgY2NoID0gbGVuOwotLy8KLS8vICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggYnVmLCBvZmYsIHBvcywgY2NoICk7Ci0vLwotLy8gICAgICAgICAgICByZXR1cm4gY2NoOwotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgaWYgKCFpc0NvbnRhaW5lcigpKQotLy8gICAgICAgICAgICByZXR1cm4gMDsKLS8vCi0vLyAgICAgICAgaW50IG9yaWdpbmFsTGVuID0gbGVuOwotLy8gICAgICAgIFNwbGF5IGxhc3QgPSBnZXRGaW5pc2hTcGxheSgpOwotLy8KLS8vICAgICAgICBmb3IgKCBTcGxheSBzID0gdGhpcyA7IGxlbiA+IDAgJiYgcyAhPSBsYXN0IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgaW50IHNyY0NwLCBzcmNDY2g7Ci0vLwotLy8gICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQotLy8gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0vLwotLy8gICAgICAgICAgICAgICAgc3JjQ3AgPSBjcDsKLS8vICAgICAgICAgICAgICAgIHNyY0NjaCA9IHMuZ2V0Q2NoKCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZWxzZQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAvLyBJdCdzIG9rIGZvciBhbiBhdHRyIHRvIGJlIGludmFsaWQgaGVyZSwgZ2V0cyB0ZXh0IGFmdGVyCi0vLwotLy8gICAgICAgICAgICAgICAgc3JjQ3AgPSBjcCArIHMuZ2V0Q2NoVmFsdWUoKTsKLS8vICAgICAgICAgICAgICAgIHNyY0NjaCA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgaWYgKHNyY0NjaCA+IDApCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIGlmIChzcmNDY2ggPiBsZW4pCi0vLyAgICAgICAgICAgICAgICAgICAgc3JjQ2NoID0gbGVuOwotLy8KLS8vICAgICAgICAgICAgICAgIGludCBzcmNPZmYgPSByLl90ZXh0LnVuT2JzY3VyZSggc3JjQ3AsIHNyY0NjaCApOwotLy8KLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheUNvcHkoIHIuX3RleHQuX2J1Ziwgc3JjT2ZmLCBidWYsIG9mZiwgc3JjQ2NoICk7Ci0vLwotLy8gICAgICAgICAgICAgICAgbGVuIC09IHNyY0NjaDsKLS8vICAgICAgICAgICAgICAgIG9mZiArPSBzcmNDY2g7Ci0vLyAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICAgIGNwICs9IHMuZ2V0Q2NoKCk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLS8vICAgIH0KLQotICAgIGZpbmFsIFN0cmluZyBnZXRUZXh0ICggUm9vdCByLCBpbnQgd3MgKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW52YWxpZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgZW5zdXJlVmFsdWVWYWxpZCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY3AgPSByLmdldENwKCB0aGlzICk7Ci0KLSAgICAgICAgaWYgKGlzTm9ybWFsQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKSB8fCBpc0xlYWYoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaCA9IGdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgICAgIGlmICh3cyA9PSBUeXBlU3RvcmUuV1NfUFJFU0VSVkUgfHwgd3MgPT0gVHlwZVN0b3JlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgIHJldHVybiByLl90ZXh0LmZldGNoKCBjcCwgY2NoICk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgc2NydWJUZXh0KCByLl90ZXh0LCB3cywgY3AsIGdldENjaFZhbHVlKCksIHNiLCBTVEFSVF9TVEFURSApOwotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFNwbGF5IGxhc3QgPSBnZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgIGludCBzY3J1YlN0YXRlID0gU1RBUlRfU1RBVEU7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBsYXN0IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0KLSAgICAgICAgICAgICAgICBzY3J1YlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc2NydWJUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dCwgd3MsIGNwLCBzLmdldENjaCgpLCBzYiwgc2NydWJTdGF0ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEl0J3Mgb2sgZm9yIGFuIGF0dHIgdG8gYmUgaW52YWxpZCBoZXJlLCBnZXRzIHRleHQgYWZ0ZXIKLQotICAgICAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2hBZnRlciA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzY3J1YlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcnViVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LCB3cywgY3AgKyBzLmdldENjaFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NoQWZ0ZXIsIHNiLCBzY3J1YlN0YXRlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcCArPSBzLmdldENjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBhdHRyIHNwbGF5IGZvciBhIGdpdmVuIGNvbnRhaW5lciwgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0KLSAgICBTcGxheSBnZXRBdHRyICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmIHMuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQotICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRYc2lOaWwgKCBSb290IHIsIGJvb2xlYW4gbmlsICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChnZXRYc2lOaWwoIHIgKSA9PSBuaWwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc2V0QXR0ciggciwgX3hzaU5pbCwgInRydWUiICk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBnZXRYc2lOaWwgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgU3BsYXkgczsKLQotICAgICAgICBmb3IgKCBzID0gbmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc1hzaU5pbCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHMuZ2V0VGV4dCggciwgVHlwZVN0b3JlLldTX0NPTExBUFNFICk7Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyggInRydWUiICkgfHx2YWx1ZS5lcXVhbHMoICIxIiApOwotICAgIH0KLQotICAgIFFOYW1lIGdldFhzaVR5cGVOYW1lICggUm9vdCByICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIFNwbGF5IHM7Ci0KLSAgICAgICAgZm9yICggcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNYc2lUeXBlKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBhc3NlcnQgcy5pc1hzaVR5cGUoKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBzLmdldFRleHQoIHIsIFR5cGVTdG9yZS5XU19DT0xMQVBTRSApOwotCi0vLyBUT0RPIC0gdW5vYnNjdXJlIHRoZSB1bmRlcmx5aW5nIHRleHQgYW5kIHVzZSBpdCBkaXJlY3RseQotLy8gVE9ETyAtIHNob3VsZCBJIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIHdxZWxsIGZvcm1lZD8gaWUuIGp1c3QgdGV4dAotCi0gICAgICAgIFN0cmluZyBwcmVmaXgsIGxvY2FsbmFtZTsKLQotICAgICAgICBpbnQgZmlyc3Rjb2xvbiA9IHZhbHVlLmluZGV4T2YoICc6JyApOwotCi0gICAgICAgIGlmIChmaXJzdGNvbG9uID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHZhbHVlLnN1YnN0cmluZyggMCwgZmlyc3Rjb2xvbiApOwotICAgICAgICAgICAgbG9jYWxuYW1lID0gdmFsdWUuc3Vic3RyaW5nKCBmaXJzdGNvbG9uICsgMSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBsb2NhbG5hbWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VGb3JQcmVmaXgoIHByZWZpeCApOwotCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBubyBwcmVmaXggZGVmaW5pdGlvbiBmb3VuZCAtIHRoYXQncyBpbGxlZ2FsCi0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggdXJpLCBsb2NhbG5hbWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFhzaVR5cGUgKCBSb290IHIsIFFOYW1lIHR5cGVOYW1lICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBdHRyKCByLCBfeHNpVHlwZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgU3RyaW5nIG5zID0gdHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIHRydWUpOwotCi0gICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbCA6ICJDYW5ub3QgZXN0YWJsaXNoIHByZWZpeCBmb3IgIiArIG5zOwotCi0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyAiOiIgKyB2YWx1ZTsKLQotICAgICAgICBib29sZWFuIHNldCA9IGZhbHNlOwotCi0gICAgICAgIHNldEF0dHIoIHIsIF94c2lUeXBlLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHZvaWQgcmVtb3ZlQXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgbmV4dDsKLSAgICAgICAgZm9yICggU3BsYXkgcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0QXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLSAgICAgICAgYXNzZXJ0IGF0dHJOYW1lICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsOwotCi0gICAgICAgIGJvb2xlYW4gc2V0ID0gZmFsc2U7Ci0KLSAgICAgICAgU3BsYXkgbmV4dDsKLSAgICAgICAgZm9yICggU3BsYXkgcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldCkKLSAgICAgICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzLnNldFRleHQoIHIsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBzSW5zZXJ0ID0gdGhpczsKLSAgICAgICAgICAgIGludCAgIHBJbnNlcnQgPSAxOwotCi0gICAgICAgICAgICBpZiAoIWlzTGVhZigpICYmIGdldENjaCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc0luc2VydCA9IG5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgIHBJbnNlcnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2NoVmFsdWUgPSB2YWx1ZS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgQXR0ciBhdHRyID0gbmV3IEF0dHIoIGF0dHJOYW1lICk7Ci0gICAgICAgICAgICBhdHRyLmFkanVzdENjaCggY2NoVmFsdWUgKTsKLQotICAgICAgICAgICAgc0luc2VydC5pbnNlcnQoIHIsIHBJbnNlcnQsIGF0dHIsIHZhbHVlLCAwLCBjY2hWYWx1ZSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudC92YWx1ZSBvZiB0aGlzIHNwbGF5IHRvIHRoZSBnaXZlbiB0ZXh0LgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCBzZXRUZXh0ICggUm9vdCByLCBPYmplY3QgdHh0LCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHJlbW92ZUNvbnRlbnQoIHIsIGZhbHNlICk7Ci0KLSAgICAgICAgaWYgKHR4dCA9PSBudWxsIHx8IGNjaCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBET0MgOgotICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFpc0JlZ2luKCkgfHwgaXNMZWFmKCk7Ci0gICAgICAgICAgICBpbnNlcnRDaGFycyggMSwgciwgdHh0LCBvZmYsIGNjaCApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBBVFRSIDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHNldFRleHQiOwotICAgICAgICAgICAgfQotLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLS8vIFRPRE8gLSBpZiBzZXR0aW5nIHRleHQgb2YgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgc2V0dGluZyB0ZXh0IG9mIHhzaTp0eXBlIG9yIHhzaTpuaWwgbXVzdCBkbyBzdHVmZgotLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLQotICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDT01NRU5UICA6Ci0gICAgICAgIGNhc2UgUFJPQ0lOU1QgOgotICAgICAgICB7Ci0gICAgICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBnZXRDY2hWYWx1ZSgpID09IDA7Ci0KLSAgICAgICAgICAgIHIuX3RleHQuaW5zZXJ0KCByLmdldENwKCB0aGlzICksIHR4dCwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCBjY2ggKTsKLQotICAgICAgICAgICAgaWYgKGdldEtpbmQoKSA9PSBBVFRSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNYc2lUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmRpc2Nvbm5lY3RUeXBlcyggciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciBzZXRUZXh0IjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIGZpbmFsIE1hcCBsb29rdXBBbGxQcmVmaXhNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIE1hcCBtYXBwaW5ncyA9IG51bGw7Ci0KLSAgICAgICAgU3BsYXkgY29udGFpbmVyID0gdGhpcy5pc0NvbnRhaW5lcigpID8gdGhpcyA6IGdldENvbnRhaW5lcigpOwotCi0gICAgICAgIGZvciAoIDsgY29udGFpbmVyICE9IG51bGwgOyBjb250YWluZXIgPSBjb250YWluZXIuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gY29udGFpbmVyLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7Ci0gICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBpbmdzLmNvbnRhaW5zS2V5KCBzLmdldExvY2FsKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dCggcy5nZXRMb2NhbCgpLCBzLmdldFVyaSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgYXBwbHlOYW1lc3BhY2VzICggUm9vdCByLCBNYXAgbmFtZXNwYWNlcyApCi0gICAgewotICAgICAgICBpZiAobmFtZXNwYWNlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFNwbGF5IGNvbnRhaW5lciA9IHRoaXMuaXNDb250YWluZXIoKSA/IHRoaXMgOiBnZXRDb250YWluZXIoKTsKLQotICAgICAgICBuYW1lc3BhY2VfbG9vcDoKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IG5hbWVzcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFVzdWFsbHksIHRoaXMgaXMgdGhlIHByZWRlZmluZWQgeG1sIG5hbWVzcGFjZQotICAgICAgICAgICAgaWYgKHByZWZpeC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBuYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIFNwbGF5IGNhbmRpZGF0ZSA9IGNvbnRhaW5lcjsKLQotICAgICAgICAgICAgY2FuZGlkYXRlX2xvb3A6Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBjID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpIDsgYyAhPSBudWxsICYmICFjLmlzRG9jKCkgOwotICAgICAgICAgICAgICAgICAgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJiBwcmVmaXguZXF1YWxzKCBzLmdldExvY2FsKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIHMuZ2V0VXJpKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgbmFtZXNwYWNlX2xvb3A7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGNhbmRpZGF0ZV9sb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gYzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbmFtZXNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGF0dHIgbGlzdCBhZnRlcgotICAgICAgICAgICAgLy8gbWFrZWluZyBzdXJlIGFsbCBwcmV2aW91cyBtYXBwaW5ncyBhcmUgZ29uZQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIHJlbW92ZUF0dHIoIHIsIHFuYW1lICk7Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZS5uZXh0Tm9uQXR0clNwbGF5KCkuaW5zZXJ0KAotICAgICAgICAgICAgICAgIHIsIDAsIG5ldyBYbWxucyggcW5hbWUgKSwgbnVsbCwgMCwgMCwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyL2VsZW1lbnQuCi0gICAgICovCi0gICAgZmluYWwgU3RyaW5nIGdldFByZWZpeCAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpIHx8IGlzQXR0cigpOwotCi0gICAgICAgIGlmIChpc1htbG5zKCkpCi0gICAgICAgICAgICByZXR1cm4gInhtbG5zIjsKLQotICAgICAgICAvLyBUT0RPIC0gaGF2ZSBhIHByZWZpeCBnb29iZXIgdG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgb24gdGhlIGZyb250aWVyLgotICAgICAgICAvLyBQYXJzZXIgd2lsbCBhZGQgdGhpcyB3aGVuIHRoZSBuYXR1cmFsIHByZWZpeCBpcyBub3QgdGhlIHJlYWwgcHJlZml4LgotCi0gICAgICAgIFNwbGF5IGMgPSBpc0JlZ2luKCkgPyB0aGlzIDogZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgLy8gc3BlY2lhbCBjYXNlCi0gICAgICAgIFN0cmluZyBucyA9IGdldFVyaSgpOwotCi0gICAgICAgIC8vIGxhc3QgYXJndW1lbnQgaXMgZmFsc2UsIHdoaWNoIG1lYW5zLCBkb24ndCBtb2RpZnkgdGhlIHRyZWUKLSAgICAgICAgcmV0dXJuIHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBwcmVmaXgsIHJldHVybnMgdGhlIG5hbWVzcGFjZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIHByZWZpeCBhdCB0aGlzIGxvY2F0aW9uLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcKLSAgICAgKiBmb3IgdGhpcyBwcmVmaXguCi0gICAgICogPHA+Ci0gICAgICogcHJlZml4PSIiIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiBhIHByZWZpeC4gIEEgcmV0dXJuIHZhbHVlCi0gICAgICogb2YgIiIgaW5kaWNhdGVzIHRoZSBuby1uYW1lc3BhY2UsIGFuZCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkCi0gICAgICogd2l0aCBhIHJldHVybiB2YWx1ZSBvZiBudWxsLCB3aGljaCBpbmRpY2F0ZXMgYW4gaWxsZWdhbAotICAgICAqIHN0YXRlLCB3aGVyZSB0aGVyZSBpcyBubyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcHJlZml4LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJjZXB0cyB0aGUgYnVpbHQtaW4gcHJlZml4ZXMgInhtbCIgYW5kCi0gICAgICogInhtbG5zIiBhbmQgcmV0dXJucyB0aGVpciB3ZWxsLWtub3duIG5hbWVzcGFjZSBVUklzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGxvb2sgdXAuCi0gICAgICogQHJldHVybiBUaGUgbWFwcGVkIG5hbWVzcGFjZSBVUkkgKCIiIGlmIG5vLW5hbWVzcGFjZSksIG9yIG51bGwgaWYgbm8gbWFwcGluZy4KLSAgICAgKi8KLSAgICBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICAvLyBudWxsIHNhbWUgYXMgIiIsIG1lYW5zIGxvb2sgdXAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotCi0gICAgICAgIC8vIGhhbmRsZSBidWlsdC1pbiBwcmVmaXhlcwotICAgICAgICBpZiAoInhtbCIuZXF1YWxzKHByZWZpeCkpCi0gICAgICAgICAgICByZXR1cm4gX3htbDE5OThVcmk7Ci0gICAgICAgIGlmICgieG1sbnMiLmVxdWFscyhwcmVmaXgpKQotICAgICAgICAgICAgcmV0dXJuIF94bWxuc1VyaTsKLQotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLQotICAgICAgICAvLyBmaW5kIGFuIHhtbG5zIGRlY2wKLSAgICAgICAgZm9yICggQ29udGFpbmVyIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcHJlZml4LmVxdWFscyggcy5nZXRMb2NhbCgpICkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldFVyaSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm8geG1sbnMgZGVjbD8gIG5vIHByb2JsZW0gZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gbm8gbmFtZXNwYWNlIGRlZm4gZm91bmQ6IHJldHVybiBudWxsCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZml4IHRvIHVzZSBmb3IgYSBnaXZlbiBuYW1lc3BhY2UgVVJJLiAgQ2FuIGVpdGhlcgotICAgICAqIGJlIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB0cmVlIHRvIGVuc3VyZSBzdWNoIGEgbWFwcGluZyAoaWYgcgotICAgICAqIGlzIG5vbi1udWxsKSwgb3IgY2FuIGJlIHRvbGQgdG8gcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8KLSAgICAgKiBleGlzdGluZyBtYXBwaW5nIChpZiByIGlzIG51bGwpLgotICAgICAqIDxwPgotICAgICAqIEZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdHJlZSBtYXkgYmUgbW9kaWZpZWQsIGEgc3VnZ2VzdGVkIHByZWZpeAotICAgICAqIGNhbiBiZSBzdXBwbGllZC4gIFRoZSBzdWdnZXN0aW9uIG1heSBiZSBpZ25vcmVkIGZvciBhbnkgcmVhc29uLAotICAgICAqIGZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IGlzIGFscmVhZHkgaW4tdXNlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgInhtbCIgYW5kICJ4bWxucyIgZm9yIHRoZSB3ZWxsLWtub3duIG5hbWVzcGFjZSBVUklzCi0gICAgICogY29ycmVzcG9uZGluZyB0byB0aG9zZSBidWlsdC1pbiBwcmVmaXhlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByICAgICAgIHNob3VsZCBiZSBudWxsIGlmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdHJlZS4KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhIHByZWZpeCBjYW4ndCBiZSBmb3VuZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkCi0gICAgICogICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgYW4geG1sbnMuCi0gICAgICogQHBhcmFtIG5zICAgICAgdGhlIG5hbWVzcGFjZSB0byBsb29rIGZvciBvciBpbnRyb2R1Y2UgYSBtYXBwaW5nIGZvci4KLSAgICAgKiAgICAgICAgICAgICAgICBjYXJlZnVsIHdpdGggIiIsIGJlY2F1c2UgaXQgbWF5IGhhdmUgbm9ubG9jYWwgZWZmZWN0cwotICAgICAqICAgICAgICAgICAgICAgIGlmIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KLSAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAgYSBzdWdnZXN0ZWQgcHJlZml4IHRvIHRyeSBmaXJzdDsgbWF5IGJlIG51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3JlYXRlSWZNaXNzaW5nIHRydWUgKG5vcm1hbGx5IGl0J3MgdHJ1ZSkgaWYgeW91IHdhbnQgdG8gY3JlYXRlCi0gICAgICogICAgICAgICAgICAgICAgYW4geG1sbnMgZGVjbGFyYXRpb24gd2hlbiBvbmUgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGZvcgotICAgICAqICAgICAgICAgICAgICAgIHlvdXIgcmVxdWVzdGVkIFVSSS4gIElmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdHJlZSwKLSAgICAgKiAgICAgICAgICAgICAgICBwYXNzIGZhbHNlLgotICAgICAqLwotICAgIGZpbmFsIFN0cmluZyBwcmVmaXhGb3JOYW1lc3BhY2UgKCAgUm9vdCByLCBTdHJpbmcgbnMsIFN0cmluZyBzdWdnZXN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVJZk1pc3NpbmcgKQotICAgIHsKLSAgICAgICAgLy8gbnVsbCBzYW1lIGFzIGVtcHR5IHN0cmluZywgbWVhbnMgbm8tbmFtZXNwYWNlCi0gICAgICAgIGlmIChucyA9PSBudWxsKQotICAgICAgICAgICAgbnMgPSAiIjsKLQotICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCi0gICAgICAgIGlmIChfeG1sMTk5OFVyaS5lcXVhbHMoIG5zICkpCi0gICAgICAgICAgICByZXR1cm4gInhtbCI7Ci0gICAgICAgIGlmIChfeG1sbnNVcmkuZXF1YWxzKCBucyApKQotICAgICAgICAgICAgcmV0dXJuICJ4bWxucyI7Ci0KLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgQ29udGFpbmVyIGM7Ci0gICAgICAgIFNwbGF5IHM7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBpcyBucyBpcyBub3Qgc3BlY2lmaWVkIChubyBuYW1lc3BhY2UpCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKG5zLmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvb3A6Ci0gICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcy5nZXRMb2NhbCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmdldFVyaSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG92ZXJyaWRkZW4gZGVmYXVsdCBuYW1lc3BhY2UgaW4gc2NvcGUsCi0gICAgICAgICAgICAvLyByZXR1cm4gIiIgLSB0aGUgZGVmYXVsdCBkZWZhdWx0IG5hbWVzcGFjZSBpcyB0aGUgbm8tbmFtZXBzYWNlLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKCBjID09IG51bGwgKQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgcHJvYmxlbWF0aWMgZGVmYXVsdCBuYW1lc3BhY2UgYnV0IGNhbm5vdCBtb2RpZnkKLSAgICAgICAgICAgIC8vIHRoZSB0cmVlLCByZXR1cm4gbnVsbCAtIG5vIHByZWZpeCBhdmFpbGFibGUuCi0gICAgICAgICAgICAvLwotCi0gICAgICAgICAgICBpZiAoICFjcmVhdGVJZk1pc3NpbmcgKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZSB3aGljaCBtYXBzIHRvIGEgJ3JlYWwnIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgbmFtZXNwYWNlIG9uIHRoaXMgY29udGFpbmVyIHdoaWNoIGlzICIiLiAgVGhpcwotICAgICAgICAgICAgLy8gY2FuIHNjcmV3IGF0dHJpYnV0ZXMgYW5kIHN1Y2gsIGJ1dCwgb2ggd2VsbC4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIGZvciAoIHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHMuZ2V0TG9jYWwoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcy5zZXROYW1lKCByLCBuZXcgUU5hbWUoICIiLCAiIiApICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldExvY2FsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIHhtbG5zPSIiIGRlY2xhcmF0aW9uCi0KLSAgICAgICAgICAgIEF0dHIgYSA9IG5ldyBYbWxucyggbmV3IFFOYW1lKCAiIiwgIiIgKSApOwotCi0gICAgICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgICAgIHIuaW5zZXJ0U3BsYXkoIGEsIHRoaXMgKTsKLQotICAgICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgICAgICByZXR1cm4gYS5nZXRMb2NhbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhlIG9yZGluYXJ5IG5vdC1hLW5vLW5hbWVzcGFjZSBjYXNlCi0gICAgICAgIC8vCi0KLSAgICAgICAgYXNzZXJ0IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGxvb2sgZm9yIGFuIGV4aXN0aW5nIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBVUkkKLSAgICAgICAgLy8KLQotICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZHhtbG5zOiBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHMuZ2V0VXJpKCkuZXF1YWxzKCBucyApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHByZWZpeCBpc24ndCBtYXNrZWQKLSAgICAgICAgICAgICAgICAgICAgZm9yICggQ29udGFpbmVyIGMyID0gKENvbnRhaW5lcikgdGhpcyA7IGMyICE9IGMgOyBjMiA9IGMyLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgczIgPSBjMi5uZXh0U3BsYXkoKSA7IHMyLmlzQXR0cigpIDsgczIgPSBzMi5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyLmlzWG1sbnMoKSAmJiBzMi5nZXRMb2NhbCgpLmVxdWFscyhyZXN1bHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBmaW5keG1sbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBub3QgbWFza2VkOiBPSy4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBXZSBjb3VsZCBub3QgZmluZCBhbiBleGlzdGluZyBwcmVmaXggaW4tc2NvcGUgdGhhdCB3b3Jrcy4KLSAgICAgICAgLy8gSWYgIWNyZWF0ZUlmTWlzc2luZywgZG9uJ3QgbW9kaWZ5IHRoZSB0cmVlIC0gcmV0dXJuIG51bGwgaW5zdGVhZC4KLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoIWNyZWF0ZUlmTWlzc2luZykKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIG11c3QgYWRkIGFuIHhtbG5zOnNvbWV0aGluZz0idXJpIiwgc28gd2UgbXVzdCBwaWNrIGEgcHJlZml4LgotICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGUgc3VnZ2VzdGlvbiBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHNjb3BlIGFuZCBpZgotICAgICAgICAvLyBpdCdzIG5vdCB0aGUgZW1wdHkgc3RyaW5nIG9yIGFuIGlsbGVnYWwgcHJlZml4LgotICAgICAgICAvLwotCi0gICAgICAgIGlmIChzdWdnZXN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uLmxlbmd0aCgpID09IDAgfHwgc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7IC8vIGJhZCBzdWdnZXN0aW9uCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggYyA9IChDb250YWluZXIpIHRoaXMgOyBjICE9IG51bGwgOyBjID0gYy5nZXRDb250YWluZXIoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBzdWdnZXN0aW9uICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiBubyBzdWdnZXN0aW9uLCBjb21lIHVwIHdpdGggYSBzYWZlIHByZWZpeCB0byB1c2UKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoc3VnZ2VzdGlvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZSA9IFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgobnMpOwotICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGJhc2U7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9vcDoKLSAgICAgICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBzdWdnZXN0aW9uICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGJhc2UgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGFpbmVyIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIENvbnRhaW5lciBsYXN0Q29udGFpbmVyID0gbnVsbDsKLQotICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdENvbnRhaW5lciA9IGM7Ci0KLSAgICAgICAgICAgIGlmIChjLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBjOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0ID0gbGFzdENvbnRhaW5lcjsKLQotICAgICAgICBBdHRyIGEgPSBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbnMsIHN1Z2dlc3Rpb24gKSApOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICByLmluc2VydFNwbGF5KCBhLCB0YXJnZXQgKTsKLQotICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIGEuZ2V0TG9jYWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IGF0IHBvcyBpbiB0aGlzCi0gICAgICogc3BsYXkuCi0gICAgICovCi0KLSAgICBmaW5hbCBDb250YWluZXIgZ2V0Q29udGFpbmVyICggaW50IHAgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHAgPj0gMCAmJiBwIDw9IGdldEVuZFBvcygpOwotICAgICAgICBhc3NlcnQgcCA+IDAgfHwgIWlzRG9jKCk7Ci0KLSAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKTsKLQotICAgICAgICBpZiAoaXNMZWFmKCkpCi0gICAgICAgICAgICByZXR1cm4gcCA8IGdldFBvc0FmdGVyKCkgPyAoQ29udGFpbmVyKSB0aGlzIDogZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICByZXR1cm4gKENvbnRhaW5lcikgdGhpczsKLQotICAgICAgICBpZiAoaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLQotICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3BsYXkgd2hpY2ggY29udGFpbnMgdGhpcyBzcGxheS4KLSAgICAgKi8KLQotICAgIGFic3RyYWN0IENvbnRhaW5lciBnZXRDb250YWluZXIgKCApOwotCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZjbiB0byBsb2NhdGUgdGhlIGNvbnRhaW5lciB0aGlzIHNwbGF5IGlzIGNvbnRhaW5lciBpbi4KLSAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mIGdldENvbnRhaW5lciBpbgotICAgICAqIGNhc2VzIHdoZXJlIHRoZSBjb250YWluZXIgaXMgbm90IG9idmlvdXNseSBjb21wdXRhYmxlLgotICAgICAqLwotCi0gICAgQ29udGFpbmVyIGZpbmRDb250YWluZXIgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgIWlzQ29udGFpbmVyKCk7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKTsKLQotICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKCAhcy5pc0ZpbmlzaCgpICYmICFzLmlzQmVnaW4oKSApCi0gICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICByZXR1cm4gcy5nZXRDb250YWluZXIoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVUZXh0ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVmFsaWQoKTsKLQotICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgICAgIHQuaW52YWxpZGF0ZVRleHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgaW52YWxpZGF0ZU5pbCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKCFpc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSB0ID0gcGVla1R5cGUoKTsKLQotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0LmludmFsaWRhdGVOaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciApCi0gICAgewotICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIsIGZhbHNlICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciwgYm9vbGVhbiBkaXNjb25uZWN0RG9jICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgU3BsYXkgbGFzdCA9IGlzQXR0cigpID8gdGhpcyA6IGdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSB0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkgfHwgcy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ID0gcy5wZWVrVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgICAgIGlmICghYy5pc0RvYygpIHx8IGRpc2Nvbm5lY3REb2MpCi0gICAgICAgICAgICAgICAgICAgIHQgPSBjLnBlZWtUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgdSA9IHQuZ2V0U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGlmICh1LmlzSW52YWxpZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHUuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0LnZhbGlkYXRlVmFsdWUoIHUsIHQgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluaXNoIHNwbGF5IG1pZ2h0IGdldCB3aGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGxheSBmID0gdS5nZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0LnZhbGlkYXRlQ29udGVudCggdSwgdCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PSBsYXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBmOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdC5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzID09IGxhc3QpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkgJiYgIXMuaXNMZWFmKCkgJiYgcy5wZWVrVHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHR5cGUgb2Ygb2YgdGhpcwotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCBzZXRUeXBlICggUm9vdCByLCBTY2hlbWFUeXBlIHNUeXBlICkKLSAgICB7Ci0gICAgICAgIHNldFR5cGUoIHIsIHNUeXBlLCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIGZpbmFsIHZvaWQgc2V0VHlwZSAoIFJvb3QgciwgU2NoZW1hVHlwZSBzVHlwZSwgYm9vbGVhbiBjb21wbGFpbiApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNUeXBlYWJsZSgpOwotICAgICAgICBhc3NlcnQgc1R5cGUgIT0gbnVsbDsKLQotICAgICAgICAvLwotICAgICAgICAvLyBJcyB0aGUgY3VycmVudCB0eXBlIGFscmVhZHkgdGhpcyB0eXBlPwotICAgICAgICAvLwotCi0gICAgICAgIFR5cGUgdCA9IHBlZWtUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmdldF9zY2hlbWFfdHlwZSgpID09IHNUeXBlKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENhbiBhbHdheXMgc2V0IGFuIGFyYml0cmFyeSB0eXBlIGF0IHRoZSBkb2MgbGV2ZWwKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoaXNEb2MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByLCB0cnVlICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBwZWVrVHlwZSgpID09IG51bGw7Ci0KLSAgICAgICAgICAgIG5ldyBUeXBlKCByLCBzVHlwZSwgdGhpcyApOwotCi0gICAgICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gR290dGEgZ2V0IHRoZSBwYXJlbnQgdHlwZSB0byBkbyBhbnl0aGluZyBmdXJ0aGVyLiAgSWYgaXQKLSAgICAgICAgLy8gY2FuJ3QgYmUgZm91bmQsIHRoZW4gYmFyZgotICAgICAgICAvLwotCi0gICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKLQotICAgICAgICBhc3NlcnQgcGFyZW50VHlwZSAhPSBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFlvdSBjYW4gc2V0IHRoZSBhdHRyaWJ1dGUgdHlwZSwgYXMgbG9uZyBhcyBpdCBpcyB0aGUgbmF0dXJhbAotICAgICAgICAvLyB0eXBlLiAgQXR0cmlidXRlcyBjYW5ub3QgaGF2ZSB4c2k6dHlwZQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChpc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0X2F0dHJpYnV0ZV90eXBlKCBnZXROYW1lKCkgKSAhPSBzVHlwZSAmJiBjb21wbGFpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgYXR0cmlidXRlIHRvICIgKyBzVHlwZS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBpc0JlZ2luKCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm93LCBmb3IgaW50ZXJpb3IgdHlwZXMsIEkgaGF2ZSB0byBkZWFsIHdpdGggeHNpOnR5cGUgYW5kCi0gICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoZSB0eXBlIGlzIGFsbG93ZWQgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgLy8KLQotICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhpcyB0eXBlIGNhbiBiZSBoZXJlIHNhbnMgeHNpOnR5cGUuCi0gICAgICAgIC8vIElmIHNvLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm8geHNpOnR5cGUKLQotICAgICAgICBpZiAocGFyZW50VHlwZS5nZXRfZWxlbWVudF90eXBlKCBnZXROYW1lKCksIG51bGwgKSA9PSBzVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0WHNpVHlwZSggciwgbnVsbCApOwotCi0gICAgICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBkZXNpcmVkIHR5cGUgaGFzIG5vIG5hbWUsIHRoZW4gaXQgY2Fubm90IGJlCi0gICAgICAgIC8vIHJlZmVyZW5jZWQgdmlhIHhzaTp0eXBlCi0KLSAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBzVHlwZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wbGFpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgZWxlbWVudCwgdHlwZSBpcyB1bi1uYW1lZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0X2VsZW1lbnRfdHlwZSggZ2V0TmFtZSgpLCB0eXBlTmFtZSApICE9IHNUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGxhaW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB0eXBlIG9mIGVsZW1lbnQsIGludmFsaWQgdHlwZSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0WHNpVHlwZSggciwgdHlwZU5hbWUgKTsKLQotICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BsYXkuICBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGNyZWF0ZQotICAgICAqIG9uZSBhbmQgd2lsbCByZXR1cm4gbnVsbCBpcyBub24gZXhpc3RzLgotICAgICAqLwotCi0gICAgZmluYWwgVHlwZSBwZWVrVHlwZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgVHlwZSB0eXBlID0gbnVsbDsKLQotICAgICAgICBpZiAoX2dvb2JlcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIoIGcgKSApCi0gICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFRZUEUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoVHlwZSkgZzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB0eXBlICE9IG51bGwgfHwgaXNWYWxpZCgpOwotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgVHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGxheS4gIElmIG5vbiBleGlzdHMsIGl0IGF0dGVtcHRzCi0gICAgICogdG8gY3JlYXRlIG9uZS4gIFJldHVybnMgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0gICAgICovCi0KLSAgICBmaW5hbCBUeXBlIGdldFR5cGUgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLQotICAgICAgICBUeXBlIHR5cGUgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgIGlmICghaXNEb2MoKSAmJiB0eXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gRGVmZW5zaXZlCi0gICAgICAgICAgICBpZiAocGFyZW50VHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIG5ld1VzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3VXNlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGUuY3JlYXRlX2VsZW1lbnRfdXNlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgZ2V0WHNpVHlwZU5hbWUoIHIgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKLQotICAgICAgICAgICAgICAgIG5ld1VzZXIgPSBwYXJlbnRUeXBlLmNyZWF0ZV9hdHRyaWJ1dGVfdXNlciggZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydCBuZXdVc2VyICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIERlZmVuc2l2ZQotICAgICAgICAgICAgaWYgKG5ld1VzZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgdHlwZSA9IG5ldyBUeXBlKCByLCBuZXdVc2VyLCB0aGlzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoaXMgaW5zaWRlIG9mIHRoZSBjb250ZW50IG9mIHNSYW5nZT8gIERvZXMgYW4gaW5jbHVzaXZlIGNoZWNrLgotICAgICAqLwotCi0gICAgZmluYWwgYm9vbGVhbiBiZXR3ZWVuICggUm9vdCByLCBpbnQgcFRoaXMsIFNwbGF5IHNSYW5nZSApCi0gICAgewotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSBzUmFuZ2UuZ2V0Um9vdFNsb3coKTsKLQotICAgICAgICBpZiAoc1JhbmdlLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAoY29tcGFyZSggciwgcFRoaXMsIHNSYW5nZSwgMCApIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTcGxheSBzRW5kOwotICAgICAgICBpbnQgICBwRW5kOwotCi0gICAgICAgIGFzc2VydCAhc1JhbmdlLmlzRG9jKCk7Ci0KLSAgICAgICAgaWYgKHNSYW5nZS5pc0xlYWYoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc0VuZCA9IHNSYW5nZTsKLSAgICAgICAgICAgIHBFbmQgPSBzUmFuZ2UuZ2V0UG9zTGVhZkVuZCgpICsgMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzUmFuZ2UuaXNCZWdpbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzRW5kID0gc1JhbmdlLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICBwRW5kID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNFbmQgPSBzUmFuZ2UubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICBwRW5kID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wYXJlKCByLCBwVGhpcywgc0VuZCwgcEVuZCApIDw9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gcG9zaXRpb25zLiAgQXR0cmlidXRlcyBhcmUgYSBiaXRjaC4KLSAgICAgKi8KLQotICAgIGZpbmFsIGludCBjb21wYXJlICggUm9vdCByLCBpbnQgcFRoaXMsIFNwbGF5IHNUaGF0LCBpbnQgcFRoYXQgKQotICAgIHsKLSAgICAgICAgU3BsYXkgc1RoaXMgPSB0aGlzOwotCi0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzVGhpcy5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzVGhhdC5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBwVGhpcyA+PSAwICYmIHBUaGlzIDw9IHNUaGlzLmdldEVuZFBvcygpOwotICAgICAgICBhc3NlcnQgcFRoYXQgPj0gMCAmJiBwVGhhdCA8PSBzVGhhdC5nZXRFbmRQb3MoKTsKLQotICAgICAgICAvLyBOb3JtYWxpemUgcG9zaXRpb25zCi0KLSAgICAgICAgaWYgKHBUaGlzID09IHNUaGlzLmdldEVuZFBvcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1RoaXMuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChzVGhpcyA9IHNUaGlzLm5leHRTcGxheSgpKS5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcFRoaXMgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBwVGhpcyA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMubmV4dE5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIHBUaGlzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwVGhhdCA9PSBzVGhhdC5nZXRFbmRQb3MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUaGF0LmlzQXR0cigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoc1RoYXQgPSBzVGhhdC5uZXh0U3BsYXkoKSkuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHBUaGF0ID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzVGhhdCA9IHNUaGF0LnByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcFRoYXQgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzVGhhdCA9IHNUaGF0Lm5leHROb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgICAgICBwVGhhdCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgcFRoaXMgPCBzVGhpcy5nZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHBUaGF0IDwgc1RoYXQuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgaWYgKHNUaGlzID09IHNUaGF0KQotICAgICAgICAgICAgcmV0dXJuIHBUaGlzIDwgcFRoYXQgPyAtMSA6IHBUaGlzID4gcFRoYXQgPyAxIDogMDsKLQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChzVGhpcy5pc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUaGF0LmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMucHJldk5vbkF0dHJTcGxheSgpICE9IHNUaGF0KQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwotCi0gICAgICAgICAgICByZXR1cm4gcFRoYXQgPT0gMCA/IDEgOiAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzVGhhdC5pc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFzVGhpcy5pc0F0dHIoKTsKLQotICAgICAgICAgICAgaWYgKHNUaGF0LnByZXZOb25BdHRyU3BsYXkoKSAhPSBzVGhpcykKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZSggciwgc1RoYXQgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHBUaGlzID09IDAgPyAtMSA6IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGFyZSggciwgc1RoYXQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbXBhcmUgKCBSb290IHIsIFNwbGF5IHNUaGF0ICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHNUaGlzID0gdGhpczsKLQotICAgICAgICBpZiAoc1RoaXMgPT0gc1RoYXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAoci5pc0xlZnRPbmx5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVGhpcy5nZXRDY2hMZWZ0KCkgPCBzVGhhdC5nZXRDY2hMZWZ0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2NoTGVmdCgpID4gc1RoYXQuZ2V0Q2NoTGVmdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2RvY0JlZ2luTGVmdCgpIDwgc1RoYXQuZ2V0Q2RvY0JlZ2luTGVmdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgaWYgKHNUaGlzLmdldENkb2NCZWdpbkxlZnQoKSA+IHNUaGF0LmdldENkb2NCZWdpbkxlZnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICAgICAgd2hpbGUgKCBzVGhpcyAhPSByICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzVGhpcyA9IHNUaGlzLm5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNUaGlzID09IHNUaGF0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2NoKCkgPiAwIHx8IHNUaGlzLmdldENkb2NCZWdpbigpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUaGF0LmlzUm9vdCgpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGlmIChzVGhpcy5pc1Jvb3QoKSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIHNUaGlzLnNwbGF5KCByLCByICk7Ci0gICAgICAgIHNUaGF0LnNwbGF5KCByLCBzVGhpcyApOwotCi0gICAgICAgIGFzc2VydCBzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0IHx8IHNUaGlzLl9yaWdodFNwbGF5ID09IHNUaGF0OwotCi0gICAgICAgIHJldHVybiBzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0ID8gMSA6IC0xOwotICAgIH0KLQotICAgIGZpbmFsIFNwbGF5IG5leHROb25BdHRyU3BsYXkgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKCBzICE9IG51bGwgJiYgcy5pc0F0dHIoKSApCi0gICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcGxheSBwcmV2Tm9uQXR0clNwbGF5ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IHByZXZTcGxheSgpOwotCi0gICAgICAgIHdoaWxlICggcyAhPSBudWxsICYmIHMuaXNBdHRyKCkgKQotICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgZmluYWwgU3BsYXkgbmV4dFNwbGF5ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0gICAgICAgIFNwbGF5IHIgPSBzLl9yaWdodFNwbGF5OwotCi0gICAgICAgIGlmIChyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IGwgPSBzID0gciA7IChsID0gbC5fbGVmdFNwbGF5KSAhPSBudWxsIDsgKQotICAgICAgICAgICAgICAgIHMgPSBsOwotCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IDsgcCA9IChzID0gcCkuX3BhcmVudFNwbGF5ICkKLSAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5fbGVmdFNwbGF5ID09IHMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgZmluYWwgU3BsYXkgcHJldlNwbGF5ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0gICAgICAgIFNwbGF5IGwgPSBzLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgaWYgKGwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggU3BsYXkgciA9IHMgPSBsIDsgKHIgPSByLl9yaWdodFNwbGF5KSAhPSBudWxsIDsgKQotICAgICAgICAgICAgICAgIHMgPSByOwotCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IDsgcCA9IChzID0gcCkuX3BhcmVudFNwbGF5ICkKLSAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5fcmlnaHRTcGxheSA9PSBzKQotICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgcm90YXRlUmlnaHQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPT0gdGhpczsKLQotICAgICAgICBTcGxheSBwID0gX3BhcmVudFNwbGF5OwotICAgICAgICBTcGxheSBnID0gcC5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgYXNzZXJ0IHAgIT0gbnVsbDsKLQotICAgICAgICBwLl9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheTsKLQotICAgICAgICBpZiAoX3JpZ2h0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgIF9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7Ci0KLSAgICAgICAgX3JpZ2h0U3BsYXkgPSBwOwotICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHRoaXM7Ci0gICAgICAgIF9wYXJlbnRTcGxheSA9IGc7Ci0KLSAgICAgICAgaWYgKGcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGcuX2xlZnRTcGxheSA9PSBwKQotICAgICAgICAgICAgICAgIGcuX2xlZnRTcGxheSA9IHRoaXM7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZy5fcmlnaHRTcGxheSA9IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwLmFkanVzdENjaExlZnQoIC0gZ2V0Q2NoTGVmdCgpIC0gZ2V0Q2NoKCkgKTsKLSAgICAgICAgcC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSAtIGdldENkb2NCZWdpbigpICk7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCByb3RhdGVMZWZ0ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheS5fcmlnaHRTcGxheSA9PSB0aGlzOwotCi0gICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7Ci0gICAgICAgIFNwbGF5IGcgPSBwLl9wYXJlbnRTcGxheTsKLQotICAgICAgICBhc3NlcnQgcCAhPSBudWxsOwotCi0gICAgICAgIHAuX3JpZ2h0U3BsYXkgPSBfbGVmdFNwbGF5OwotCi0gICAgICAgIGlmIChfbGVmdFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICBfbGVmdFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7Ci0KLSAgICAgICAgX2xlZnRTcGxheSA9IHA7Ci0gICAgICAgIHAuX3BhcmVudFNwbGF5ID0gdGhpczsKLSAgICAgICAgX3BhcmVudFNwbGF5ID0gZzsKLQotICAgICAgICBpZiAoZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCi0gICAgICAgICAgICAgICAgZy5fbGVmdFNwbGF5ID0gdGhpczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnLl9yaWdodFNwbGF5ID0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGFkanVzdENjaExlZnQoIHAuZ2V0Q2NoTGVmdCgpICsgcC5nZXRDY2goKSApOwotICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCBwLmdldENkb2NCZWdpbkxlZnQoKSArIHAuZ2V0Q2RvY0JlZ2luKCkgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFNwbGF5IHRoaXMgc28gdGhhdCBpdCdzIHBhcmVudCBpcyBwU3RvcC4KLSAgICAvLwotICAgIC8vIFRoaXMgdmVyc2lvbiBvZiBzcGxheSBpcyBjYXBhYmxlIG9mIHNwbGF5aW5nIHRoaXMgdG8gdGhlIHRvcC4gIFRoZXJlCi0gICAgLy8gYXJlIHR3byBjYXNlcy4gIE9uZSBpcyB0aGVyZSByIGlzIHRoaXMgYW5kIHRoaXMgaXMgc3BsYXllZCB0byBiZQotICAgIC8vIHRoZSBsZWZ0IGNoaWxkIG9mIHIuICBUaGUgb3RoZXIgY2FzZSBpcyB3aGVyZSByIGlzIG51bGwuICBJbiB0aGlzIGNhc2UKLSAgICAvLyB0aGUgdHJlZSB0aGlzIGlzIGluIGlzIGRldGFjaGVkIGZyb20gdGhlIG1haW4gZG9jdW1lbnQsIGFuZCB0aGlzIHdpbGwgYmUKLSAgICAvLyBzcGxheWVkIHRvIHRoZSB0b3Agb2YgdGhhdCBzdWJ0cmVlIHN1Y2ggdGhhdCBpdCdzIHBhcmVudCB3aWxsIGJlIG51bGwuCi0gICAgLy8KLQotICAgIGZpbmFsIHZvaWQgc3BsYXkgKCBSb290IHIsIFNwbGF5IHBTdG9wICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwU3RvcCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdGhpcyAhPSBwU3RvcDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHIgPT0gbnVsbCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCByID09IG51bGwgfHwgcFN0b3AuZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgciA9PSBudWxsIHx8IHIudmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKTsKLQotICAgICAgICBib29sZWFuIHJvdGF0ZWQgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBwICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGlsZCBvZiB0aGUgc3RvcHBlciwgdGhlbiB3ZSBhcmUgZG9uZQotCi0gICAgICAgICAgICBpZiAocCA9PSBwU3RvcCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgU3BsYXkgZyA9IHAuX3BhcmVudFNwbGF5OwotCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGNoaWxkIG9mIHJvb3QsIHRoZW4gc2ltcGxlIHJvdGF0ZQotCi0gICAgICAgICAgICByb3RhdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKGcgPT0gcFN0b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHAuX2xlZnRTcGxheSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdCgpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZhbmN5IHNwbGF5cwotCi0gICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHAuX2xlZnRTcGxheSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBwLnJvdGF0ZVJpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KCk7Ci0KLSAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwLl9yaWdodFNwbGF5ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHAucm90YXRlTGVmdCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoKTsKLQotICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyb3RhdGVkICYmIHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHIuX2xlZnRPbmx5ID0gZmFsc2U7Ci0KLSAgICAgICAgYXNzZXJ0IHIgPT0gbnVsbCB8fCByLnZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoaXMgc3BsYXkgd2hlcmUgcm9vdCBpcyB0aGUgc3BsYXkgcm9vdCBvZiB0aGUgdHJlZSB0aGlzIHNwbGF5LgotICAgICAqIFRoaXMgbWF5IGJlIGEgUk9PVCBzcGxheQotICAgICAqLwotCi0gICAgZmluYWwgU3BsYXkgcmVtb3ZlU3BsYXkgKCBTcGxheSByICkKLSAgICB7Ci0gICAgICAgIFJvb3Qgcm9vdCA9IHIuaXNSb290KCkgPyAoUm9vdCkgciA6IG51bGw7Ci0KLSAgICAgICAgYXNzZXJ0IHIuX3BhcmVudFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgIWlzRG9jKCk7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRTcGxheVJvb3RTbG93KCkgPT0gcjsKLQotICAgICAgICAvLyBJZiB0aGUgc3BsYXkgdG8gYmUgcmVtb3ZlZCBoYXMgbm8gY2NoIG9yIGNiZWdpbiwgdGhlbiB3aGVuIHRoZQotICAgICAgICAvLyB0cmVlIGlzIGxlZnQgb25seSBjaGlsZHJlbiwgd2UgbmVlZCBub3Qgc3BsYXkuCi0KLSAgICAgICAgaW50IGNjaCA9IGdldENjaCgpOwotICAgICAgICBpbnQgY2JlZ2luID0gZ2V0Q2RvY0JlZ2luKCk7Ci0KLSAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCAmJiByb290Ll9sZWZ0T25seSAmJiBjY2ggPT0gMCAmJiBjYmVnaW4gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9yaWdodFNwbGF5ID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICgoX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPSBfbGVmdFNwbGF5KSAhPSBudWxsKQotICAgICAgICAgICAgICAgIF9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gX3BhcmVudFNwbGF5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3BsYXkoIHJvb3QsIHIgKTsKLQotICAgICAgICAgICAgaWYgKF9sZWZ0U3BsYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLmFkanVzdENjaExlZnQoIC0gY2NoICk7Ci0gICAgICAgICAgICAgICAgci5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGNiZWdpbiApOwotCi0gICAgICAgICAgICAgICAgaWYgKChyLl9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX3JpZ2h0U3BsYXkuX3BhcmVudFNwbGF5ID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBwID0gcHJldlNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBwLnNwbGF5KCByb290LCB0aGlzICk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcC5fcmlnaHRTcGxheSA9PSBudWxsOwotCi0gICAgICAgICAgICAgICAgci5fbGVmdFNwbGF5ID0gcDsKLSAgICAgICAgICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHI7Ci0gICAgICAgICAgICAgICAgci5hZGp1c3RDY2hMZWZ0KCAtIGNjaCApOwotICAgICAgICAgICAgICAgIHIuYWRqdXN0Q2RvY0JlZ2luTGVmdCggLSBjYmVnaW4gKTsKLSAgICAgICAgICAgICAgICBwLl9yaWdodFNwbGF5ID0gX3JpZ2h0U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocC5fcmlnaHRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBwLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfbGVmdFNwbGF5ID0gX3JpZ2h0U3BsYXkgPSBfcGFyZW50U3BsYXkgPSBudWxsOwotICAgICAgICBhZGp1c3RDY2hMZWZ0KCAtIGdldENjaExlZnQoKSApOwotICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSApOwotCi0gICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gVGhlIFpvbyAobW9yZSBsaWtlIGEgcGV0dGluZyB6b28gbm93KQotICAgIC8vCi0KLSAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUU5hbWVTcGxheSBleHRlbmRzIFNwbGF5Ci0gICAgewotICAgICAgICBRTmFtZVNwbGF5ICggaW50IGtpbmQsIGJvb2xlYW4gaXMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcigga2luZCwgaXMgKTsKLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFFOYW1lIGdldE5hbWUgKCApIHsgcmV0dXJuIF9uYW1lOyB9Ci0gICAgICAgIGZpbmFsIHZvaWQgIGNoYW5nZU5hbWUgKCBRTmFtZSBuYW1lICkgeyBfbmFtZSA9IG5hbWU7IH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0VXJpICAgKCApIHsgcmV0dXJuIF9uYW1lLmdldE5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnZXRMb2NhbCAoICkgeyByZXR1cm4gX25hbWUuZ2V0TG9jYWxQYXJ0KCk7ICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250YWluZXIgZXh0ZW5kcyBRTmFtZVNwbGF5Ci0gICAgewotICAgICAgICBDb250YWluZXIgKCBpbnQga2luZCwgYm9vbGVhbiBpcywgUU5hbWUgbmFtZSApCi0gICAgICAgICAgICB7IHN1cGVyKCBraW5kLCBpcywgbmFtZSApOyB9Ci0KLSAgICAgICAgYWJzdHJhY3QgRmluaXNoIGdldEZpbmlzaCAoICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIERvYyBleHRlbmRzIENvbnRhaW5lcgotICAgIHsKLSAgICAgICAgRG9jICggUm9vdCByLCBRTmFtZSBuYW1lICkKLSAgICAgICAgICAgIHsgc3VwZXIoIERPQywgZmFsc2UsIG5hbWUgKTsgX3Jvb3QgPSByOyB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gbnVsbDsgfQotICAgICAgICBGaW5pc2ggICAgZ2V0RmluaXNoICggKSB7IHJldHVybiBfcm9vdDsgfQotCi0gICAgICAgIFJvb3QgX3Jvb3Q7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEJlZ2luIGV4dGVuZHMgQ29udGFpbmVyCi0gICAgewotICAgICAgICBCZWdpbiAoIFFOYW1lIG5hbWUsIENvbnRhaW5lciBjb250YWluZXIgKQotICAgICAgICAgICAgeyBzdXBlciggQkVHSU4sIGZhbHNlLCBuYW1lICk7IF9jb250YWluZXIgPSBjb250YWluZXI7IH0KLQotICAgICAgICBmaW5hbCBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBfY29udGFpbmVyOyB9Ci0gICAgICAgIGZpbmFsIEZpbmlzaCAgICBnZXRGaW5pc2ggICAgKCApIHsgcmV0dXJuIF9lbmQ7IH0KLQotICAgICAgICBFbmQgICAgICAgICBfZW5kOwotICAgICAgICBDb250YWluZXIgICBfY29udGFpbmVyOwotICAgIH0KLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaW5pc2ggZXh0ZW5kcyBTcGxheQotICAgIHsKLSAgICAgICAgRmluaXNoICggaW50IGtpbmQgKSB7IHN1cGVyKCBraW5kLCBmYWxzZSApOyB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEVuZCBleHRlbmRzIEZpbmlzaAotICAgIHsKLSAgICAgICAgRW5kICggQmVnaW4gYmVnaW4gKSB7IHN1cGVyKCBFTkQgKTsgX2JlZ2luID0gYmVnaW47IH0KLQotICAgICAgICBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBfYmVnaW47IH0KLQotICAgICAgICBmaW5hbCBCZWdpbiBfYmVnaW47Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBTcGxheQotICAgIHsKLSAgICAgICAgQ29tbWVudCAoICkgeyBzdXBlciggQ09NTUVOVCwgZmFsc2UgKTsgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIGZpbmRDb250YWluZXIoKTsgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGcmFnbWVudCBleHRlbmRzIFNwbGF5Ci0gICAgewotICAgICAgICBGcmFnbWVudCAoICkgeyBzdXBlciggQ09NTUVOVCwgdHJ1ZSApOyB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gbnVsbDsgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBBdHRyIGV4dGVuZHMgUU5hbWVTcGxheQotICAgIHsKLSAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUgKSB7IHN1cGVyKCBBVFRSLCBmYWxzZSwgbmFtZSApOyB9Ci0KLSAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUsIGJvb2xlYW4gaXNYbWxucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBBVFRSLCB0cnVlLCBuYW1lICk7Ci0gICAgICAgICAgICBhc3NlcnQgaXNYbWxuczsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBwcmV2U3BsYXkoKSA7IDsgcyA9IHMucHJldlNwbGF5KCkgKQotICAgICAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDb250YWluZXIpIHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgWG1sbnMgZXh0ZW5kcyBBdHRyCi0gICAgewotICAgICAgICBYbWxucyAoIFFOYW1lIG5hbWUgKSB7IHN1cGVyKCBuYW1lLCB0cnVlICk7IH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgUHJvY2luc3QgZXh0ZW5kcyBRTmFtZVNwbGF5Ci0gICAgewotICAgICAgICBQcm9jaW5zdCAoIFFOYW1lIHRhcmdldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBQUk9DSU5TVCwgZmFsc2UsIHRhcmdldCApOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvY2luc3QgKCBTdHJpbmcgdGFyZ2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIFBST0NJTlNULCBmYWxzZSwgbmV3IFFOYW1lKCAiIiwgdGFyZ2V0ICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIGZpbmRDb250YWluZXIoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2ZXJ5IHNwbGF5IHBvaW50cyB0byBhIGNvbGxlY3Rpb24gb2YgZ29vYmVycy4gIEdvb2JlcnMgY2FuIGJlCi0gICAgICogYWdncmVnYXRlZCBpbnRvIGdyb3VwcyB3aGljaCBzaGFyZSB0aGUgc2FtZSBzdGF0ZSAoa2luZCBhbmQgcG9zaXRpb24pLgotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGludCBDVVJTT1IgICAgID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRZUEUgICAgICAgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTiA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBBR0dSRUdBVEUgID0gMzsKLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBHb29iZXIgZXh0ZW5kcyBHb29iZXJzCi0gICAgewotICAgICAgICBHb29iZXIgKCBSb290IHIsIGludCBraW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgX3N0YXRlID0ga2luZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCAgIGdldEtpbmQgICggKSB7IHJldHVybiBfc3RhdGUgJiA3OyAgfQotICAgICAgICBmaW5hbCBSb290ICBnZXRSb290ICAoICkgeyByZXR1cm4gX3Jvb3Q7ICAgICAgIH0KLSAgICAgICAgZmluYWwgU3BsYXkgZ2V0U3BsYXkgKCApIHsgcmV0dXJuIF9zcGxheTsgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCAgIGdldFBvcyAgICggKSB7IHJldHVybiBfc3RhdGUgPj4gMzsgfQotICAgICAgICBmaW5hbCBpbnQgICBnZXRTdGF0ZSAoICkgeyByZXR1cm4gX3N0YXRlOyAgICAgIH0KLQotICAgICAgICBmaW5hbCBib29sZWFuIGlzQW5ub3RhdGlvbiAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IEFOTk9UQVRJT047IH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOwotICAgICAgICAgICAgZG9TZXQoIHIsIHMsIHAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBkb1NldCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsIHx8IHAgPT0gMDsKLSAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzID09IG51bGwgfHwgciA9PSBzLmdldFJvb3RTbG93KCk7Ci0gICAgICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgX3NwbGF5ID09IG51bGwgfHwgX3Jvb3QgPT0gX3NwbGF5LmdldFJvb3RTbG93KCk7Ci0vLyAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBfcm9vdCA9PSByIHx8IF9zcGxheS5nZXRSb290U2xvdygpICE9IHMuZ2V0Um9vdFNsb3coKTsKLQotICAgICAgICAgICAgX3Jvb3QgPSByOwotCi0gICAgICAgICAgICBpZiAoX3NwbGF5ICE9IHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9zcGxheSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZW1vdmUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnQgcCA+PSAwOwotICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsIHx8IHAgPD0gX3NwbGF5LmdldE1heFBvcygpOwotICAgICAgICAgICAgX3N0YXRlID0gcCAqIDggKyAoX3N0YXRlICYgNyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByICE9IG51bGw7Ci0gICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFNwbGF5IHMsIGludCBwICkgeyBkb1NldCggZ2V0Um9vdCgpLCBzLCAgICAgICAgICBwICk7IH0KLSAgICAgICAgZmluYWwgdm9pZCBzZXQgKCAgICAgICAgICBpbnQgcCApIHsgZG9TZXQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgcCApOyB9Ci0KLSAgICAgICAgZmluYWwgdm9pZCBzZXQgKCBHb29iZXIgZyApCi0gICAgICAgICAgICB7IGRvU2V0KCBnLmdldFJvb3QoKSwgZy5nZXRTcGxheSgpLCBnLmdldFBvcygpICk7IH0KLQotICAgICAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb1NldCggciwgbnVsbCwgMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFwcGVuZCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMuZ2V0Um9vdFNsb3coKSA9PSBfcm9vdDsKLSAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfcGFyZW50ID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX25leHQgPT0gbnVsbCAmJiBfcHJldiA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAocy5fZ29vYmVycyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMuX2dvb2JlcnMgPSB0aGlzOwotICAgICAgICAgICAgICAgIF9uZXh0ID0gX3ByZXYgPSB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uZXh0ID0gcy5fZ29vYmVyczsKLSAgICAgICAgICAgICAgICBfcHJldiA9IF9uZXh0Ll9wcmV2OwotICAgICAgICAgICAgICAgIF9uZXh0Ll9wcmV2ID0gdGhpczsKLSAgICAgICAgICAgICAgICBfcHJldi5fbmV4dCA9IHRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9zcGxheSA9IHM7Ci0gICAgICAgICAgICBfcGFyZW50ID0gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCByZW1vdmUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfZ29vYmVycyA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX25leHQgPT0gdGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzOwotCi0gICAgICAgICAgICAgICAgX3BhcmVudC5fZ29vYmVycyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBwYXJlbnQgaXMgYW4gYWdncmVnYXRlIGdvb2JlciwgcmVtb3ZlIGl0IHRvbwotCi0gICAgICAgICAgICAgICAgaWYgKF9wYXJlbnQgIT0gX3NwbGF5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR29vYmVyIGcgPSAoR29vYmVyKSBfcGFyZW50OwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgPT0gQUdHUkVHQVRFOwotICAgICAgICAgICAgICAgICAgICBnLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJldi5fbmV4dCA9IF9uZXh0OwotICAgICAgICAgICAgICAgIF9uZXh0Ll9wcmV2ID0gX3ByZXY7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBfcGFyZW50Ll9nb29iZXJzID0gX25leHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9uZXh0ID0gX3ByZXYgPSBudWxsOwotCi0gICAgICAgICAgICBfcGFyZW50ID0gbnVsbDsKLSAgICAgICAgICAgIF9zcGxheSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgZ2V0S2luZCgpID09IEFOTk9UQVRJT04KLSAgICAgICAgICAgICAgICAgICAgPyAoKEFubm90YXRpb24pIHRoaXMpLmdldFhtbEJvb2ttYXJrKCkKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldEtpbmROYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBnZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBDVVJTT1IgICAgIDogcmV0dXJuICJDVVJTT1IiOwotICAgICAgICAgICAgY2FzZSBUWVBFICAgICAgIDogcmV0dXJuICJUWVBFIjsKLSAgICAgICAgICAgIGNhc2UgQU5OT1RBVElPTiA6IHJldHVybiAiQU5OT1RBVElPTiI7Ci0gICAgICAgICAgICBkZWZhdWx0ICAgICAgICAgOiByZXR1cm4gIjx1bmtub3cgZ29vYmVyIGtpbmQ+IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUm9vdCBfcm9vdDsKLQotICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKLQotICAgICAgICBwcml2YXRlIGludCBfc3RhdGU7ICAvLyBwb3MgYW5kIGtpbmQKLQotICAgICAgICBHb29iZXIgIF9uZXh0OwotICAgICAgICBHb29iZXIgIF9wcmV2OwotICAgICAgICBHb29iZXJzIF9wYXJlbnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEN1cnNvckdvb2JlciBleHRlbmRzIEdvb2JlcgotICAgIHsKLSAgICAgICAgQ3Vyc29yR29vYmVyICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIENVUlNPUiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBjcmVhdGVEZWJ1Z0lkTWFwICggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDcmVlcHkgd2F5IHRvIGRpc2NvdmVyIGlzIGFzc2VydCBpcyBlbmFibGVkLgotICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IChtYXAgPSBuZXcgSGFzaE1hcCgpKSAhPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdJZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9kZWJ1Z0lkcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgc3luY2hyb25pemVkICggX2RlYnVnSWRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9kZWJ1Z0lkcy5jb250YWluc0tleSggdGhpcyApKQotICAgICAgICAgICAgICAgICAgICBfZGVidWdJZHMucHV0KCB0aGlzLCBuZXcgSW50ZWdlciggX25leHREZWJ1Z0lkKysgKSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgX2RlYnVnSWRzLmdldCggdGhpcyApKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBfZGVidWdJZHMgPSBjcmVhdGVEZWJ1Z0lkTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCAgIF9uZXh0RGVidWdJZCA9IDE7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBHb29iZXIgaW1wbGVtZW50cyBYbWxNYXJrCi0gICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQW5ub3RhdGlvbiAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBBTk5PVEFUSU9OICk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbm5vdGF0aW9uICggUm9vdCByLCBYbWxCb29rbWFyayBhICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcyggciApOwotCi0gICAgICAgICAgICBpZiAoYS5fcmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2Fubm90YXRpb24gPSBhOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9yZWYgPSBhLl9yZWY7Ci0KLSAgICAgICAgICAgIF9rZXkgPSBhLmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRLZXkgKCBPYmplY3Qga2V5ICkKLSAgICAgICAgewotICAgICAgICAgICAgX2tleSA9IGtleTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhbGxlZCB2aWEgYm9va21hcmsgKHB1YmxpYyB2aWEgWG1sTWFyaykKLSAgICAgICAgcHVibGljIGZpbmFsIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChnZXRTcGxheSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgY3Vyc29yIG9uIGEgYm9va21hcmsgdGhhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGJlZW4gY2xlYXJlZCBvciByZXBsYWNlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrIGdldFhtbEJvb2ttYXJrICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2Fubm90YXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gX2Fubm90YXRpb247Ci0KLSAgICAgICAgICAgIGlmIChfcmVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChYbWxCb29rbWFyaykgX3JlZi5nZXQoKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0KCByICk7Ci0KLSAgICAgICAgICAgIFhtbEJvb2ttYXJrIHhhID0gZ2V0WG1sQm9va21hcmsoKTsKLQotICAgICAgICAgICAgaWYgKHhhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeGEuX2N1cnJlbnRNYXJrID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbEJvb2ttYXJrIF9hbm5vdGF0aW9uOwotICAgICAgICBSZWZlcmVuY2UgICAgIF9yZWY7Ci0KLSAgICAgICAgT2JqZWN0IF9rZXk7Ci0gICAgfQotCi0gICAgZmluYWwgR29vYmVyIGZpcnN0R29vYmVyICggKQotICAgIHsKLSAgICAgICAgaWYgKF9nb29iZXJzID09IG51bGwgfHwgX2dvb2JlcnMuZ2V0S2luZCgpICE9IEFHR1JFR0FURSkKLSAgICAgICAgICAgIHJldHVybiBfZ29vYmVyczsKLQotICAgICAgICBhc3NlcnQgX2dvb2JlcnMuX2dvb2JlcnMgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IF9nb29iZXJzLl9nb29iZXJzLmdldEtpbmQoKSAhPSBBR0dSRUdBVEU7Ci0KLSAgICAgICAgcmV0dXJuIF9nb29iZXJzLl9nb29iZXJzOwotICAgIH0KLQotICAgIGZpbmFsIEdvb2JlciBuZXh0R29vYmVyICggR29vYmVyIGcgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGcgIT0gbnVsbDsKLQotICAgICAgICBpZiAoKGcgPSBnLl9uZXh0KSAhPSBnLl9wYXJlbnQuX2dvb2JlcnMpCi0gICAgICAgICAgICByZXR1cm4gZzsKLQotICAgICAgICByZXR1cm4gZy5fcGFyZW50ID09IGcuX3NwbGF5ID8gbnVsbCA6IG5leHRHb29iZXIoIChHb29iZXIpIGcuX3BhcmVudCApOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIF9hc3NlcnRFbmFibGVkID0gZ2V0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXRBc3NlcnRFbmFibGVkICggKQotICAgIHsKLSAgICAgICAgLy8gQ3JlZXB5IHdheSB0byBkaXNjb3ZlciBpcyBhc3NlcnQgaXMgZW5hYmxlZC4KLSAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydCAoZW5hYmxlZCA9IHRydWUpIHx8IHRydWU7Ci0gICAgICAgIHJldHVybiBlbmFibGVkOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2VydEFzc2VydEVuYWJsZWQgKCApCi0gICAgewotICAgICAgICBpZiAoIV9hc3NlcnRFbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0IG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXNzb2NpYXRlIGlkJ3Mgd2l0aCBzcGxheXMgd2hlbiBhc3NlcnRzIGFyZSBlbmFibGVkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwIF9kZWJ1Z0lkcyA9Ci0gICAgICAgIF9hc3NlcnRFbmFibGVkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX25leHREZWJ1Z0lkID0gMTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdJZCAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfZGVidWdJZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKCBfZGVidWdJZHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9kZWJ1Z0lkcy5jb250YWluc0tleSggdGhpcyApKQotICAgICAgICAgICAgICAgIF9kZWJ1Z0lkcy5wdXQoIHRoaXMsIG5ldyBJbnRlZ2VyKCBfbmV4dERlYnVnSWQrKyApICk7Ci0KLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIF9kZWJ1Z0lkcy5nZXQoIHRoaXMgKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcCAoICkgeyBnZXRSb290U2xvdygpLmR1bXAoKTsgfQotICAgIHZvaWQgZHVtcCAoIGJvb2xlYW4gdmVyYm9zZSApIHsgZ2V0Um9vdFNsb3coKS5kdW1wKCB2ZXJib3NlICk7IH0KLQotICAgIHB1YmxpYyBTcGxheSBnZXRTcGxheVJvb3RTbG93ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIFNwbGF5IHMgPSB0aGlzOwotCi0gICAgICAgIHdoaWxlICggcy5fcGFyZW50U3BsYXkgIT0gbnVsbCApCi0gICAgICAgICAgICBzID0gcy5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIFJvb3QgZ2V0Um9vdFNsb3cgKCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5Um9vdFNsb3coKTsKLQotICAgICAgICByZXR1cm4gcy5pc1Jvb3QoKSA/IChSb290KSBzIDogbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q3BTbG93ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIGludCBjY2ggPSAwOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgKHMgPSBzLnByZXZTcGxheSgpKSAhPSBudWxsIDsgKQotICAgICAgICAgICAgY2NoICs9IHMuZ2V0Q2NoKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNjaDsKLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZVNsb3cgKCBTcGxheSBzVGhhdCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gc1RoYXQuZ2V0Um9vdFNsb3coKTsKLQotICAgICAgICBpZiAodGhpcyA9PSBzVGhhdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgaWYgKHMgPT0gc1RoYXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBudWxsIDsgcyA9IHMucHJldlNwbGF5KCkgKQotICAgICAgICAgICAgaWYgKHMgPT0gc1RoYXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgYXNzZXJ0IGZhbHNlOiAiWWlrZXMhIjsKLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIHZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIHJldHVybiBnZXRSb290U2xvdygpLnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBEb2N1bWVudCBzcGxheSB0cmVlIG1lbWJlcnMKLSAgICAvLwotCi0gICAgU3BsYXkgX2xlZnRTcGxheTsKLSAgICBTcGxheSBfcmlnaHRTcGxheTsKLSAgICBTcGxheSBfcGFyZW50U3BsYXk7Ci0KLSAgICBwcml2YXRlIGludCBfYml0czsgLy8gMjc6IGNEb2NiZWdpbkxlZnQsIDE6IGludmFsaWQsIDE6IG11bHRpLCAzOiBraW5kCi0gICAgcHJpdmF0ZSBpbnQgX2NjaDsKLSAgICBwcml2YXRlIGludCBfY2NoQWZ0ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgX2NjaExlZnQ7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTVlMWM5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5Xcml0ZUNvbnRleHQ7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5SZWFkQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dAotewotICAgIGNoYXJbXSBfYnVmOwotICAgIGludCAgICBfZ2FwOyAgICAvLyBXaGVyZSB0aGUgZ2FwIHN0YXJ0cwotICAgIGludCAgICBfZ2FwTGVuOyAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBnYXAKLQotICAgIGludCBsZW5ndGggKCApCi0gICAgewotICAgICAgICByZXR1cm4gYnVmTGVuKCkgLSBfZ2FwTGVuOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGJ1ZkxlbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHkgKCBjaGFyW10gbmV3QnVmICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfYnVmICE9IG51bGwgJiYgbmV3QnVmLmxlbmd0aCA+PSBsZW5ndGgoKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgMCwgX2dhcCApOwotCi0gICAgICAgIGludCBsZW5BZnRlckdhcCA9IF9idWYubGVuZ3RoIC0gX2dhcCAtIF9nYXBMZW47Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgIF9idWYsIF9nYXAgKyBfZ2FwTGVuLAotICAgICAgICAgICAgbmV3QnVmLCBuZXdCdWYubGVuZ3RoIC0gKGxlbkFmdGVyR2FwKSwgbGVuQWZ0ZXJHYXAgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2l6ZSAoIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+IF9nYXBMZW47Ci0gICAgICAgIAotICAgICAgICBpbnQgbmV3U2l6ZSA9IGxlbmd0aCgpICsgY2NoOwotICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gMTAyNCA6IF9idWYubGVuZ3RoICogMjsKLQotICAgICAgICB3aGlsZSAoIG5ld0xlbiA8IG5ld1NpemUgKQotICAgICAgICAgICAgbmV3TGVuICo9IDI7Ci0KLSAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbmV3TGVuIF07Ci0KLSAgICAgICAgaWYgKF9idWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29weSggbmV3QnVmICk7Ci0gICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGggLSBfYnVmLmxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGg7Ci0KLSAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKLSAgICB9Ci0KLSAgICB2b2lkIHRyaW0gKCApCi0gICAgewotICAgICAgICBpZiAoX2J1ZiAhPSBudWxsICYmIF9nYXBMZW4gIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbGVuZ3RoKCkgXTsKLQotICAgICAgICAgICAgY29weSggbmV3QnVmICk7Ci0KLSAgICAgICAgICAgIF9idWYgPSBuZXdCdWY7Ci0gICAgICAgICAgICBfZ2FwID0gMDsKLSAgICAgICAgICAgIF9nYXBMZW4gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBtb3ZlICggaW50IHBvcywgVGV4dCBzcmMsIGludCBzcmNQb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaW5zZXJ0KCBwb3MsIHNyYywgc3JjUG9zLCBjY2ggKTsKLQotICAgICAgICBpZiAoc3JjID09IHRoaXMgJiYgc3JjUG9zID49IHBvcykKLSAgICAgICAgICAgIHNyY1BvcyArPSBjY2g7Ci0KLSAgICAgICAgc3JjLnJlbW92ZSggc3JjUG9zLCBjY2ggKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIE9iamVjdCB0eHQsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaWYgKHR4dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHh0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoU3RyaW5nKSB0eHQsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlIGlmICh0eHQgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoVGV4dCkgdHh0LCBvZmYsIGNjaCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCB0eHQgaW5zdGFuY2VvZiBjaGFyW107Ci0gICAgICAgICAgICAgICAgaW5zZXJ0KCBwb3MsIChjaGFyW10pIHR4dCwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFRleHQgc3JjLCBpbnQgc3JjUG9zLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgY2FuIGRlYWwgd2l0aCBjb3B5aW5nIGZyb20gaXRzZWxmCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOwotCi0gICAgICAgICAgICBpZiAoc3JjUG9zICsgY2NoIDwgc3JjLl9nYXApCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzcmNQb3MgPj0gc3JjLl9nYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyY1BvcyArIHNyYy5fZ2FwTGVuLCBfYnVmLCBfZ2FwLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVmdExlbiA9IHNyYy5fZ2FwIC0gc3JjUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgbGVmdExlbiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyYy5fZ2FwICsgc3JjLl9nYXBMZW4sCi0gICAgICAgICAgICAgICAgICAgIF9idWYsIF9nYXAgKyBsZWZ0TGVuLCBjY2ggLSBsZWZ0TGVuICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9nYXAgKz0gY2NoOwotICAgICAgICAgICAgX2dhcExlbiAtPSBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBjaGFyW10gY2hhcnMsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNoYXJzICE9IF9idWY7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNjaCA+IF9nYXBMZW4pCi0gICAgICAgICAgICAgICAgcmVzaXplKCBjY2ggKTsKLQotICAgICAgICAgICAgbW92ZUdhcCggcG9zICk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGNoYXJzLCBvZmYsIF9idWYsIF9nYXAsIGNjaCApOwotCi0gICAgICAgICAgICBfZ2FwICs9IGNjaDsKLSAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBpbnNlcnQoIHBvcywgcywgMCwgcy5sZW5ndGgoKSApOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG9mZiA+PSAwICYmIG9mZiA8IHMubGVuZ3RoKCk7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoIDw9IHMubGVuZ3RoKCkgLSBvZmY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOwotCi0gICAgICAgICAgICBzLmdldENoYXJzKCBvZmYsIG9mZiArIGNjaCwgX2J1ZiwgX2dhcCApOwotCi0gICAgICAgICAgICBfZ2FwICs9IGNjaDsKLSAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHJlbW92ZSggcG9zLCBjY2gsIG51bGwsIDAgKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoLCBjaGFyW10gcmV0QnVmLCBpbnQgb2ZmICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgKyBjY2ggPD0gbGVuZ3RoKCk7Ci0KLSAgICAgICAgbW92ZUdhcCggcG9zICk7Ci0KLSAgICAgICAgYXNzZXJ0IHJldEJ1ZiA9PSBudWxsIHx8IHJldEJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoOwotCi0gICAgICAgIGlmIChjY2ggPiAwICYmIHJldEJ1ZiAhPSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIHJldEJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgCi0gICAgICAgIF9nYXBMZW4gKz0gY2NoOwotICAgIH0KLQotICAgIHZvaWQgbW92ZUdhcCggaW50IHBvcyApCi0gICAgewotICAgICAgICBpZiAocG9zIDwgX2dhcCkKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgX2J1ZiwgcG9zICsgX2dhcExlbiwgX2dhcCAtIHBvcyApOwotICAgICAgICBlbHNlIGlmIChwb3MgPiBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIF9idWYsIF9nYXAsIHBvcyAtIF9nYXApOwotCi0gICAgICAgIF9nYXAgPSBwb3M7Ci0gICAgfQotCi0gICAgaW50IHVuT2JzY3VyZSAoIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOwotCi0gICAgICAgIGlmIChjY2ggPiAwICYmIChwb3MgPCBfZ2FwICYmIHBvcyArIGNjaCA+IF9nYXApKQotICAgICAgICAgICAgbW92ZUdhcCggcG9zICsgY2NoICk7Ci0KLSAgICAgICAgcmV0dXJuIHBvcyA8IF9nYXAgPyBwb3MgOiBwb3MgKyBfZ2FwTGVuOwotICAgIH0KLQotICAgIHZvaWQgZmV0Y2ggKCBTdHJpbmdCdWZmZXIgc2IsIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgY2NoICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG9zID49IF9nYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBfYnVmLCBwb3MgKyBfZ2FwTGVuLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGNjaCAtIF9nYXAgKyBwb3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBmZXRjaCAoIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcywgY2NoICk7Ci0KLSAgICAgICAgaWYgKHBvcyA+PSBfZ2FwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcyArIF9nYXBMZW4sIGNjaCApOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOwotICAgICAgICBzYi5hcHBlbmQoIF9idWYsIF9nYXAgKyBfZ2FwTGVuLCBjY2ggLSBfZ2FwICsgcG9zICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBmZXRjaCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IG9mZiA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOwotICAgICAgICBhc3NlcnQgYnVmLmxlbmd0aCAtIG9mZiA+PSBjY2g7Ci0KLSAgICAgICAgaWYgKGNjaCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgIGVsc2UgaWYgKHBvcyA+PSBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zICsgX2dhcExlbiwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaHVuayA9IF9nYXAgLSBwb3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgYnVmLCBvZmYsIGNodW5rICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGJ1Ziwgb2ZmICsgY2h1bmssIGNjaCAtIGNodW5rICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZldGNoKCAwLCBsZW5ndGgoKSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVHlwZS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTlkOGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQXR0cjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQmVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ29weUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5Lkdvb2JlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVXNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeXBlIGV4dGVuZHMgR29vYmVyIGltcGxlbWVudHMgVHlwZVN0b3JlCi17Ci0gICAgVHlwZSAoIFJvb3QgciwgU2NoZW1hVHlwZSBzVHlwZSwgU3BsYXkgcyApCi0gICAgewotICAgICAgICB0aGlzKCByLCAoKFR5cGVTdG9yZVVzZXJGYWN0b3J5KSBzVHlwZSkuY3JlYXRlVHlwZVN0b3JlVXNlcigpLCBzICk7Ci0gICAgfQotICAgIAotICAgIFR5cGUgKCBSb290IHIsIFR5cGVTdG9yZVVzZXIgdXNlciwgU3BsYXkgcyApCi0gICAgewotICAgICAgICBzdXBlciggciwgU3BsYXkuVFlQRSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMucGVla1R5cGUoKSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgdXNlciAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0gICAgICAgIAotICAgICAgICBfdXNlciA9IHVzZXI7Ci0gICAgICAgIAotICAgICAgICBzZXQoIHMsIDAgKTsKLQotICAgICAgICBpZiAodXNlci51c2VzX2ludmFsaWRhdGVfdmFsdWUoKSkKLSAgICAgICAgICAgIHIuX2NJbnZhbGlkYXRhYmxlVHlwZXMrKzsKLQotICAgICAgICBpZiAodXNlci5pc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpKQotICAgICAgICAgICAgci5fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzKys7Ci0gICAgICAgIAotICAgICAgICB1c2VyLmF0dGFjaF9zdG9yZSggdGhpcyApOwotICAgIH0KLQotICAgIHZvaWQgZGlzY29ubmVjdCAoIFJvb3QgciApCi0gICAgewotICAgICAgICBzdXBlci5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoX3VzZXIudXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkpCi0gICAgICAgICAgICByLl9jSW52YWxpZGF0YWJsZVR5cGVzLS07Ci0KLSAgICAgICAgaWYgKF91c2VyLmlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkpCi0gICAgICAgICAgICByLl9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMtLTsKLSAgICAgICAgCi0gICAgICAgIF91c2VyLmRpc2Nvbm5lY3Rfc3RvcmUoKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIFNjaGVtYVR5cGUgZ2V0X3NjaGVtYV90eXBlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLmdldF9zY2hlbWFfdHlwZSgpOwotICAgIH0KLSAgICAKLSAgICBTY2hlbWFUeXBlIGdldF9lbGVtZW50X3R5cGUgKCBRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5nZXRfZWxlbWVudF90eXBlKCBlbHROYW1lLCB4c2lUeXBlICk7Ci0gICAgfQotICAgIAotICAgIFNjaGVtYVR5cGUgZ2V0X2F0dHJpYnV0ZV90eXBlICggUU5hbWUgYXR0ck5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLmdldF9hdHRyaWJ1dGVfdHlwZSggYXR0ck5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfZWxlbWVudF91c2VyICggUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSApCi0gICAgewotICAgICAgICBUeXBlU3RvcmVVc2VyIHJldCA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRSb290KCkuX2ZhY3RvcnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldCA9IGdldFJvb3QoKS5fZmFjdG9yeS5jcmVhdGVFbGVtZW50VXNlcihnZXRfc2NoZW1hX3R5cGUoKSwgZWx0TmFtZSwgeHNpVHlwZSk7Ci0KLSAgICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0ID0gX3VzZXIuY3JlYXRlX2VsZW1lbnRfdXNlciggZWx0TmFtZSwgeHNpVHlwZSApOwotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfYXR0cmlidXRlX3VzZXIoIFFOYW1lIGF0dHJOYW1lICkKLSAgICB7Ci0gICAgICAgIFR5cGVTdG9yZVVzZXIgcmV0ID0gbnVsbDsKLQotICAgICAgICBpZiAoZ2V0Um9vdCgpLl9mYWN0b3J5ICE9IG51bGwpCi0gICAgICAgICAgICByZXQgPSBnZXRSb290KCkuX2ZhY3RvcnkuY3JlYXRlQXR0cmlidXRlVXNlcihnZXRfc2NoZW1hX3R5cGUoKSwgIGF0dHJOYW1lKTsKLQotICAgICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICAgICAgICByZXQgPSBfdXNlci5jcmVhdGVfYXR0cmlidXRlX3VzZXIoIGF0dHJOYW1lICk7Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBYbWxPYmplY3QgZ2V0WG1sT2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpIF91c2VyOwotICAgIH0KLQotICAgIGJvb2xlYW4gdXNlc19pbnZhbGlkYXRlX3ZhbHVlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLnVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3VzZXIuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGludmFsaWRhdGVUZXh0ICggKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmhpYml0VXNlckludmFsaWRhdGUgPT0gMCkKLSAgICAgICAgICAgIF91c2VyLmludmFsaWRhdGVfdmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGludmFsaWRhdGVOaWwgKCApCi0gICAgewotICAgICAgICBpZiAoX2luaGliaXRVc2VySW52YWxpZGF0ZSA9PSAwKQotICAgICAgICAgICAgX3VzZXIuaW52YWxpZGF0ZV9uaWx2YWx1ZSgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGludmFsaWRhdGVFbGVtZW50ICggQ29udGFpbmVyIGNvbnRhaW5lciwgU3BsYXkgcyApCi0gICAgewotICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXI7Ci0gICAgICAgIAotICAgICAgICBpZiAoX2luaGliaXRVc2VySW52YWxpZGF0ZSA+IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgVHlwZSBjb250YWluZXJUeXBlID0gY29udGFpbmVyLnBlZWtUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5lclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoIWNvbnRhaW5lclR5cGUuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjb250YWluZXJUeXBlLl91c2VyLmludmFsaWRhdGVfdmFsdWUoKTsKLQotICAgICAgICBmb3IgKCA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IGNvbnRhaW5lcjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUeXBlIGNoaWxkVHlwZSA9IHMucGVla1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRUeXBlLl91c2VyLmludmFsaWRhdGVfZWxlbWVudF9vcmRlcigpOwotCi0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgYnVpbGRfdGV4dCAoIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5idWlsZF90ZXh0KCBuc20gKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGJ1aWxkX25pbCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5idWlsZF9uaWwoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IHZhbGlkYXRlQ29udGVudCAoIFNwbGF5IHMsIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKLSAgICB7Ci0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzSW52YWxpZCgpOwotICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzRG9jKCk7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBidWlsZF90ZXh0KCBuc20gKTsKLQotICAgICAgICBhc3NlcnQgdGV4dCAhPSBudWxsOwotCi0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKLQotICAgICAgICAvLyBWYWxpZGF0aW5nIGRvZXMgbm90IGxvZ2ljYWxseSBjaGFuZ2UgdGhlIGRvYwotICAgICAgICBsb25nIG9sZFZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7IC8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbgotICAgICAgICAKLSAgICAgICAgcy5pbnNlcnRDaGFycyggMSwgciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOwotCi0gICAgICAgIHIucmVzdG9yZVZlcnNpb24oIG9sZFZlcnNpb24gKTsKLSAgICAgICAgCi0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUtLTsKLQotICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGgoKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB2YWxpZGF0ZVZhbHVlICggU3BsYXkgcywgTmFtZXNwYWNlTWFuYWdlciBuc20gKQotICAgIHsKLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNJbnZhbGlkKCk7Ci0gICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gYnVpbGRfdGV4dCggbnNtICk7Ci0KLSAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbDsKLQotICAgICAgICAvLyBWYWxpZGF0aW5nIGRvZXMgbm90IGxvZ2ljYWxseSBjaGFuZ2UgdGhlIGRvYwotICAgICAgICBsb25nIG9sZFZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKLSAgICAgICAgCi0gICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7IC8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbgotICAgICAgICAKLSAgICAgICAgcy5zZXRUZXh0KCByLCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpICk7Ci0gICAgICAgIAotICAgICAgICByLnJlc3RvcmVWZXJzaW9uKCBvbGRWZXJzaW9uICk7Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0gICAgfQotCi0gICAgUU5hbWVTZXQgZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIFFOYW1lIHFuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5nZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyggcW5hbWUgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc19hdHRyaWJ1dGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5pc0F0dHIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZV9vbl9zZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFJvb3QoKS52YWxpZGF0ZU9uU2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdfY3Vyc29yICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlICggVmFsaWRhdG9yTGlzdGVuZXIgdkV2ZW50U2luayApCi0gICAgewotICAgICAgICBuZXcgU2F2ZXIuVmFsaWRhdG9yU2F2ZXIoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgMCwgbnVsbCwgdkV2ZW50U2luayApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRfc2NoZW1hdHlwZWxvYWRlciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkuZ2V0U2NoZW1hVHlwZUxvYWRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0X3hzaV90eXBlICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKSB8fCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHMuZ2V0WHNpVHlwZU5hbWUoIGdldFJvb3QoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBjaGFuZ2VfdHlwZSAoIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgcy5zZXRUeXBlKCBnZXRSb290KCksIHNUeXBlLCBmYWxzZSApOwotCi0gICAgICAgIFR5cGUgdCA9IHMuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX3RleHQgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlKys7Ci0KLSAgICAgICAgcy5yZW1vdmVDb250ZW50KCBnZXRSb290KCksIGZhbHNlICk7Ci0KLSAgICAgICAgcy50b2dnbGVJc0ludmFsaWQoKTsKLSAgICAgICAgYXNzZXJ0IHMuaXNJbnZhbGlkKCk7Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hfdGV4dCAoIGludCB3aGl0ZXNwYWNlUnVsZSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgIXMuaXNJbnZhbGlkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ2FuJ3QgZmV0Y2ggdGV4dCB3aGVuIGludmFsaWQiICk7Ci0KLSAgICAgICAgcmV0dXJuIHMuZ2V0VGV4dCggZ2V0Um9vdCgpLCB3aGl0ZXNwYWNlUnVsZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZV90ZXh0ICggU3RyaW5nIHRleHQgKQotICAgIHsKLSAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZSsrOwotICAgICAgICBnZXRTcGxheSgpLnNldFRleHQoIGdldFJvb3QoKSwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOwotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgY29tcHV0ZV9mbGFncyAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOwotCi0gICAgICAgIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2F0dHJpYnV0ZWZsYWdzKCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGludCBmID0gcGFyZW50VXNlci5nZXRfZWxlbWVudGZsYWdzKCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGlmIChmICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIGY7Ci0KLSAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gcGFyZW50VXNlci5uZXdfdmlzaXRvcigpOwotCi0gICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9lbGVtZW50ZmxhZ3MoKTsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNEb2MoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgVHlwZVN0b3JlVXNlciBwYXJlbnRVc2VyID0gcGFyZW50Q29udGFpbmVyLmdldFR5cGUoIGdldFJvb3QoKSApLl91c2VyOwotICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICByZXR1cm4gcGFyZW50VXNlci5nZXRfYXR0cmlidXRlX2ZpZWxkKCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGFzc2VydCBzLmlzQmVnaW4oKTsKLQotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IHBhcmVudFVzZXIubmV3X3Zpc2l0b3IoKTsKLQotICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IHBhcmVudENvbnRhaW5lci5uZXh0U3BsYXkoKSA7IDsgdCA9IHQubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCB0LmdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkVORCA6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKLSAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KCB0LmdldE5hbWUoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHQgPT0gcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X3NjaGVtYV9maWVsZCgpOwotCi0gICAgICAgICAgICAgICAgdCA9IHQuZ2V0RmluaXNoU3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgY291bnRfZWxlbWVudHMgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkuY291bnQoIChDb250YWluZXIpIGdldFNwbGF5KCksIG5hbWUsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvdW50X2VsZW1lbnRzKFFOYW1lU2V0IG5hbWVzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5jb3VudCgoQ29udGFpbmVyKWdldFNwbGF5KCksICBudWxsLCBuYW1lcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWUgbmFtZSwgaW50IGkgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbiggcywgbmFtZSwgbnVsbCwgaSApOwotCi0gICAgICAgIGlmIChudGhCZWdpbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWVTZXQgbmFtZXMsIGludCBpICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbihzLCAgbnVsbCwgbmFtZXMsIGkpOwotICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZShnZXRSb290KCkpOwotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZmluZEFsbEVsZW1lbnRUeXBlcyAoIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgTGlzdCBmaWxsTWVVcCApCi0gICAgewotICAgICAgICBhc3NlcnQgZ2V0U3BsYXkoKS5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGxvb3A6Ci0gICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EICA6Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LlJPT1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKCBnZXRSb290KCkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxsTWVVcC5hZGQoIHR5cGUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHMuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKGdldFJvb3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1lVXAuYWRkKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMgKCBRTmFtZSBuYW1lLCBMaXN0IGZpbGxNZVVwICkKLSAgICB7Ci0gICAgICAgIGludCBpID0gZmlsbE1lVXAuc2l6ZSgpOwotICAgICAgICAKLSAgICAgICAgZmluZEFsbEVsZW1lbnRUeXBlcyggbmFtZSwgbnVsbCwgZmlsbE1lVXAgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaiA9IGkgOyBqIDwgZmlsbE1lVXAuc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgIGZpbGxNZVVwLnNldCggaiwgKChUeXBlKSBmaWxsTWVVcC5nZXQoIGogKSkuX3VzZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5kX2FsbF9lbGVtZW50X3VzZXJzIChRTmFtZVNldCBuYW1lcywgTGlzdCBmaWxsTWVVcCkKLSAgICB7Ci0gICAgICAgIGludCBpID0gZmlsbE1lVXAuc2l6ZSgpOwotICAgICAgICBmaW5kQWxsRWxlbWVudFR5cGVzKG51bGwsIG5hbWVzLCBmaWxsTWVVcCk7Ci0KLSAgICAgICAgZm9yICggaW50IGogPSBpIDsgaiA8IGZpbGxNZVVwLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICBmaWxsTWVVcC5zZXQoIGosICgoVHlwZSkgZmlsbE1lVXAuZ2V0KCBqICkpLl91c2VyICk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgZmluZF9hdHRyaWJ1dGVfdXNlciAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGdldFNwbGF5KCkuaXNDb250YWluZXIoKTsKLQotICAgICAgICBTcGxheSBhID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBuYW1lICk7Ci0KLSAgICAgICAgaWYgKGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFR5cGUgdCA9IGEuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBjb21wdXRlX2RlZmF1bHRfdGV4dCAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOwotCi0gICAgICAgIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3RleHQoIHMuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHBhcmVudFVzZXIuZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gcGFyZW50VXNlci5uZXdfdmlzaXRvcigpOwotCi0gICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9kZWZhdWx0X3RleHQoKTsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV9uaWwgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgcy5zZXRYc2lOaWwoIGdldFJvb3QoKSwgYnVpbGRfbmlsKCkgKTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5kX25pbCAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLSAgCi0gICAgICAgIHJldHVybiBzLmlzQXR0cigpID8gZmFsc2UgOiBzLmdldFhzaU5pbCggZ2V0Um9vdCgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICgKLSAgICAgICAgU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBuc3VyaSwgc3VnZ2VzdGVkX3ByZWZpeCwgdHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHMubmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXggKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyICggUU5hbWUgbmFtZSwgaW50IGkgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICBDb250YWluZXIgYyA9IChDb250YWluZXIpIHM7Ci0KLSAgICAgICAgQmVnaW4gbnRoQmVnaW4gPSByLmZpbmROdGhCZWdpbiggYywgbmFtZSwgbnVsbCwgaSApOwotCi0gICAgICAgIGlmIChudGhCZWdpbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IHIuY291bnQoIGMsIG5hbWUsIG51bGwgKSArIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgcmV0dXJuIGFkZF9lbGVtZW50X3VzZXIoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnNlcnRFbGVtZW50KCBuYW1lLCBudGhCZWdpbiwgMCApOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoUU5hbWVTZXQgc2V0LCBRTmFtZSBuYW1lLCBpbnQgaSkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgQ29udGFpbmVyIGMgPSAoU3BsYXkuQ29udGFpbmVyKSBzOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gci5maW5kTnRoQmVnaW4oYywgbnVsbCwgc2V0LCBpKTsKLQotICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiByLmNvdW50KGMsIG51bGwsIHNldCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgcmV0dXJuIGFkZF9lbGVtZW50X3VzZXIobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5zZXJ0RWxlbWVudChuYW1lLCBudGhCZWdpbiwgMCk7Ci0gICAgfQotICAgIAotLy8gVE9ETyAtIGNvbnNvbGlkYXRlIG5hbWVzLCB0aGlzIGZjbiBpcyB2ZXJ5IGV4cGVuc2l2ZSBpbiBjcmVhdGluZyBuYW1lcwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIgKCBRTmFtZSBxbmFtZSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU3BsYXkgY2FuZGlkYXRlU3BsYXk7Ci0gICAgICAgIGludCBjYW5kaWRhdGVQb3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVNwbGF5ID0gczsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVBvcyA9IHMuZ2V0UG9zTGVhZkVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY2FuZGlkYXRlU3BsYXkgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICBjYW5kaWRhdGVQb3MgPSAwOwotCi0gICAgICAgICAgICBRTmFtZVNldCBlbmRTZXQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb29wOgotICAgICAgICAgICAgZm9yICggU3BsYXkgdCA9IGNhbmRpZGF0ZVNwbGF5IDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSB0LnByZXZTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gcykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodC5nZXROYW1lKCkuZXF1YWxzKCBxbmFtZSApKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmIChlbmRTZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW5kU2V0ID0gZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIHFuYW1lICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW5kU2V0LmNvbnRhaW5zKCB0LmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVTcGxheSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnNlcnRFbGVtZW50KCBxbmFtZSwgY2FuZGlkYXRlU3BsYXksIGNhbmRpZGF0ZVBvcyApOwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZVN0b3JlVXNlciBpbnNlcnRFbGVtZW50ICggUU5hbWUgbmFtZSwgU3BsYXkgcywgaW50IHAgKQotICAgIHsKLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICAKLSAgICAgICAgQmVnaW4gYiA9IG5ldyBCZWdpbiggbmFtZSwgbnVsbCApOwotICAgICAgICBiLnRvZ2dsZUlzTGVhZigpOwotICAgICAgICAKLSAgICAgICAgcy5pbnNlcnQoIHIsIHAsIGIsIG51bGwsIDAsIDAsIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIFR5cGUgdCA9IGIuZ2V0VHlwZSggciApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlX2VsZW1lbnQgKCBRTmFtZSBxbmFtZSwgaW50IGkgKQotICAgIHsKLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgQmVnaW4gYiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4oIHMsIHFuYW1lLCBudWxsLCBpICk7Ci0KLSAgICAgICAgaWYgKGIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgYi5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lU2V0IG5hbWVzLCBpbnQgaSkKLSAgICB7Ci0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLQotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgQmVnaW4gYiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4ocywgbnVsbCwgbmFtZXMsIGkpOwotCi0gICAgICAgIGlmIChiID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIGIucmVtb3ZlKGdldFJvb3QoKSwgdHJ1ZSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgYWRkX2F0dHJpYnV0ZV91c2VyICggUU5hbWUgcW5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNwbGF5IGEgPSBzLmdldEF0dHIoIHFuYW1lICk7Ci0KLSAgICAgICAgaWYgKGEgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBzLm5leHRTcGxheSgpLmluc2VydCgKLSAgICAgICAgICAgIGdldFJvb3QoKSwgMCwgYSA9IG5ldyBBdHRyKCBxbmFtZSApLCBudWxsLCAwLCAwLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBUeXBlIHQgPSBhLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHQuX3VzZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUgKCBRTmFtZSBxbmFtZSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU3BsYXkgYSA9IHMuZ2V0QXR0ciggcW5hbWUgKTsKLQotICAgICAgICBpZiAoYSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGEucmVtb3ZlKCBnZXRSb290KCksIHRydWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY29weV9jb250ZW50c19mcm9tICggVHlwZVN0b3JlIHNvdXJjZSApCi0gICAgewotICAgICAgICBhc3NlcnQgc291cmNlIGluc3RhbmNlb2YgVHlwZTsKLQotICAgICAgICBUeXBlIHNvdXJjZVR5cGUgPSAoVHlwZSkgc291cmNlOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIHMucmVwbGFjZUNvbnRlbnRzKCBnZXRSb290KCksIHNvdXJjZVR5cGUuZ2V0U3BsYXkoKSwgc291cmNlVHlwZS5nZXRSb290KCksIHRydWUsIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzLmdldFR5cGUoIGdldFJvb3QoKSApLl91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFycmF5X3NldHRlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1lbnROYW1lICkKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIHRoZSBxdWljayBhbmQgZGlydHkgaW1wbGVtZW50YXRpb24sIG1ha2UgdGhpcyBmYXN0ZXIKLSAgICAgICAgCi0gICAgICAgIGludCBtID0gc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGNvcGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBtIDsgaSsrICkKLSAgICAgICAgewotLy8gVE9ETyAtIGRlYWwgd2l0aCBudWxsIHNvdXJjZXNbIGkgXSBoZXJlIC0tIHdoYXQgdG8gZG8/Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2VzWyBpIF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXJyYXkgZWxlbWVudCBudWxsIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VzWyBpIF0uaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3BpZXMuYWRkKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgdHlwZXMuYWRkKCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpICgoVHlwZVN0b3JlVXNlcikgc291cmNlc1sgaSBdKS5nZXRfc3RvcmUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjb3BpZXMuYWRkKCB0eXBlLmdldFNwbGF5KCkuY29weVNwbGF5Q29udGVudHMoIHR5cGUuZ2V0Um9vdCgpKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHlwZXMuYWRkKCBzb3VyY2VzWyBpIF0uc2NoZW1hVHlwZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbiA9IGNvdW50X2VsZW1lbnRzKCBlbGVtZW50TmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbiA+IG0gOyBuLS0gKQotICAgICAgICAgICAgcmVtb3ZlX2VsZW1lbnQoIGVsZW1lbnROYW1lLCBtICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG4rKyApCi0gICAgICAgICAgICBhZGRfZWxlbWVudF91c2VyKCBlbGVtZW50TmFtZSApOwotCi0gICAgICAgIGFzc2VydCBtID09IG47Ci0gICAgICAgIAotICAgICAgICBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5kQWxsRWxlbWVudFR5cGVzKCBlbGVtZW50TmFtZSwgbnVsbCwgZWxlbWVudHMgKTsKLQotICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgZWxlbWVudHMuc2l6ZSgpID09IG47Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgZWxlbWVudHMuZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2VzWyBpIF0uaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICB0eXBlLmdldFhtbE9iamVjdCgpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IHR5cGUuZ2V0U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCByID09IHR5cGUuZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzLnJlbW92ZUNvbnRlbnQoIHIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDb3B5Q29udGV4dCBjb3B5Q29udGV4dCA9IChDb3B5Q29udGV4dCkgY29waWVzLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgU3BsYXkgY29weVRyZWUgPSBjb3B5Q29udGV4dC5nZXRUcmVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29weVRyZWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0Q29weSA9IGNvcHlDb250ZXh0LmdldFRleHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBzLmluc2VydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHIsIDEsIGNvcHlUcmVlLCB0ZXh0Q29weSwgMCwgdGV4dENvcHkgPT0gbnVsbCA/IDAgOiB0ZXh0Q29weS5sZW5ndGgsIHRydWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0eXBlLmNoYW5nZV90eXBlKCAoU2NoZW1hVHlwZSkgdHlwZXMuZ2V0KCBpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdF9lbGVtZW50cyAoIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciApCi0gICAgewotICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EIDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggcy5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNfcXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gUGF0aC5xdWVyeSggdGhpcywgcXVlcnlFeHByLCBvcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8KLSAgICAvLwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vbml0b3Igb2JqZWN0LCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgZG9jLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0X3Jvb3Rfb2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlU3RvcmVVc2VyIF91c2VyOwotICAgIHByaXZhdGUgaW50IF9pbmhpYml0VXNlckludmFsaWRhdGU7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1htbE9iamVjdExpc3QuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWG1sT2JqZWN0TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzcxYjVhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWG1sT2JqZWN0TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi0vLyBCVUdCVUc6ICoqKlRMTCoqKiBXaHkgaXNuJ3QgdGhpcyBleHBvc2VkIGluIG9yZy5hcGFjaGUueG1sYmVhbnM/Pz8/Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcmVwcmVzZW50IGxpc3RzIG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgcmV0dXJuZWQKLSAqIGZyb20gYSBxdWVyeS4gVXNlZCBhbHNvIGFzIGEgY29udmVuaWVudCB0eXBlZCB3YXkgb2YgY29sbGVjdGluZwotICogWG1sT2JqZWN0IGluc3RhbmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPYmplY3RMaXN0IHsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBYbWxPYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWwgdGhlIFhtbE9iamVjdCBpbnN0YW5jZSB0byBhZGQgdG8gdGhlIGxpc3QKLSAgICAgKi8KLSAgICB2b2lkIGFkZChYbWxPYmplY3QgeG1sKTsKLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgbGlzdCB0byB0aGlzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sTGlzdCB0aGUgbGlzdCB3aGljaCBpcyB0byBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgdm9pZCBhZGRBbGwoWG1sT2JqZWN0TGlzdCB4bWxMaXN0KTsKLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgb2YgWG1sT2JqZWN0IGluc3RhbmNlcyB0byB0aGlzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sQXJyYXkgdGhlIGFycmF5IHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEFsbChYbWxPYmplY3RbXSB4bWxBcnJheSk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3QuIEFmdGVyIHRoaXMgb3BlcmF0aW9uLAotICAgICAqIHtAbGluayAjaXNFbXB0eSgpIGlzRW1wdHkoKX0gd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgWG1sT2JqZWN0IGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBYbWxPYmplY3QgYXQgdGhlIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZgotICAgICAqICAgICAgICAgPGNvZGU+KGluZGV4IDwgMCkgfHwgKGluZGV4ID49IHNpemUoKSk8L2NvZGU+Ci0gICAgICovCi0gICAgWG1sT2JqZWN0IGdldChpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogVGVzdHMgaWYgdGhpcyBYbWxMaXN0IGlzIGVtcHR5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgKiA8Y29kZT57QGxpbmsgI3NpemUoKSBzaXplKCl9ID09IDA8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBsaXN0IGlzIGVtcHR5LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNFbXB0eSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIGFsbCB0aGUgWG1sT2JqZWN0IGluc3RhbmNlcyBjb250YWluZWQgaW4gdGhpcwotICAgICAqIGxpc3QuIFRoaXMgaXRlcmF0b3Igd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpbgotICAgICAqIHJlc3BvbnNlIHRvIGl0cyByZW1vdmUgbWV0aG9kLgotICAgICAqCi0gICAgICogQHJldHVybiBJdGVyYXRvciBvdmVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3QKLSAgICAgKi8KLSAgICBJdGVyYXRvciBpdGVyYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gaW50IHNpemUgb2YgdGhlIGxpc3QuCi0gICAgICovCi0gICAgaW50IHNpemUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgWG1sTGlzdCBpbiBhIG5ld2x5IGNyZWF0ZWQgYXJyYXkgb2YKLSAgICAgKiBYbWxPYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBhcnJheSBvZiBYbWxPYmplY3QgaW5zdGFuY2VzIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YKLSAgICAgKiAgICAgICAgIHRoZSBsaXN0LgotICAgICAqLwotICAgIFhtbE9iamVjdFtdIHRvQXJyYXkoKTsKLQotCi0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgZmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBvZiBYbWxPYmplY3RMaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvLyB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQ0xBU1M7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENMQVNTID0gQ2xhc3MuZm9yTmFtZSgiY29tLmJlYS53bGkudmFyaWFibGVzLlhtbE9iamVjdExpc3RJbXBsIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBYbWxPYmplY3RMaXN0SW1wbC4iKTsKLSAgICAgICAgICAgICAgICBpc2UuaW5pdENhdXNlKHQpOwotICAgICAgICAgICAgICAgIHRocm93IGlzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgZW1wdHkgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBlbXB0eSBYbWxPYmplY3RMaXN0IGluc3RhbmNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdExpc3QgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0TGlzdClDTEFTUy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZSwgZmlsbGVkIHdpdGggdGhlIGVsZW1lbnRzCi0gICAgICAgICAqIG9mIHRoZSBnaXZlbiBsaXN0Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0TGlzdCBuZXdJbnN0YW5jZShYbWxPYmplY3RMaXN0IGxpc3QpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBuZXdMaXN0ID0gKFhtbE9iamVjdExpc3QpQ0xBU1MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZEFsbChsaXN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBjcmVhdGVzIGEgbmV3IFhtbE9iamVjdExpc3QgaW5zdGFuY2UgZ2l2ZW4gYW4gYXJyYXkgb2YgWG1sT2JqZWN0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBYbWxPYmplY3RMaXN0IGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3RMaXN0IG5ld0luc3RhbmNlKFhtbE9iamVjdFtdIHhtbE9iamVjdHMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBuZXdMaXN0ID0gKFhtbE9iamVjdExpc3QpIENMQVNTLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgbmV3TGlzdC5hZGRBbGwoeG1sT2JqZWN0cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWHFybERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjczMDUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhxcmxEZWxlZ2F0ZSAKLXsKLSAgICBwcml2YXRlIFhxcmxEZWxlZ2F0ZSAoICkKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY2hlY2sgKCBPYmplY3QgbyApCi0gICAgewotICAgICAgICBpZiAobyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHhxcmwuamFyIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFBhdGguUXVlcnkgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aCwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFBhdGguUXVlcnkpCi0gICAgICAgICAgICAgICAgaW52b2tlKCBfY29tcGlsZVBhdGgsIG5ldyBPYmplY3RbXSB7IHBhdGgsIGN1cnJlbnROb2RlVmFyIH0gKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFBhdGguUXVlcnkgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFBhdGguUXVlcnkpCi0gICAgICAgICAgICAgICAgaW52b2tlKAotICAgICAgICAgICAgICAgICAgICBfY29tcGlsZVF1ZXJ5LCBuZXcgT2JqZWN0W10geyBxdWVyeUV4cHIsIGN1cnJlbnROb2RlVmFyLCBuZXcgQm9vbGVhbih0cnVlKSB9ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dSdW50aW1lRXhjZXB0aW9uICggVGhyb3dhYmxlIGUgKQotICAgIHsKLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0gICAgICAgIAotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgIAotICAgICAgICBSdW50aW1lRXhjZXB0aW9uIHJ0ZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBjYXVzZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHJ0ZS5pbml0Q2F1c2UoIGNhdXNlICk7Ci0KLSAgICAgICAgdGhyb3cgcnRlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2UgKCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbXMgKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHhxcmwuamFyIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKCBudWxsLCBwYXJhbXMgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBVbnJlYWNoYWJsZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTG9vc2UgY291cGxpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHhxcmwuamFyCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgX2NvbXBpbGVQYXRoOwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBfY29tcGlsZVF1ZXJ5OwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBib29sZWFuIGhhc1hxcmw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5YcXJsSW1wbCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaGFzWHFybCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYXNYcXJsID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzWHFybCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgeHFybEltcGwgPQotICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlhxcmxJbXBsIiApOwotCi0gICAgICAgICAgICAgICAgX2NvbXBpbGVQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeHFybEltcGwuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZVBhdGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyB9ICk7Ci0KLSAgICAgICAgICAgICAgICBfY29tcGlsZVF1ZXJ5ID0KLSAgICAgICAgICAgICAgICAgICAgeHFybEltcGwuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZVF1ZXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIEJvb2xlYW4uY2xhc3MgfSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QgYi92MS9zcmMveHNkc2NoZW1hL3NjaGVtYS9YTUxTY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWYyMWE3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFhNTCBTY2hlbWEgc2NoZW1hIGZvciBYTUwgU2NoZW1hczogUGFydCAxOiBTdHJ1Y3R1cmVzIC0tPgotPCEtLSBOb3RlIHRoaXMgc2NoZW1hIGlzIE5PVCB0aGUgbm9ybWF0aXZlIHN0cnVjdHVyZXMgc2NoZW1hLiAtLT4KLQotPCEtLSBUaGUgcHJvc2UgY29weSBpbiB0aGUgc3RydWN0dXJlcyBSRUMgaXMgdGhlIG5vcm1hdGl2ZSAtLT4KLQotPCEtLSB2ZXJzaW9uICh3aGljaCBzaG91bGRuJ3QgZGlmZmVyIGZyb20gdGhpcyBvbmUgZXhjZXB0IGZvciAtLT4KLQotPCEtLSB0aGlzIGNvbW1lbnQgYW5kIGVudGl0eSBleHBhbnNpb25zLCBidXQganVzdCBpbiBjYXNlIC0tPgotCi08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiBbCi0KLTwhLS0gcHJvdmlkZSBJRCB0eXBlIGluZm9ybWF0aW9uIGV2ZW4gZm9yIHBhcnNlcnMgd2hpY2ggb25seSByZWFkIHRoZQotICAgICBpbnRlcm5hbCBzdWJzZXQgLS0+Ci08IUFUVExJU1QgeHM6c2NoZW1hICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y29tcGxleFR5cGUgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y29tcGxleENvbnRlbnQgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2ltcGxlQ29udGVudCAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZXh0ZW5zaW9uICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZWxlbWVudCAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Z3JvdXAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+IAotPCFBVFRMSVNUIHhzOmFsbCAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmNob2ljZSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnNlcXVlbmNlICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmFueSAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmFueUF0dHJpYnV0ZSAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmF0dHJpYnV0ZSAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmF0dHJpYnV0ZUdyb3VwICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnVuaXF1ZSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmtleSAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmtleXJlZiAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnNlbGVjdG9yICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmZpZWxkICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmluY2x1ZGUgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmltcG9ydCAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnJlZGVmaW5lICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOm5vdGF0aW9uICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCEtLQotICAgICBrZWVwIHRoaXMgc2NoZW1hIFhNTDEuMCBEVEQgdmFsaWQKLSAgLS0+Ci0gICAgICAgIDwhRU5USVRZICUgc2NoZW1hQXR0cnMgJ3htbG5zOmhmcCBDREFUQSAjSU1QTElFRCc+Ci0KLSAgICAgICAgPCFFTEVNRU5UIGhmcDpoYXNGYWNldCBFTVBUWT4KLSAgICAgICAgPCFBVFRMSVNUIGhmcDpoYXNGYWNldAotICAgICAgICAgICAgICAgIG5hbWUgTk1UT0tFTiAjUkVRVUlSRUQ+Ci0KLSAgICAgICAgPCFFTEVNRU5UIGhmcDpoYXNQcm9wZXJ0eSBFTVBUWT4KLSAgICAgICAgPCFBVFRMSVNUIGhmcDpoYXNQcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWUgTk1UT0tFTiAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgICB2YWx1ZSBDREFUQSAjUkVRVUlSRUQ+Ci08IS0tCi0gICAgICAgIE1ha2Ugc3VyZSB0aGF0IHByb2Nlc3NvcnMgdGhhdCBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwKLSAgICAgICAgc3Vic2V0IHdpbGwga25vdyBhYm91dCB0aGUgdmFyaW91cyBJRHMgd2UgZGVjbGFyZQotICAtLT4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnNpbXBsZVR5cGUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhFeGNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5FeGNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhJbmNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5JbmNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czp0b3RhbERpZ2l0cyBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmZyYWN0aW9uRGlnaXRzIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bGVuZ3RoIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWluTGVuZ3RoIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWF4TGVuZ3RoIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZW51bWVyYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpwYXR0ZXJuIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6YXBwaW5mbyBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmRvY3VtZW50YXRpb24gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpsaXN0IGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6dW5pb24gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIF0+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGJsb2NrRGVmYXVsdD0iI2FsbCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjEuMCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iRU4iIHhtbG5zOmhmcD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaGFzRmFjZXRBbmRQcm9wZXJ0eSI+Ci0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgIFBhcnQgMSB2ZXJzaW9uOiBJZDogWE1MU2NoZW1hLnhzZCx2IDEuNTMgMjAwMy8wMi8yNCAxNzo0MDowNyBodCBFeHAgCi0gICAgUGFydCAyIHZlcnNpb246IElkOiBkYXRhdHlwZXMueHNkLHYgMS42MCAyMDAzLzA0LzA1IDExOjAyOjMwIGh0IEV4cCAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotCi0gPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC9Hcm91cC8yMDAyLzA5L3htbHNjaGVtYS0xL3N0cnVjdHVyZXMtd2l0aC1lcnJhdGEuaHRtbCI+Ci0gICBUaGUgc2NoZW1hIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkb2N1bWVudCBpcyBub3JtYXRpdmUsCi0gICB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bnRhY3RpYyBjb25zdHJhaW50cyBpdCBleHByZXNzZXMgaW4gdGhlCi0gICBYTUwgU2NoZW1hIGxhbmd1YWdlLiAgVGhlIGRvY3VtZW50YXRpb24gKHdpdGhpbiAmbHQ7ZG9jdW1lbnRhdGlvbj4gZWxlbWVudHMpCi0gICBiZWxvdywgaXMgbm90IG5vcm1hdGl2ZSwgYnV0IHJhdGhlciBoaWdobGlnaHRzIGltcG9ydGFudCBhc3BlY3RzIG9mCi0gICB0aGUgVzNDIFJlY29tbWVuZGF0aW9uIG9mIHdoaWNoIHRoaXMgaXMgYSBwYXJ0PC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGUgc2ltcGxlVHlwZSBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIG1lbWJlcnMgYXJlIGRlZmluZWQKLSAgICAgIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGlzIHNjaGVtYSBkb2N1bWVudDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBHZXQgYWNjZXNzIHRvIHRoZSB4bWw6IGF0dHJpYnV0ZSBncm91cHMgZm9yIHhtbDpsYW5nCi0gICAgICAgYXMgZGVjbGFyZWQgb24gJ3NjaGVtYScgYW5kICdkb2N1bWVudGF0aW9uJyBiZWxvdwotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gPC94czppbXBvcnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ib3BlbkF0dHJzIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgYWxtb3N0IGFsbCBzY2hlbWEgdHlwZXMKLSAgICAgICB0byBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgbmFtZXNwYWNlcyB0byBiZQotICAgICAgIGFkZGVkIHRvIHVzZXIgc2NoZW1hcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW5ub3RhdGVkIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgYWxsIHR5cGVzIHdoaWNoIGFsbG93IGFubm90YXRpb24KLSAgICAgICBvdGhlciB0aGFuICZsdDtzY2hlbWEmZ3Q7IGl0c2VsZgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0ic2NoZW1hVG9wIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoaXMgZ3JvdXAgaXMgZm9yIHRoZQotICAgZWxlbWVudHMgd2hpY2ggb2NjdXIgZnJlZWx5IGF0IHRoZSB0b3AgbGV2ZWwgb2Ygc2NoZW1hcy4KLSAgIEFsbCBvZiB0aGVpciB0eXBlcyBhcmUgYmFzZWQgb24gdGhlICJhbm5vdGF0ZWQiIHR5cGUgYnkgZXh0ZW5zaW9uLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6ZWxlbWVudCIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphdHRyaWJ1dGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6bm90YXRpb24iLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0icmVkZWZpbmFibGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBncm91cCBpcyBmb3IgdGhlCi0gICBlbGVtZW50cyB3aGljaCBjYW4gc2VsZi1yZWRlZmluZSAoc2VlICZsdDtyZWRlZmluZT4gYmVsb3cpLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzaW1wbGVUeXBlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNvbXBsZXhUeXBlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmdyb3VwIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmF0dHJpYnV0ZUdyb3VwIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJmb3JtQ2hvaWNlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJxdWFsaWZpZWQiLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5xdWFsaWZpZWQiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZWZhdWx0RGVyaXZhdGlvbkNvbnRyb2wiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlZmF1bHREZXJpdmF0aW9uU2V0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge2V4dGVuc2lvbiwgcmVzdHJpY3Rpb24sIGxpc3QsIHVuaW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4gICAgCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpkZWZhdWx0RGVyaXZhdGlvbkNvbnRyb2wiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJyZWR1Y2VkRGVyaXZhdGlvbkNvbnRyb2wiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZXJpdmF0aW9uU2V0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge2V4dGVuc2lvbiwgcmVzdHJpY3Rpb259PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPiAgICAKLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnJlZHVjZWREZXJpdmF0aW9uQ29udHJvbCIvPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNjaGVtYSIgaWQ9InNjaGVtYSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2NoZW1hIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmluY2x1ZGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmltcG9ydCIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6cmVkZWZpbmUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czpncm91cCByZWY9InhzOnNjaGVtYVRvcCIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOm5vcm1hbGl6ZWRTdHJpbmciLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbERlZmF1bHQiIHR5cGU9InhzOmRlZmF1bHREZXJpdmF0aW9uU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9ja0RlZmF1bHQiIHR5cGU9InhzOmJsb2NrU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIgdHlwZT0ieHM6Zm9ybUNob2ljZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0idW5xdWFsaWZpZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50Rm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6a2V5IG5hbWU9ImVsZW1lbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0idHlwZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmNvbXBsZXhUeXBlfHhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0gCi0gIDx4czprZXkgbmFtZT0iZ3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpncm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLSAKLSAgPHhzOmtleSBuYW1lPSJhdHRyaWJ1dGVHcm91cCI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZUdyb3VwIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotIAotICA8eHM6a2V5IG5hbWU9Im5vdGF0aW9uIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6bm90YXRpb24iLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSAgPHhzOmtleSBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSIuLy94czprZXl8Li8veHM6dW5pcXVlfC4vL3hzOmtleXJlZiIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotIDwveHM6ZWxlbWVudD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE5OSSI+Ci0gIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPgotICAgZm9yIG1heE9jY3VyczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvY2N1cnMiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBhbGwgcGFydGljbGVzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdHlwZT0ieHM6YWxsTk5JIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkZWZSZWYiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBlbGVtZW50LCBncm91cCBhbmQgYXR0cmlidXRlR3JvdXAsCi0gICB3aGljaCBib3RoIGRlZmluZSBhbmQgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOlFOYW1lIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czpncm91cCBuYW1lPSJ0eXBlRGVmUGFydGljbGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICdjb21wbGV4VHlwZScgdXNlcyB0aGlzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0gCi0gCi0KLSA8eHM6Z3JvdXAgbmFtZT0ibmVzdGVkUGFydGljbGUiPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpncm91cCBuYW1lPSJwYXJ0aWNsZSI+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czpsb2NhbEVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJvcHRpb25hbCI+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvaGliaXRlZCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHR5cGU9InhzOmZvcm1DaG9pY2UiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQXR0cmlidXRlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iYXR0ckRlY2xzIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOmF0dHJpYnV0ZSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiB0eXBlPSJ4czphdHRyaWJ1dGVHcm91cFJlZiIvPgotICAgPC94czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueUF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueUF0dHJpYnV0ZSIgdHlwZT0ieHM6d2lsZGNhcmQiIGlkPSJhbnlBdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYW55QXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iY29tcGxleFR5cGVNb2RlbCI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZUNvbnRlbnQiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleENvbnRlbnQiLz4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGJyYW5jaCBpcyBzaG9ydCBmb3IKLSAgICZsdDtjb21wbGV4Q29udGVudD4KLSAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4KLSAgIC4uLgotICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAgICZsdDsvY29tcGxleENvbnRlbnQ+PC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4VHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFdpbGwgYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1peGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBOb3QgYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50IGNoaWxkIGlzIGNob3Nlbi4KLSAgICAgIE1heSBiZSBvdmVycmlkZW4gYnkgc2V0dGluZyBvbiBjb21wbGV4Q29udGVudCBjaGlsZC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxDb21wbGV4VHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpjb21wbGV4VHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpjb21wbGV4VHlwZU1vZGVsIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJyZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgICAgIAotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFJlc3RyaWN0aW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZXN0cmljdGlvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2UgaXMgYWRkZWQgc2ltcGx5IHRvCi0gICAgICAgICAgICAgICAgICAgbWFrZSB0aGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gcGVyIHRoZSBSRUM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2lvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleENvbnRlbnQiIGlkPSJjb21wbGV4Q29udGVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4Q29udGVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgdHlwZT0ieHM6Y29tcGxleFJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpleHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPiAgICAgCi0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgT3ZlcnJpZGVzIGFueSBzZXR0aW5nIG9uIGNvbXBsZXhUeXBlIHBhcmVudC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVSZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bwotICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHRlbnNpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4dGVuc2lvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vIHR5cGVEZWZQYXJ0aWNsZSBncm91cCByZWZlcmVuY2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNpbXBsZUNvbnRlbnQiIGlkPSJzaW1wbGVDb250ZW50Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNpbXBsZUNvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOnNpbXBsZVJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpzaW1wbGVFeHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0gCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOnRvcExldmVsQ29tcGxleFR5cGUiIGlkPSJjb21wbGV4VHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4VHlwZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmxvY2tTZXQiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtzdWJzdGl0dXRpb24sIGV4dGVuc2lvbiwKLSAgICByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+ICAgIAotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6bGlzdD4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgPC94czp1bmlvbj4gIAotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhlIGVsZW1lbnQgZWxlbWVudCBjYW4gYmUgdXNlZCBlaXRoZXIKLSAgIGF0IHRoZSB0b3AgbGV2ZWwgdG8gZGVmaW5lIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGdsb2JhbGx5LAotICAgb3Igd2l0aGluIGEgY29udGVudCBtb2RlbCB0byBlaXRoZXIgcmVmZXJlbmNlIGEgZ2xvYmFsbHktZGVmaW5lZAotICAgZWxlbWVudCBvciB0eXBlIG9yIGRlY2xhcmUgYW4gZWxlbWVudC10eXBlIGJpbmRpbmcgbG9jYWxseS4KLSAgIFRoZSByZWYgZm9ybSBpcyBub3QgYWxsb3dlZCBhdCB0aGUgdG9wIGxldmVsLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uR3JvdXAiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmJsb2NrU2V0Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB0eXBlPSJ4czpmb3JtQ2hvaWNlIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEVsZW1lbnQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZWxlbWVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxFbGVtZW50Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOnRvcExldmVsRWxlbWVudCIgaWQ9ImVsZW1lbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZWxlbWVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBncm91cCB0eXBlIGZvciBleHBsaWNpdCBncm91cHMsIG5hbWVkIHRvcC1sZXZlbCBncm91cHMgYW5kCi0gICBncm91cCByZWZlcmVuY2VzPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czpwYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVhbEdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZWFsR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpzaW1wbGVFeHBsaWNpdEdyb3VwIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXBSZWYiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4cGxpY2l0R3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgZ3JvdXAgdHlwZSBmb3IgdGhlIHRocmVlIGtpbmRzIG9mIGdyb3VwPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZUV4cGxpY2l0R3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0iYWxsTW9kZWwiPgotICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2Ugd2l0aCBtaW4vbWF4IGlzIGhlcmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgYSBwYmxtIHdpdGggdGhlIEVsdDpBbGwvQ2hvaWNlL1NlcQotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNsZSBkZXJpdmF0aW9uIGNvbnN0cmFpbnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmVsZW1lbnRJbkFsbCIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudEluQWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPnJlc3RyaWN0ZWQgbWF4L21pbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9jYWxFbGVtZW50Ij4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+ICAgIAotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbGwiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBPbmx5IGVsZW1lbnRzIGFsbG93ZWQgaW5zaWRlPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpleHBsaWNpdEdyb3VwIj4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFsbCIgaWQ9ImFsbCIgdHlwZT0ieHM6YWxsIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFsbCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0iY2hvaWNlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWNob2ljZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOmV4cGxpY2l0R3JvdXAiIGlkPSJzZXF1ZW5jZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZXF1ZW5jZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOm5hbWVkR3JvdXAiIGlkPSJncm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ncm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9IndpbGRjYXJkIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpuYW1lc3BhY2VMaXN0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIjI2FueSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0NvbnRlbnRzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJzdHJpY3QiPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNraXAiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaWN0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYW55IiBpZD0iYW55Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOndpbGRjYXJkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgc2ltcGxlIHR5cGUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgJ25hbWVzcGFjZScgYXR0ciBvZgotICAgJ2FueScgYW5kICdhbnlBdHRyaWJ1dGUnPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBWYWx1ZSBpcwotICAgICAgICAgICAgICAjI2FueSAgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBhdCBhbGwKLQotICAgICAgICAgICAgICAjI290aGVyICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0YXJnZXROUwotCi0gICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIAotCi0gICAgICAgICAgICAgIG9uZSBvciAgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGZyb20KLSAgICAgICAgICAgICAgbW9yZSBVUkkgICAgICAgIHRoZSBsaXN0ZWQgbmFtZXNwYWNlcwotICAgICAgICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgICAgICAgIChzcGFjZSBzZXBhcmF0ZWQpCi0KLSAgICAjI3RhcmdldE5hbWVzcGFjZSBvciAjI2xvY2FsIG1heSBhcHBlYXIgaW4gdGhlIGFib3ZlIGxpc3QsIHRvCi0gICAgICAgIHJlZmVyIHRvIHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZwotICAgICAgICBzY2hlbWEgb3IgYW4gYWJzZW50IHRhcmdldE5hbWVzcGFjZSByZXNwZWN0aXZlbHk8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWVzcGFjZUxpc3QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNvdGhlciIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdD4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmFueVVSSSI+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjbG9jYWwiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOnVuaW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czpsaXN0PgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ieHM6dG9wTGV2ZWxBdHRyaWJ1dGUiIGlkPSJhdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlR3JvdXAiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRBdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZUdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlR3JvdXAiIHR5cGU9InhzOm5hbWVkQXR0cmlidXRlR3JvdXAiIGlkPSJhdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hdHRyaWJ1dGVHcm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgaWQ9ImluY2x1ZGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW5jbHVkZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJyZWRlZmluZSIgaWQ9InJlZGVmaW5lIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXJlZGVmaW5lIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiIGlkPSJpbXBvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW1wb3J0Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VsZWN0b3IiIGlkPSJzZWxlY3RvciI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZWxlY3RvciIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCi1pbiBzZWxlY3RvcnM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwotdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBmb2xsb3dpbmcgRUJORjoKLSAgICAgICAgICBTZWxlY3RvciAgICA6Oj0gICAgUGF0aCAoICd8JyBQYXRoICkqICAKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyBTdGVwICggJy8nIFN0ZXAgKSogIAotICAgICAgICAgIFN0ZXAgICAgOjo9ICAgICcuJyB8IE5hbWVUZXN0ICAKLSAgICAgICAgICBOYW1lVGVzdCAgICA6Oj0gICAgUU5hbWUgfCAnKicgfCBOQ05hbWUgJzonICcqJyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDo6IGlzIGFsc28gYWxsb3dlZAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIG1vZGlmaWVkIHRvIGFsbG93IHdoaXRlIHNwYWNlIC0tPgotICAgICAgICA8eHM6cGF0dGVybgotICAgICAgICAgICAgdmFsdWU9IihcLlxzKi8vXHMqKT8oKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKShccyovXHMqKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKihccypcfFxzKihcLlxzKi8vXHMqKT8oKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKShccyovXHMqKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKikqIj4KLSAgICAgICAgPC94czpwYXR0ZXJuPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJmaWVsZCIgaWQ9ImZpZWxkIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWZpZWxkIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgiIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgc3Vic2V0IG9mIFhQYXRoIGV4cHJlc3Npb25zIGZvciB1c2UKLWluIGZpZWxkczwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljCi11c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIGZvbGxvd2luZyBwYXR0ZXJuIGlzIGludGVuZGVkIHRvIGFsbG93IFhQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyBwZXIgdGhlIHNhbWUgRUJORiBhcyBmb3Igc2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgotICAgICAgICAgIFBhdGggICAgOjo9ICAgICgnLi8vJyk/ICggU3RlcCAnLycgKSogKCBTdGVwIHwgJ0AnIE5hbWVUZXN0ICkgCi0gICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPCEtLSBUU0ggbW9kaWZpZWQgdG8gYWxsb3cgd2hpdGUgc3BhY2UgLS0+Ci0gICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoXC5ccyovL1xzKik/KCgoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pXHMqL1xzKikqKCgoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pfCgoYXR0cmlidXRlXHMqOjpccyp8QFxzKikoKFxpXGMqOik/KFxpXGMqfFwqKSkpKShccypcfFxzKihccypcLi8vXHMqKT8oKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikvKSooKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLil8KChhdHRyaWJ1dGVccyo6OlxzKnxAXHMqKSgoXGlcYyo6KT8oXGlcYyp8XCopKSkpKSoiPgotICAgICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJrZXliYXNlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZWxlY3RvciIvPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZpZWxkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSB0aHJlZSBraW5kcyBvZiBpZGVudGl0eSBjb25zdHJhaW50cywgYWxsIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3IgZGVyaXZlZCBmcm9tICdrZXliYXNlJy4KLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlxdWUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5Ii8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmtleXJlZiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0idW5pcXVlIiB0eXBlPSJ4czprZXliYXNlIiBpZD0idW5pcXVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXVuaXF1ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotIDx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0ieHM6a2V5YmFzZSIgaWQ9ImtleSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLSA8eHM6ZWxlbWVudCBuYW1lPSJrZXlyZWYiIGlkPSJrZXlyZWYiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQta2V5cmVmIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6a2V5YmFzZSI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmZXIiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Im5vdGF0aW9uIiBpZD0ibm90YXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtbm90YXRpb24iLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpYyIgdHlwZT0ieHM6cHVibGljIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icHVibGljIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgcHVibGljIGlkZW50aWZpZXIsIHBlciBJU08gODg3OTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iLz4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhcHBpbmZvIiBpZD0iYXBwaW5mbyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hcHBpbmZvIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uIiBpZD0iZG9jdW1lbnRhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1kb2N1bWVudGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiBpZD0iYW5ub3RhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbm5vdGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YXBwaW5mbyIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZG9jdW1lbnRhdGlvbiIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBub3RhdGlvbnMgZm9yIHVzZSB3aXRoaW4gWE1MIFNjaGVtYSBzY2hlbWFzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpub3RhdGlvbiBuYW1lPSJYTUxTY2hlbWFTdHJ1Y3R1cmVzIiBwdWJsaWM9InN0cnVjdHVyZXMiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOC9YTUxTY2hlbWEueHNkIi8+Ci0gPHhzOm5vdGF0aW9uIG5hbWU9IlhNTCIgcHVibGljPSJSRUMteG1sLTE5OTgwMjEwIiBzeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCIvPgotICAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgTm90IHRoZSByZWFsIHVyVHlwZSwgYnV0IGFzIGNsb3NlIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2FuCi0gICBnZXQgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6c2VxdWVuY2U+Ci0gICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gIDx4czphbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRmlyc3QgdGhlIGJ1aWx0LWluIHByaW1pdGl2ZSBkYXRhdHlwZXMuICBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yCi0gICAgICBpbmZvcm1hdGlvbiBvbmx5LCB0aGUgcmVhbCBidWlsdC1pbiBkZWZpbml0aW9ucyBhcmUgbWFnaWMuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBGb3IgZWFjaCBidWlsdC1pbiBkYXRhdHlwZSBpbiB0aGlzIHNjaGVtYSAoYm90aCBwcmltaXRpdmUgYW5kCi0gICAgICBkZXJpdmVkKSBjYW4gYmUgdW5pcXVlbHkgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZAotICAgICAgYXMgZm9sbG93czoKLSAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZQotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgaW50IGRhdGF0eXBlLCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludAotCi0gICAgICBBZGRpdGlvbmFsbHksIGVhY2ggZmFjZXQgZGVmaW5pdGlvbiBlbGVtZW50IGNhbiBiZSB1bmlxdWVseQotICAgICAgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOgotICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKLSAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGZhY2V0Ci0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSBtYXhJbmNsdXNpdmUgZmFjZXQsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbWF4SW5jbHVzaXZlCi0KLSAgICAgIEFkZGl0aW9uYWxseSwgZWFjaCBmYWNldCB1c2FnZSBpbiBhIGJ1aWx0LWluIGRhdGF0eXBlIGRlZmluaXRpb24KLSAgICAgIGNhbiBiZSB1bmlxdWVseSBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZGF0YXR5cGUsIGZvbGxvd2VkCi0gICAgICAgICAgIGJ5IGEgcGVyaW9kICgiLiIpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBmYWNldAotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgdXNhZ2Ugb2YgdGhlIG1heEluY2x1c2l2ZSBmYWNldCBpbgotICAgICAgdGhlIGRlZmluaXRpb24gb2YgaW50LCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludC5tYXhJbmNsdXNpdmUKLQotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InN0cmluZyIgaWQ9InN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJwcmVzZXJ2ZSIgaWQ9InN0cmluZy5wcmVzZXJ2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJib29sZWFuIiBpZD0iYm9vbGVhbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNib29sZWFuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJib29sZWFuLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZmxvYXQiIGlkPSJmbG9hdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZmxvYXQud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkb3VibGUiIGlkPSJkb3VibGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZG91YmxlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZG91YmxlLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVjaW1hbCIgaWQ9ImRlY2ltYWwiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0idG90YWxEaWdpdHMiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJmcmFjdGlvbkRpZ2l0cyIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkZWNpbWFsLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkdXJhdGlvbiIgaWQ9ImR1cmF0aW9uIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZHVyYXRpb24ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlVGltZSIgaWQ9ImRhdGVUaW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGVUaW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGltZSIgaWQ9InRpbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJ0aW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGF0ZSIgaWQ9ImRhdGUiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnWWVhck1vbnRoIiBpZD0iZ1llYXJNb250aCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXJNb250aC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdZZWFyIiBpZD0iZ1llYXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXIud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdNb250aERheSIgaWQ9ImdNb250aERheSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoRGF5Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgaWQ9ImdNb250aERheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdEYXkiIGlkPSJnRGF5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBpZD0iZ0RheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ01vbnRoIiBpZD0iZ01vbnRoIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJnTW9udGgud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaGV4QmluYXJ5IiBpZD0iaGV4QmluYXJ5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImhleEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSIgaWQ9ImJhc2U2NEJpbmFyeSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImJhc2U2NEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYW55VVJJIiBpZD0iYW55VVJJIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJhbnlVUkkud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWUiIGlkPSJRTmFtZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9IlFOYW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5PVEFUSU9OIiBpZD0iTk9UQVRJT04iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iLz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICBOT1RBVElPTiBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBpbiBhIHNjaGVtYTsgcmF0aGVyIGEgdHlwZQotICAgICAgICBtdXN0IGJlIGRlcml2ZWQgZnJvbSBpdCBieSBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBlbnVtZXJhdGlvbgotICAgICAgICBmYWNldCB3aG9zZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiBhIE5PVEFUSU9OIGRlY2xhcmVkIGluIHRoZQotICAgICAgICBzY2hlbWEuCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iTk9UQVRJT04ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vdyB0aGUgZGVyaXZlZCBwcmltaXRpdmUgdHlwZXMKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiBpZD0ibm9ybWFsaXplZFN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9InJlcGxhY2UiCi0gICAgICAgIGlkPSJub3JtYWxpemVkU3RyaW5nLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idG9rZW4iIGlkPSJ0b2tlbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGlkPSJ0b2tlbi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxhbmd1YWdlIiBpZD0ibGFuZ3VhZ2UiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbGFuZ3VhZ2UiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czpwYXR0ZXJuCi0gICAgICAgIHZhbHVlPSJbYS16QS1aXXsxLDh9KC1bYS16QS1aMC05XXsxLDh9KSoiCi0gICAgICAgICAgICAgICAgaWQ9Imxhbmd1YWdlLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1MYW5ndWFnZUlEIj4KLSAgICAgICAgICAgIHBhdHRlcm4gc3BlY2lmaWVzIHRoZSBjb250ZW50IG9mIHNlY3Rpb24gMi4xMiBvZiBYTUwgMS4wZTIKLSAgICAgICAgICAgIGFuZCBSRkMgMzA2NiAoUmV2aXNlZCB2ZXJzaW9uIG9mIFJGQyAxNzY2KS4KLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUZTIiBpZD0iSURSRUZTIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOklEUkVGIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJJRFJFRlMubWluTGVuZ3RoIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUSUVTIiBpZD0iRU5USVRJRVMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRJRVMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpFTlRJVFkiLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9IkVOVElUSUVTLm1pbkxlbmd0aCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOTVRPS0VOIiBpZD0iTk1UT0tFTiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGMrIiBpZD0iTk1UT0tFTi5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTm10b2tlbiI+Ci0gICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA3IGZyb20gdGhlIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5NVE9LRU5TIiBpZD0iTk1UT0tFTlMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJOTVRPS0VOUy5taW5MZW5ndGgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxpXGMqIiBpZD0iTmFtZS5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1OYW1lIj4KLSAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDUgZnJvbSB0aGUgWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTkNOYW1lIiBpZD0iTkNOYW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TmFtZSI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xpLVs6XV1bXGMtWzpdXSoiIGlkPSJOQ05hbWUucGF0dGVybiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNOVC1OQ05hbWUiPgotICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNCBmcm9tIHRoZSBOYW1lc3BhY2VzIGluIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRCIgaWQ9IklEIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUYiIGlkPSJJRFJFRiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUWSIgaWQ9IkVOVElUWSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVFkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImludGVnZXIiIGlkPSJpbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlY2ltYWwiPgotICAgICAgPHhzOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSIwIiBmaXhlZD0idHJ1ZSIgaWQ9ImludGVnZXIuZnJhY3Rpb25EaWdpdHMiLz4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXC0rXT9bMC05XSsiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIiBpZD0ibm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vblBvc2l0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIwIiBpZD0ibm9uUG9zaXRpdmVJbnRlZ2VyLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuZWdhdGl2ZUludGVnZXIiIGlkPSJuZWdhdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iLTEiIGlkPSJuZWdhdGl2ZUludGVnZXIubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImxvbmciIGlkPSJsb25nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xvbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTkyMjMzNzIwMzY4NTQ3NzU4MDgiIGlkPSJsb25nLm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iOTIyMzM3MjAzNjg1NDc3NTgwNyIgaWQ9ImxvbmcubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImludCIgaWQ9ImludCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmxvbmciPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTIxNDc0ODM2NDgiIGlkPSJpbnQubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIyMTQ3NDgzNjQ3IiBpZD0iaW50Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzaG9ydCIgaWQ9InNob3J0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Nob3J0Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTMyNzY4IiBpZD0ic2hvcnQubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIzMjc2NyIgaWQ9InNob3J0Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJieXRlIiBpZD0iYnl0ZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNieXRlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaG9ydCI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItMTI4IiBpZD0iYnl0ZS5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEyNyIgaWQ9ImJ5dGUubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vbk5lZ2F0aXZlSW50ZWdlciIgaWQ9Im5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25OZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMCIgaWQ9Im5vbk5lZ2F0aXZlSW50ZWdlci5taW5JbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRMb25nIiBpZD0idW5zaWduZWRMb25nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkTG9uZyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjE4NDQ2NzQ0MDczNzA5NTUxNjE1IgotICAgICAgICBpZD0idW5zaWduZWRMb25nLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZEludCIgaWQ9InVuc2lnbmVkSW50Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkSW50Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZExvbmciPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iNDI5NDk2NzI5NSIKLSAgICAgICAgaWQ9InVuc2lnbmVkSW50Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZFNob3J0IiBpZD0idW5zaWduZWRTaG9ydCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZFNob3J0Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZEludCI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI2NTUzNSIKLSAgICAgICAgaWQ9InVuc2lnbmVkU2hvcnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkQnl0ZSIgaWQ9InVuc2lnbmVkQnl0ZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkU2hvcnQiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMjU1IiBpZD0idW5zaWduZWRCeXRlLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwb3NpdGl2ZUludGVnZXIiIGlkPSJwb3NpdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIgaWQ9InBvc2l0aXZlSW50ZWdlci5taW5JbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZXJpdmF0aW9uQ29udHJvbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3Vic3RpdHV0aW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsaXN0Ii8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuaW9uIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9InNpbXBsZURlcml2YXRpb24iPgotICA8eHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6cmVzdHJpY3Rpb24iLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmxpc3QiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnVuaW9uIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzaW1wbGVEZXJpdmF0aW9uU2V0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge3Jlc3RyaWN0aW9uLCB1bmlvbiwgbGlzdH0KLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlcml2YXRpb25Db250cm9sIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsaXN0Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5pb24iLz4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOnNpbXBsZURlcml2YXRpb25TZXQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIENhbiBiZSByZXN0cmljdGVkIHRvIHJlcXVpcmVkIG9yIGZvcmJpZGRlbgotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbFNpbXBsZVR5cGUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBSZXF1aXJlZCBhdCB0aGUgdG9wIGxldmVsCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxTaW1wbGVUeXBlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIEZvcmJpZGRlbiB3aGVuIG5lc3RlZAotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOnRvcExldmVsU2ltcGxlVHlwZSIgaWQ9InNpbXBsZVR5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1zaW1wbGVUeXBlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9ImZhY2V0cyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBXZSBzaG91bGQgdXNlIGEgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciBmYWNldHMsIGJ1dAotICAgICAgIHRoYXQncyBydWxlZCBvdXQgYmVjYXVzZSBpdCB3b3VsZCBhbGxvdyB1c2VycyB0bwotICAgICAgIGFkZCB0aGVpciBvd24sIHdoaWNoIHdlJ3JlIG5vdCByZWFkeSBmb3IgeWV0LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5FeGNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1pbkluY2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4RXhjbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhJbmNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnRvdGFsRGlnaXRzIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpmcmFjdGlvbkRpZ2l0cyIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bGVuZ3RoIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5MZW5ndGgiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heExlbmd0aCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZW51bWVyYXRpb24iLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOndoaXRlU3BhY2UiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnBhdHRlcm4iLz4KLSAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czpncm91cCBuYW1lPSJzaW1wbGVSZXN0cmljdGlvbk1vZGVsIj4KLSAgIDx4czpzZXF1ZW5jZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDx4czpncm91cCByZWY9InhzOmZhY2V0cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgaWQ9InJlc3RyaWN0aW9uIj4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1yZXN0cmljdGlvbiI+Ci0gICAgICAgICAgYmFzZSBhdHRyaWJ1dGUgYW5kIHNpbXBsZVR5cGUgY2hpbGQgYXJlIG11dHVhbGx5Ci0gICAgICAgICAgZXhjbHVzaXZlLCBidXQgb25lIG9yIG90aGVyIGlzIHJlcXVpcmVkCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgotICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxpc3QiIGlkPSJsaXN0Ij4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1saXN0Ij4KLSAgICAgICAgICBpdGVtVHlwZSBhdHRyaWJ1dGUgYW5kIHNpbXBsZVR5cGUgY2hpbGQgYXJlIG11dHVhbGx5Ci0gICAgICAgICAgZXhjbHVzaXZlLCBidXQgb25lIG9yIG90aGVyIGlzIHJlcXVpcmVkCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXRlbVR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5pb24iIGlkPSJ1bmlvbiI+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtdW5pb24iPgotICAgICAgICAgIG1lbWJlclR5cGVzIGF0dHJpYnV0ZSBtdXN0IGJlIG5vbi1lbXB0eSBvciB0aGVyZSBtdXN0IGJlCi0gICAgICAgICAgYXQgbGVhc3Qgb25lIHNpbXBsZVR5cGUgY2hpbGQKLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVtYmVyVHlwZXMiIHVzZT0ib3B0aW9uYWwiPgotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpRTmFtZSIvPgotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmYWNldCI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9GaXhlZEZhY2V0Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5FeGNsdXNpdmUiIGlkPSJtaW5FeGNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluRXhjbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1pbkluY2x1c2l2ZSIgaWQ9Im1pbkluY2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5JbmNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhFeGNsdXNpdmUiIGlkPSJtYXhFeGNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4RXhjbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1heEluY2x1c2l2ZSIgaWQ9Im1heEluY2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibnVtRmFjZXQiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+Ci0gICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InRvdGFsRGlnaXRzIiBpZD0idG90YWxEaWdpdHMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC10b3RhbERpZ2l0cyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpudW1GYWNldCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnBvc2l0aXZlSW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZnJhY3Rpb25EaWdpdHMiIGlkPSJmcmFjdGlvbkRpZ2l0cyIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1mcmFjdGlvbkRpZ2l0cyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgaWQ9Imxlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1sZW5ndGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWluTGVuZ3RoIiBpZD0ibWluTGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkxlbmd0aCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhMZW5ndGgiIGlkPSJtYXhMZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4TGVuZ3RoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRpb24iIGlkPSJlbnVtZXJhdGlvbiIgdHlwZT0ieHM6bm9GaXhlZEZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtZW51bWVyYXRpb24iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ3aGl0ZVNwYWNlIiBpZD0id2hpdGVTcGFjZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXdoaXRlU3BhY2UiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZSIvPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icGF0dGVybiIgaWQ9InBhdHRlcm4iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1wYXR0ZXJuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vRml4ZWRGYWNldCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMvemlwY29tcGFyZS96aXBjb21wYXJlL1ppcENvbXBhcmUuamF2YSBiL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZmYTk5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgemlwY29tcGFyZTsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFppcENvbXBhcmUKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHppcGNvbXBhcmUgW2ZpbGUxXSBbZmlsZTJdIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIFppcEZpbGUgZmlsZTE7Ci0gICAgICAgIHRyeSB7IGZpbGUxID0gbmV3IFppcEZpbGUoYXJnc1swXSk7IH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB6aXAgZmlsZSAiICsgYXJnc1swXSArICI6ICIgKyBlKTsgU3lzdGVtLmV4aXQoMSk7IHJldHVybjsgfQotCi0gICAgICAgIFppcEZpbGUgZmlsZTI7Ci0gICAgICAgIHRyeSB7IGZpbGUyID0gbmV3IFppcEZpbGUoYXJnc1sxXSk7IH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB6aXAgZmlsZSAiICsgYXJnc1swXSArICI6ICIgKyBlKTsgU3lzdGVtLmV4aXQoMSk7IHJldHVybjsgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGFyaW5nICIgKyBhcmdzWzBdICsgIiB3aXRoICIgKyBhcmdzWzFdICsgIjoiKTsKLQotICAgICAgICBTZXQgc2V0MSA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGZpbGUxLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKQotICAgICAgICAgICAgc2V0MS5hZGQoKChaaXBFbnRyeSllLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU2V0IHNldDIgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlMi5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICAgICAgICAgIHNldDIuYWRkKCgoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCkpOwotCi0gICAgICAgIGludCBlcnJjb3VudCA9IDA7Ci0gICAgICAgIGludCBmaWxlY291bnQgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghc2V0Mi5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICIgbm90IGZvdW5kIGluICIgKyBhcmdzWzFdKTsKLSAgICAgICAgICAgICAgICBlcnJjb3VudCArPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0Mi5yZW1vdmUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1zRXF1YWwoZmlsZTEuZ2V0SW5wdXRTdHJlYW0oZmlsZTEuZ2V0RW50cnkobmFtZSkpLCBmaWxlMi5nZXRJbnB1dFN0cmVhbShmaWxlMi5nZXRFbnRyeShuYW1lKSkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6IElPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGVycmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIiBub3QgZm91bmQgaW4gIiArIGFyZ3NbMF0pOwotICAgICAgICAgICAgZXJyY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZWNvdW50ICsgIiBlbnRyaWVzIG1hdGNoZWQiKTsKLSAgICAgICAgaWYgKGVycmNvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVycmNvdW50ICsgIiBlbnRyaWVzIGRpZCBub3QgbWF0Y2giKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHN0cmVhbXNFcXVhbChJbnB1dFN0cmVhbSBzdHJlYW0xLCBJbnB1dFN0cmVhbSBzdHJlYW0yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGJvb2xlYW4gZG9uZTEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBkb25lMiA9IGZhbHNlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgIHdoaWxlICghZG9uZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvZmYxID0gMDsKLSAgICAgICAgICAgIGludCBvZmYyID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKG9mZjEgPCBidWYxLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0xLnJlYWQoYnVmMSwgb2ZmMSwgYnVmMS5sZW5ndGggLSBvZmYxKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2ZmMSArPSBjb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChvZmYyIDwgYnVmMi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gc3RyZWFtMi5yZWFkKGJ1ZjIsIG9mZjIsIGJ1ZjIubGVuZ3RoIC0gb2ZmMik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZjIgKz0gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2ZmMSAhPSBvZmYyIHx8IGRvbmUxICE9IGRvbmUyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2ZmMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChidWYxW2ldICE9IGJ1ZjJbaV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsgc3RyZWFtMS5jbG9zZSgpOyBzdHJlYW0yLmNsb3NlKCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL2VudW10ZXN0L3JlcG9ydDEueG1sIGIvdjEvdGVzdC9jYXNlcy9lbnVtdGVzdC9yZXBvcnQxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyNjhjYi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL2VudW10ZXN0L3JlcG9ydDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08c3RhdHVzcmVwb3J0IHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiPgotICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9ImFsbCI+YWxsPC9zdGF0dXM+Ci0gIDxzdGF0dXMgbmFtZT0ic2Vjb25kIiB0YXJnZXQ9ImFsbCI+ZmV3PC9zdGF0dXM+Ci0gIDxzdGF0dXMgbmFtZT0idGhpcmQiIHRhcmdldD0ibm9uZSI+bW9zdDwvc3RhdHVzPgotICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9Im5vbmUiPm5vbmU8L3N0YXR1cz4KLTwvc3RhdHVzcmVwb3J0PgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvbmFtZXdvcmxkL3dvcmxkMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjU2MWYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTxudzpuYW1ld29ybGQgeG1sbnM6bnc9Imh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiCi0gICAgICAgICAgICAgIHhtbG5zOmZvbz0iaHR0cDovL2Zvby5jb20vIgotICAgICAgICAgICAgICB4bWxuczpiYXI9Imh0dHA6Ly9iYXIuY29tLyI+Ci0KLSAgPG53OmlzbGFuZCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9mb28uY29tLyI+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImZvb2NpdHkiPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcmNpdHkiLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb290b3duIi8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImZvb3Rvd24iPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcnRvd24iLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb292aWxsYWdlIi8+Ci0gICAgPC9udzpsb2NhdGlvbj4KLSAgICA8bnc6bG9jYXRpb24gbmFtZT0iZm9vdmlsbGFnZSI+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gIDwvbnc6aXNsYW5kPgotCi0gIDxudzppc2xhbmQgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYmFyLmNvbS8iPgotICAgIDxudzpsb2NhdGlvbiBuYW1lPSJiYXJjaXR5Ij4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb29jaXR5Ii8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydG93biIvPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3ZpbGxhZ2UiLz4KLSAgICA8L253OmxvY2F0aW9uPgotICAgIDxudzpsb2NhdGlvbiBuYW1lPSJiYXJ0b3duIj4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb290b3duIi8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImJhcnZpbGxhZ2UiPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3ZpbGxhZ2UiLz4KLSAgICA8L253OmxvY2F0aW9uPgotICA8L253OmlzbGFuZD4KLTwvbnc6bmFtZXdvcmxkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1kc2EueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLWRzYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZWM0OTcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLWRzYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+Ci0gIDxTaWduZWRJbmZvPgotICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+Ci0gICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KLSAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgotICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgotICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgotICAgIDwvUmVmZXJlbmNlPgotICA8L1NpZ25lZEluZm8+Ci0gIDxTaWduYXR1cmVWYWx1ZT4KLSAgICBxVUFERE1IWmt5ZWJ2UmRMcys2RHY3UnZnTUxSbFVhREI0UTl5bjlYb0pBNzlhMjg4MmZmVGc9PQotICA8L1NpZ25hdHVyZVZhbHVlPgotICA8S2V5SW5mbz4KLSAgICA8S2V5VmFsdWU+Ci0gICAgICA8RFNBS2V5VmFsdWU+Ci0gICAgICAgIDxQPgotICAgICAgICAgIDJpWTN3MDYyc0RCMy9ESWxMV09lRzkrNFVwbURaMGR5cVJrOWRMbE5RNnFhWEk3dE9yamRJaG02bi9lT3c0NUEKLSAgICAgICAgICBRdHVZU3A2c3BDdDljUWNOQkFqMjJLdnlndmZKSUlYWDlzU1FydWdmR3FpZmVTdlkzVlg1U2Qxait6ME1TWi9uCi0gICAgICAgICAgNWpOdDg4dWgyQzExU0FxWDZuclhUWS8xUndrb1dSTjIzU1loT2xhRzBoVT0KLSAgICAgICAgPC9QPgotICAgICAgICA8UT4KLSAgICAgICAgICA5QjV5cExZOXBNT210eENlVERIZ3dkTkZlR3M9Ci0gICAgICAgIDwvUT4KLSAgICAgICAgPEc+Ci0gICAgICAgICAgTXVHQWxxZUIxYXgrdnlPMitPc3ViamhsN3BIeEx1NDdSSUgrL001MkRqRVNBOUtNU3J3enNZeDh5TlIyV29vQgotICAgICAgICAgIHlyRTB0NmZ1MFZuY0s3VUs4b2xPNHQ3d3B2Mno0QUZRUFJWQ0tGd28wcWduNWFLSWtJQ0dNbHJSeTgxYXZiMjcKLSAgICAgICAgICB3R2NXb3RoeDNpUFBNdEZYdG9EcUswSkl0YUk5Ujh6YzFtc0ZoTTFHS01ZPQotICAgICAgICA8L0c+Ci0gICAgICAgIDxZPgotICAgICAgICAgIGN0QThZR3hydG5nZy96S1Z2cUVPZWZud21WaUZ6dGNuUEJZUGxKc3ZoNnlLSTRpRG02OGZucDRNaTNScko2YloKLSAgICAgICAgICBBeWdGclVJUUx4TGpWK09KdGdKQUV0bzB4QXMrTWVodXExRGtTRkVwUDNvRHpDVE9zck9pUzFEd1FlNG9JYjd6Ci0gICAgICAgICAgVmsvOWw3YVB0Sk1IVzBMVmxNZHdaTkZOTkpvcU1jVDJaZkNQcmZ2WXZRMD0KLSAgICAgICAgPC9ZPgotICAgICAgPC9EU0FLZXlWYWx1ZT4KLSAgICA8L0tleVZhbHVlPgotICAgIDxYNTA5RGF0YT4KLSAgICAgIDxYNTA5U3ViamVjdE5hbWU+Ci0gICAgICAgIENOPU1lcmxpbiBIdWdoZXMsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQotICAgICAgPC9YNTA5U3ViamVjdE5hbWU+Ci0gICAgICA8WDUwOUlzc3VlclNlcmlhbD4KLSAgICAgICAgPFg1MDlJc3N1ZXJOYW1lPgotICAgICAgICAgIENOPVRlc3QgRFNBIENBLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKLSAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KLSAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+OTcwODQ5OTM2PC9YNTA5U2VyaWFsTnVtYmVyPgotICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgotICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KLSAgICAgICAgTUlJRE56Q0NBdldnQXdJQkFnSUVPZDMra0RBSkJnY3Foa2pPT0FRRE1Gc3hDekFKQmdOVkJBWVRBa2xGTVE4dwotICAgICAgICBEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eVpTQlVaV05vYm05c2IyZHBaWE1zCi0gICAgICAgIElFeDBaQzR4RkRBU0JnTlZCQU1UQzFSbGMzUWdSRk5CSUVOQk1CNFhEVEF3TVRBd05qRTJNekl4TlZvWERUQXgKLSAgICAgICAgTVRBd05qRTJNekl4TkZvd1hURUxNQWtHQTFVRUJoTUNTVVV4RHpBTkJnTlZCQWdUQmtSMVlteHBiakVsTUNNRwotICAgICAgICBBMVVFQ2hNY1FtRnNkR2x0YjNKbElGUmxZMmh1YjJ4dloybGxjeXdnVEhSa0xqRVdNQlFHQTFVRUF4TU5UV1Z5Ci0gICAgICAgIGJHbHVJRWgxWjJobGN6Q0NBYll3Z2dFckJnY3Foa2pPT0FRQk1JSUJIZ0tCZ1FEYUpqZkRUcmF3TUhmOE1pVXQKLSAgICAgICAgWTU0YjM3aFNtWU5uUjNLcEdUMTB1VTFEcXBwY2p1MDZ1TjBpR2JxZjk0N0Rqa0JDMjVoS25xeWtLMzF4QncwRQotICAgICAgICBDUGJZcS9LQzk4a2doZGYyeEpDdTZCOGFxSjk1SzlqZFZmbEozV1A3UFF4Sm4rZm1NMjN6eTZIWUxYVklDcGZxCi0gICAgICAgIGV0ZE5qL1ZIQ1NoWkUzYmRKaUU2Vm9iU0ZRSVZBUFFlY3FTMlBhVERwcmNRbmt3eDRNSFRSWGhyQW9HQU11R0EKLSAgICAgICAgbHFlQjFheCt2eU8yK09zdWJqaGw3cEh4THU0N1JJSCsvTTUyRGpFU0E5S01Tcnd6c1l4OHlOUjJXb29CeXJFMAotICAgICAgICB0NmZ1MFZuY0s3VUs4b2xPNHQ3d3B2Mno0QUZRUFJWQ0tGd28wcWduNWFLSWtJQ0dNbHJSeTgxYXZiMjd3R2NXCi0gICAgICAgIG90aHgzaVBQTXRGWHRvRHFLMEpJdGFJOVI4emMxbXNGaE0xR0tNWURnWVFBQW9HQWN0QThZR3hydG5nZy96S1YKLSAgICAgICAgdnFFT2VmbndtVmlGenRjblBCWVBsSnN2aDZ5S0k0aURtNjhmbnA0TWkzUnJKNmJaQXlnRnJVSVFMeExqVitPSgotICAgICAgICB0Z0pBRXRvMHhBcytNZWh1cTFEa1NGRXBQM29EekNUT3NyT2lTMUR3UWU0b0liN3pWay85bDdhUHRKTUhXMExWCi0gICAgICAgIGxNZHdaTkZOTkpvcU1jVDJaZkNQcmZ2WXZRMmpSekJGTUI0R0ExVWRFUVFYTUJXQkUyMWxjbXhwYmtCaVlXeDAKLSAgICAgICAgYVcxdmNtVXVhV1V3RGdZRFZSMFBBUUgvQkFRREFnZUFNQk1HQTFVZEl3UU1NQXFBQ0VKWlFHMEt3UmJQTUFrRwotICAgICAgICBCeXFHU000NEJBTURNUUF3TGdJVkFLNHNrV0VGWWdyZ2dhSkE4dllBd1NqZzEyK0tBaFVBd0hUbzd3ZDR0RU53Ci0gICAgICAgIDlMQUtQa2xRLzc0ZkgxOD0KLSAgICAgIDwvWDUwOUNlcnRpZmljYXRlPgotICAgIDwvWDUwOURhdGE+Ci0gIDwvS2V5SW5mbz4KLTwvU2lnbmF0dXJlPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtcnNhLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1yc2EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0NDU5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1yc2EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICA8U2lnbmVkSW5mbz4KLSAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgotICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+Ci0gICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KLSAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KLSAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9TaWduZWRJbmZvPgotICA8U2lnbmF0dXJlVmFsdWU+Ci0gICAganVTNVJoSjg4NHFvRlI4ZmxWWGQvcmJyU0RWR240MENhcGdCN3FlUWlUK3JyME5la0VRNkJIaFVBOGRUMytCQwotICAgIFRCVVFJMGRCamxtbDlsd3pFTlh2UzgzelJFQ2p6WGJNUlRVdFZaaVBaRzJwcUtQbkwyWVUzQTk2NDVVQ2pUWFUKLSAgICAramdGdW12N2s3OGhpZUFHRHpOY2krUFE5S1JtbS8vaWNUN0phWXp0Z3Q0PQotICA8L1NpZ25hdHVyZVZhbHVlPgotICA8S2V5SW5mbz4KLSAgICA8S2V5VmFsdWU+Ci0gICAgICA8UlNBS2V5VmFsdWU+Ci0gICAgICAgIDxNb2R1bHVzPgotICAgICAgICAgIHVDaXVrcGdPYU9tcnExZlBVVEgzQ0FYeHVGbVBqc21TNGpuVEt4cnYwdzFKS2NYdEoyTTNha2FWMWQva2FydkoKLSAgICAgICAgICBsbWVhbzIwak55OXIrL3ZLd2liak03N0YrM2JJa2VNRUdtQUlVbkZjaUprUitpaE83YjRjVHVZbkVpOHhIdHU0Ci0gICAgICAgICAgaU1uNkdPREJvRXpxRlFZZGQ4cDR2clpCc3ZzNDRuVHJTOHF5eWhiYTY0OD0KLSAgICAgICAgPC9Nb2R1bHVzPgotICAgICAgICA8RXhwb25lbnQ+Ci0gICAgICAgICAgQVFBQgotICAgICAgICA8L0V4cG9uZW50PgotICAgICAgPC9SU0FLZXlWYWx1ZT4KLSAgICA8L0tleVZhbHVlPgotICAgIDxYNTA5RGF0YT4KLSAgICAgIDxYNTA5U3ViamVjdE5hbWU+Ci0gICAgICAgIENOPU1lcmxpbiBIdWdoZXMsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQotICAgICAgPC9YNTA5U3ViamVjdE5hbWU+Ci0gICAgICA8WDUwOUlzc3VlclNlcmlhbD4KLSAgICAgICAgPFg1MDlJc3N1ZXJOYW1lPgotICAgICAgICAgIENOPVRlc3QgUlNBIENBLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKLSAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KLSAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+OTcwODQ5OTI4PC9YNTA5U2VyaWFsTnVtYmVyPgotICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgotICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KLSAgICAgICAgTUlJQ2VEQ0NBZUdnQXdJQkFnSUVPZDMraURBTkJna3Foa2lHOXcwQkFRUUZBREJiTVFzd0NRWURWUVFHRXdKSgotICAgICAgICBSVEVQTUEwR0ExVUVDQk1HUkhWaWJHbHVNU1V3SXdZRFZRUUtFeHhDWVd4MGFXMXZjbVVnVkdWamFHNXZiRzluCi0gICAgICAgIGFXVnpMQ0JNZEdRdU1SUXdFZ1lEVlFRREV3dFVaWE4wSUZKVFFTQkRRVEFlRncwd01ERXdNRFl4TmpNeU1EZGEKLSAgICAgICAgRncwd01URXdNRFl4TmpNeU1EUmFNRjB4Q3pBSkJnTlZCQVlUQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eAotICAgICAgICBKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXNiMmRwWlhNc0lFeDBaQzR4RmpBVUJnTlZCQU1UCi0gICAgICAgIERVMWxjbXhwYmlCSWRXZG9aWE13Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUxnb3JwS1kKLSAgICAgICAgRG1qcHE2dFh6MUV4OXdnRjhiaFpqNDdKa3VJNTB5c2E3OU1OU1NuRjdTZGpOMnBHbGRYZjVHcTd5WlpubXFOdAotICAgICAgICBJemN2YS92N3lzSW00ek8reGZ0MnlKSGpCQnBnQ0ZKeFhJaVpFZm9vVHUyK0hFN21KeEl2TVI3YnVJakoraGpnCi0gICAgICAgIHdhQk02aFVHSFhmS2VMNjJRYkw3T09KMDYwdktzc29XMnV1UEFnTUJBQUdqUnpCRk1CNEdBMVVkRVFRWE1CV0IKLSAgICAgICAgRTIxbGNteHBia0JpWVd4MGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQQotICAgICAgICBDRW5nclpJVmd1MDNNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBSEp1NEpWcS9XblhLMm9xcWZMV3FlczV2SE90Ci0gICAgICAgIGZYL1poQ2pGeURNaHpzbEk4YW02MmdaZWR3WjlJSVpJd2xOUk12RURRQjJ6ZHMvZUVCbklBUVBsL3lSTENMT2YKLSAgICAgICAgWm5iQThQWHJiRlA1aWdzM3FRV1NjQlVqWlZqaWs3NDhIVTJzVVZaT2E5MGMwbUpsMnZKcy9Sd3lMVzcvdUNBZgotICAgICAgICBDL0kvazl4R3I3Zm5lb0lXCi0gICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KLSAgICA8L1g1MDlEYXRhPgotICA8L0tleUluZm8+Ci08L1NpZ25hdHVyZT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTY5OTQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCFET0NUWVBFIFNpZ25hdHVyZSBTWVNURU0gInhtbGRzaWctY29yZS1zY2hlbWEuZHRkIiBbCi08IUVOVElUWSBkc2lnICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KLSAgIDwhRU5USVRZICUgU2lnbmF0dXJlUHJvcGVydHkuQU5ZICd8IHRzOnRpbWVzdGFtcCc+Ci0gICA8IUVMRU1FTlQgdHM6dGltZXN0YW1wICgjUENEQVRBKT4KLSAgIDwhQVRUTElTVCB0czp0aW1lc3RhbXAKLSAgICAgICAgICAgICB4bWxuczp0cwlDREFUQQkjRklYRUQgICAnaHR0cDovL3d3dy5leGFtcGxlLm9yZy9yZmMvcmZjeHh4eC50eHQnPgotICAgPCFBVFRMSVNUIFNpZ25hdHVyZQotICAgICAgICAgICAgIHhtbG5zOnhzaSAgQ0RBVEEgI0ZJWEVEICAgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJwotICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbglDREFUQQkjUkVRVUlSRUQ+Ci1dPgotPFNpZ25hdHVyZSBJZD0iTXlGaXJzdFNpZ25hdHVyZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjCi0gICB4bWxkc2lnLWNvcmUtc2NoZW1hLnhzZCI+Ci0gIDxTaWduZWRJbmZvPiAKLQkgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1dELXhtbC1jMTRuLTIwMDAwNzEwIj4KLQkgPC9DYW5vbmljYWxpemF0aW9uTWV0aG9kPgotCSA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYSI+Ci0JIDwvU2lnbmF0dXJlTWV0aG9kPgotCSA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvIj4gCi0JCTxUcmFuc2Zvcm1zPiAKLQkJICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIvPgotCQkgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjbnVsbCIvPgotCQk8L1RyYW5zZm9ybXM+IAotCQk8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiPiAKLQkJPC9EaWdlc3RNZXRob2Q+Ci0JCTxEaWdlc3RWYWx1ZT5qNmx3eDNydkVQTzB2S3RNdXA0TmJlVnU4bms9PC9EaWdlc3RWYWx1ZT4gCi0JIDwvUmVmZXJlbmNlPiAKLQkgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIj4gCi0JCTxUcmFuc2Zvcm1zPiAKLQkJICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIvPiAKLQkJPC9UcmFuc2Zvcm1zPiAKLQkJPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj4gCi0JCTwvRGlnZXN0TWV0aG9kPgotCQk8RGlnZXN0VmFsdWU+VXJYTERMQkl0YTZza29WNS9BOFEzOEdFdzQ0PTwvRGlnZXN0VmFsdWU+IAotCSA8L1JlZmVyZW5jZT4gCSAKLSAgPC9TaWduZWRJbmZvPiAKLSAgPFNpZ25hdHVyZVZhbHVlPk1DMENGRnJWTHRSbGtNYzNEYW9uNEJxcW5raENPbEVhQWhVQWs4cEgxaVJOSytxMUkrc2lzRFR6MlRGRUFMRT08L1NpZ25hdHVyZVZhbHVlPiAKLSAgPEtleUluZm8+Ci0gICAgPEtleVZhbHVlPgotICAgICAgPERTQUtleVZhbHVlPgotICAgICAgICA8UD4uLi48L1A+PFE+Li4uPC9RPjxHPi4uLjwvRz48WT4uLi48L1k+Ci0gICAgICA8L0RTQUtleVZhbHVlPiAKLSAgICA8L0tleVZhbHVlPiAKLSAgPC9LZXlJbmZvPgotICA8T2JqZWN0PgotICAgICA8U2lnbmF0dXJlUHJvcGVydGllcz4KLSAgICAgICAgPFNpZ25hdHVyZVByb3BlcnR5IFRhcmdldD0iI015Rmlyc3RTaWduYXR1cmUiPgotICAgICAgICAgIDx0czp0aW1lc3RhbXAgeG1sbnM6dHM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvcmZjL3JmY3h4eHgudHh0Ij4KLSAgICAgICAgICAgdGhpcyBpcyBhIHRlc3Qgb2YgdGhlIG1peGVkIGNvbnRlbnQgbW9kZWw8L3RzOnRpbWVzdGFtcD4KLSAgICAgICAgPC9TaWduYXR1cmVQcm9wZXJ0eT4KLSAgICAgIDwvU2lnbmF0dXJlUHJvcGVydGllcz4KLSAgPC9PYmplY3Q+Ci08L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS94a21zLTEuMC53c2RsIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDg3YWQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotDQotPGRlZmluaXRpb25zIG5hbWU9IlhNTEtleU1hbmFnZW1lbnQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0geG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiDQotIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iDQotIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iDQotIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIA0KLSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyINCi0geG1sbnM6eGttcz0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwIg0KLSB4bWxuczp0bnM9Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCINCi0gdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAiPg0KLQ0KLSAgPHR5cGVzPg0KLQ0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiDQotICAgICAgICB2ZXJzaW9uPSIwLjEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gDQotDQotPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPg0KLQ0KLTxzaW1wbGVUeXBlIG5hbWU9IkNyeXB0b0JpbmFyeSI+DQotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4NCi0gIDwvcmVzdHJpY3Rpb24+DQotPC9zaW1wbGVUeXBlPg0KLQ0KLTwhLS0gU3RhcnQgU2lnbmF0dXJlIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVUeXBlIj4NCi0gIDxzZXF1ZW5jZT4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmVkSW5mbyIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVWYWx1ZSIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6T2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IA0KLSAgPC9zZXF1ZW5jZT4gIA0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4NCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlVmFsdWUiIHR5cGU9ImRzOlNpZ25hdHVyZVZhbHVlVHlwZSIvPiANCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVWYWx1ZVR5cGUiPg0KLSAgICA8c2ltcGxlQ29udGVudD4NCi0gICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImJhc2U2NEJpbmFyeSI+DQotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPg0KLSAgICAgIDwvZXh0ZW5zaW9uPg0KLSAgICA8L3NpbXBsZUNvbnRlbnQ+DQotICA8L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gU3RhcnQgU2lnbmVkSW5mbyAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJTaWduZWRJbmZvIiB0eXBlPSJkczpTaWduZWRJbmZvVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJTaWduZWRJbmZvVHlwZSI+DQotICA8c2VxdWVuY2U+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QiLz4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlTWV0aG9kIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gDQotICA8L3NlcXVlbmNlPiAgDQotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZCIgdHlwZT0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiLz4gDQotICA8Y29tcGxleFR5cGUgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4NCi0gICAgPHNlcXVlbmNlPg0KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIG5hbWVzcGFjZSAtLT4NCi0gICAgPC9zZXF1ZW5jZT4NCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi0gIDwvY29tcGxleFR5cGU+DQotDQotICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVNZXRob2QiIHR5cGU9ImRzOlNpZ25hdHVyZU1ldGhvZFR5cGUiLz4NCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJITUFDT3V0cHV0TGVuZ3RoIiBtaW5PY2N1cnM9IjAiIHR5cGU9ImRzOkhNQUNPdXRwdXRMZW5ndGhUeXBlIi8+DQotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICA8IS0tICgwLHVuYm91bmRlZCkgZWxlbWVudHMgZnJvbSAoMSwxKSBleHRlcm5hbCBuYW1lc3BhY2UgLS0+DQotICAgIDwvc2VxdWVuY2U+DQotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gDQotICA8L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iZHM6UmVmZXJlbmNlVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4NCi0gIDxzZXF1ZW5jZT4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdE1ldGhvZCIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpEaWdlc3RWYWx1ZSIvPiANCi0gIDwvc2VxdWVuY2U+DQotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiANCi0gIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gDQotICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiLz4NCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1zVHlwZSI+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gIA0KLSAgICA8L3NlcXVlbmNlPg0KLSAgPC9jb21wbGV4VHlwZT4NCi0NCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPg0KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybVR5cGUiIG1peGVkPSJ0cnVlIj4NCi0gICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gDQotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJYUGF0aCIgdHlwZT0ic3RyaW5nIi8+IA0KLSAgICA8L2Nob2ljZT4NCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi0gIDwvY29tcGxleFR5cGU+DQotDQotPCEtLSBFbmQgUmVmZXJlbmNlIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJEaWdlc3RNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+IA0KLSAgPHNlcXVlbmNlPg0KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gIDwvc2VxdWVuY2U+ICAgIA0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdFZhbHVlIiB0eXBlPSJkczpEaWdlc3RWYWx1ZVR5cGUiLz4NCi08c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPg0KLSAgPHJlc3RyaWN0aW9uIGJhc2U9ImJhc2U2NEJpbmFyeSIvPg0KLTwvc2ltcGxlVHlwZT4NCi0NCi08IS0tIEVuZCBTaWduZWRJbmZvIC0tPg0KLQ0KLTwhLS0gU3RhcnQgS2V5SW5mbyAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJLZXlJbmZvIiB0eXBlPSJkczpLZXlJbmZvVHlwZSIvPiANCi0NCi08Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiIG1peGVkPSJ0cnVlIj4NCi0gIDxzZXF1ZW5jZT4NCi08IS0tICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPiAgICAgLS0+DQotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPg0KLSAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOlJldHJpZXZhbE1ldGhvZCIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpYNTA5RGF0YSIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOlNQS0lEYXRhIi8+DQotICAgIDxlbGVtZW50IHJlZj0iZHM6TWdtdERhdGEiLz4NCi0gICAgPGFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIi8+ICANCi0gICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4NCi0gIDwvc2VxdWVuY2U+DQotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+DQotICA8ZWxlbWVudCBuYW1lPSJNZ210RGF0YSIgdHlwZT0ic3RyaW5nIi8+DQotDQotICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+IA0KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IktleVZhbHVlVHlwZSIgbWl4ZWQ9InRydWUiPg0KLSAgIDxjaG9pY2U+DQotICAgICA8ZWxlbWVudCByZWY9ImRzOkRTQUtleVZhbHVlIi8+DQotICAgICA8ZWxlbWVudCByZWY9ImRzOlJTQUtleVZhbHVlIi8+DQotICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICA8L2Nob2ljZT4NCi0gIDwvY29tcGxleFR5cGU+DQotDQotICA8ZWxlbWVudCBuYW1lPSJSZXRyaWV2YWxNZXRob2QiIHR5cGU9ImRzOlJldHJpZXZhbE1ldGhvZFR5cGUiLz4gDQotICA8Y29tcGxleFR5cGUgbmFtZT0iUmV0cmlldmFsTWV0aG9kVHlwZSI+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJUcmFuc2Zvcm1zIiB0eXBlPSJkczpUcmFuc2Zvcm1zVHlwZSIgbWluT2NjdXJzPSIwIi8+IA0KLSAgICA8L3NlcXVlbmNlPiAgDQotICAgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiLz4NCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4NCi0gIDwvY29tcGxleFR5cGU+DQotDQotPCEtLSBTdGFydCBYNTA5RGF0YSAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJYNTA5RGF0YSIgdHlwZT0iZHM6WDUwOURhdGFUeXBlIi8+IA0KLTxjb21wbGV4VHlwZSBuYW1lPSJYNTA5RGF0YVR5cGUiPg0KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgPGNob2ljZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyU2VyaWFsIiB0eXBlPSJkczpYNTA5SXNzdWVyU2VyaWFsVHlwZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTdWJqZWN0TmFtZSIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUNlcnRpZmljYXRlIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4NCi0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgPC9jaG9pY2U+DQotICA8L3NlcXVlbmNlPg0KLTwvY29tcGxleFR5cGU+DQotDQotPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4gDQotICA8c2VxdWVuY2U+IA0KLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyTmFtZSIgdHlwZT0ic3RyaW5nIi8+IA0KLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+IA0KLSAgPC9zZXF1ZW5jZT4NCi08L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gRW5kIFg1MDlEYXRhIC0tPg0KLQ0KLTwhLS0gQmVnaW4gUEdQRGF0YSAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPiANCi08Y29tcGxleFR5cGUgbmFtZT0iUEdQRGF0YVR5cGUiPiANCi0gIDxjaG9pY2U+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IA0KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleVBhY2tldCIgdHlwZT0iYmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4gDQotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiDQotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgIDwvc2VxdWVuY2U+DQotICA8L2Nob2ljZT4NCi08L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gRW5kIFBHUERhdGEgLS0+DQotDQotPCEtLSBCZWdpbiBTUEtJRGF0YSAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+IA0KLTxjb21wbGV4VHlwZSBuYW1lPSJTUEtJRGF0YVR5cGUiPg0KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgPGVsZW1lbnQgbmFtZT0iU1BLSVNleHAiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPg0KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIvPg0KLSAgPC9zZXF1ZW5jZT4NCi08L2NvbXBsZXhUeXBlPiANCi0NCi08IS0tIEVuZCBTUEtJRGF0YSAtLT4NCi0NCi08IS0tIEVuZCBLZXlJbmZvIC0tPg0KLQ0KLTwhLS0gU3RhcnQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9Ik9iamVjdCIgdHlwZT0iZHM6T2JqZWN0VHlwZSIvPiANCi08Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPg0KLSAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICA8L3NlcXVlbmNlPg0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gDQotICA8YXR0cmlidXRlIG5hbWU9Ik1pbWVUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4gPCEtLSBhZGQgYSBncmVwIGZhY2V0IC0tPg0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZyIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IA0KLTwvY29tcGxleFR5cGU+DQotDQotPGVsZW1lbnQgbmFtZT0iTWFuaWZlc3QiIHR5cGU9ImRzOk1hbmlmZXN0VHlwZSIvPiANCi08Y29tcGxleFR5cGUgbmFtZT0iTWFuaWZlc3RUeXBlIj4NCi0gIDxzZXF1ZW5jZT4NCi0gICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IA0KLSAgPC9zZXF1ZW5jZT4NCi0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IA0KLTwvY29tcGxleFR5cGU+DQotDQotPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlUHJvcGVydGllcyIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydGllc1R5cGUiLz4gDQotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4NCi0gIDxzZXF1ZW5jZT4NCi0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVQcm9wZXJ0eSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gDQotICA8L3NlcXVlbmNlPg0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gDQotPC9jb21wbGV4VHlwZT4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eSIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydHlUeXBlIi8+IA0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eVR5cGUiIG1peGVkPSJ0cnVlIj4NCi0gICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgxLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4NCi0gICAgIDwvY2hvaWNlPg0KLSAgICAgPGF0dHJpYnV0ZSBuYW1lPSJUYXJnZXQiIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IA0KLSAgIDwvY29tcGxleFR5cGU+DQotDQotPCEtLSBFbmQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPg0KLQ0KLTwhLS0gU3RhcnQgQWxnb3JpdGhtIFBhcmFtZXRlcnMgLS0+DQotDQotPHNpbXBsZVR5cGUgbmFtZT0iSE1BQ091dHB1dExlbmd0aFR5cGUiPg0KLSAgPHJlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiLz4NCi08L3NpbXBsZVR5cGU+DQotDQotPCEtLSBTdGFydCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IkRTQUtleVZhbHVlIiB0eXBlPSJkczpEU0FLZXlWYWx1ZVR5cGUiLz4NCi08Y29tcGxleFR5cGUgbmFtZT0iRFNBS2V5VmFsdWVUeXBlIj4NCi0gIDxzZXF1ZW5jZT4NCi0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iUCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iUSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+DQotICAgIDwvc2VxdWVuY2U+DQotICAgIDxlbGVtZW50IG5hbWU9IkoiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+DQotICAgIDxlbGVtZW50IG5hbWU9IkciIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+DQotICAgIDxlbGVtZW50IG5hbWU9IlkiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPg0KLSAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJTZWVkIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQZ2VuQ291bnRlciIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+DQotICAgIDwvc2VxdWVuY2U+DQotICA8L3NlcXVlbmNlPg0KLTwvY29tcGxleFR5cGU+DQotDQotDQotPGVsZW1lbnQgbmFtZT0iUlNBS2V5VmFsdWUiIHR5cGU9ImRzOlJTQUtleVZhbHVlVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJSU0FLZXlWYWx1ZVR5cGUiPg0KLSAgPHNlcXVlbmNlPg0KLSAgICA8ZWxlbWVudCBuYW1lPSJNb2R1bHVzIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gDQotICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gDQotICA8L3NlcXVlbmNlPg0KLTwvY29tcGxleFR5cGU+IA0KLQ0KLTwhLS0gRW5kIEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+DQotDQotPCEtLSBFbmQgU2lnbmF0dXJlIC0tPg0KLQ0KLTwvc2NoZW1hPg0KLQ0KLTxzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwIg0KLSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIvPg0KLSAgIDxlbGVtZW50IG5hbWU9IlJlY292ZXIiIHR5cGU9InhrbXM6UmVjb3ZlclR5cGUiLz4NCi0gICA8ZWxlbWVudCBuYW1lPSJSZXZva2UiIHR5cGU9InhrbXM6UmV2b2tlVHlwZSIvPg0KLSAgIDxlbGVtZW50IG5hbWU9IkxvY2F0ZSIgdHlwZT0ieGttczpMb2NhdGVUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iUmVnaXN0ZXIiIHR5cGU9InhrbXM6UmVnaXN0ZXJUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iVmFsaWRhdGUiIHR5cGU9InhrbXM6VmFsaWRhdGVUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iUmVnaXN0ZXJSZXN1bHQiIHR5cGU9InhrbXM6UmVnaXN0ZXJSZXN1bHRUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iUmVjb3ZlclJlc3VsdCIgdHlwZT0ieGttczpSZWNvdmVyUmVzdWx0VHlwZSIvPg0KLSAgIDxlbGVtZW50IG5hbWU9IlJldm9rZVJlc3VsdCIgdHlwZT0ieGttczpSZXZva2VSZXN1bHRUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iTG9jYXRlUmVzdWx0IiB0eXBlPSJ4a21zOkxvY2F0ZVJlc3VsdFR5cGUiLz4NCi0gICA8ZWxlbWVudCBuYW1lPSJWYWxpZGF0ZVJlc3VsdCIgdHlwZT0ieGttczpWYWxpZGF0ZVJlc3VsdFR5cGUiLz4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRlVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNhY3Rpb25JRCIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUXVlcnkiIHR5cGU9InhrbXM6S2V5SW5mb1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0ZVJlc3VsdFR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zYWN0aW9uSUQiIHR5cGU9InN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3VsdCIgdHlwZT0ieGttczpSZXN1bHRDb2RlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOkxvY2F0ZVJlc3VsdEFuc3dlclR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9ySW5mbyIgdHlwZT0ieGttczpFcnJvckluZm9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF1ZXJ5IiB0eXBlPSJ4a21zOktleUJpbmRpbmdUeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNwb25kIiB0eXBlPSJ4a21zOlJlc3BvbmRUeXBlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGF0ZVJlc3VsdFR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXN1bHQiIHR5cGU9InhrbXM6UmVzdWx0Q29kZVR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFuc3dlciIgdHlwZT0ieGttczpWYWxpZGF0ZVJlc3VsdEFuc3dlclR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9ySW5mbyIgdHlwZT0ieGttczpFcnJvckluZm9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlUmVzdWx0QW5zd2VyVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IktleUJpbmRpbmciIHR5cGU9InhrbXM6S2V5QmluZGluZ1R5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb3RvdHlwZSIgdHlwZT0ieGttczpLZXlCaW5kaW5nVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhJbmZvIiB0eXBlPSJ4a21zOkF1dGhJbmZvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0VHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3VsdCIgdHlwZT0ieGttczpSZXN1bHRDb2RlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOlJlZ2lzdGVyUmVzdWx0QW5zd2VyVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpdmF0ZSIgdHlwZT0ieGttczpQcml2YXRlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JJbmZvIiB0eXBlPSJ4a21zOkVycm9ySW5mb1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmVnaXN0ZXJSZXN1bHRBbnN3ZXJUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iS2V5QmluZGluZyIgdHlwZT0ieGttczpLZXlCaW5kaW5nVHlwZSIvPg0KLSAgICAgIDwvc2VxdWVuY2U+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmVjb3ZlclR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXIiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlY292ZXJSZXN1bHRUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyUmVzdWx0Ii8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZXZva2VUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQcml2YXRlVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxhbnkgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAgDQotCSAgICAgIG1pbk9jY3Vycz0iMCIgbmFtZXNwYWNlPSIjI2FueSIvPg0KLSAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgIDwvY29tcGxleFR5cGU+DQotDQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJldm9rZVJlc3VsdFR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXJSZXN1bHQiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVycm9ySW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJFcnJvckRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9yQWN0b3IiIHR5cGU9InN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JEZXRhaWwiIHR5cGU9InhrbXM6RXJyb3JEZXRhaWxUeXBlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yQ29kZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iRXJyb3JEZXRhaWxUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic3RyaWN0Ii8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJzdHJpY3QiLz4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IkVycm9yQ29kZVR5cGUiPg0KLSAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50Ii8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2ZXIiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudC5NYWxmb3JtZWRLZXlOYW1lUGFzc2VkIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnQuSW52YWxpZFBhc3NQaHJhc2VBdXRoIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSIqIi8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IktleUJpbmRpbmdUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2FjdGlvbklEIiB0eXBlPSJzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHR5cGU9InhrbXM6QXNzZXJ0aW9uU3RhdHVzVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUlEIiB0eXBlPSJzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6S2V5SW5mbyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFzc1BocmFzZSIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9jZXNzSW5mbyIgdHlwZT0ieGttczpQcm9jZXNzSW5mb1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlZhbGlkaXR5SW50ZXJ2YWwiIHR5cGU9InhrbXM6VmFsaWRpdHlJbnRlcnZhbFR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlVc2FnZSIgdHlwZT0ieGttczpLZXlVc2FnZVR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaXZhdGUiIHR5cGU9InhrbXM6UHJpdmF0ZVR5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCByZWY9ImRzOktleUluZm8iLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlc3BvbmRUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4a21zOlJlc3BvbmRFbnVtIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IlJlc3BvbmRFbnVtIj4NCi0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IktleU5hbWUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IktleVZhbHVlIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJYNTA5Q2VydCIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iWDUwOUNoYWluIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJYNTA5Q1JMIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJPQ1NQIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSZXRyaWV2YWxNZXRob2QiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1nbXREYXRhIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQR1BEYXRhIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQR1BXZWIiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNQS0lEYXRhIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZSIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZSIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlJbnRlcnZhbCIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iS2V5VXNhZ2UiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmVkUmVzdWx0Ii8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0ZVJlc3VsdEFuc3dlclR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiByZWY9ImRzOktleUluZm8iLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPHNpbXBsZVR5cGUgbmFtZT0iUmVzdWx0Q29kZVR5cGUiPg0KLSAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2VzcyIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTm9NYXRjaCIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm91bmQiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkluY29tcGxldGUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzZWQiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmciLz4NCi0gICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgIDwvc2ltcGxlVHlwZT4NCi0gICA8c2ltcGxlVHlwZSBuYW1lPSJBc3NlcnRpb25TdGF0dXNUeXBlIj4NCi0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbnZhbGlkIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbmRldGVybWluYXRlIi8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NJbmZvVHlwZSI+DQotICAgICAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPg0KLSAgICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eUludGVydmFsVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90QmVmb3JlIiB0eXBlPSJ0aW1lSW5zdGFudCIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90QWZ0ZXIiIHR5cGU9InRpbWVJbnN0YW50Ii8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IktleVVzYWdlVHlwZSI+DQotICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFbmNyeXB0aW9uIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlIi8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkF1dGhJbmZvVHlwZSI+DQotICAgICAgPGNob2ljZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJBdXRoVXNlckluZm8iIHR5cGU9InhrbXM6QXV0aFVzZXJJbmZvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhTZXJ2ZXJJbmZvIiB0eXBlPSJ4a21zOkF1dGhTZXJ2ZXJJbmZvVHlwZSIvPg0KLSAgICAgIDwvY2hvaWNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb29mT2ZQb3NzZXNzaW9uVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IktleUJpbmRpbmdBdXRoVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkF1dGhVc2VySW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb29mT2ZQb3NzZXNzaW9uIiB0eXBlPSJ4a21zOlByb29mT2ZQb3NzZXNzaW9uVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iS2V5QmluZGluZ0F1dGgiIHR5cGU9InhrbXM6S2V5QmluZGluZ0F1dGhUeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXNzUGhyYXNlQXV0aCIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBdXRoU2VydmVySW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUJpbmRpbmdBdXRoIiB0eXBlPSJ4a21zOktleUJpbmRpbmdBdXRoVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFzc1BocmFzZUF1dGgiIHR5cGU9InN0cmluZyIvPg0KLSAgICAgIDwvc2VxdWVuY2U+DQotICAgPC9jb21wbGV4VHlwZT4NCi08L3NjaGVtYT4NCi0gIDwvdHlwZXM+DQotDQotICA8bWVzc2FnZSBuYW1lPSJSZWdpc3RlciI+DQotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6UmVnaXN0ZXIiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpSZWdpc3RlclJlc3VsdCIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iVmFsaWRhdGUiPg0KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOlZhbGlkYXRlIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJWYWxpZGF0ZVJlc3VsdCI+DQotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6VmFsaWRhdGVSZXN1bHQiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkxvY2F0ZSI+DQotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6TG9jYXRlIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJMb2NhdGVSZXN1bHQiPg0KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOkxvY2F0ZVJlc3VsdCIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IktleVNlcnZpY2VQb3J0VHlwZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iUmVnaXN0ZXIiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXIiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlclJlc3VsdCIvPg0KLQk8ZmF1bHQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyUmVzdWx0Ii8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGVSZXN1bHQiLz4NCi0JPGZhdWx0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJMb2NhdGUiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ii8+DQotCTxmYXVsdCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ii8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IktleVNlcnZpY2VTb2FwQmluZGluZyIgdHlwZT0idG5zOktleVNlcnZpY2VQb3J0VHlwZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlJlZ2lzdGVyIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI1JlZ2lzdGVyIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyIj4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXJSZXN1bHQiPg0KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI1ZhbGlkYXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIj4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGVSZXN1bHQiPg0KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkxvY2F0ZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCNMb2NhdGUiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlIj4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ij4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IktleVNlcnZpY2VIdHRwUG9zdEJpbmRpbmciIHR5cGU9InRuczpLZXlTZXJ2aWNlUG9ydFR5cGUiPg0KLSAgICA8aHR0cDpiaW5kaW5nIHZlcmI9IlBPU1QiLz4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJSZWdpc3RlciI+DQotICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJ4a21zL0FjY2VwdG9yLm5hbm8iLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyIj4NCi0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlclJlc3VsdCI+DQotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJWYWxpZGF0ZSI+DQotICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJ4a21zL0FjY2VwdG9yLm5hbm8iLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIj4NCi0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCI+DQotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJMb2NhdGUiPg0KLSAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0ieGttcy9BY2NlcHRvci5uYW5vIi8+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpMb2NhdGUiPg0KLSAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0cz0iYm9keSIgdHlwZT0idGV4dC94bWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkxvY2F0ZVJlc3VsdCI+DQotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlhNTEtleU1hbmFnZW1lbnRTZXJ2aWNlIj4NCi0JPGRvY3VtZW50YXRpb24+VmVyaXNpZ24ncyBYTUwgS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoWEtNUyk8L2RvY3VtZW50YXRpb24+DQotDQotICAgIDxwb3J0IG5hbWU9IktleVNlcnZpY2VTb2FwUG9ydCIgYmluZGluZz0idG5zOktleVNlcnZpY2VTb2FwQmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3hrbXMudmVyaXNpZ24uY29tL3hrbXMvQWNjZXB0b3IubmFubyIvPg0KLSAgICA8L3BvcnQ+DQotDQotICAgIDxwb3J0IG5hbWU9IktleVNlcnZpY2VIdHRwUG9zdFBvcnQiIGJpbmRpbmc9InRuczpLZXlTZXJ2aWNlSHR0cFBvc3RCaW5kaW5nIj4NCi0gICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8veGttcy52ZXJpc2lnbi5jb20vIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlBpbG90WE1MS2V5TWFuYWdlbWVudFNlcnZpY2UiPg0KLQk8ZG9jdW1lbnRhdGlvbj5WZXJpc2lnbidzIFBpbG90IFhNTCBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChYS01TKTwvZG9jdW1lbnRhdGlvbj4NCi0NCi0gICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZVNvYXBQb3J0IiBiaW5kaW5nPSJ0bnM6S2V5U2VydmljZVNvYXBCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vcGlsb3QteGttcy52ZXJpc2lnbi5jb20veGttcy9BY2NlcHRvci5uYW5vIi8+DQotICAgIDwvcG9ydD4NCi0NCi0gICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZUh0dHBQb3N0UG9ydCIgYmluZGluZz0idG5zOktleVNlcnZpY2VIdHRwUG9zdEJpbmRpbmciPg0KLSAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9waWxvdC14a21zLnZlcmlzaWduLmNvbS8iLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q3MmNmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCFET0NUWVBFIHNjaGVtYQotICBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNjaGVtYSAyMDAxMDIvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEuZHRkIgotIFsKLSAgIDwhQVRUTElTVCBzY2hlbWEgCi0gICAgIHhtbG5zOmRzIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+Ci0gICA8IUVOVElUWSBkc2lnICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4KLSAgIDwhRU5USVRZICUgcCAnJz4KLSAgIDwhRU5USVRZICUgcyAnJz4KLSAgXT4KLQotPCEtLSBTY2hlbWEgZm9yIFhNTCBTaWduYXR1cmVzCi0gICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIwotICAgICRSZXZpc2lvbjogMS4xICQgb24gJERhdGU6IDIwMDMvMDkvMTUgMTg6MjA6MzkgJCBieSAkQXV0aG9yOiBlcmljdmFzICQKLQotICAgIENvcHlyaWdodCAyMDAxIFRoZSBJbnRlcm5ldCBTb2NpZXR5IGFuZCBXM0MgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlCi0gICAgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbgotICAgIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvCi0KLSAgICBUaGlzIGRvY3VtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBXM0MgU29mdHdhcmUgTGljZW5zZSBbMV0gYXMgZGVzY3JpYmVkCi0gICAgaW4gdGhlIEZBUSBbMl0uCi0KLSAgICBbMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLSAgICBbMl0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFRECi0tLT4KLQotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICAgICAgdmVyc2lvbj0iMC4xIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+IAotCi08IS0tIEJhc2ljIFR5cGVzIERlZmluZWQgZm9yIFNpZ25hdHVyZXMgLS0+Ci0KLTxzaW1wbGVUeXBlIG5hbWU9IkNyeXB0b0JpbmFyeSI+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJiYXNlNjRCaW5hcnkiPgotICA8L3Jlc3RyaWN0aW9uPgotPC9zaW1wbGVUeXBlPgotCi08IS0tIFN0YXJ0IFNpZ25hdHVyZSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlIiB0eXBlPSJkczpTaWduYXR1cmVUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlVHlwZSI+Ci0gIDxzZXF1ZW5jZT4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduZWRJbmZvIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlVmFsdWUiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpPYmplY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+ICAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlVmFsdWUiIHR5cGU9ImRzOlNpZ25hdHVyZVZhbHVlVHlwZSIvPiAKLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVZhbHVlVHlwZSI+Ci0gICAgPHNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICA8L3NpbXBsZUNvbnRlbnQ+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgU2lnbmVkSW5mbyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iU2lnbmVkSW5mbyIgdHlwZT0iZHM6U2lnbmVkSW5mb1R5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJTaWduZWRJbmZvVHlwZSI+Ci0gIDxzZXF1ZW5jZT4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UmVmZXJlbmNlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKLSAgPC9zZXF1ZW5jZT4gIAotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZCIgdHlwZT0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPCEtLSAoMCx1bmJvdW5kZWQpIGVsZW1lbnRzIGZyb20gKDEsMSkgbmFtZXNwYWNlIC0tPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKLSAgPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVNZXRob2QiIHR5cGU9ImRzOlNpZ25hdHVyZU1ldGhvZFR5cGUiLz4KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZU1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJITUFDT3V0cHV0TGVuZ3RoIiBtaW5PY2N1cnM9IjAiIHR5cGU9ImRzOkhNQUNPdXRwdXRMZW5ndGhUeXBlIi8+Ci0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPCEtLSAoMCx1bmJvdW5kZWQpIGVsZW1lbnRzIGZyb20gKDEsMSkgZXh0ZXJuYWwgbmFtZXNwYWNlIC0tPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKLSAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBTdGFydCBSZWZlcmVuY2UgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iZHM6UmVmZXJlbmNlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGUiPgotICA8c2VxdWVuY2U+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6RGlnZXN0TWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6RGlnZXN0VmFsdWUiLz4gCi0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAotICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiLz4KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybXNUeXBlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gIAotICAgIDwvc2VxdWVuY2U+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtIiB0eXBlPSJkczpUcmFuc2Zvcm1UeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1UeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gCi0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYUGF0aCIgdHlwZT0ic3RyaW5nIi8+IAotICAgIDwvY2hvaWNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIFJlZmVyZW5jZSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iRGlnZXN0TWV0aG9kIiB0eXBlPSJkczpEaWdlc3RNZXRob2RUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iRGlnZXN0TWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPiAKLSAgPHNlcXVlbmNlPgotICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICA8L3NlcXVlbmNlPiAgICAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdFZhbHVlIiB0eXBlPSJkczpEaWdlc3RWYWx1ZVR5cGUiLz4KLTxzaW1wbGVUeXBlIG5hbWU9IkRpZ2VzdFZhbHVlVHlwZSI+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJiYXNlNjRCaW5hcnkiLz4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBFbmQgU2lnbmVkSW5mbyAtLT4KLQotPCEtLSBTdGFydCBLZXlJbmZvIC0tPgotCi08ZWxlbWVudCBuYW1lPSJLZXlJbmZvIiB0eXBlPSJkczpLZXlJbmZvVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJLZXlJbmZvVHlwZSIgbWl4ZWQ9InRydWUiPgotICA8Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gICAgIAotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UmV0cmlldmFsTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6WDUwOURhdGEiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U1BLSURhdGEiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOk1nbXREYXRhIi8+Ci0gICAgPGFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIi8+Ci0gICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4KLSAgPC9jaG9pY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJLZXlOYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgPGVsZW1lbnQgbmFtZT0iTWdtdERhdGEiIHR5cGU9InN0cmluZyIvPgotCi0gIDxlbGVtZW50IG5hbWU9IktleVZhbHVlIiB0eXBlPSJkczpLZXlWYWx1ZVR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlWYWx1ZVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgIDxjaG9pY2U+Ci0gICAgIDxlbGVtZW50IHJlZj0iZHM6RFNBS2V5VmFsdWUiLz4KLSAgICAgPGVsZW1lbnQgcmVmPSJkczpSU0FLZXlWYWx1ZSIvPgotICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwvY2hvaWNlPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlJldHJpZXZhbE1ldGhvZCIgdHlwZT0iZHM6UmV0cmlldmFsTWV0aG9kVHlwZSIvPiAKLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlJldHJpZXZhbE1ldGhvZFR5cGUiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+IAotICAgIDwvc2VxdWVuY2U+ICAKLSAgICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0iYW55VVJJIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLSAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBTdGFydCBYNTA5RGF0YSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iWDUwOURhdGEiIHR5cGU9ImRzOlg1MDlEYXRhVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJYNTA5RGF0YVR5cGUiPgotICA8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgIDxjaG9pY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyU2VyaWFsIiB0eXBlPSJkczpYNTA5SXNzdWVyU2VyaWFsVHlwZSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVNLSSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U3ViamVjdE5hbWUiIHR5cGU9InN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUNlcnRpZmljYXRlIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDUkwiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC9jaG9pY2U+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08Y29tcGxleFR5cGUgbmFtZT0iWDUwOUlzc3VlclNlcmlhbFR5cGUiPiAKLSAgPHNlcXVlbmNlPiAKLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyTmFtZSIgdHlwZT0ic3RyaW5nIi8+IAotICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTZXJpYWxOdW1iZXIiIHR5cGU9ImludGVnZXIiLz4gCi0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBYNTA5RGF0YSAtLT4KLQotPCEtLSBCZWdpbiBQR1BEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJQR1BEYXRhVHlwZSI+IAotICA8Y2hvaWNlPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleUlEIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4gCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIi8+IAotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleVBhY2tldCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IAotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L2Nob2ljZT4KLTwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIFBHUERhdGEgLS0+Ci0KLTwhLS0gQmVnaW4gU1BLSURhdGEgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNQS0lEYXRhIiB0eXBlPSJkczpTUEtJRGF0YVR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iU1BLSURhdGFUeXBlIj4KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8ZWxlbWVudCBuYW1lPSJTUEtJU2V4cCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiLz4KLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+IAotCi08IS0tIEVuZCBTUEtJRGF0YSAtLT4KLQotPCEtLSBFbmQgS2V5SW5mbyAtLT4KLQotPCEtLSBTdGFydCBPYmplY3QgKE1hbmlmZXN0LCBTaWduYXR1cmVQcm9wZXJ0eSkgLS0+Ci0KLTxlbGVtZW50IG5hbWU9Ik9iamVjdCIgdHlwZT0iZHM6T2JqZWN0VHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJPYmplY3RUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotICA8YXR0cmlidXRlIG5hbWU9Ik1pbWVUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4gPCEtLSBhZGQgYSBncmVwIGZhY2V0IC0tPgotICA8YXR0cmlidXRlIG5hbWU9IkVuY29kaW5nIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCi08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJNYW5pZmVzdCIgdHlwZT0iZHM6TWFuaWZlc3RUeXBlIi8+IAotPGNvbXBsZXhUeXBlIG5hbWU9Ik1hbmlmZXN0VHlwZSI+Ci0gIDxzZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlUHJvcGVydGllcyIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydGllc1R5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydGllc1R5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVQcm9wZXJ0eSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotICAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHkiIHR5cGU9ImRzOlNpZ25hdHVyZVByb3BlcnR5VHlwZSIvPiAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgPGNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgxLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4KLSAgICAgPC9jaG9pY2U+Ci0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iVGFyZ2V0IiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotICAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBFbmQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPgotCi08IS0tIFN0YXJ0IEFsZ29yaXRobSBQYXJhbWV0ZXJzIC0tPgotCi08c2ltcGxlVHlwZSBuYW1lPSJITUFDT3V0cHV0TGVuZ3RoVHlwZSI+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIi8+Ci08L3NpbXBsZVR5cGU+Ci0KLTwhLS0gU3RhcnQgS2V5VmFsdWUgRWxlbWVudC10eXBlcyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iRFNBS2V5VmFsdWUiIHR5cGU9ImRzOkRTQUtleVZhbHVlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IkRTQUtleVZhbHVlVHlwZSI+Ci0gIDxzZXF1ZW5jZT4KLSAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlAiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJHIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDxlbGVtZW50IG5hbWU9IlkiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgIDxlbGVtZW50IG5hbWU9IkoiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJTZWVkIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBnZW5Db3VudGVyIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPGVsZW1lbnQgbmFtZT0iUlNBS2V5VmFsdWUiIHR5cGU9ImRzOlJTQUtleVZhbHVlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlJTQUtleVZhbHVlVHlwZSI+Ci0gIDxzZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJNb2R1bHVzIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gCi0gICAgPGVsZW1lbnQgbmFtZT0iRXhwb25lbnQiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPiAKLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+IAotCi08IS0tIEVuZCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPgotCi08IS0tIEVuZCBTaWduYXR1cmUgLS0+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FubnVpdHkvYW5udWl0eW5ldC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2ZiZDQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1Qcm9wcmlldGFyeSAmIENvbmZpZGVudGlhbCB0byBBbm51aXR5TmV0LCBJbmMuIEFsbCB1c2Ugb2YgQW5udWl0eU5ldCBtYXRlcmlhbCBpcyBzdWJqZWN0IHRvIGFuZCByZXN0cmljdGVkIGJ5IGEgQ29uZmlkZW50aWFsaXR5IEFncmVlbWVudCBvciBvdGhlciBhZ3JlZW1lbnQuLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiIAoteG1sbnM6cHI9Imh0dHA6Ly93d3cuYW5udWl0eW5ldC5jb20vbmFtZXNwYWNlL3Byb2ZpbGVzIiAKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTxlbGVtZW50IG5hbWU9IkVOVkVMT1BFIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5UaGUgdHJhbnNtaXNzaW9uIGVudmVsb3BlIHRoYXQgZW5jb21wYXNlcyBhbGwgdHJhbnNhY3Rpb25zIGluY2x1ZGVkIGluIHRoZSBmaWxlLiAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBmaWxlLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iSEVBREVSIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgRU5WRUxPUEUgaGVhZGVyLiAgQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnRpZXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zbWlzc2lvbiwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGlkZW50aWZpZXIgZm9yIHRoZSBzZW5kaW5nIHBhcnR5LiBUaGUgSUQgaXMgYW4gYWdyZWVkIHVwb24gc3RhbmRhcmQgYmV0d2VlbiB0aGUgdHdvIHBhcnRpZXMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSRUNFSVZJTkdfUEFSVFlfSUQiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZWNlaXZpbmcgcGFydHkuICBUaGUgSUQgaXMgYW4gYWdyZWVkIHVwb24gc3RhbmRhcmQgYmV0d2VlbiB0aGUgdHdvIHBhcnRpZXMuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX0NPVU5UIiB0eXBlPSJpbnRlZ2VyIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBleHBlY3RlZCBpbiB0aGUgZmlsZS4gVG8gYmUgdXNlZCB0byBjb25maXJtIHRoYXQgdGhlIGZpbGUgaXMgY29tcGxldGUgYXMgdGhlIHNlbmRpbmcgcGFydHkgdW5kZXJzdGFuZHMgaXQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRFU1QiIHR5cGU9ImJvb2xlYW4iIGRlZmF1bHQ9IjAiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+T3B0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgdGVzdCBmaWxlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJCTxlbGVtZW50IHJlZj0icHI6VFJBTlNBQ1RJT04iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTiI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+VGhlIHJvb3QgZWxlbWVudCBvZiBhIHRyYW5zYWN0aW9uLiAgQ29udGFpbnMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlZ2FyZGluZyBhIHRyYW5zYWN0aW9uLiAgVGhlIFNDSEVNQV9WRVJTSU9OIHNob3VsZCBiZSBzZXQgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8gZW5zdXJlIGNvbXBsaWFuY2UgYW1vbmdzdCBhbGwgcGFydGllcy48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhUeXBlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IkhFQURFUiI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGhlYWRlciBkZW5vdGVzIGhhbmRsaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIHBhY2thZ2Uocykgc3RvcmVkIGluIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIGVsZW1lbnRzLiAgVGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBkYXRhIHBhY2thZ2UsIGFzIHdlbGwgYXMgcm91dGluZyBhbmQgcGFydGllcyBpbnZvbHZlZCB3aXRoIHRoZSBwYWNrYWdlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iRUZGRUNUSVZFX0RBVEUiIHR5cGU9ImRhdGUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgaW52b2tlZCBhbmQgdGhlIGRhdGEgcHJvY2Vzc2VkLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJBU19PRl9EQVRFVElNRSIgdHlwZT0iZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RGF0ZSBhbmQgdGltZSB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDVElWSVRZIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cuYW5udWl0bmV0LmNvbS9kb2N1bWVudGF0aW9uL3Byb2ZpbGVzIj5BREQgLT4gQWRkIHRvIHRoZSBDb2xsZWN0aW9ucyBpbmNsdWRlZC4gVXNlcyB0aGUgcHJpbWFyeSBrZXlzIGZvciB0aGUgQ29sbGVjdGlvbnMgaW52b2x2ZWQuIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBDb2xsZWN0aW9uIHVzaW5nIHByaW1hcnkga2V5cyBhbHJlYWR5IGluIHVzZSwgIGFuIGVycm9yIGlzIHJldHVybmVkLiB8IE1PRElGWSAtPiBSZXBsYWNlcyBtZW1iZXJzIG9mIHRoZSBDb2xsZWN0aW9ucyBpbmNsdWRlZC4gVXNlcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBDb2xsZWN0aW9uLiBJZiBhIG5ldyBwcmltYXJ5IGtleSB2YWx1ZSBpcyBpbmNsdWRlZCB0aGVuIGEgbmV3IG1lbWJlciBpcyBhZGRlZCB0byB0aGUgQ29sbGVjdGlvbi4gfCBERUxFVEUgLT4gRGVsZXRlIG1lbWJlcnMgb2YgdGhlIENvbGxlY3Rpb25zIGluY2x1ZGVkLiAgVXNlcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBDb2xsZWN0aW9uLiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgbWVtYmVyIHdoZXJlIHRoZSBwcmltYXJ5IGtleSBpcyBub3QgaW4gdGhlIENvbGxlY3Rpb24sIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBREQiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9Ik1PRElGWSIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0JCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX0lEIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VHJhbnNhY3Rpb25fSUQgY2FwdHVyZXMgdGhlIGV4dGVybmFsIFRyYW5zYWN0aW9uIElEIGZvciBlYWNoIHBhcnR5IHRoYXQgaGFuZGxlcyB0aGUgdHJhbnNhY3Rpb24uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQQVJUWV9JRCIgdHlwZT0ic3RyaW5nIi8+Ci0JCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fSUQiIHR5cGU9InN0cmluZyIvPgotCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUk9VVElORyI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIHJvdXRpbmcgJ21hcCcgb2Ygd2hpY2ggcGFydGllcyBuZWVkIHRvIHRha2UgcGFydCBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHRoZSBvcmRlciB0aGVpciBpbnRlcmFjdGlvbiBvY2N1cnMuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEVQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGVhY2ggc3RlcCBvZiB0aGUgcm91dGluZyBtYXAuICBNYW55IHRyYW5zYWN0aW9ucyB3aWxsIG9ubHkgaW5jbHVkZSBvbmUgcmVjb3JkIGluIHRoaXMgbm9kZSwgd2l0aCBhbiBvcmRlciBvZiAxLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCQkJCQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJwcjpTVEVQVHlwZSI+Ci0JCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9SREVSIiB0eXBlPSJpbnRlZ2VyIi8+Ci0JCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJCQkJCQkJCQk8L2NvbXBsZXhDb250ZW50PgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJPVVRJTkdfSElTVE9SWSI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSByb3V0aW5nIGxvZywgd2hpY2ggc3RvcmVzIGEgcmVjb3JkIGZvciBlYWNoIHBhcnR5IHRoYXQgaGFuZGxlcyB0aGUgdHJhbnNhY3Rpb24uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEVQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+U3RvcmVzIGEgcmVjb3JkIGZvciBlYWNoIHBhcnR5IGludGVyYWN0aW9uIG9uIHRoZSB0cmFuc2FjdGlvbi4gIEVhY2ggcGFydHkgc2hvdWxkIHN0b3JlIHRoZWlyIHNlbmQgb3IgcmVjZWl2ZSBkYXRlIGFuZCB0aW1lLCBvbmNlIHRoZXkgcmVjZWl2ZSB0aGUgcGFja2V0LiAgIFRoaXMgaGlzdG9yeSBjYW4gYmUgcmVjb25jaWxlZCBhZ2FpbnN0IHRoZSBwbGFubmVkIHJvdXRpbmcgc3RlcHMgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdvcmtmbG93IHdhcyBzdWNjZXNzZnVsLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCQkJCQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJwcjpTVEVQVHlwZSI+Ci0JCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFTkRfREFURVRJTUUiIHR5cGU9ImRhdGVUaW1lIi8+Ci0JCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSRUNFSVZFX0RBVEVUSU1FIiB0eXBlPSJkYXRlVGltZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJCQkJCQkJCQk8L2NvbXBsZXhDb250ZW50PgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uIHRoYXQgdGhpcyByZXByZXNlbnRzLiAgRm9yIGV4YW1wbGUsIGEgUHJvZHVjdCBEZWZpbml0aW9uLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQk8c2ltcGxlVHlwZT4KLQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQlVTSU5FU1NfVU5JVF9ERUZJTklUSU9OIi8+Ci0JCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUkVRVUVTVCI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIFJFUVVFU1QgZWxlbWVudCBjb250YWlucyB0aGUgZGF0YSBuZWNjZXNzYXJ5IGZvciB0aGUgcmVxdWVzdC4gIFRoaXMgZGF0YSBjb21lcyBmcm9tIHRoZSBzZW5kaW5nIHBhcnR5IHRvIGJlIGFuYWx5emVkIGFuZCB1c2VkIGJ5IHRoZSByZWNlaXZpbmcgcGFydHkuPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOkJVU0lORVNTX1VOSVRTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlVTRVJTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlVTRVJfUk9MRVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6QUNDT1VOVFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6Q09OVEFDVFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6QlVTSU5FU1NfVU5JVF9BVkFJTEFCSUxJVFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6T1BFUkFUSU5HX1BST0ZJTEVTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlVTRVJfVE9fQlVTSU5FU1NfVU5JVF9NQVBQSU5HUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6QlVTSU5FU1NfVU5JVF9PUEVSQVRJTkdfUFJPRklMRV9MSU5LUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8YXR0cmlidXRlIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8c2ltcGxlVHlwZT4KLQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBBUlRORVJfWE1MX0lOVEVSRkFDRV9WMS4xMCIvPgotCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCTwvc2ltcGxlVHlwZT4KLQkJCTwvYXR0cmlidXRlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJJRFMiPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JPC9lbGVtZW50PgotCTxlbGVtZW50IG5hbWU9IklEIiB0eXBlPSJwcjpJRFR5cGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPldoZW4gdXNlZCBpbiBhbiBJRFMgY29sbGVjdGlvbiB0aGlzIGlzIHRoZSBJRCBieSB3aGljaCB0aGUgSURTIGNvbGxlY3Rpb24ncyBwYXJlbnQgZGF0YSBlbGVtZW50IGlzIHJlZmVyZW5jZWQgKGxpbmtlZCkuICBXaGVuIHVzZWQgYXMgYSBzdWJlbGVtZW50IG9mICpfTElOSyBlbGVtZW50IHRoaXMgcmVwcmVzZW50cyB0aGUgSUQgb2YgdGhlIHJlZmVyZW5jZWQgZGF0YSBlbGVtZW50LiAgV2hlbiB1c2VkIGFzIGEgc3ViZWxlbWVudCBvZiAqX0xJTksgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMgdGhlIElEIG9mIHRoZSByZWZlcmVuY2VkIGRhdGEgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVFMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBidXNpbmVzcyB1bml0IHdpdGhpbiB0aGUgZGlzdHJpYnV0b3IuICBUaGlzIG1pZ2h0IGJlIGEgdW5pdCB0aGF0IGNvbnRhaW5zIHVzZXJzLCBzdWNoIGFzIGEgZmlybSwgb3IgYSBncm91cCB0aGF0IGNvbnRhaW5zIG90aGVyIGJ1c2luZXNzIHVuaXRzLiAgKENvbW1vbmx5IHVzZWQgZm9yIHJlcG9ydGluZyBwdXJwb3Nlcyk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhUeXBlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVQiIHR5cGU9InByOkJVU0lORVNTX1VOSVRUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iVVNFUlMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gb2YgdXNlcnMgdGhhdCB3aWxsIGJlIHVzaW5nIHRoZSBzeXN0ZW0uPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJVU0VSIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEUyIvPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDVElWRSIgdHlwZT0iYm9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5GbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHVzZXIgYWNjb3VudCBpcyBhY3RpdmUgb3Igbm90LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJUSU4iIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Vc2VyJ3MgVElOIG9yIFNTTjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJVU0VSX0xPR09OX0lEIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIHVzZXIncyBsb2dvbiBpZC4gIFNob3VsZCBpbmNsdWRlIGxldHRlcnMgYW5kIGF0IGxlYXN0IG9uZSBudW1iZXIuICAoaS5lLiB1c2VyNik8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUEFTU1dPUkQiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgdXNlcidzIGxvZ29uIHBhc3N3b3JkLiAgIFBhc3N3b3JkcyBzaG91bGQgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiBsZXR0ZXIsIG51bWJlciBhbmQgcHVuY3R1YXRpb24gKGkuZS4gNHBhJCR3b3JkKTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJMQVNUX05BTUUiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgVXNlcidzIExhc3QgTmFtZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJGSVJTVF9OQU1FIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIFVzZXIncyBGaXJzdCBOYW1lPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik1JRERMRV9JTklUSUFMIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBVc2VyJ3MgbWlkZGxlIGluaXRpYWw8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQkJCQk8bWluTGVuZ3RoIHZhbHVlPSIwIi8+Ci0JCQkJCQkJCQkJPG1heExlbmd0aCB2YWx1ZT0iMSIvPgotCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTQUxVVEFUSU9OX0NEIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBzYWx1dGF0aW9uIG9mIHRoZSB1c2VyLiAgU2hvdWxkIG5vdCBpbmNsdWRlIGFueSBwdW5jdHVhdGlvbi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9Ik1yIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJNcnMiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9Ik1zIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJNaXNzIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEciIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUmV2Ii8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBdHR5Ii8+Ci0JCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNVRkZJWF9DRCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5OYW1lIHN1ZmZpeCBvZiB0aGUgdXNlci4gIFNob3VsZCBub3QgaW5jbHVkZSBhbnkgcHVuY3R1YXRpb24uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJKciIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU3IiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IklJIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJJSUkiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJNRCIvPgotCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJFTUFJTCIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLiAgU2hvdWxkIGJlIGluIEludGVybmV0IGVtYWlsIGZvcm1hdDogbWFpbGJveEBkb21haW4uY29tPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBIT05FX05VTUJFUiIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkxJQ0VOU0VTIiB0eXBlPSJwcjpMSUNFTlNFU1R5cGUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIHVzZXIncyBsaWNlbnNlcywgYnkgdHlwZSBhbmQgc3RhdGUuICA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iQVBQT0lOVE1FTlRTIiB0eXBlPSJwcjpBUFBPSU5UTUVOVFNUeXBlIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBVc2VyJ3MgYXBwb2ludG1lbnQgcmlnaHRzLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iVVNFUl9ST0xFUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcm9sZXMgYXZhaWxhYmxlIHRvIGEgdXNlci48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhUeXBlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IlVTRVJfUk9MRSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRFMiLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJERVNDUklQVElPTiIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPkRlc2NyaXB0aW9uIG9mIHVzZXIgcm9sZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JPC9lbGVtZW50PgotCTxlbGVtZW50IG5hbWU9IlVTRVJfVE9fQlVTSU5FU1NfVU5JVF9NQVBQSU5HUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgdXNlciwgcm9sZSwgYnVzaW5lc3MgdW5pdCBsaW5rYWdlcy4gQXQgdGhlIGN1cnJlbnQgdGltZSBBbm51aXR5TmV0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgcm9sZSBhbmQgYnVzaW5lc3MgdW5pdCBwZXIgdXNlci4gSWYgb25lIHdhbnRzIHRvIGFzc2lnbiBtdWx0aXBsZSByb2xlcyBhbmQvb3IgYnVzaW5lc3MgdW5pdHMgdG8gYW4gaW5kaXZpZHVhbCwgdGhlbiB0aGlzIGluZGl2aWR1YWwgaGFzIHRvIGFwcGVhciB0d2ljZSBpbiB0aGUgVVNFUlMgY29sbGVjdGlvbiB3aXRoIGRpZmZlcmVudCBsb2dpbnMuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJVU0VSX1RPX0JVU0lORVNTX1VOSVRfTUFQUElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LIiB0eXBlPSJwcjpMSU5LVHlwZSI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGJ1c2luZXNzIHVuaXQgdGhlIHVzZXIgd2lsbCByZXBvcnQgdG8uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlVTRVJfTElOSyIgdHlwZT0icHI6TElOS1R5cGUiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBJRCBvZiB0aGUgdXNlciB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byB0aGUgYnVzaW5lc3MgdW5pdC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iVVNFUl9ST0xFX0xJTksiIHR5cGU9InByOkxJTktUeXBlIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgVXNlciBSb2xlIG9mIHRoZSB1c2VyLCBhcyB0aGV5IGFyZSBtYXBwZWQgdG8gdGhlIGJ1c2luZXNzIHVuaXQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0FWQUlMQUJJTElUWSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoaWNoIHByb2R1Y3RzLCByaWRlcnMsIHBsYW5zLCBzZXJ2aWNlIHByb2dyYW1zLCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSB0byBhIGJ1c2luZXNzIHVuaXQuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTktTIj4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFWQUlMQUJJTElUWSIgdHlwZT0icHI6QVZBSUxBQklMSVRZVHlwZSI+Ci0JCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RWFjaCBjaGlsZCBlbGVtZW50IGlzIHVzZWQgYXMgYSBwYXNzIGZpbHRlci4gVGhhdCBpcywgYSBwYXJ0aWN1bGFyIHByb2R1Y3QsIHBsYW4sIHJpZGVyLCBzZXJ2aWNlIHByb2dyYW0sIGZ1bmQgY29tYmluYXRpb24gaXMgYXZhaWxhYmxlIHRvIGEgcGFydGljdWxhciBCdXNpbmVzcyBVbml0IGluIGEgcGFydGljdWxhciBzdGF0ZSBpZiB0aGlzIGNvbWJpbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgRGlzdHJpYnV0b3IgRGVmaW5pdGlvbiB4bWwgYW5kIHRoZSBQcm9kdWN0IERlZmluaXRpb24geG1sIGFzIHdlbGwgYXMgYmVpbmcgYXZhaWxhYmxlIGluIGVhY2ggb2YgdGhlIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHRoaXMgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iT1BUSU9OQUxJVFkiIGRlZmF1bHQ9Ik9QVElPTkFMIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5JcyB0aGlzIGEgcmVxdWlyZWQgb3Igb3B0aW9uYWwgPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzaW1wbGVUeXBlPgotCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgotCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KLQkJCTwvcmVzdHJpY3Rpb24+Ci0JCTwvc2ltcGxlVHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElOR1MiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHJvdXRpbmcgbWV0aG9kcyB0byBiZSB1c2VkIGJ5IHRoZSBidXNpbmVzcyB1bml0cy4gIEVhY2ggdHJhbnNhY3Rpb24gcm91dGluZyBjYW4gaW5jbHVkZSBwYXJhbWV0ZXJzIHRoYXQgbmVlZCB0byBiZSBmaWxsZWQgb3V0IGZvciB0aGF0IHJvdXRpbmcgdHlwZS4gVGhpcyBlbGVtZW50IGFsc28gZXhpc3RzIGluIHRoZSBEaXN0cmlidXRvciBEZWZpbml0aW9uIHhtbCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHNvdXJjZSBvZiB0aGlzIGluZm9ybWF0aW9uLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8Y2hvaWNlPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SURTIi8+Ci0JCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGlzIHRyYW5zYWN0aW9uIHJvdXRpbmcuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCTxlbGVtZW50IG5hbWU9IkZPUk1BVCI+Ci0JCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Gb3JtYXRzIGluIHdoaWNoIHRyYW5zYWN0aW9uIHJlcXVlc3RzIG1heSBiZSByZWNpZXZlZDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxzaW1wbGVUeXBlPgotCQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkFOU0kiLz4KLQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJOU0NDIi8+Ci0JCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQU5OVUlUWU5FVF9QUk9GSUxFX1YxLjAiLz4KLQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJYTUxJRkUiLz4KLQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJUWE1MSUZFIi8+Ci0JCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJCTwvc2ltcGxlVHlwZT4KLQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQQVJBTUVURVJTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHBhcmFtZXRlcnMgYW5kIHZhbHVlcyB0aGF0IGFyZSBuZWNjZXNzYXJ5IGZvciB0aGUgdHJhbnNhY3Rpb24gcm91dGluZy4gIEZvciBpbnN0YW5jZSwgYW4gTlNDQyByb3V0aW5nIHdvdWxkIHJlcXVpcmUgYSBOU0NDIElELiAgSW4gdGhpcyBzY29wZSwgdGhlIGRpc3RyaWJ1dG9yIGRlZmluZXMgdGhlIHBvc3NpYmxlIHBhcmFtZXRlcnMgZm9yIGVhY2ggcm91dGluZyB0eXBlLCBhbmQgd2lsbCBmaWxsIGluIHRoZSB2YWx1ZXMgaW4gdGhlIHNpbWlsYXIgc3RydWN0dXJlIHdpdGhpbiB0aGUgT1BFUkFUSU5HX1BST0ZJTEVTIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iUEFSQU1FVEVSIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJzdHJpbmciPgotCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJPC9jaG9pY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9PUEVSQVRJTkdfUFJPRklMRV9MSU5LUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+TGlua3MgdGhlIGRlZmluZWQgb3BlcmF0aW5nIHByb2ZpbGVzIHRvIHRoZSBidXNpbmVzcyB1bml0cyB0aGV5IGFwcGx5IHRvLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LUyI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZXNlIG9wZXJhdGluZyBwcm9maWxlcyBtdXN0IGJlIHJlc3RyaWN0aW9ucyBvZiB0aGUgb3BlcmF0aW5nIHByb2ZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNhbWUgcHJvZHVjdCBpbiB0aGUgRGlzdHJpYnV0b3IgRGVmaW5pdGlvbiB4bWwuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJPUEVSQVRJTkdfUFJPRklMRVMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzZXQgb2YgcG9zc2libGUgY29tbWlzc2lvbiBvcHRpb25zLCB0cmFuc2FjdGlvbiB0eXBlcywgYW5kIG1vbmV5IGZvcm1zIGF2YWlsYWJsZSB0byB0aGUgYnVzaW5lc3MgdW5pdC4gQWxzbywgdGhlIG5ldHRpbmcgb3B0aW9uIGFuZCB0cmFuc2FjdGlvbiByb3V0aW5nIHRoYXQgdGhlIGZvciBlYWNoIHRyYW5zYWN0aW9uIHR5cGUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEUiIHR5cGU9InByOk9QRVJBVElOR19QUk9GSUxFVHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JPC9lbGVtZW50PgotCTxlbGVtZW50IG5hbWU9IkNPTlRBQ1RTIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5Db250YWN0IGluZm9ybWF0aW9uLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQ09OVEFDVCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRFMiLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+Q29udGFjdCBuYW1lLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQSE9ORV9OVU1CRVIiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Db250YWN0IHBob25lIG51bWJlci48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iRU1BSUwiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Db250YWN0IGUtbWFpbCBhZGRyZXNzLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9SRUxBVElPTlNISVBTIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSByZXBvcnRpbmcgaGllcmFyY2h5LiBBbm51aXR5TmV0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgaGllcmFyY2h5IC0tIHRoYXQgaXMsIGVhY2ggYnVzaW5lc3MgdW5pdCBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBwYXJlbnQuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUEFSRU5UX0JVU0lORVNTX1VOSVRfTElOSyIgdHlwZT0icHI6TElOS1R5cGUiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPkxpbmsgdG8gdGhlICBidXNpbmVzcyB1bml0IHRoYXQgd2lsbCBob2xkIHRoZSBjaGlsZCBidXNpbmVzcyB1bml0LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDSElMRF9CVVNJTkVTU19VTklUX0xJTksiIHR5cGU9InByOkxJTktUeXBlIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbGluayB0byB0aGUgYnVzaW5lc3MgdW5pdCB0aGF0IHJlc2lkZXMgd2l0aGluIHRoZSBwYXJlbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJBQ0NPVU5UUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+QWNjb3VudHMgdG8gYmUgcmVwb3J0ZWQgb24uPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJBQ0NPVU5UIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEUyIvPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDQ09VTlRfTkFNRSIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJPV05FUl9OQU1FIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG93bmVyIG9mIHRoZSBhY2NvdW50PC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFCQV9OVU1CRVIiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgQUJBIG51bWJlciBmb3IgdGhlIGFjY291bnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDQ09VTlRfTlVNQkVSIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGFjY291bnQgbnVtYmVyLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQVVJQT1NFIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB1c2FnZSBvZiB0aGUgYWNjb3VudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBSRU1JVU0gQ09MTEVDVElPTiIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiBSRUNJRVBUUyIvPgotCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkxJTktUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNURVBUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iUkVDRUlWSU5HX1BBUlRZX0lEIiB0eXBlPSJzdHJpbmciLz4KLQkJCTxlbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InN0cmluZyIvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IklEVHlwZSI+Ci0JCTxzaW1wbGVDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0iUEFSVFlfTElOS19JRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9zaW1wbGVDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNUQVRFU1R5cGUiPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIHR5cGU9ImJvb2xlYW4iIGRlZmF1bHQ9IjAiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPklmIHRoZSBleGNlcHRpb24gZmxhZyBpcyBvbiwgdGhlbiB0aGUgc3RhdGUgbGlzdCBpbmNsdWRlcyBhbGwgc3RhdGVzLCBFWENFUFQgdGhlIGFzc29jaWF0ZWQgKGxpc3QpIG9mIHN0YXRlKHMpIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJTVEFURSIgdHlwZT0icHI6U1RBVEVUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+RGV0YWlscyBvZiBTdGF0ZSBhbmQgU3RhdGUgYXBwcm92YWwgZm9yIHNlbGxpbmcgYSBwcm9kdWN0IGluIGEgc3BlY2lmaWMgc3RhdGU8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNUQVRFVHlwZSI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9IkNPREUiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5Ud28gZGlnaXQgc3RhdGUgY29kZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJPGxlbmd0aCB2YWx1ZT0iMiIvPgotCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCTwvc2ltcGxlVHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IkJFR0lOX0RBVEUiIHR5cGU9ImRhdGUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPkRhdGUgc3RhdGUgYXBwcm92YWwgYmVjb21lIGVmZmVjdGl2ZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJFTkRfREFURSIgdHlwZT0iZGF0ZSIgbWluT2NjdXJzPSIwIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+RGF0ZSBzdGF0ZSBhcHByb3ZhbCBleHBpcmVzPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IlRFUk1fREFURSIgdHlwZT0iZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTElDRU5TRVNUeXBlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5WYXJpYWJsZSBzYWxlcyBjYW4gb25seSBiZSBtYWRlIHdoZW4gdGhlIHJlcCBvciBmaXJtIGlzIGJvdGggRklYRUQgYW5kIFZBUklBQkxFIGxpY2Vuc2VkIGluIHRoZSBzdGF0ZS48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iTElDRU5TRSIgbWF4T2NjdXJzPSIyIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlRZUEUiPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgbGljZW5zZSBpcyBmb3IgZml4ZWQgb3IgdmFyaWFibGUgYW5udWl0aWVzLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJGSVhFRCIvPgotCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJWQVJJQUJMRSIvPgotCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCTwvc2ltcGxlVHlwZT4KLQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlNUQVRFUyIgdHlwZT0icHI6U1RBVEVTVHlwZSIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQVBQT0lOVE1FTlRTVHlwZSI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9IkFQUE9JTlRNRU5UIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFUVVMiPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgc3RhdHVzIG9mIHRoaXMgYXBwb2ludG1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8c2ltcGxlVHlwZT4KLQkJCQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBFTkRJTkciLz4KLQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQVBQT0lOVEVEIi8+Ci0JCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRFUk1JTkFURUQiLz4KLQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJORVdfQlVTSU5FU1MiIHR5cGU9ImJvb2xlYW4iPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5GbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwb2ludG1lbnQgaW5jbHVkZXMgTmV3IEJ1c2luZXNzIHRyYW5zYWN0aW9ucy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTlMiIHR5cGU9ImJvb2xlYW4iPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5GbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwb2ludG1lbnQgaW5jbHVkZXMgQ29tbWlzaW9ucy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iV1JJVElOR19DT01QQU5ZIj4KLQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJPGRvY3VtZW50YXRpb24+V3JpdGluZyBjb21wYW55IGFuZCBsaW5lcyBvZiBidXNpbmVzcy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iTElORVNfT0ZfQlVTSU5FU1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJMSU5FX09GX0JVU0lORVNTIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJJTkRJVklEVUFMX0xJRkUiLz4KLQkJCQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iVkFSSUFCTEVfQU5OVUlUSUVTIi8+Ci0JCQkJCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEX0FOTlVJVElFUyIvPgotCQkJCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJHUk9VUF9MSUZFIi8+Ci0JCQkJCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFX0xJRkUiLz4KLQkJCQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+Ci0JCQkJCQkJCQkJCQkJCTwvcmVzdHJpY3Rpb24+Ci0JCQkJCQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlNUQVRFUyIgdHlwZT0icHI6U1RBVEVTVHlwZSIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQlVTSU5FU1NfVU5JVFR5cGUiPgotCQk8Y2hvaWNlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQk8ZWxlbWVudCBuYW1lPSJBQ1RJVkUiIHR5cGU9ImJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1c2luZXNzIHVuaXQgaXMgYWN0aXZlIG9yIG5vdC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IHJlZj0icHI6SURTIi8+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQUNUSVZFIiB0eXBlPSJib29sZWFuIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVzaW5lc3MgdW5pdCBpcyBhY3RpdmUgb3Igbm90LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvZWxlbWVudD4KLQkJCQk8ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJzdHJpbmciPgotCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcyB1bml0LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvZWxlbWVudD4KLQkJCQk8ZWxlbWVudCBuYW1lPSJDTEFTUyIgdHlwZT0ic3RyaW5nIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5MZXZlbCBpbiB0aGUgcmVwb3J0aW5nIGhpZXJhcmNoeS4gQ29tbW9uIHZhbHVlcyBhcmUgQnJhbmNoLCBSZWdpb24sIERpc3RyaWJ1dG9yLCBGaWVsZCBPZmZpY2UsIGV0Yy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iVElOIiB0eXBlPSJzdHJpbmciPgotCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB0YXggaWRlbnRpZmljYXRpb24gbnVtYmVyPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPC9lbGVtZW50PgotCQkJCTxlbGVtZW50IG5hbWU9IkFDQ09VTlRfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJBQ0NPVU5UX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQ09OVEFDVF9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5MaW5rcyB0byB0aGUgRGlzdHJpYnV0b3IgY29udGFjdHMgZm9yIHRoZSBCdXNpbmVzcyBVbml0IGluIHRoZSBjYXNlIG9mIHF1ZXN0aW9ucyBvciBwcm9ibGVtcy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkNPTlRBQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJFU1BPTlNJQklMSVRZIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBwdXJwb3NlIGZvciB3aGljaCB0aGUgY29udGFjdCBzaG91bGQgYmUgdXNlZC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jaG9pY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgcmVmPSJwcjpJRFMiLz4KLQkJCTxlbGVtZW50IG5hbWU9Ik5FVFRJTkdfT1BUSU9OIiB0eXBlPSJib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbmV0dGluZyBvcHRpb24gdG8gYmUgdXNlZC48L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTl9PUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPkxpbmtzIGF2YWlsYWJsZSBjb21taXNzaW9uIG9wdGlvbnMgdG8gdGhlIHByb2ZpbGUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJDT01NSVNTSU9OX09QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCTxkb2N1bWVudGF0aW9uPkNvbW1pc3Npb24gb3B0aW9ucyBhdmFpbGFibGU8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEVTIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBtb25leSBmb3JtcyBhbGxvd2VkIGluIHRoaXMgcHJvZmlsZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fVFlQRSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iVFlQRSI+Ci0JCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB0eXBlcyBvZiB0cmFuc2FjdGlvbiBiZWluZyBhbGxvd2VkLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBUFBMSUNBVElPTiIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJJTklUSUFMX1BSRU1JVU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU1VCU0VRVUVOVF9QUkVNSVVNIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9BQ0hfUFJPR1JBTSIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJXSVRIRFJBV0FMIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNVUlJFTkRFUiIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJUUkFOU0ZFUiIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJSRUJBTEFOQ0UiLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iTVJEX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iTVJEIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9SRUJBTEFOQ0VfUFJPR1JBTSIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEQ0EiLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRENBX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUkVORVdBTCIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBTk5VSVRJWkFUSU9OIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBBWU9VVCIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJERUFUSF9DTEFJTV9QRU5ESU5HIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRFQVRIX0NMQUlNIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNZU1RFTUFUSUNfV0lUSERSQVdBTCIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTQ0hFRFVMRURfQUNIIi8+Ci0JCQkJCQkJCQkJCTwvcmVzdHJpY3Rpb24+Ci0JCQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iTU9ORVlfRk9STVMiIHR5cGU9InByOk1PTkVZX0ZPUk1TVHlwZSIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIHBvc3NpYmxlIG1vbmV5IHNvdXJjZXMgKGZvcm1zKSBhcHByb3ZlZCBmb3IgdHJhbnNmZXJzIG9yIHRyYW5zYWN0aW9ucyBpbnRvIHRoaXMgcHJvZHVjdC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1JPVVRJTkdfTElOSyIgbWluT2NjdXJzPSIwIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBjb2xsZWN0aW9uIG9mIGZpbGxlZCBpbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHRyYW5zYWN0aW9uIHJvdXRpbmcuICBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBzcGVjaWZ5IHRoZSBOU0NDIG51bWJlciwgZm9yIGEgTlNDQyB0cmFuc2FjdGlvbiByb3V0aW5nLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuICBTaG91bGQgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBhcyBkZWZpbmVkIGluIHRoZSBUUkFOU0FDVElPTl9ST1VUSU5HIHN0cnVjdHVyZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iVkFMVUUiIHR5cGU9ImFueVNpbXBsZVR5cGUiPgotCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgZm9yIHRoZSBwcm9maWxlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTU9ORVlfRk9STVNUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iTU9ORVlfRk9STSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRJUkVDVCIvPgotCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRVhDSEFOR0UiLz4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRJUkVDVF9ST0xMT1ZFUiIvPgotCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUk9MTE9WRVIiLz4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRkVSIi8+Ci0JCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJST1RIX0NPTlZFUlNJT04iLz4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRBWF9ZRUFSIi8+Ci0JCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQk8L3NpbXBsZUNvbnRlbnQ+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJBVkFJTEFCSUxJVFlUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPlByb2R1Y3QgYXZhaWxhYmlsaXR5IGJ5IHN0YXRlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BST0RVQ1RTL1BST0RVQ1QgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU1RBVEVTIiB0eXBlPSJwcjpTVEFURVNUeXBlIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5TdGF0ZXMgaW4gd2hpY2ggdGhpcyBwcm9kdWN0IGlzIGF2YWlsYWJsZSBmb3Igc2FsZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUU19QTEFOUyIgbWluT2NjdXJzPSIwIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+UGxhbiBhdmFpbGFiaWxpdHkgZm9yIHByb2R1Y3RzIGJ5IHN0YXRlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BST0RVQ1RTL1BST0RVQ1QgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BMQU5TL1BMQU4uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNUQVRFUyIgdHlwZT0icHI6U1RBVEVTVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCQkJPGNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RTX1JJREVSUyI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjYXJyaWVyIG1heSB1c2UgZWl0aGVyIHRoZSBQUk9EVUNUU19SSURFUlMgb3IgdGhlIFBST0RVQ1RTX1BMQU5TX1JJREVSUyBlbGVtZW50cywgYnV0IG5vdCBib3RoLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BST0RVQ1RTL1BST0RVQ1QgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJJREVSX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1JJREVSUy9SSURFUi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgUklERVJTL1JJREVSL0NPTkZJR1VSQVRJT05TL0NPTkZJR1VSQVRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOk9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfUklERVJTIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5BIGNhcnJpZXIgbWF5IHVzZSBlaXRoZXIgdGhlIFBST0RVQ1RTX1JJREVSUyBvciB0aGUgUFJPRFVDVFNfUExBTlNfUklERVJTIGVsZW1lbnRzLCBidXQgbm90IGJvdGguPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+UGxhbnMgZm9yIHdoaWNoIChsaXN0KSBvZiByaWRlcihzKSBpcyBhdmFpbGFibGU8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUExBTlMvUExBTi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJJREVSX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1JJREVSUy9SSURFUi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgUklERVJTL1JJREVSL0NPTkZJR1VSQVRJT05TL0NPTkZJR1VSQVRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOk9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9jaG9pY2U+Ci0JCQk8Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjYXJyaWVyIG1heSB1c2UgZWl0aGVyIHRoZSBQUk9EVUNUU19TRVJWSUNFX1BST0dSQU1TIG9yIHRoZSBQUk9EVUNUU19QTEFOU19TRVJWSUNFX1BST0dSQU1TIGVsZW1lbnRzLCBidXQgbm90IGJvdGguPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFUlZJQ0VfUFJPR1JBTV9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFUlZJQ0VfUFJPR1JBTV9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgUkVRVUVTVC9TRVJWSUNFX1BST0dSQU1TL1NFUlZJQ0VfUFJPR1JBTSBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgU0VSVklDRV9QUk9HUkFNUy9TRVJWSUNFX1BST0dSQU0vT1BUSU9OUy9PUFRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFNFUlZJQ0VfUFJPR1JBTVMvU0VSVklDRV9QUk9HUkFNL0NPTkZJR1VSQVRJT05TL0NPTkZJR1VSQVRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOk9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfU0VSVklDRV9QUk9HUkFNUyI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjYXJyaWVyIG1heSB1c2UgZWl0aGVyIHRoZSBQUk9EVUNUU19TRVJWSUNFX1BST0dSQU1TIG9yIHRoZSBQUk9EVUNUU19QTEFOU19TRVJWSUNFX1BST0dSQU1TIGVsZW1lbnRzLCBidXQgbm90IGJvdGguPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQTEFOX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BMQU5TL1BMQU4uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU0VSVklDRV9QUk9HUkFNX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU0VSVklDRV9QUk9HUkFNX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1NFUlZJQ0VfUFJPR1JBTVMvU0VSVklDRV9QUk9HUkFNIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iT1BUSU9OX19MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QVElPTl9fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFNFUlZJQ0VfUFJPR1JBTVMvU0VSVklDRV9QUk9HUkFNL09QVElPTlMvT1BUSU9OIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBTRVJWSUNFX1BST0dSQU1TL1NFUlZJQ0VfUFJPR1JBTS9DT05GSUdVUkFUSU9OUy9DT05GSUdVUkFUSU9OIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU1RBVEVTIiB0eXBlPSJwcjpTVEFURVNUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvY2hvaWNlPgotCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfSU5WRVNUTUVOVF9PUFRJT05TIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5JbnZlc3RtZW50IE9wdGlvbiBhdmFpbGFiaWxpdHkgZm9yIHByb2R1Y3RzIGJ5IHN0YXRlPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJJTlZFU1RNRU5UX09QVElPTlNfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJJTlZFU1RNRU5UX09QVElPTlNfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBhbiBJTlZFU1RNRU5UX09QVElPTiBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hbm51aXR5L2FubnVpdHluZXQueHNkY29uZmlnIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1NmE1Zi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hbm51aXR5L2FubnVpdHluZXQueHNkY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyIKLSAgICAgICAgICAgeG1sbnM6YW49Imh0dHA6Ly93d3cuYW5udWl0eW5ldC5jb20vbmFtZXNwYWNlL3Byb2ZpbGVzIj4KLQotICA8eGI6bmFtZXNwYWNlIHVyaT0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiPgotICAgIDx4YjpwYWNrYWdlPmNvbS5hbm51aXR5bmV0PC94YjpwYWNrYWdlPgotICA8L3hiOm5hbWVzcGFjZT4KLQotICA8eGI6cW5hbWUgbmFtZT0iYW46QUJBX05VTUJFUiIgamF2YW5hbWU9IkFiYU51bWJlciIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QUNDT1VOVCIgamF2YW5hbWU9IkFjY291bnQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFDQ09VTlRTIiBqYXZhbmFtZT0iQWNjb3VudHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFDQ09VTlRfTElOSyIgamF2YW5hbWU9IkFjY291bnRMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBQ0NPVU5UX0xJTktTIiBqYXZhbmFtZT0iQWNjb3VudExzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBQ0NPVU5UX05BTUUiIGphdmFuYW1lPSJBY2NvdW50TmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QUNDT1VOVF9OVU1CRVIiIGphdmFuYW1lPSJBY2NvdW50TnVtYmVyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBQ1RJVkUiIGphdmFuYW1lPSJBY3RpdmUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFDVElWSVRZIiBqYXZhbmFtZT0iQWN0aXZpdHkiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFQUE9JTlRNRU5UIiBqYXZhbmFtZT0iQXBwdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QVBQT0lOVE1FTlRTIiBqYXZhbmFtZT0iQXBwdHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFQUE9JTlRNRU5UU1R5cGUiIGphdmFuYW1lPSJBcHB0c1QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFTX09GX0RBVEVUSU1FIiBqYXZhbmFtZT0iQXNPZkRhdGV0aW1lIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBVkFJTEFCSUxJVFkiIGphdmFuYW1lPSJBdmFpbCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QVZBSUxBQklMSVRZVHlwZSIgamF2YW5hbWU9IkF2YWlsVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QkVHSU5fREFURSIgamF2YW5hbWU9IkJlZ2luRGF0ZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVCIgamF2YW5hbWU9IkJVIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUUyIgamF2YW5hbWU9IkJVcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVFR5cGUiIGphdmFuYW1lPSJCVVQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkJVU0lORVNTX1VOSVRfQVZBSUxBQklMSVRZIiBqYXZhbmFtZT0iQlVBdmFpbCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVF9MSU5LIiBqYXZhbmFtZT0iQlVMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUX0xJTktTIiBqYXZhbmFtZT0iQlVMcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVF9PUEVSQVRJTkdfUFJPRklMRV9MSU5LUyIgamF2YW5hbWU9IkJVT3BlcmF0aW5nUHJvZmlsZUxzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUCIgamF2YW5hbWU9IkJVUmVsYXRpb25zaGlwIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUFMiIGphdmFuYW1lPSJCVVJlbGF0aW9uc2hpcHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkNISUxEX0JVU0lORVNTX1VOSVRfTElOSyIgamF2YW5hbWU9IkNoaWxkQlVMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDTEFTUyIgamF2YW5hbWU9IkNsYXNzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDT0RFIiBqYXZhbmFtZT0iQ29kZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09NTUlTU0lPTlMiIGphdmFuYW1lPSJDb21taXNpb25zIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDT01NSVNTSU9OX09QVElPTl9MSU5LIiBqYXZhbmFtZT0iQ29tbWlzaW9uT3B0TCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09NTUlTU0lPTl9PUFRJT05fTElOS1MiIGphdmFuYW1lPSJDb21taXNpb25PcHRMcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09ORklHVVJBVElPTl9MSU5LIiBqYXZhbmFtZT0iQ2ZnTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09ORklHVVJBVElPTl9MSU5LUyIgamF2YW5hbWU9IkNmZ0xzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDT05UQUNUIiBqYXZhbmFtZT0iQ29udGFjdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09OVEFDVFMiIGphdmFuYW1lPSJDb250YWN0cyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09OVEFDVF9MSU5LIiBqYXZhbmFtZT0iQ29udGFjdEwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkNPTlRBQ1RfTElOS1MiIGphdmFuYW1lPSJDb250YWN0THMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkRFU0NSSVBUSU9OIiBqYXZhbmFtZT0iRGVzY3JpcHRpb24iLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkVGRkVDVElWRV9EQVRFIiBqYXZhbmFtZT0iRWZmZWN0aXZlRGF0ZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46RU1BSUwiIGphdmFuYW1lPSJFbWFpbCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46RU5EX0RBVEUiIGphdmFuYW1lPSJFbmREYXRlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpFTlZFTE9QRSIgamF2YW5hbWU9IkVudmVsb3BlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpFWENFUFRJT04iIGphdmFuYW1lPSJFeGNlcHRpb24iLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkZJUlNUX05BTUUiIGphdmFuYW1lPSJGaXJzdE5hbWUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkZPUk1BVCIgamF2YW5hbWU9IkZvcm1hdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46SEVBREVSIiBqYXZhbmFtZT0iSGVhZGVyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpJRCIgamF2YW5hbWU9IklEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpJRFMiIGphdmFuYW1lPSJJRHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOklEVHlwZSIgamF2YW5hbWU9IklEVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46SU5WRVNUTUVOVF9PUFRJT05TX0xJTksiIGphdmFuYW1lPSJJbnZPcHRzTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46SU5WRVNUTUVOVF9PUFRJT05TX0xJTktTIiBqYXZhbmFtZT0iSW52T3B0c0xzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpMQVNUX05BTUUiIGphdmFuYW1lPSJMYXN0TmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TElDRU5TRSIgamF2YW5hbWU9IkxpY2Vuc2UiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkxJQ0VOU0VTIiBqYXZhbmFtZT0iTGljZW5zZXMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkxJQ0VOU0VTVHlwZSIgamF2YW5hbWU9IkxpY2Vuc2VzVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TElORVNfT0ZfQlVTSU5FU1MiIGphdmFuYW1lPSJMaW5lc09mQnVzaW5lc3MiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkxJTkVfT0ZfQlVTSU5FU1MiIGphdmFuYW1lPSJMaW5lT2ZCdXNpbmVzcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TElOS1R5cGUiIGphdmFuYW1lPSJMVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TUlERExFX0lOSVRJQUwiIGphdmFuYW1lPSJNaWRkbGVJbml0aWFsIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpNT05FWV9GT1JNIiBqYXZhbmFtZT0iTW9uZXlGb3JtIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpNT05FWV9GT1JNUyIgamF2YW5hbWU9Ik1vbmV5Rm9ybXMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk1PTkVZX0ZPUk1TVHlwZSIgamF2YW5hbWU9Ik1vbmV5Rm9ybXNUIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpOQU1FIiBqYXZhbmFtZT0iTmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TkVUVElOR19PUFRJT04iIGphdmFuYW1lPSJOZXR0aW5nT3B0Ii8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpORVdfQlVTSU5FU1MiIGphdmFuYW1lPSJOZXdCdXNpbmVzcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BFUkFUSU5HX1BST0ZJTEUiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpPUEVSQVRJTkdfUFJPRklMRVMiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BFUkFUSU5HX1BST0ZJTEVUeXBlIiBqYXZhbmFtZT0iT3BlcmF0aW5nUHJvZmlsZVQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QRVJBVElOR19QUk9GSUxFX0xJTksiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BFUkFUSU5HX1BST0ZJTEVfTElOS1MiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlTHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTkFMSVRZIiBqYXZhbmFtZT0iT3B0aW9uYWxpdHkiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTl9MSU5LIiBqYXZhbmFtZT0iT3B0TCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BUSU9OX0xJTktTIiBqYXZhbmFtZT0iT3B0THMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTl9fTElOSyIgamF2YW5hbWU9Ik9wdEwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTl9fTElOS1MiIGphdmFuYW1lPSJPcHRMcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1JERVIiIGphdmFuYW1lPSJPcmRlciIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1dORVJfTkFNRSIgamF2YW5hbWU9Ik93bmVyTmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UEFSQU1FVEVSIiBqYXZhbmFtZT0iUGFyYW0iLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBUkFNRVRFUlMiIGphdmFuYW1lPSJQYXJhbXMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBUkVOVF9CVVNJTkVTU19VTklUX0xJTksiIGphdmFuYW1lPSJQYXJlbnRCVUwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBUlRZX0lEIiBqYXZhbmFtZT0iUGFydElEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpQQVJUWV9MSU5LX0lEIiBqYXZhbmFtZT0iUGFydHlMSUQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBU1NXT1JEIiBqYXZhbmFtZT0iUGFzc3dvcmQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBIT05FX05VTUJFUiIgamF2YW5hbWU9IlBob25lTnVtYmVyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpQTEFOX0xJTksiIGphdmFuYW1lPSJQbGFuTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UExBTl9MSU5LUyIgamF2YW5hbWU9IlBsYW5McyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFMiIGphdmFuYW1lPSJQcm9kdWN0cyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFNfSU5WRVNUTUVOVF9PUFRJT05TIiBqYXZhbmFtZT0iUHJvZEludk9wdHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBST0RVQ1RTX1BMQU5TIiBqYXZhbmFtZT0iUHJvZFBsYW5zIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpQUk9EVUNUU19QTEFOU19SSURFUlMiIGphdmFuYW1lPSJQcm9kUGxhbnNSaWRlcnMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBST0RVQ1RTX1BMQU5TX1NFUlZJQ0VfUFJPR1JBTVMiIGphdmFuYW1lPSJQcm9kUGxhbnNTdmNQcm9ncyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFNfUklERVJTIiBqYXZhbmFtZT0iUHJvZFJpZGVycyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyIgamF2YW5hbWU9IlByb2RTdmNQcm9ncyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVF9MSU5LIiBqYXZhbmFtZT0iUHJvZEwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBST0RVQ1RfTElOS1MiIGphdmFuYW1lPSJQcm9kTHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBVUlBPU0UiIGphdmFuYW1lPSJQdXJwb3NlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpSRUNFSVZFX0RBVEVUSU1FIiBqYXZhbmFtZT0iUmVjZWl2ZURhdGV0aW1lIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpSRUNFSVZJTkdfUEFSVFlfSUQiIGphdmFuYW1lPSJSZWNlaXZpbmdQYXJ0eUlEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpSRVFVRVNUIiBqYXZhbmFtZT0iUmVxdWVzdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UkVTUE9OU0lCSUxJVFkiIGphdmFuYW1lPSJSZXNwb25zaWJpbGl0eSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UklERVJfTElOSyIgamF2YW5hbWU9IlJpZGVyTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UklERVJfTElOS1MiIGphdmFuYW1lPSJSaWRlckxzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpST1VUSU5HIiBqYXZhbmFtZT0iUm91dGluZyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Uk9VVElOR19ISVNUT1JZIiBqYXZhbmFtZT0iUm91dGluZ0hpc3RvcnkiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNBTFVUQVRJT05fQ0QiIGphdmFuYW1lPSJTYWx1dGF0aW9uQ0QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiBqYXZhbmFtZT0iU2NoZW1hVmVyc2lvbiIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U0VORElOR19QQVJUWV9JRCIgamF2YW5hbWU9IlNlbmRpbmdQYXJ0eUlEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTRU5EX0RBVEVUSU1FIiBqYXZhbmFtZT0iU2VuZERhdGV0aW1lIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTRVJWSUNFX1BST0dSQU1fTElOSyIgamF2YW5hbWU9IlN2Y1Byb2dMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTRVJWSUNFX1BST0dSQU1fTElOS1MiIGphdmFuYW1lPSJTdmNQcm9nTHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNUQVRFIiBqYXZhbmFtZT0iU3RhdGUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNUQVRFUyIgamF2YW5hbWU9IlN0YXRlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1RBVEVTVHlwZSIgamF2YW5hbWU9IlN0YXRlc1QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNUQVRFVHlwZSIgamF2YW5hbWU9IlN0YXRlVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1RBVFVTIiBqYXZhbmFtZT0iU3RhdHVzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTVEVQIiBqYXZhbmFtZT0iU3RlcCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1RFUFR5cGUiIGphdmFuYW1lPSJTdGVwVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1VGRklYX0NEIiBqYXZhbmFtZT0iU3VmZml4Q0QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlRFUk1fREFURSIgamF2YW5hbWU9IlRlcm1EYXRlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpURVNUIiBqYXZhbmFtZT0iVGVzdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VElOIiBqYXZhbmFtZT0iVElOIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpUUkFOU0FDVElPTiIgamF2YW5hbWU9IlR4biIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fQ09VTlQiIGphdmFuYW1lPSJUeG5Db3VudCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fSUQiIGphdmFuYW1lPSJUeG5JZCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fUk9VVElORyIgamF2YW5hbWU9IlR4blJvdXRpbmciLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBqYXZhbmFtZT0iVHhuUm91dGluZ3MiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlRSQU5TQUNUSU9OX1JPVVRJTkdfTElOSyIgamF2YW5hbWU9IlR4blJvdXRpbmdMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpUUkFOU0FDVElPTl9UWVBFIiBqYXZhbmFtZT0iVHhuVHlwZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fVFlQRVMiIGphdmFuYW1lPSJUeG5UeXBlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFlQRSIgamF2YW5hbWU9IlR5cGUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlVTRVIiIGphdmFuYW1lPSJVc2VyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSUyIgamF2YW5hbWU9IlVzZXJzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSX0xJTksiIGphdmFuYW1lPSJVc2VyTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VVNFUl9MT0dPTl9JRCIgamF2YW5hbWU9IlVzZXJMb2dvbklEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSX1JPTEUiIGphdmFuYW1lPSJVc2VyUm9sZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VVNFUl9ST0xFUyIgamF2YW5hbWU9IlVzZXJSb2xlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VVNFUl9ST0xFX0xJTksiIGphdmFuYW1lPSJVc2VyUm9sZUwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlVTRVJfVE9fQlVTSU5FU1NfVU5JVF9NQVBQSU5HIiBqYXZhbmFtZT0iVXNlclRvQlVNYXBwaW5nIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSX1RPX0JVU0lORVNTX1VOSVRfTUFQUElOR1MiIGphdmFuYW1lPSJVc2VyVG9CVU1BcHBpbmdzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpWQUxVRSIgamF2YW5hbWU9IlZhbHVlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpXUklUSU5HX0NPTVBBTlkiIGphdmFuYW1lPSJXcml0aW5nQ29tcGFueSIvPgotCi08L3hiOmNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWEyZDIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9BZGRfQWNjdFNpZWJlbDcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gZWRpdGVkIHdpdGggWE1MIFNweSB2NC40IFUgKGh0dHA6Ly93d3cueG1sc3B5LmNvbSkgYnkgQm9yaXMgUG9ydG5veSAoSW5mb3JtYXRpb24gQnVpbGRlcnMgSW5jLikgLS0+Ci08P1NpZWJlbC1Qcm9wZXJ0eS1TZXQgRXNjYXBlTmFtZXM9ImZhbHNlIj8+Ci08U2llYmVsTWVzc2FnZSBNZXNzYWdlSWQ9IjEtTiIgSW50T2JqZWN0Rm9ybWF0PSJTaWViZWwgSGllcmFyY2hpY2FsIiBNZXNzYWdlVHlwZT0iSW50ZWdyYXRpb24gT2JqZWN0IiBJbnRPYmplY3ROYW1lPSJTYW1wbGUgQWNjb3VudCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IkY6XEFkYXB0ZXJzXHNpZWJlbFxBZGRfQWNjdFNpZWJlbDdfMS54c2QiPgotCTxMaXN0T2ZTYW1wbGVBY2NvdW50PgotCQk8QWNjb3VudD4KLQkJCTxDdWx0dXJlLz4KLQkJCTxDdXJyZW5jeUNvZGU+VVNEPC9DdXJyZW5jeUNvZGU+Ci0JCQk8RGVzY3JpcHRpb24vPgotCQkJPERpdmlzaW9uLz4KLQkJCTxIb21lUGFnZS8+Ci0JCQk8SW50ZWdyYXRpb25JZC8+Ci0JCQk8TGluZW9mQnVzaW5lc3MvPgotCQkJPExvY2F0aW9uLz4KLQkJCTxOYW1lPkJlYSBEZW1vPC9OYW1lPgotCQkJPFByb2plY3ROYW1lLz4KLQkJCTxUeXBlPkNvbW1lcmNpYWw8L1R5cGU+Ci0JCQk8TGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb24+Ci0JCQkJPEFjY291bnRfT3JnYW5pemF0aW9uIElzUHJpbWFyeU1WRz0iWSI+Ci0JCQkJCTxJbnRlZ3JhdGlvbklkLz4KLQkJCQkJPE9yZ2FuaXphdGlvbj5EZWZhdWx0IE9yZ2FuaXphdGlvbjwvT3JnYW5pemF0aW9uPgotCQkJCTwvQWNjb3VudF9Pcmdhbml6YXRpb24+Ci0JCQk8L0xpc3RPZkFjY291bnRfT3JnYW5pemF0aW9uPgotCQkJPExpc3RPZkFjY291bnRBdHRhY2htZW50Lz4KLQkJCTxMaXN0T2ZCdXNpbmVzc0FkZHJlc3M+Ci0JCQkJPEJ1c2luZXNzQWRkcmVzcz4KLQkJCQkJPEFkZHJlc3NOYW1lPk5ZPC9BZGRyZXNzTmFtZT4KLQkJCQkJPENpdHk+Tlk8L0NpdHk+Ci0JCQkJCTxDb3VudHJ5PlVTQTwvQ291bnRyeT4KLQkJCQkJPEZheE51bWJlcj45ODc2NTQzMjExPC9GYXhOdW1iZXI+Ci0JCQkJCTxJbnRlZ3JhdGlvbklkLz4KLQkJCQkJPFBob25lTnVtYmVyPjEyMzQ1Njc4OTA8L1Bob25lTnVtYmVyPgotCQkJCQk8UG9zdGFsQ29kZT4wNzMwMTwvUG9zdGFsQ29kZT4KLQkJCQkJPFByb3ZpbmNlLz4KLQkJCQkJPFN0YXRlPk5ZPC9TdGF0ZT4KLQkJCQkJPFN0cmVldEFkZHJlc3M+MiBNYWRpc2lvbiBTcXVhcmU8L1N0cmVldEFkZHJlc3M+Ci0JCQkJPC9CdXNpbmVzc0FkZHJlc3M+Ci0JCQk8L0xpc3RPZkJ1c2luZXNzQWRkcmVzcz4KLQkJCTxMaXN0T2ZDb250YWN0Lz4KLQkJPC9BY2NvdW50PgotCTwvTGlzdE9mU2FtcGxlQWNjb3VudD4KLTwvU2llYmVsTWVzc2FnZT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyNTY5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCQkKLQk8eHNkOmVsZW1lbnQgbmFtZT0iU2llYmVsTWVzc2FnZSI+Ci0JICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLQkJCSAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNhbXBsZUFjY291bnQiIHR5cGU9Ikxpc3RPZlNhbXBsZUFjY291bnRfdHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPiAgCi0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJNZXNzYWdlSWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Ik1lc3NhZ2VUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJbnRPYmplY3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBmaXhlZD0iU2FtcGxlIEFjY291bnQiLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IkludE9iamVjdEZvcm1hdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4JCi0JPC94c2Q6ZWxlbWVudD4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNhbXBsZUFjY291bnRfdHlwZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50IiB0eXBlPSJBY2NvdW50X3R5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRfdHlwZSI+Ci0JCSA8eHNkOnNlcXVlbmNlPgotCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJTeXN0ZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvLS0+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkN1bHR1cmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG9tZVBhZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGluZW9mQnVzaW5lc3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbiIgdHlwZT0iTGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFjY291bnRBdHRhY2htZW50IiB0eXBlPSJMaXN0T2ZBY2NvdW50QXR0YWNobWVudF90eXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0teHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWNjb3VudEF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvLS0+Ci0JCQkJCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkJ1c2luZXNzQWRkcmVzcyIgdHlwZT0iTGlzdE9mQnVzaW5lc3NBZGRyZXNzX3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJMaXN0T2ZDb250YWN0X3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLy0tPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdWJBY2NvdW50IiB0eXBlPSJMaXN0T2ZTdWJBY2NvdW50X3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkgIDwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbl90eXBlIj4KLQkgIAk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50X09yZ2FuaXphdGlvbiIgdHlwZT0iQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JICA8L3hzZDpjb21wbGV4VHlwZT4KLQkgIAotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBY2NvdW50QXR0YWNobWVudF90eXBlIj4KLQkJICA8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50QXR0YWNobWVudCIgdHlwZT0iQWNjb3VudEF0dGFjaG1lbnRfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkgIDwveHNkOnNlcXVlbmNlPgotCSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0JICAKLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQnVzaW5lc3NBZGRyZXNzX3R5cGUiPgotCQkgIDx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkJ1c2luZXNzQWRkcmVzcyIgdHlwZT0iQnVzaW5lc3NBZGRyZXNzX3R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJICA8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0X3R5cGUiPgotCSAgCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHR5cGU9IkNvbnRhY3RfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIj4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RfQnVzaW5lc3NBZGRyZXNzIiB0eXBlPSJDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdWJBY2NvdW50X3R5cGUiPgotCQkgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQWNjb3VudCIgdHlwZT0iU3ViQWNjb3VudF90eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCSA8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY2NvdW50QXR0YWNobWVudF90eXBlIiA+Ci0JCSAgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjbnRGaWxlRXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjbnRGaWxlTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW1lbnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkgIDwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCQotCSA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRfT3JnYW5pemF0aW9uX3R5cGUiPgotCQkgPHhzZDpzZXF1ZW5jZT4KLQkJCSA8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkgPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCSA8L3hzZDpzZXF1ZW5jZT4KLQkJIDx4c2Q6YXR0cmlidXRlIG5hbWU9IklzUHJpbWFyeU1WRyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JIDwveHNkOmNvbXBsZXhUeXBlPgotCi0JCi0JIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnVzaW5lc3NBZGRyZXNzX3R5cGUiPgotCQkgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkcmVzc05hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkZheE51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVncmF0aW9uSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQaG9uZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm92aW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0QWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0X3R5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZWxsdWxhclBob25lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbWVudDIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJzdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb21lUGhvbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSm9iVGl0bGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMYXN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pZGRsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcmdhbml6YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJzb25hbENvbnRhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0X0J1c2luZXNzQWRkcmVzcyIgdHlwZT0iTGlzdE9mQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSI+Ci0JCSA8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmVldEFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJlZXRBZGRyZXNzMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZHJlc3NOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzUHJpbWFyeU1WRyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdWJBY2NvdW50X3R5cGUiPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDcmVhdGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXBkYXRlZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmZsaWN0SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNb2RJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRTdGF0dXMyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWxpYXMyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudEFyZWFDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudENvdW50cnlDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ1NOMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbXBldGl0b3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3JvdXBUeXBlQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVybmFsT3JnRmxhZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb25MZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5GYXhOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluUGhvbmVOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudERpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudElkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudExvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudExvY2F0aW9uTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnRSZWdpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVR5cGVDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlVSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5SW5kdXN0cnlJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlPcmdhbml6YXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlQb3NpdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeVNlcnZpY2VBZ3JlZW1lbnRJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlTeW5vbnltSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWdpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTLVNJbnN0YW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlMtU0luc3RhbmNlSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTLVNLZXlJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3JlcXVlc3QueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9BZGRDdXN0b21lcl9yZXF1ZXN0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NWU0Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3JlcXVlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IklucHV0Ij4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZJUlNUTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTEFTVE5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRPQiIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9BZGRDdXN0b21lcl9yZXNwb25zZS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNzhkYS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IlJvd3NBZmZlY3RlZCIgdHlwZT0ieHNkOmludCIvPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0dldEFsbEN1c3RvbWVyc19yZXNwb25zZS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0dldEFsbEN1c3RvbWVyc19yZXNwb25zZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTVhNGUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9HZXRBbGxDdXN0b21lcnNfcmVzcG9uc2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IlJvd3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUm93IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFERFJFU1MxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBRERSRVNTMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUREUkVTUzMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNJVFkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPVU5UUlkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRPQiIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFTUFJTCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRkFYIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGSVJTVE5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxBU1ROQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNSURETEVOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQSE9ORSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUE9TVEFMQ09ERSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ISVBBQTI3MC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmY4NmQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ISVBBQTI3MC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgSElQQUEyNzA+Ci08SElQQUEyNzA+Ci0gIDxJU0E+Ci0gICAgPF8wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8+MDA8L18wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8+Ci0gICAgPF8wMl9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uXz4xMjM0NTY3ODkwPC9fMDJfQXV0aG9yaXphdGlvbl9JbmZvcm1hdGlvbl8+Ci0gICAgPF8wM19TZWN1cml0eV9JbmZvcm1hdGlvbl9RdWFsaWZpZXJfPjAwPC9fMDNfU2VjdXJpdHlfSW5mb3JtYXRpb25fUXVhbGlmaWVyXz4KLSAgICA8XzA0X1NlY3VyaXR5X0luZm9ybWF0aW9uXz4xMjM0NTY3ODkwPC9fMDRfU2VjdXJpdHlfSW5mb3JtYXRpb25fPgotICAgIDxfMDVfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXz5aWjwvXzA1X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8+Ci0gICAgPF8wNl9JbnRlcmNoYW5nZV9TZW5kZXJfSURfPlNVQk1JVFRFUlMgSUQxMjwvXzA2X0ludGVyY2hhbmdlX1NlbmRlcl9JRF8+Ci0gICAgPF8wN19JbnRlcmNoYW5nZV9JRF9RdWFsaWZpZXJfPlpaPC9fMDdfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXz4KLSAgICA8XzA4X0ludGVyY2hhbmdlX1JlY2VpdmVyX0lEXz5SRUNFSVZFUlMgSUQxMjM8L18wOF9JbnRlcmNoYW5nZV9SZWNlaXZlcl9JRF8+Ci0gICAgPF8wOV9JbnRlcmNoYW5nZV9EYXRlXz4wMTAxMjI8L18wOV9JbnRlcmNoYW5nZV9EYXRlXz4KLSAgICA8XzEwX0ludGVyY2hhbmdlX1RpbWVfPjEyNTM8L18xMF9JbnRlcmNoYW5nZV9UaW1lXz4KLSAgICA8XzExX1JlcGV0aXRpb25fU2VwYXJhdG9yXz5VPC9fMTFfUmVwZXRpdGlvbl9TZXBhcmF0b3JfPgotICAgIDxfMTJfSW50ZXJjaGFuZ2VfQ29udHJvbF9WZXJzaW9uX051bWJlcl8+MDA0MDE8L18xMl9JbnRlcmNoYW5nZV9Db250cm9sX1ZlcnNpb25fTnVtYmVyXz4KLSAgICA8XzEzX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXz4wMDAwMDA5MDU8L18xM19JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8+Ci0gICAgPF8xNF9BY2tub3dsZWRnZW1lbnRfUmVxdWVzdGVkXz4xPC9fMTRfQWNrbm93bGVkZ2VtZW50X1JlcXVlc3RlZF8+Ci0gICAgPF8xNV9Vc2FnZV9JbmRpY2F0b3JfPlQ8L18xNV9Vc2FnZV9JbmRpY2F0b3JfPgotICAgIDxfMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXz46PC9fMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXz4KLSAgPC9JU0E+Ci0gIDxHUz4KLSAgICA8XzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXz5IUzwvXzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXz4KLSAgICA8XzAyX0FwcGxpY2F0aW9uX1NlbmRlcnNfQ29kZV8+U2VuZGVySUQ8L18wMl9BcHBsaWNhdGlvbl9TZW5kZXJzX0NvZGVfPgotICAgIDxfMDNfQXBwbGljYXRpb25fUmVjZWl2ZXJzX0NvZGVfPlJlY2VpdmVySUQ8L18wM19BcHBsaWNhdGlvbl9SZWNlaXZlcnNfQ29kZV8+Ci0gICAgPF8wNF9EYXRlXz4yMDAxMDEyMjwvXzA0X0RhdGVfPgotICAgIDxfMDVfVGltZV8+MTMxMDwvXzA1X1RpbWVfPgotICAgIDxfMDZfR3JvdXBfQ29udHJvbF9OdW1iZXJfPjE8L18wNl9Hcm91cF9Db250cm9sX051bWJlcl8+Ci0gICAgPF8wN19SZXNwb25zaWJsZV9BZ2VuY3lfQ29kZV8+WDwvXzA3X1Jlc3BvbnNpYmxlX0FnZW5jeV9Db2RlXz4KLSAgICA8XzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8+MDA0MDEwWDA5MjwvXzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8+Ci0gIDwvR1M+Ci0gIDxfMjcwPgotICAgIDxTVD4KLSAgICAgIDxfMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8+MjcwPC9fMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8+Ci0gICAgICA8XzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+MTIzNDwvXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+Ci0gICAgPC9TVD4KLSAgICA8QkhUPgotICAgICAgPF8wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfPjAwMjI8L18wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfPgotICAgICAgPF8wMl9UcmFuc2FjdGlvbl9TZXRfUHVycG9zZV9Db2RlXz4xMzwvXzAyX1RyYW5zYWN0aW9uX1NldF9QdXJwb3NlX0NvZGVfPgotICAgICAgPF8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPjEwMDAxMjM0PC9fMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgIDxfMDRfRGF0ZV8+MTk5OTA1MDE8L18wNF9EYXRlXz4KLSAgICAgIDxfMDVfVGltZV8+MTMxOTwvXzA1X1RpbWVfPgotICAgICAgPF8wNl9UcmFuc2FjdGlvbl9UeXBlX0NvZGVfLz4KLSAgICA8L0JIVD4KLSAgICA8XzIwMDBBPgotICAgICAgPEhMPgotICAgICAgICA8XzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfPjE8L18wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4KLSAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8vPgotICAgICAgICA8XzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4yMDwvXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4KLSAgICAgICAgPF8wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8+MTwvXzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4KLSAgICAgIDwvSEw+Ci0gICAgICA8XzIxMDBBPgotICAgICAgICA8Tk0xPgotICAgICAgICAgIDxfMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+UFI8L18wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXz4KLSAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MjwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+Ci0gICAgICAgICAgPF8wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPkFCQ0NPTVBBTlk8L18wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPgotICAgICAgICAgIDxfMDRfTmFtZV9GaXJzdF8vPgotICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfLz4KLSAgICAgICAgICA8XzA2X05hbWVfUHJlZml4Xy8+Ci0gICAgICAgICAgPF8wN19OYW1lX1N1ZmZpeF8vPgotICAgICAgICAgIDxfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPlBJPC9fMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPgotICAgICAgICAgIDxfMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+ODQyNjEwMDAxPC9fMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+Ci0gICAgICAgIDwvTk0xPgotICAgICAgPC9fMjEwMEE+Ci0gICAgICA8XzIwMDBCPgotICAgICAgICA8SEw+Ci0gICAgICAgICAgPF8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4yPC9fMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8+Ci0gICAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8+MTwvXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4KLSAgICAgICAgICA8XzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4yMTwvXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4KLSAgICAgICAgICA8XzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4xPC9fMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPgotICAgICAgICA8L0hMPgotICAgICAgICA8XzIxMDBCPgotICAgICAgICAgIDxOTTE+Ci0gICAgICAgICAgICA8XzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPjFQPC9fMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+Ci0gICAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MTwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICA8XzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Sk9ORVM8L18wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPgotICAgICAgICAgICAgPF8wNF9OYW1lX0ZpcnN0Xz5NQVJDVVM8L18wNF9OYW1lX0ZpcnN0Xz4KLSAgICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfLz4KLSAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KLSAgICAgICAgICAgIDxfMDdfTmFtZV9TdWZmaXhfLz4KLSAgICAgICAgICAgIDxfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPlNWPC9fMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPgotICAgICAgICAgICAgPF8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXz4wMjAyMDM0PC9fMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+Ci0gICAgICAgICAgPC9OTTE+Ci0gICAgICAgICAgPFJFRj4KLSAgICAgICAgICAgIDxfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+TjU8L18wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXz4KLSAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4xMjk8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgotICAgICAgICAgICAgPF8wM19EZXNjcmlwdGlvbl8vPgotICAgICAgICAgIDwvUkVGPgotICAgICAgICAgIDxOMz4KLSAgICAgICAgICAgIDxfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8+NTUgSElHSCBTVFJFRVQ8L18wMV9BZGRyZXNzX0luZm9ybWF0aW9uXz4KLSAgICAgICAgICAgIDxfMDJfQWRkcmVzc19JbmZvcm1hdGlvbl8vPgotICAgICAgICAgIDwvTjM+Ci0gICAgICAgICAgPE40PgotICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlNFQVRUTEU8L18wMV9DaXR5X05hbWVfPgotICAgICAgICAgICAgPF8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXz5XQTwvXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPgotICAgICAgICAgICAgPF8wM19Qb3N0YWxfQ29kZV8+OTgxMjM8L18wM19Qb3N0YWxfQ29kZV8+Ci0gICAgICAgICAgICA8XzA0X0NvdW50cnlfQ29kZV8vPgotICAgICAgICAgIDwvTjQ+Ci0gICAgICAgICAgPFBFUj4KLSAgICAgICAgICAgIDxfMDFfQ29udGFjdF9GdW5jdGlvbl9Db2RlXz5JQzwvXzAxX0NvbnRhY3RfRnVuY3Rpb25fQ29kZV8+Ci0gICAgICAgICAgICA8XzAyX05hbWVfPk1BUllNVVJQSFk8L18wMl9OYW1lXz4KLSAgICAgICAgICAgIDxfMDNfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXz5URTwvXzAzX0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICA8XzA0X0NvbW11bmljYXRpb25fTnVtYmVyXz4yMDY1NTUxMjEyPC9fMDRfQ29tbXVuaWNhdGlvbl9OdW1iZXJfPgotICAgICAgICAgICAgPF8wNV9Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfPkVYPC9fMDVfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXz4KLSAgICAgICAgICAgIDxfMDZfQ29tbXVuaWNhdGlvbl9OdW1iZXJfPjM2OTQ8L18wNl9Db21tdW5pY2F0aW9uX051bWJlcl8+Ci0gICAgICAgICAgICA8XzA3X0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8+Rlg8L18wN19Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfPgotICAgICAgICAgICAgPF8wOF9Db21tdW5pY2F0aW9uX051bWJlcl8+MjA2NTU1MTIxNDwvXzA4X0NvbW11bmljYXRpb25fTnVtYmVyXz4KLSAgICAgICAgICA8L1BFUj4KLSAgICAgICAgPC9fMjEwMEI+Ci0gICAgICAgIDxfMjAwMEM+Ci0gICAgICAgICAgPEhMPgotICAgICAgICAgICAgPF8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4zPC9fMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8+Ci0gICAgICAgICAgICA8XzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4yPC9fMDJfSGllcmFyY2hpY2FsX1BhcmVudF9JRF9OdW1iZXJfPgotICAgICAgICAgICAgPF8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+MjI8L18wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+Ci0gICAgICAgICAgICA8XzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4xPC9fMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPgotICAgICAgICAgIDwvSEw+Ci0gICAgICAgICAgPFRSTj4KLSAgICAgICAgICAgIDxfMDFfVHJhY2VfVHlwZV9Db2RlXz4xPC9fMDFfVHJhY2VfVHlwZV9Db2RlXz4KLSAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz45MzE3NS0wMTI1NDc8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgotICAgICAgICAgICAgPF8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPjk4NzcyODEyMzQ8L18wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPgotICAgICAgICAgICAgPF8wNF9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fLz4KLSAgICAgICAgICA8L1RSTj4KLSAgICAgICAgICA8XzIxMDBDPgotICAgICAgICAgICAgPE5NMT4KLSAgICAgICAgICAgICAgPF8wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXz5JTDwvXzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPgotICAgICAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MTwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICAgIDxfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXz5TTUlUSDwvXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Ci0gICAgICAgICAgICAgIDxfMDRfTmFtZV9GaXJzdF8+Uk9CRVJUPC9fMDRfTmFtZV9GaXJzdF8+Ci0gICAgICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfPkI8L18wNV9OYW1lX01pZGRsZV8+Ci0gICAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KLSAgICAgICAgICAgICAgPF8wN19OYW1lX1N1ZmZpeF8vPgotICAgICAgICAgICAgICA8XzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXz5NSTwvXzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXz4KLSAgICAgICAgICAgICAgPF8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXz4xMTEyMjMzMzMwMTwvXzA5X0lkZW50aWZpY2F0aW9uX0NvZGVfPgotICAgICAgICAgICAgPC9OTTE+Ci0gICAgICAgICAgICA8UkVGPgotICAgICAgICAgICAgICA8XzAxX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl9RdWFsaWZpZXJfPjFMPC9fMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz41OTkxMTk8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgotICAgICAgICAgICAgPC9SRUY+Ci0gICAgICAgICAgICA8TjM+Ci0gICAgICAgICAgICAgIDxfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8+MjkgRlJFTU9OVCBTVDwvXzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fPgotICAgICAgICAgICAgICA8XzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPkFQVCMgMTwvXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPgotICAgICAgICAgICAgPC9OMz4KLSAgICAgICAgICAgIDxOND4KLSAgICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlBFQUNFPC9fMDFfQ2l0eV9OYW1lXz4KLSAgICAgICAgICAgICAgPF8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXz5OWTwvXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPgotICAgICAgICAgICAgICA8XzAzX1Bvc3RhbF9Db2RlXz4xMDAyMzwvXzAzX1Bvc3RhbF9Db2RlXz4KLSAgICAgICAgICAgICAgPF8wNF9Db3VudHJ5X0NvZGVfLz4KLSAgICAgICAgICAgIDwvTjQ+Ci0gICAgICAgICAgICA8RE1HPgotICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+RDg8L18wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICA8XzAyX0RhdGVfVGltZV9QZXJpb2RfPjE5NDMwNTE5PC9fMDJfRGF0ZV9UaW1lX1BlcmlvZF8+Ci0gICAgICAgICAgICAgIDxfMDNfR2VuZGVyX0NvZGVfPk08L18wM19HZW5kZXJfQ29kZV8+Ci0gICAgICAgICAgICA8L0RNRz4KLSAgICAgICAgICA8L18yMTAwQz4KLSAgICAgICAgICA8XzIwMDBEPgotICAgICAgICAgICAgPEhMPgotICAgICAgICAgICAgICA8XzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfPjQ8L18wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4KLSAgICAgICAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8+MzwvXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4KLSAgICAgICAgICAgICAgPF8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+MjM8L18wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+Ci0gICAgICAgICAgICAgIDxfMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPjA8L18wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8+Ci0gICAgICAgICAgICA8L0hMPgotICAgICAgICAgICAgPFRSTj4KLSAgICAgICAgICAgICAgPF8wMV9UcmFjZV9UeXBlX0NvZGVfPjE8L18wMV9UcmFjZV9UeXBlX0NvZGVfPgotICAgICAgICAgICAgICA8XzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+OTMxNzUtMDEyNTQ3PC9fMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgICAgICAgICAgPF8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPjk4NzcyODEyMzQ8L18wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPgotICAgICAgICAgICAgICA8XzA0X1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+UkFESU9MT0dZPC9fMDRfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgICAgICAgIDwvVFJOPgotICAgICAgICAgICAgPF8yMTAwRD4KLSAgICAgICAgICAgICAgPE5NMT4KLSAgICAgICAgICAgICAgICA8XzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPjAzPC9fMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfPjE8L18wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICAgIDxfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXz5TTUlUSDwvXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Ci0gICAgICAgICAgICAgICAgPF8wNF9OYW1lX0ZpcnN0Xz5NQVJZTE9VPC9fMDRfTmFtZV9GaXJzdF8+Ci0gICAgICAgICAgICAgICAgPF8wNV9OYW1lX01pZGRsZV8vPgotICAgICAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KLSAgICAgICAgICAgICAgICA8XzA3X05hbWVfU3VmZml4Xy8+Ci0gICAgICAgICAgICAgIDwvTk0xPgotICAgICAgICAgICAgICA8UkVGPgotICAgICAgICAgICAgICAgIDxfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+U1k8L18wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXz4KLSAgICAgICAgICAgICAgICA8XzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+MDAzMjIxMjM0PC9fMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgICAgICAgICAgPC9SRUY+Ci0gICAgICAgICAgICAgIDxOMz4KLSAgICAgICAgICAgICAgICA8XzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fPjI5IEZSRU1PTlQgU1Q8L18wMV9BZGRyZXNzX0luZm9ybWF0aW9uXz4KLSAgICAgICAgICAgICAgICA8XzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPkFQVCMgMTwvXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPgotICAgICAgICAgICAgICA8L04zPgotICAgICAgICAgICAgICA8TjQ+Ci0gICAgICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlBFQUNFPC9fMDFfQ2l0eV9OYW1lXz4KLSAgICAgICAgICAgICAgICA8XzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPk5ZPC9fMDJfU3RhdGVfb3JfUHJvdmluY2VfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wM19Qb3N0YWxfQ29kZV8+MTAwMjM8L18wM19Qb3N0YWxfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wNF9Db3VudHJ5X0NvZGVfLz4KLSAgICAgICAgICAgICAgPC9OND4KLSAgICAgICAgICAgICAgPERNRz4KLSAgICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+RDg8L18wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICAgIDxfMDJfRGF0ZV9UaW1lX1BlcmlvZF8+MTk3ODEwMTQ8L18wMl9EYXRlX1RpbWVfUGVyaW9kXz4KLSAgICAgICAgICAgICAgICA8XzAzX0dlbmRlcl9Db2RlXz5GPC9fMDNfR2VuZGVyX0NvZGVfPgotICAgICAgICAgICAgICA8L0RNRz4KLSAgICAgICAgICAgICAgPElOUz4KLSAgICAgICAgICAgICAgICA8XzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8+TjwvXzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wMl9JbmRpdmlkdWFsX1JlbGF0aW9uc2hpcF9Db2RlXz4xOTwvXzAyX0luZGl2aWR1YWxfUmVsYXRpb25zaGlwX0NvZGVfPgotICAgICAgICAgICAgICAgIDxfMDNfTWFpbnRlbmFuY2VfVHlwZV9Db2RlXy8+Ci0gICAgICAgICAgICAgICAgPF8wNF9NYWludGVuYW5jZV9SZWFzb25fQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMDVfQmVuZWZpdF9TdGF0dXNfQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMDZfTWVkaWNhcmVfU3RhdHVzX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzA3X0NvbnNvbGlkYXRlZF9PbW5pYnVzX0J1ZGdldF9SZWNvbmNpbGlhdGlvbl9BY3RfX0NPQlJBX19RdWFsaWZ5aW5nX0V2ZW50X0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzA4X0VtcGxveW1lbnRfU3RhdHVzX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzA5X1N0dWRlbnRfU3RhdHVzX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzEwX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMTFfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXy8+Ci0gICAgICAgICAgICAgICAgPF8xMl9EYXRlX1RpbWVfUGVyaW9kXy8+Ci0gICAgICAgICAgICAgICAgPF8xM19Db25maWRlbnRpYWxpdHlfQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMTRfQ2l0eV9OYW1lXy8+Ci0gICAgICAgICAgICAgICAgPF8xNV9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXy8+Ci0gICAgICAgICAgICAgICAgPF8xNl9Db3VudHJ5X0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzE3X051bWJlcl8vPgotICAgICAgICAgICAgICA8L0lOUz4KLSAgICAgICAgICAgICAgPERUUD4KLSAgICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfPjQ3MjwvXzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICAgIDxfMDJfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXz5EODwvXzAyX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+Ci0gICAgICAgICAgICAgICAgPF8wM19EYXRlX1RpbWVfUGVyaW9kXz4xOTk5MDUwMTwvXzAzX0RhdGVfVGltZV9QZXJpb2RfPgotICAgICAgICAgICAgICA8L0RUUD4KLSAgICAgICAgICAgICAgPF8yMTEwRD4KLSAgICAgICAgICAgICAgICA8RVE+Ci0gICAgICAgICAgICAgICAgICA8XzAxX1NlcnZpY2VfVHlwZV9Db2RlXz44MTwvXzAxX1NlcnZpY2VfVHlwZV9Db2RlXz4KLSAgICAgICAgICAgICAgICAgIDxfMDJfQ29tcG9zaXRlX01lZGljYWxfUHJvY2VkdXJlX0lkZW50aWZpZXJfLz4KLSAgICAgICAgICAgICAgICAgIDxfMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8+RkFNPC9fMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8+Ci0gICAgICAgICAgICAgICAgICA8XzA0X0luc3VyYW5jZV9UeXBlX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8L0VRPgotICAgICAgICAgICAgICA8L18yMTEwRD4KLSAgICAgICAgICAgIDwvXzIxMDBEPgotICAgICAgICAgIDwvXzIwMDBEPgotICAgICAgICA8L18yMDAwQz4KLSAgICAgIDwvXzIwMDBCPgotICAgIDwvXzIwMDBBPgotICAgIDxTRT4KLSAgICAgIDxfMDFfTnVtYmVyX29mX0luY2x1ZGVkX1NlZ21lbnRzXz4yODwvXzAxX051bWJlcl9vZl9JbmNsdWRlZF9TZWdtZW50c18+Ci0gICAgICA8XzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+MTIzNDwvXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+Ci0gICAgPC9TRT4KLSAgPC9fMjcwPgotICA8R0U+Ci0gICAgPF8wMV9OdW1iZXJfb2ZfVHJhbnNhY3Rpb25fU2V0c19JbmNsdWRlZF8+MTwvXzAxX051bWJlcl9vZl9UcmFuc2FjdGlvbl9TZXRzX0luY2x1ZGVkXz4KLSAgICA8XzAyX0dyb3VwX0NvbnRyb2xfTnVtYmVyXz4xPC9fMDJfR3JvdXBfQ29udHJvbF9OdW1iZXJfPgotICA8L0dFPgotICA8SUVBPgotICAgIDxfMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXz4xPC9fMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXz4KLSAgICA8XzAyX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXz4wMDAwMDA5MDU8L18wMl9JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8+Ci0gIDwvSUVBPgotPC9ISVBBQTI3MD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWMyZDNiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJETUdUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9EYXRlX1RpbWVfUGVyaW9kXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19HZW5kZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEVFBUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfRGF0ZV9UaW1lX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19EYXRlX1RpbWVfUGVyaW9kXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVRVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1NlcnZpY2VfVHlwZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9Db21wb3NpdGVfTWVkaWNhbF9Qcm9jZWR1cmVfSWRlbnRpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfSW5zdXJhbmNlX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkdFIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9OdW1iZXJfb2ZfVHJhbnNhY3Rpb25fU2V0c19JbmNsdWRlZF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0dyb3VwX0NvbnRyb2xfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkdTIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9GdW5jdGlvbmFsX0lkZW50aWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0FwcGxpY2F0aW9uX1NlbmRlcnNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0FwcGxpY2F0aW9uX1JlY2VpdmVyc19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wNF9EYXRlXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wNV9UaW1lXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfR3JvdXBfQ29udHJvbF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19SZXNwb25zaWJsZV9BZ2VuY3lfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJISVBBQTI3MCI+Ci0JCTx4c2Q6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJJU0EiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJHUyIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8yNzAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJHRSIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IklFQSIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJITFR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfSGllcmFyY2hpY2FsX0xldmVsX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSUVBIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9OdW1iZXJfb2ZfSW5jbHVkZWRfRnVuY3Rpb25hbF9Hcm91cHNfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSUlJVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0NvZGVfTGlzdF9RdWFsaWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfSW5kdXN0cnlfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJTlNUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfWWVzX05vX0NvbmRpdGlvbl9vcl9SZXNwb25zZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9JbmRpdmlkdWFsX1JlbGF0aW9uc2hpcF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19NYWludGVuYW5jZV9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X01haW50ZW5hbmNlX1JlYXNvbl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNV9CZW5lZml0X1N0YXR1c19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9NZWRpY2FyZV9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfQ29uc29saWRhdGVkX09tbmlidXNfQnVkZ2V0X1JlY29uY2lsaWF0aW9uX0FjdF9fQ09CUkFfX1F1YWxpZnlpbmdfRXZlbnRfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfRW1wbG95bWVudF9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDlfU3R1ZGVudF9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTBfWWVzX05vX0NvbmRpdGlvbl9vcl9SZXNwb25zZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEyX0RhdGVfVGltZV9QZXJpb2RfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEzX0NvbmZpZGVudGlhbGl0eV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNF9DaXR5X05hbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE1X1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE2X0NvdW50cnlfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTdfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSVNBIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0F1dGhvcml6YXRpb25fSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19TZWN1cml0eV9JbmZvcm1hdGlvbl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9TZWN1cml0eV9JbmZvcm1hdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X0ludGVyY2hhbmdlX1NlbmRlcl9JRF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA3X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X0ludGVyY2hhbmdlX1JlY2VpdmVyX0lEXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDlfSW50ZXJjaGFuZ2VfRGF0ZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEwX0ludGVyY2hhbmdlX1RpbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMV9SZXBldGl0aW9uX1NlcGFyYXRvcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEyX0ludGVyY2hhbmdlX0NvbnRyb2xfVmVyc2lvbl9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xM19JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE0X0Fja25vd2xlZGdlbWVudF9SZXF1ZXN0ZWRfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNV9Vc2FnZV9JbmRpY2F0b3JfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNl9Db21wb25lbnRfRWxlbWVudF9TZXBhcmF0b3JfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik4zVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTjRUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQ2l0eV9OYW1lXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19Qb3N0YWxfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfQ291bnRyeV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5NMVR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfTmFtZV9GaXJzdF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDVfTmFtZV9NaWRkbGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X05hbWVfUHJlZml4XyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19OYW1lX1N1ZmZpeF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA5X0lkZW50aWZpY2F0aW9uX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUFJWVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1Byb3ZpZGVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJFRlR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IHJlZj0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfRGVzY3JpcHRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVFJOVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1RyYWNlX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX09yaWdpbmF0aW5nX0NvbXBhbnlfSWRlbnRpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0RhdGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9Il8wNV9UaW1lXyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjcwIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlNUIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9UcmFuc2FjdGlvbl9TZXRfSWRlbnRpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wMl9UcmFuc2FjdGlvbl9TZXRfQ29udHJvbF9OdW1iZXJfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQkhUIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9UcmFuc2FjdGlvbl9TZXRfUHVycG9zZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzA0X0RhdGVfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzA1X1RpbWVfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9UcmFuc2FjdGlvbl9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIwMDBBIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkhMIiB0eXBlPSJITFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMDBBIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5NMSIgdHlwZT0iTk0xVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMDAwQiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJITCIgdHlwZT0iSExUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTAwQiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOTTEiIHR5cGU9Ik5NMVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik4zIiB0eXBlPSJOM1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjQiIHR5cGU9Ik40VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQRVIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0NvbnRhY3RfRnVuY3Rpb25fQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX05hbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9Db21tdW5pY2F0aW9uX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X0NvbW11bmljYXRpb25fTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfQ29tbXVuaWNhdGlvbl9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUFJWIiB0eXBlPSJQUlZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIwMDBDIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkhMIiB0eXBlPSJITFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVFJOIiB0eXBlPSJUUk5UeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTAwQyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOTTEiIHR5cGU9Ik5NMVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik4zIiB0eXBlPSJOM1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjQiIHR5cGU9Ik40VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQUlYiIHR5cGU9IlBSVlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRE1HIiB0eXBlPSJETUdUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IklOUyIgdHlwZT0iSU5TVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEVFAiIHR5cGU9IkRUUFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMTBDIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVRIiB0eXBlPSJFUVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQU1UIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9BbW91bnRfUXVhbGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9Nb25ldGFyeV9BbW91bnRfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSUlJIiB0eXBlPSJJSUlUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEVFAiIHR5cGU9IkRUUFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMDAwRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJITCIgdHlwZT0iSExUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRSTiIgdHlwZT0iVFJOVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjEwMEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTk0xIiB0eXBlPSJOTTFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOMyIgdHlwZT0iTjNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik40IiB0eXBlPSJONFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUFJWIiB0eXBlPSJQUlZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRNRyIgdHlwZT0iRE1HVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJTlMiIHR5cGU9IklOU1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRFRQIiB0eXBlPSJEVFBUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTEwRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFUSIgdHlwZT0iRVFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IklJSSIgdHlwZT0iSUlJVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSRUYiIHR5cGU9IlJFRlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRFRQIiB0eXBlPSJEVFBUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlNFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9OdW1iZXJfb2ZfSW5jbHVkZWRfU2VnbWVudHNfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxNzg3OC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08d29ya2Jvb2s+Ci0gICAgPFNoZWV0MT4KLSAgICAgICAgPHJvdz4KLSAgICAgICAgICAgIDxjb2wxPkZJUlNUIE5BTUU8L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5MQVNUIE5BTUU8L2NvbDI+Ci0gICAgICAgICAgICA8Y29sMz5USVRMRTwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PkFERFJFU1M8L2NvbDQ+Ci0gICAgICAgICAgICA8Y29sNT5DSVRZPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+U1RBVEU8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5DT1VOVFJZPC9jb2w3PgotICAgICAgICA8L3Jvdz4KLSAgICAgICAgPHJvdz4KLSAgICAgICAgICAgIDxjb2wxPlBhdWw8L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5GZWFyb248L2NvbDI+Ci0gICAgICAgICAgICA8Y29sMz5NcjwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PjIgUGVubiBQbGF6YTwvY29sND4KLSAgICAgICAgICAgIDxjb2w1Pk5ldyBZb3JrPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+TmV3IFlvcms8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5VU0E8L2NvbDc+Ci0gICAgICAgIDwvcm93PgotICAgICAgICA8cm93PgotICAgICAgICAgICAgPGNvbDE+SmVmZjwvY29sMT4KLSAgICAgICAgICAgIDxjb2wyPlBhb2xldHRpPC9jb2wyPgotICAgICAgICAgICAgPGNvbDM+U2lyPC9jb2wzPgotICAgICAgICAgICAgPGNvbDQ+MiBQZW5uIFBsYXphPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+TmV3IFlvcms8L2NvbDU+Ci0gICAgICAgICAgICA8Y29sNj5OZXcgWW9yazwvY29sNj4KLSAgICAgICAgICAgIDxjb2w3PlVTQTwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgICAgIDxyb3c+Ci0gICAgICAgICAgICA8Y29sMT5Kb25hdGhvbjwvY29sMT4KLSAgICAgICAgICAgIDxjb2wyPlBsYXR0PC9jb2wyPgotICAgICAgICAgICAgPGNvbDM+TG9yZDwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PldlbWJsZXkgUG9pbnQsIEhhcnJvdyBSb2FkPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+TG9uZG9uPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+TUlERFg8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5VSzwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgICAgIDxyb3c+Ci0gICAgICAgICAgICA8Y29sMT5FaWxlZW48L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5BbmRlcnNvbjwvY29sMj4KLSAgICAgICAgICAgIDxjb2wzPk1yczwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PkJlbGxlIFBsYWluPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+TWF5cGVuPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+Q2xhcmVuZG9uPC9jb2w2PgotICAgICAgICAgICAgPGNvbDc+SmFtYWljYTwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgPC9TaGVldDE+Ci08L3dvcmtib29rPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNGRkZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjMgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJTaGVldDEiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJyb3ciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbDMiPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvcmQiLz4KLQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNciIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ycyIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpciIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJVExFIi8+Ci0JCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbDUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29sNiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w3Ij4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1VOVFJZIi8+Ci0JCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFtYWljYSIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVLIi8+Ci0JCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBIi8+Ci0JCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJyb3ciPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2wxIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iY29sMiIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDMiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iY29sNSIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDYiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w3Ii8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0id29ya2Jvb2siPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTaGVldDEiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWNjODIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZG9jOlJGQ19DVVNUT01FUl9HRVQgeG1sbnM6ZG9jPSJ1cm46c2FwLWNvbTpkb2N1bWVudDpzYXA6YnVzaW5lc3M6cmZjIj4KLTxLVU5OUj4qPC9LVU5OUj4KLTxOQU1FMT5BKjwvTkFNRTE+Ci08Q1VTVE9NRVJfVD4KLTxpdGVtPgotPEtVTk5SPjwvS1VOTlI+Ci08QU5SRUQ+PC9BTlJFRD4KLTxOQU1FMT48L05BTUUxPgotPFBGQUNIPjwvUEZBQ0g+Ci08U1RSQVM+PC9TVFJBUz4KLTxQU1RMWj48L1BTVExaPgotPE9SVDAxPjwvT1JUMDE+Ci08VEVMRjE+PC9URUxGMT4KLTxURUxGWD48L1RFTEZYPgotPC9pdGVtPgotPC9DVVNUT01FUl9UPgotPC9kb2M6UkZDX0NVU1RPTUVSX0dFVD4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L1JGQ19DVVNUT01FUl9HRVQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FjYzJiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmRvYz0idXJuOnNhcC1jb206ZG9jdW1lbnQKLTpzYXA6YnVzaW5lc3M6cmZjIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46c2FwLWNvbTpkb2N1bWVudDpzYXA6Ci1idXNpbmVzczpyZmMiPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJSRkNLTkExIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IktVTk5SIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQU5SRUQiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBGQUNIIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RSQVMiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQU1RMWiI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9SVDAxIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVEVMRjEiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGWCI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjMxIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iUkZDX0NVU1RPTUVSX0dFVCI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YWxsPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iS1VOTlIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ1VTVE9NRVJfVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Iml0ZW0iIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJkb2M6QlJGQ0tOQTEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDphbGw+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L2V2ZW50X0RFQk1BUzAxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTI0ZjlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PjxERUJNQVMwMT48SURPQyBCRUdJTj0iMSI+PEVESV9EQzQwIFNFR01FTlQ9IjEiPjxUQUJOQU0+RURJX0RDNDA8L1RBQk5BTT48TUFORFQ+ODAwPC9NQU5EVD48RE9DTlVNPjAwMDAwMDAwMDAyMzI5MDQ8L0RPQ05VTT48RE9DUkVMPjQwQjwvRE9DUkVMPjxTVEFUVVM+MzA8L1NUQVRVUz48RElSRUNUPjE8L0RJUkVDVD48T1VUTU9EPjI8L09VVE1PRD48RVhQUlNTLz48VEVTVC8+PElET0NUWVA+REVCTUFTMDE8L0lET0NUWVA+PENJTVRZUC8+PE1FU1RZUD5ERUJNQVM8L01FU1RZUD48TUVTQ09ELz48TUVTRkNULz48U1RELz48U1REVlJTLz48U1RETUVTLz48U05EUE9SPlNBUEk0QjwvU05EUE9SPjxTTkRQUlQ+TFM8L1NORFBSVD48U05EUEZDLz48U05EUFJOPkk0Ql9DTEk4MDA8L1NORFBSTj48U05EU0FELz48U05ETEFELz48UkNWUE9SPkEwMDAwMDAwMzE8L1JDVlBPUj48UkNWUFJUPkxTPC9SQ1ZQUlQ+PFJDVlBGQy8+PFJDVlBSTj5OT05fSlhBPC9SQ1ZQUk4+PFJDVlNBRC8+PFJDVkxBRC8+PENSRURBVD4yMDAyMDcyMjwvQ1JFREFUPjxDUkVUSU0+MTgyOTM5PC9DUkVUSU0+PFJFRklOVC8+PFJFRkdSUC8+PFJFRk1FUy8+PEFSQ0tFWS8+PFNFUklBTD4yMDAyMDcyMjE4MjkzOTwvU0VSSUFMPgotICAgICAgPC9FRElfREM0MD48RTFLTkExTSBTRUdNRU5UPSIxIj48TVNHRk4+MDA1PC9NU0dGTj48S1VOTlI+MDAwMDAwMDEwMDwvS1VOTlI+PEFOUkVELz48QVVGU0QvPjxCQUhORS8+PEJBSE5TPkT8c3NlbGRvcmYgSEJGPC9CQUhOUz48QkJCTlI+MDAwMDAwMDwvQkJCTlI+PEJCU05SPjAwMDAwPC9CQlNOUj48QkVHUlUvPjxCUlNDSC8+PEJVQktaPjA8L0JVQktaPjxEQVRMVC8+PEZBS1NELz48RklTS04vPjxLTlJaQS8+PEtPTlpTLz48S1RPS0Q+MDAwMTwvS1RPS0Q+PEtVS0xBLz48TEFORDE+REU8L0xBTkQxPjxMSUZOUi8+PExJRlNELz48TE9DQ08vPjxMT0VWTS8+PE5BTUUxPklCSSBRdWFsaXR5IEFzc3VyYW5jZTwvTkFNRTE+PE5BTUUyLz48TkFNRTMvPjxOQU1FNC8+PE5JRUxTLz48T1JUMDE+TmV3IFlvcms8L09SVDAxPjxPUlQwMi8+PFBGQUNILz48UFNUTDIvPjxQU1RMWj4xMDEyMTwvUFNUTFo+PFJFR0lPPjA1PC9SRUdJTz48Q09VTkMvPjxDSVRZQy8+PFJQTUtSLz48U09SVEw+QU08L1NPUlRMPjxTUEVSUi8+PFNQUkFTPkQ8L1NQUkFTPjxTVENEMS8+PFNUQ0QyLz48U1RLWkEvPjxTVEtaVS8+PFNUUkFTPjIgUGVubnN5bHZhbmlhIFBsYXphPC9TVFJBUz48VEVMQlgvPjxURUxGMT4yMTItNzM2LTQ0MzM8L1RFTEYxPjxURUxGMi8+PFRFTEZYPjIxMi03MzYtNDQzNDwvVEVMRlg+PFRFTFRYLz48VEVMWDEvPjxMWk9ORT5EMDAwMDQwMDAwPC9MWk9ORT48WFpFTVAvPjxWQlVORC8+PFNUQ0VHPkRFLTEyMzQ1Njc5PC9TVENFRz48R0ZPUk0vPjxCUkFOMS8+PEJSQU4yLz48QlJBTjMvPjxCUkFONC8+PEJSQU41Lz48VU1KQUg+MDAwMDwvVU1KQUg+PFVXQUVSLz48Sk1aQUg+MDAwMDAwPC9KTVpBSD48Sk1KQUg+MDAwMDwvSk1KQUg+PEtBVFIxLz48S0FUUjIvPjxLQVRSMy8+PEtBVFI0Lz48S0FUUjUvPjxLQVRSNi8+PEtBVFI3Lz48S0FUUjgvPjxLQVRSOS8+PEtBVFIxMC8+PFNUS1pOLz48VU1TQTE+MDwvVU1TQTE+PFRYSkNELz48UEVSSVYvPjxLVE9DRC8+PFBGT1JULz48RFRBTVMvPjxEVEFXUy8+PEhaVU9SPjAwPC9IWlVPUj48Q0lWVkU+WDwvQ0lWVkU+PE1JTFZFLz48U1BSQVNfSVNPPkRFPC9TUFJBU19JU08+PEZJVFlQLz48U1RDRFQvPjxTVENEMy8+PFNUQ0Q0Lz48WElDTVMvPjxYWElQSS8+PFhTVUJULz48Q0ZPUEMvPjxUWExXMS8+PFRYTFcyLz48Q0NDMDEvPjxDQ0MwMi8+PENDQzAzLz48Q0NDMDQvPjxDQVNTRC8+PEtES0cxLz48S0RLRzIvPjxLREtHMy8+PEtES0c0Lz48S0RLRzUvPjxFMUtOQjFNIFNFR01FTlQ9IjEiPjxNU0dGTj4wMDU8L01TR0ZOPjxCVUtSUz5HTDEwMDA8L0JVS1JTPjxTUEVSUi8+PExPRVZNLz48WlVBV0E+MDAyPC9aVUFXQT48QlVTQUIvPjxBS09OVD4wMDAwMTQwMDAwPC9BS09OVD48QkVHUlUvPjxLTlJaRS8+PEtOUlpCLz48WkFNSU0vPjxaQU1JVi8+PFpBTUlSLz48WkFNSUIvPjxaQU1JTy8+PFpXRUxTLz48WFZFUlIvPjxaQUhMUy8+PFpURVJNPlpCMDE8L1pURVJNPjxXQUtPTi8+PFZaU0taLz48WklORFQ+MDAwMDAwMDA8L1pJTkRUPjxaSU5SVD4wMDwvWklOUlQ+PEVJS1RPPjAwMDAwMDAxMDA8L0VJS1RPPjxaU0FCRS8+PEtWRVJNLz48RkRHUlY+RTI8L0ZER1JWPjxWUkJLWi8+PFZMSUJCPjA8L1ZMSUJCPjxWUlNaTD4wPC9WUlNaTD48VlJTUFI+MDwvVlJTUFI+PFZSU05SLz48VkVSRFQ+MDAwMDAwMDA8L1ZFUkRUPjxQRVJLWi8+PFhERVpWLz48WEFVU1ovPjxXRUJUUj4wPC9XRUJUUj48UkVNSVQvPjxEQVRMWj4wMDAwMDAwMDwvREFUTFo+PFhaVkVSPlg8L1haVkVSPjxUT0dSVS8+PEtVTFRHPjA8L0tVTFRHPjxIQktJRC8+PFhQT1JFLz48QkxOS1ovPjxBTFRLTi8+PFpHUlVQLz48VVJMSUQvPjxNR1JVUC8+PExPQ0tCLz48VVpBV0UvPjxFS1ZCRC8+PFNSRUdMLz48WEVESVAvPjxGUkdSUC8+PFZSU0RHLz48VExGWFMvPjxQRVJOUj4wMDAwMDAwMDwvUEVSTlI+PElOVEFELz48R1VaVEUvPjxHUklDRC8+PEdSSURULz48RTFLTkI1TSBTRUdNRU5UPSIxIj48TVNHRk4+MDA1PC9NU0dGTj48TUFCRVIvPjxNQUhOQT4wMDAxPC9NQUhOQT48TUFOU1AvPjxNQURBVD4wMDAwMDAwMDwvTUFEQVQ+PE1BSE5TPjA8L01BSE5TPjxLTlJNQS8+PEdNVkRUPjAwMDAwMDAwPC9HTVZEVD48QlVTQUIvPjwvRTFLTkI1TT48L0UxS05CMU0+PC9FMUtOQTFNPjwvSURPQz48L0RFQk1BUzAxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTg5ZDUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPjx4c2Q6ZWxlbWVudCBuYW1lPSJERUJNQVMwMSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJJRE9DIj48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9IkVESV9EQzQwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJUQUJOQU0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQU5EVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9DTlVNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9DUkVMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFUVVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJUkVDVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1VUTU9EIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFWFBSU1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFU1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IklET0NUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDSU1UWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNRVNUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNRVNDT0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1FU0ZDVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1REIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVERWUlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNURE1FUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EUE9SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EUFJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRQRkMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFBSTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFNBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORExBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlBPUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlBSVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWUEZDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZQUk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZTQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZMQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjcwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDUkVEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGUiLz48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNSRVRJTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dGltZSIvPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVGSU5UIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVGR1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVGTUVTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVJDS0VZIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0VSSUFMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTkExTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVTk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQU5SRUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBVUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFITkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQUhOUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJCQk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQlNOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVHUlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSU0NIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVUJLWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREFUTFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGQUtTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRklTS04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJaQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktPTlpTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1RPS0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVS0xBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMQU5EMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTElGTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9DQ08iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0VWTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUUzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOSUVMUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1JUMDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJPUlQwMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBGQUNIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFNUTDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQU1RMWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFR0lPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDT1VOQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0lUWUMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJQTUtSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT1JUTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQRVJSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUFJBUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENEMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUS1pBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEtaVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RSQVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxCWCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEYxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMRjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGWCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTFRYIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMWDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMWk9ORSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhaRU1QIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWQlVORCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRUciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHRk9STSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFOMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSQU4zIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFONSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVNSkFIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVV0FFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSk1aQUgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkpNSkFIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFIzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI2IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSNyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI5IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSMTAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUS1pOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVTVNBMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRYSkNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSSVYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktUT0NEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRk9SVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRUQU1TIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEVEFXUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSFpVT1IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNJVlZFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUxWRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BSQVNfSVNPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGSVRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0QzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRDQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYSUNNUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFhJUEkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhTVUJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDRk9QQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVFhMVzEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRYTFcyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQ0MwMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0NDMDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNDQzAzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQ0MwNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0FTU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0cxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RLRzMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0c0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHNSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZWTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZLT1JHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWVFdFRyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BBUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJFR1JVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0VWTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVkVSU0ciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFVRlNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQUxLUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJaSVJLIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLT05EQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUExUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFXQUhSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJJTkNPMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSU5DTzIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVVUTEYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFOVExGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLWlRMRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1pBWlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNIU1BMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMUFJJTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRUlLVE8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWU0JFRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRkFLU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1STktaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJGSyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSUkwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldBRVJTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVEdSRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWlRFUk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZXRVJLIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWS0dSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVktCVVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZTT1JUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1IyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkdSMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1I1IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCT0tSRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VSU1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBSRlJFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTEFCQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FCU1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktLQkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQVNTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkRPRkYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WUE0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJWVyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VOTjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJERUZQQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05SRUYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVkRNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9DVFAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQUkFTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FOWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9WRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BQ0hBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUFJBU19JU08iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WSU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTEFORCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEFUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRBWEtEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVkxNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUxBTkQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRBVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUNOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRBVEFCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQVRCSSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVMSUMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05CMU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVUtSUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BFUlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxPRVZNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaVUFXQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlVTQUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFLT05UIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVHUlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOUlpFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05SWkIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSVYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBTUlSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSU8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpXRUxTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFZFUlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBSExTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaVEVSTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iV0FLT04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZaU0taIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaSU5EVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWklOUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkVJS1RPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWlNBQkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkVSTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZER1JWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJCS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZMSUJCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJTWkwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSU1BSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlNOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZFUkRUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJLWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWERFWlYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhBVVNaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXRUJUUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFTUlUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREFUTFoiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhaVkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUT0dSVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VMVEciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkhCS0lEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYUE9SRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkxOS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFMVEtOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkdSVVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVSTElEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNR1JVUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9DS0IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjciLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVaQVdFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFS1ZCRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNSRUdMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYRURJUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSU0RHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUTEZYUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBFUk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJJTlRBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHVVpURSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR1JJQ0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdSSURUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOQjVNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFCRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BSE5BIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQU5TUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BSE5TIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJNQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdNVkRUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNBQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTkJLTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBTktTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQU5LTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBTktOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQktPTlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJWVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYRVpFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQktSRUYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQU5LQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNjAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUUkFTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1JUMDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTV0lGVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJHUlVQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYUEdSTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQk5LTFoiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQU0tUTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSTkNIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFJPVloiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktPSU5IIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZBTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFCTEFEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05GQUsiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldBTklEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREVGQUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WS00iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUVWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBQlRQQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFCVE5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVRVBBUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEYxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQU5SRUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUZLVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSVk8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBVklQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJHRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSTEEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdCREFUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlROUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSWVRIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBS1ZFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTk1BSUwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkFVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkgyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJIMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkg1IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS04yIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUtOMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS041IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT1JUTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZBTVNUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUE5BTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRJVEVMX0FQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTktBTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktMSU1HIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0xJTUUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXQUVSUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRExBVVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05LS00iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLS0JFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0xJTUsiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTktMSSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNUTFBDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEVFJFViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ1JCTEIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNCR1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOWFRSViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1JBVVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjExIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVlEQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJSQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFVkRCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHUlVQUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0JEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktER1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQlBBWSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJSVEciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCRUtSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJXQUUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCTU9OIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IkJFR0lOIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL0N5Y2xvbmVPcmdhbml6YXRpb25Qcm9maWxlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvQ3ljbG9uZU9yZ2FuaXphdGlvblByb2ZpbGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMxNGMwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvQ3ljbG9uZU9yZ2FuaXphdGlvblByb2ZpbGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDgvY29wIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxkc2lnLWNvcmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiLz4KLQk8eHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSByZXByZXNlbnRzIG9yZ2FuaXphdGlvbiBkZXRhaWxzIHJlcXVpcmVkIGZvciB0cmFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQk8IS0tR2VuZXJhbCBkZWZpbml0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcmVzdCBvZiB0aGUgc2NoZW1hLi0tPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZnJlZWZvcm0gdGV4dCBmaWVsZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2Q6bGFuZ3VhZ2UiIGRlZmF1bHQ9ImVuIi8+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZCBmb3IgYW4gZWxlbWVudC4gIENhbid0IHVzZSB4c2Q6SUQgYmVjYXVzZSBpdCB3b24ndCBhbGxvdyB0aGVtIHRvIGJlZ2luIHdpdGggYSBudW1iZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllclJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBJZGVudGlmaWVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZ2FuaXphdGlvbklkIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXJ2ZXIncyB1bmlxdWUgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgYW4gb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb21tdW5pdHlJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VydmVyJ3MgdW5pcXVlIGludGVybmFsIGlkZW50aWZpZXIgZm9yIGEgY29tbXVuaXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pdHkiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bml0eU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcm9rZXJJZCIgdHlwZT0iT3JnYW5pemF0aW9uSWQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21tdW5pdHlJZCIgdHlwZT0iQ29tbXVuaXR5SWQiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciB0aGUgQWRtaW5pc3RyYXRpdmUgSW5mb3JtYXRpb24tLT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iT3JnYW5pemF0aW9uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyc29uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIHBlcnNvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBob25lIiBtaXhlZD0idHJ1ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHBob25lIG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVtYWlsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGVtYWlsIGFkZHJlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBhYm91dCBhIHBlcnNvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUGVyc29uTmFtZSIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUaXRsZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlcGFydG1lbnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbWFpbCBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRW1haWwiPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGhvbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBob25lIi8+Ci0JCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb250YWN0SWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdHMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBDb250YWN0IGFuZCBDb250YWN0UmVmcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qb3N0YWwgbWFpbGluZyBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdHJlZXQgYWRkcmVzcy4gIFRoaXMgbWF5IHJlc29sdmUgdG8gd2hhdCBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgbXVsdGlwbGUgbGluZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2l0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlcHJvdiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0YXRlIG9yIHByb3ZpbmNlIGRlcGVuZGluZyBvbiB0aGUgY291bnRyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9zdGFsIG9yIHppcCBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iVVMiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q291bnRyeSBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSb3V0aW5nSWRUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIHJvdXRpbmcgaWRlbnRpZmllciwgbGlrZSBEVU5TLCBFREksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElGQUNUIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJvdXRpbmdJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZGVudGlmaWVyIHN1Y2ggYXMgRFVOUyBvciBFREkgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbXBhbnkgZm9yIHRyYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0iUm91dGluZ0lkVHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgY2VydGlmaWNhdGUuIFRoZSBpbml0aWFsIHZlcnNpb24gb2YgZWFjaCBJbnRlcmNoYW5nZSBwcm9kdWN0IG9ubHkgc3VwcG9ydCB0aGUgZHM6S2V5SW5mby9kczpYNTA5RGF0YSBzZWN0aW9uIGluY2x1ZGluZyBkczpYNTA5SXNzdWVyU2VyaWFsIGFuZCBYNTA5Q2VydGlmaWNhdGUuICBBbnkgb3RoZXIgZWxlbWVudHMgdXNlZCB3aWxsIGJlIGlnbm9yZWQsIGFuZCBpZiBvbmUgb2YgdGhlIHR3byBzdXBwb3J0ZWQgZWxlbWVudHMgaXMgbm90IGluY2x1ZGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGNvbnNpZGVyZWQgaW52YWxpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNlcnRJZCIgdHlwZT0iSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZXJ0aWZpY2F0ZXRSZWYiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYSBDZXJ0aWZpY2F0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIENlcnRpZmljYXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmZXJyZWRFbmNyeXB0aW9uQ2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkFkbWluaXN0cmF0aXZlSW5mbyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBkZXNjcmliaW5nIGFuIG9yZ2FuaXphdGlvbiB1c2VmdWwgdG8gaHVtYW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik9yZ2FuaXphdGlvbk5hbWUiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciBUcmFuc3BvcnRzLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlVzZXJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZXJuYW1lIHVzZWQgdG8gYWNjZXNzIGEgcmVzb3VyY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXNzd29yZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QYXNzd29yZCB1c2VkIHRvIGFjY2VzcyBhIHNlY3VyZSByZXNvdWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImVuY3J5cHRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJUEFkZHJlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SW50ZXJuZXQgUHJvdG9jYWwgYWRkcmVzcywgZXg6ICAxMi4zNC41Ni43ODwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQk8eHNkOnBhdHRlcm4gdmFsdWU9IigoWzAtMV0/WzAtOV0/WzAtOV18MlswLTRdWzAtOV18MjVbMC05XSl7M30oLlswLTFdP1swLTldP1swLTldfDJbMC00XVswLTldfDI1WzAtNV0pKSI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBtZXNzIGp1c3QgcmVzdHJpY3RzIHRoZSB2YWx1ZSB0byBzdGFuZGFyZCBJUCBhZGRyZXNzZXMgd2hlcmUgZWFjaCBvZiBmb3VyIG9jdGV0cyBjYW4gaGF2ZSB2YWx1ZXMgMC0yNTUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJPC94c2Q6cGF0dGVybj4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRE5TQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Eb21haW4gTmFtZSBTZXJ2ZXIgYWRkcmVzcywgZXg6IHd3dy5jeWNsb25lY29tbWVyY2UuY29tPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU29ja2V0U2VjdXJpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFVVEhFTlRJQ0FURUQgb3IgQU5PTllNT1VTPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVEhFTlRJQ0FURUQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOT05ZTU9VUyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3N0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgaG9zdCBhZGRyZXNzLCBlaXRoZXIgaW4gRE5TIG9yIElQLCBmb3IgYSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0iRE5TQWRkcmVzcyBJUEFkZHJlc3MiLz4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNvY2tldCBwb3J0IG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLQkJCQk8eHNkOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotCQkJCTx4c2Q6bWF4SW5jbHVzaXZlIHZhbHVlPSI2NTAwMCIvPgotCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCTwveHNkOnNpbXBsZVR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGlyZWN0b3J5IG9uIGEgZmlsZSBzeXN0ZW0gb3Igc2VydmVyIHN1Y2ggYXMgRlRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkpNU0NvbnN1bWVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgSk1TLCBlaXRoZXIgYSBRdWV1ZSBvciBUb3BpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVVFVUUiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUElDIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBTL0tleSBvciBDbGVhclRleHQ8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tFWSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xFQVJURVhUIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZpcmV3YWxsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNwb3J0IHNlcnZlcidzIGZpcmV3YWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgUy9LZXkgb3IgQ2xlYXIgdGV4dCBhdXRoZW50aWNhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU29ja2V0U2VjdXJpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VHlwZSBvZiBTU0wgc2VjdXJpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNlcnRpZmljYXRldFJlZiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IlNvY2tldFNlY3VyaXR5VHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSB0cmFkaW5nIHRyYW5zcG9ydCBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBzY2hlZHVsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZWR1bGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBlcmlvZCBvZiB0aW1lIGluY2x1ZGluZyBhIHN0YXJ0IGFuZCBzdG9wIHRpbWUgcmVwcmVzZW50aW5nIHRoZSBwZXJpb2Qgb2YgdGltZSB0aGUgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lIiB0eXBlPSJ4c2Q6dGltZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdG9wVGltZSIgdHlwZT0ieHNkOnRpbWUiIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zcG9ydElkIiB0eXBlPSJJZGVudGlmaWVyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIFRyYW5zcG9ydCBkZWZpbmVkIGVsc2V3aGVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNwb3J0SWQiIHR5cGU9IklkZW50aWZpZXJSZWYiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0cyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIFRyYW5zcG9ydHMgZGVmaW50aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaWxlVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iRlRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iSFRUUFRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkhUVFBUcmFuc3BvcnRfQ0kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTTVRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iU01UUFRyYW5zcG9ydF9DSSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkpNU1RyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik1RU2VyaWVzVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZlcnJlZFRyYW5zcG9ydFJlZiIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaWxlVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkZpbGUgc3lzdGVtIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0xvY2FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZUUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWxlIFRyYW5zZmVyIFByb3RvY29sIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wRGlyIiB0eXBlPSJEaXJlY3RvcnkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpcmVjdG9yeSBvbiB0aGUgRlRQIHNlcnZlciB3aGVyZSBpbmNvbWluZyBkb2N1bWVudHMgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCBhcyB0aGV5IGFyZSB0cmFuc2ZlcnJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBpY2t1cERpciIgdHlwZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXJlY3Rvcnkgd2hlcmUgdGhlIGRvY3VtZW50cyBhcmUgbW92ZWQgYWZ0ZXIgaGF2aW5nIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFRlbXBEaXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclR5cGUiIGRlZmF1bHQ9IkJJTkFSWSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QklOQVJZIG9yIEFTQ0lJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTQ0lJIi8+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSU5BUlkiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTW9kZSIgZGVmYXVsdD0iUGFzc2l2ZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9ydCBvciBQYXNzaXZlLiAgUGFzc2l2ZSBtZWFucyB0aGUgRlRQIHNlcnZlciBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci4gUG9ydCBtZWFucyB0aGUgRlRQIGNsaWVudCBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2l2ZSIvPgotCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkhUVFBUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2QiIGRlZmF1bHQ9IlBPU1QiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBQVVQgb3IgUE9TVCB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0byBwdXNoIGRvY3VlbW50cyB0byB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPU1QiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRG91YmxlTWltZVdyYXBwZWQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U29tZSBzZXJ2ZXJzIHdpbGwgc3RyaXAgb2ZmIE1JTUUgd3JhcHBpbmcgb2YgYSBkb2N1bWVudCByZXF1aXJpbmcgdGhhdCB0aGUgZG9jdW1lbnQgYmUgTUlNRSB3cmFwcGVkIHR3aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTb2NrZXRTZWN1cml0eSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIVFRQVHJhbnNwb3J0X0NJIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgRW50ZXJwcmlzZSdzIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgSFRUUC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJUcmFuc3BvcnQiPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU01UUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGUgTWFpbCBUcmFuc3BvcnQgUHJvdG9jb2wgdHJhbnNwb3J0IGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVjaXBpZW50IiB0eXBlPSJFbWFpbCI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RW1haWwgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSXNDb21wbGlhbnQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIj4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXQgdG8gZmFsc2UgZm9yIFNNVFAgaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGxlYXZlIHRoZSBNSU1FIHdyYXBwaW5nIGluIHRhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlNNVFBUcmFuc3BvcnRfQ0kiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q3ljbG9uZSBJbnRlcmNoYW5nZSBFbnRlcnByaXNlJ3Mgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBTTVRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlY2lwaWVudCIgdHlwZT0iRW1haWwiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSk1TVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTWVzc2FnZSBTZXJ2aWNlIChKTVMpIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29ubmVjdGlvbkZhY3RvcnkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25zdW1lciI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIFF1ZXVlIG9yIFRvcGljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJKTVNDb25zdW1lclR5cGUiIGRlZmF1bHQ9IlFVRVVFIi8+Ci0JCQkJCQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQkJCQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkpOREkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlIGRlZmludGlvbiB0byBsb2NhdGUgdGhlIEpNUyBwcm92aWRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSI+Ci0JCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBsb2NhdGlvbiBvZiB0aGUgSk1TIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iVXNlcm5hbWUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRleHRGYWN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgSk5ESSBjb250ZXh0IGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTVFTZXJpZXNUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SUJNJ3MgTVEgU2VyaWVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZU1hbmFnZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoYW5uZWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPCEtLVRoZSBmb2xsb3dpbmcgZGVmaW5lcyBidXNpbmVzcyBwcm90b2NvbCBpbmZvcm1hdGlvbiAtLT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJ1c2luZXNzUHJvdG9jb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QmFzZSBkZWZpbml0aW9uIGZvciBhIGJ1c2luZXNzIHByb3RvY29sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRSZWYiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzc1Byb3RvY29sSWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQnVzaW5lc3NQcm90b2NvbFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIGJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzUHJvdG9jb2xJZCIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJCdXNpbmVzc1Byb3RvY29scyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIEJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmFsbD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQVMxUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUzJQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvc2V0dGFOZXRQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9ImViWE1MUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6YWxsPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTwhLS1UaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIHRvcC1sZXZlbCBPcmdhbml6YXRpb25EYXRhLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvblByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QWxsIGluZm9ybWF0aW9uIG5lZWRlZCB0byB0cmFkZSB3aXRoIGFuIG9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iQWRtaW5pc3RyYXRpdmVJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm91dGluZ0lkcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbGxlY3Rpb24gb2YgUm91dGluZ0lkczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlJvdXRpbmdJZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyb2tlcklkIiB0eXBlPSJPcmdhbml6YXRpb25JZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPldpdGhpbiB0aGlzIGNvbW11bml0eSwgdGhpcyBvcmdhbml6YXRpb24gdHJhZGVzIHRocm91Z2ggYSBicm9rZXIgKGh1YikuIFRoaXMgcmVmZXJlbmNlcyBhbm90aGVyIHByb2ZpbGUgd2l0aCB0aGlzIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaXRpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIGNvbW11bml0aWVzIHRoZSB0cmFkaW5nIHByb2ZpbGUgaXMgYWN0aXZlbHkgYSBtZW1iZXIgb2YuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iQ29tbXVuaXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkJ1c2luZXNzUHJvdG9jb2xzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9Ik9yZ2FuaXphdGlvbklkIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgT3JnYW5pemF0aW9uSWQgZXhpc3RzIGZvciB2YWxpZCBwcm9maWxlcyBleGlzdGluZyB3aXRoaW4gdGhlIHNlcnZlci4gIElmIGEgY2xpZW50IGlzIHNlbmRpbmcgYSBwcm9maWxlIGZvciBhbiBvcmdhbml6YXRpb24gdGhhdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgc2VydmVyJ3MgcmVwb3NpdG9yeSwgdGhpcyBpZCB3aWxsIG5vdCBiZSBwcmVzZW50IGFzIHRoZSBzZXJ2ZXIgd2lsbCBiZSBhc3NpZ25pbmcgb25lIGZvciBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL0ludGVyY2hhbmdlUGFydG5lckNvbmZpZy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL0ludGVyY2hhbmdlUGFydG5lckNvbmZpZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDliMWQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvY3ljbG9uZS9JbnRlcmNoYW5nZVBhcnRuZXJDb25maWcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIGVkaXRlZCB3aXRoIFhNTCBTcHkgdjQuMyBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pIGJ5IEJvYiBLcmllciAoQ3ljbG9uZSBDT21tZXJjZSwgSW5jLikgLS0+Ci08IS0tVzNDIFNjaGVtYSBnZW5lcmF0ZWQgYnkgWE1MIFNweSB2My41IE5UIChodHRwOi8vd3d3LnhtbHNweS5jb20pLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDkvaXBwIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOS9pcHAiIHhtbG5zOmNvcD0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmN5Y2xvbmVjb21tZXJjZS5jb20vU2NoZW1hcy8yMDAxLzA4L0N5Y2xvbmVPcmdhbml6YXRpb25Qcm9maWxlLnhzZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmNoYW5nZVBhcnRuZXJQcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgcGFydG5lciBwcm9maWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvcDpPcmdhbml6YXRpb25Qcm9maWxlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWRzIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJmYWxzZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUHJlZmVyZW5jZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pblNLZXlJdGVyYXRpb25Db3VudCI+Ci0JCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0JCQkJCQkJCQkJPHhzZDptaW5JbmNsdXNpdmUgdmFsdWU9IjAiLz4KLQkJCQkJCQkJCQk8eHNkOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHkiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZWN1cml0eSBwYXJhbWV0ZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFNpZ25pbmciIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGRvY3VtZW50cyByZWNlaXZlZCBieSB0aGlzIHBhcnRuZXIgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50QWNrbm93bGVkZ2VtZW50IiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RG9jdW1lbnQgYWNrbm93bGVkZ2VtZW50IGNvbmZpZ3VyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTaWduZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBkb2N1bWVudCBhY2tub3dsZWRnbWVudHMgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTeW5jaHJvbm91cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFja25vd2xlZGdlbWVudHMgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHJlY2VpdmVkLiAgUmVxdWlyZXMgYnVuZGxlZCBIVFRQKFMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpib29sZWFuIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1lc3NhZ2VEaWdlc3QiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkb2N1bWVudCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aGltIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRDUiLz4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSEExIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudEVuY3J5cHRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSB0eXBlIG9mIGRvY3VtZW50IGVuY3J5cHRpb24gYWxnb3JpdGhpbSB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6Y2hvaWNlPgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSQzJFbmNyeXB0aW9uIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJDMiBFbmNyeXB0aW9uIGFsZ29yaXRoaW0uICBLZXkgbGVuZ3RoIGlzIHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlMZW5ndGgiIHVzZT0icmVxdWlyZWQiPgotCQkJCQkJCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEyOCIvPgotCQkJCQkJCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUkNGb3VyRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BUkNGb3VyIEVuY3J5cHRpb24gYWxnb3JpdGhpbS4gIEtleSBsZW5ndGggaXMgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImtleUxlbmd0aCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJCQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwIi8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTI4Ii8+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQkJCQkJCTwveHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRFU0VuY3J5cHRpb24iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+REVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iNTYiLz4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJpcGxlREVTRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UcmlwbGUgREVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iMTY4Ii8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3JpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgY29tcGFuaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCaW5hcnlDb21wYW55IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgY29tcGFueS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3J5IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmJvdW5kIGFuZCBvdXRib3VuZCBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgcGFydG5lci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydG5lcklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbmJvdW5kUGF0aCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0Ym91bmRQYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbXBhbnlJZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlByZWZlcmVuY2VzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBhcnRuZXIgcHJvZmlsZSB0cmFuc3BvcnQgYW5kIGRvY3VtZW50IHNldHRpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZSIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgc2NoZWR1bGUgdG8gdXNlIHdoZW4gc2VuZGluZyBkb2N1bWVudHMgdG8gdGhpcyBwYXJ0bmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5ib3VuZEZpbGVQcmVzZXJ2YXRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgaW5ib3VuZCBmaWxlcyBzaG91bGQgYmUgcGVyc2lzdGVkIHdpdGggdGhlaXIgb3JpZ2luYWwgZmlsZSBuYW1lLiAgT3B0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgZm9yIG92ZXJ3cml0aW5nIG9yIHNlcXVlbmNpbmcgZmlsZXMgd2l0aCBkdXBsaWNhdGUgZmlsZSBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50T3B0aW9ucyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdsb2JhbCBkb2N1bWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlamVjdER1cGxpY2F0ZUVESSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIEVESSBkb2N1bWVudCByZWNpZXZlZCB3aXRoIGR1cGxpY2F0ZSBjb250cm9sIElEcyBzaG91bGQgYmUgcmVqZWN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wcmVzc2lvbiIgZGVmYXVsdD0iTk9ORSIgbmlsbGFibGU9ImZhbHNlIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiBhbGdvcml0aGltIHRvIHVzZSAoTk9ORSwgR1pJUCBvciBaTElCKS4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWklQIi8+Ci0JCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkxJQiIvPgotCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc2VuZEF0dGVtcHRzIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZG9jdW1lbnQgc2hvdWxkIGJlIHJlc2VudCBpZiBhbiBhY2tub3dsZWRtZW50IGhhcyBub3QgYmVlbiByZWNpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIwIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9IjYwIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNlbmRJbnRlcnZhbCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhlIGR1cmF0aW9uIChpbiBob3VycykgYmV0d2VlbiByZXNlbmQgYXR0ZXB0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTkiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmV0cmllcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgVHJhbnNwb3J0IHJldHJpZXMgb3B0aW9uIGFuZCBpbnRlcnZhbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZHVyYXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmYWxsb2ZmIiB0eXBlPSJ4c2Q6aW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc1Byb3RvY29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSBidXNpbmVzcyBwcm90b2NvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IHJlZj0iVHJhbnNwb3J0UmVmIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3NQcm90b2NvbElkIiB0eXBlPSJ4c2Q6SURSRUYiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmVmIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGEgVHJhbnNwb3J0IGRlZmluZWQgZWxzZXdoZXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvVFBNLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvVFBNLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyYWE1Yi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL1RQTS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCUNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCUFsbCByaWdodHMgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRISVMgSVMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVNPVVJDRSBDT0RFIE9GIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRoZSBjb3B5cmlnaHQgbm90aWNlIGFib3ZlIGRvZXMgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCWV2aWRlbmNlIGFueSBhY3R1YWwgb3IgaW50ZW5kZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCXB1YmxpY2F0aW9uIG9mIHN1Y2ggc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAkSWQ6IFRQTS54c2QsdiAxLjEgMjAwMy8wOS8xNSAxODoyMDo0MCBlcmljdmFzIEV4cCAkIC0tPgotPHhzOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzAzL3dsaS90cG0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMy93bGkvdHBtIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmltcG9ydAotICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sZHNpZy1jb3JlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW1hbmFnZW1lbnQiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYWRpbmctcGFydG5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ic2VydmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZy1kZWZhdWx0IiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUtYXVkaXQtbG9nZ2luZyIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXN0LW1vZGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iYWRkcmVzcyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9ImNsaWVudC1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNlcnZlci1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0iZW5jcnlwdGlvbi1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHM6Y2hvaWNlPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZWJ4bWwtYmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icm9zZXR0YW5ldC1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ3ZWItc2VydmljZS1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6Y2hvaWNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0NBTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRU1PVEUiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1pZC10eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbWFpbCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBob25lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZmF4IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2xpZW50LWNlcnRpZmljYXRlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzOmhleEJpbmFyeSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImRzOktleUluZm8iIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4czpoZXhCaW5hcnkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZWJ4bWwtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS10cmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtcHJvdG9jb2wtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLXZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1kZWZhdWx0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1yZWNlaXB0LXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaWduYXR1cmUtY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlbGl2ZXJ5LXNlbWFudGljcyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0RWZmb3J0Ii8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJFU1RFRkZPUlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbmNlQW5kT25seU9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT05DRUFORE9OTFlPTkNFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQXRMZWFzdE9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVRMRUFTVE9OQ0UiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBdE1vc3RPbmNlIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFUTU9TVE9OQ0UiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGVyc2lzdC1kdXJhdGlvbiIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS10cmFuc2Zvcm1zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ieHBhdGgiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4cGF0aCIvPgotCTx4czplbGVtZW50IG5hbWU9InJvc2V0dGFuZXQtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImZhaWx1cmUtcmVwb3J0LWFkbWluaXN0cmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iZmFpbHVyZS1ub3RpZmllciIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbC12ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWNlcnRpZmljYXRlLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaXBoZXItYWxnb3JpdGhtIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJDNSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERVMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJJUExFX0RFUyIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWxldmVsIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUxPQUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5USVJFX1BBWUxPQUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXJlY2VpcHQtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzcy10aW1lb3V0IiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZmFpbHVyZS1yZXBvcnQtYWRtaW5pc3RyYXRvciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsdXJlLW5vdGlmaWVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFkaW5nLXBhcnRuZXItbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmctbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IndlYi1zZXJ2aWNlLWJpbmRpbmciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm90b2NvbCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHR0cCIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJIVFRQIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHBzIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkhUVFBTIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImptcyIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKTVMiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvdG9jb2wtdmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVuZHBvaW50IiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGllbnQtYXV0aGVudGljYXRpb24iIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFTSUMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1NMX0NFUlQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2VydmVyLWF1dGhlbnRpY2F0aW9uIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNTTF9DRVJUX01VVFVBTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJzZXJ2aWNlLXByb2ZpbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InJvc2V0dGFuZXQtc2VydmljZS1kZWZhdWx0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2aWNlLXR5cGUiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldFQlNFUlZJQ0UiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPQ0VTUyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVJWSUNFQ09OVFJPTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbCIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0VCU0VSVklDRSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQlhNTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJST1NFVFRBTkVUIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UtcHJvZmlsZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtdHJhZGluZy1wYXJ0bmVyIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtYmluZGluZyIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLXRyYWRpbmctcGFydG5lciIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLWJpbmRpbmciIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOQUJMRUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQUJMRUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUZBVUxUIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyb3NldHRhbmV0LXNlcnZpY2UtZGVmYXVsdHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNlcnZpY2UtY29udGVudC1zY2hlbWEiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtZHRkLXZhbGlkYXRpb24iIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGUtc2VydmljZS1jb250ZW50IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRlLXNlcnZpY2UtaGVhZGVyIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czpzaW1wbGVUeXBlIG5hbWU9InJlZmVyZW5jZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2YxNDMzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxkdDp3cmFwcGVkaW5zdGFuY2UgeG1sbnM6ZHQ9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiPgotICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvPgotICA8L3hzOnNjaGVtYT4KLSAgPHF0OnF1YW50aXR5IHhtbG5zOnF0PSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+Ci0gICAgNDIKLSAgPC9xdDpxdWFudGl0eT4KLTwvZHQ6d3JhcHBlZGluc3RhbmNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2EzMDA3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIKLSAgYmxvY2tEZWZhdWx0PSIjYWxsIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbDpsYW5nPSJFTiI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0id3JhcHBlZGluc3RhbmNlIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6c2NoZW1hIi8+Ci0gICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0Mi54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2MmU0ZC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGR0OndyYXBwZWR3aWxkY2FyZCB4bWxuczpkdD0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCI+Ci0gIDx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L3F1YW50Ij4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6aW50Ii8+Ci0gIDwveHM6c2NoZW1hPgotPC9kdDp3cmFwcGVkd2lsZGNhcmQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0Mi54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjNGUzNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIGJsb2NrRGVmYXVsdD0iI2FsbCIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIHZlcnNpb249IjEuMCIKLSAgeG1sOmxhbmc9IkVOIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ3cmFwcGVkd2lsZGNhcmQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvSU1TX3htbC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvSU1TX3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjRkZGMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvaW1zL0lNU194bWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gZmlsZW5hbWU9aW1zX3htbC54c2QgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JPCEtLSAyMDAxLTAyLTIyIGVkaXRlZCBieSBUaG9tYXMgV2Fzb24gSU1TIEdsb2JhbCBMZWFybmluZyBDb25zb3J0aXVtLCBJbmMuIC0tPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpkb2N1bWVudGF0aW9uPkluIG5hbWVzcGFjZS1hd2FyZSBYTUwgcHJvY2Vzc29ycywgdGhlICZxdW90O3htbCZxdW90OyBwcmVmaXggaXMgYm91bmQgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8eHNkOmRvY3VtZW50YXRpb24+RG8gbm90IHJlZmVyZW5jZSB0aGlzIGZpbGUgaW4gWE1MIGluc3RhbmNlczwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2Q6bGFuZ3VhZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJzIHRvIHVuaXZlcnNhbCAgWE1MIDEuMCBsYW5nIGF0dHJpYnV0ZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6YXR0cmlidXRlPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzZDphbnlVUkkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJzIHRvIFhNTCBCYXNlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxiYXNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDphdHRyaWJ1dGU+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGluayIgdHlwZT0ieHNkOmFueVVSSSIvPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvaW1zL2ltc21kX3YxcDJwMi54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvaW1zbWRfdjFwMnAyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMWY3Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvaW1zbWRfdjFwMnAyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lmltc2dsb2JhbC5vcmcveHNkL2ltc21kX3YxcDIiIAotICAgICAgICAgICAgeG1sbnM6eD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy5pbXNnbG9iYWwub3JnL3hzZC9pbXNtZF92MXAyIiAKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgICAgICAgICAgIHZlcnNpb249IklNUyBNRCAxLjIuMyI+Ci0KLSAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiBzY2hlbWFMb2NhdGlvbj0iaW1zX3htbC54c2QiLz4gCi0gICAKLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICA8IS0tICoqIENoYW5nZSBIaXN0b3J5ICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4yMDAxLTA0LTI2IFQuRC5XYXNvbi4gSU1TIG1ldGEtZGF0YSAxLjIgWE1MLVNjaGVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4yMDAxLTA2LTA3IFMuRS5UaHJvcHAuIENoYW5nZWQgdGhlIG11bHRpcGxpY2l0eSBvbiBhbGwgZWxlbWVudHMgdG8gbWF0Y2ggdGhlICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaW5hbCAxLjIgQmluZGluZyBTcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFuZ2VkIGFsbCBlbGVtZW50cyB0aGF0IHVzZSB0aGUgbGFuZ3N0cmluZ1R5cGUgdG8gYSBtdWx0aXBsaWN5IG9mIDEgb3IgbW9yZSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFuZ2VkIGNlbnRpdHkgaW4gdGhlIGNvbnRyaWJ1dGUgZWxlbWVudCB0byBoYXZlIGEgbXVsdGlwbGljaXR5IG9mIDAgb3IgbW9yZS4gICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFuZ2VkIHRoZSByZXF1aXJlbWVudCBlbGVtZW50IHRvIGhhdmUgYSBtdWx0aXBsaWNpdHkgb2YgMCBvciBtb3JlLiAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gMjAwMS0wNy0yNSBTY2hhd24gVGhyb3BwLiAgVXBkYXRlcyB0byBicmluZyB0aGUgWFNEIHVwIHRvIHNwZWVkIHdpdGggdGhlIFczQyAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbi4gIFRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGU6IENoYW5nZSB0aGUgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gbmFtZXNwYWNlIHRvIHJlZmVyZW5jZSB0aGUgNS8yLzIwMDEgVzNDIFhNTCBTY2hlbWEgUmVjb21tZW5kYXRpb24sdGhlIGJhc2UgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gdHlwZSBmb3IgdGhlIGR1cnRpbWVUeXBlLCBzaW1wbGVUeXBlLCB3YXMgY2hhbmdlZCBmcm9tIHRpbWVEdXJhdGlvbiB0byBkdXJhdGlvbi4gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4gCi0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IEFueSBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIHRoYXQgaGF2ZSB1c2U9ImRlZmF1bHQiIGhhZCB0byBjaGFuZ2UgdG8gdXNlPSJvcHRpb25hbCIgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IC0gYXR0ci50eXBlLiAgQW55IGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgdGhhdCBoYXZlIHZhbHVlID0ic29tZXZhbHVlIiBoYWQgdG8gY2hhbmdlIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IHRvIGRlZmF1bHQgPSAic29tZXZhbHVlIiAtIGF0dHIudHlwZSAoVVJJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IDIwMDEtMDktMDQgU2NoYXduIFRocm9wcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IENoYW5nZWQgdGhlIHRhcmdldE5hbWVzcGFjZSBhbmQgbmFtZXNwYWNlIG9mIHNjaGVtYSB0byByZWZsZWN0IHZlcnNpb24gY2hhbmdlICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IDIwMDEtMTEtMDQgQ2hyaXMgTW9mZmF0dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAxLiBDaGFuZ2VzIHRvIGVuYWJsZSB0aGUgc2NoZW1hIHRvIHdvcmsgd2l0aCBjb21tZXJjaWFsIFhNTCBUb29scyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBhLiBSZWZlciB0byB0aGUgeG1sIG5hbWVzcGFjZSB1c2luZyB0aGUgIngiIGFiYnJldmlhdGlvbiBpbnN0ZWFkIG9mICJ4bWwiICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBiLiBSZW1vdmUgdW5lY2Vzc2FyeSBub24tZGV0ZXJtaW5pc3RpYyBjb25zdHJ1Y3RzIGZyb20gc2NoZW1hLiAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICAgICBpLmUuIGNoYW5nZSBvY2N1cnJlbmNlcyBvZiAiI2FueSIgdG8gIiNvdGhlciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAyLiBSZXZlcnQgdG8gb3JpZ2luYWwgSU1TIE1EIHZlcnNpb24gMS4yIG5hbWVzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBpLmUuICJodHRwOi8vd3d3Lmltc2dsb2JhbC5vcmcveHNkL2ltc21kX3YxcDIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBUaGlzIGNoYW5nZSBkb25lIHRvIHN1cHBvcnQgdGhlIGRlY2lzaW9uIHRvIG9ubHkgY2hhbmdlIHRoZSBYTUwgbmFtZXNwYWNlIHdpdGggIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBtYWpvciByZXZpc2lvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24gaWUuIHdoZXJlIHRoZSBpbmZvcm1hdGlvbiBtb2RlbCBvciBiaW5kaW5nIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBjaGFuZ2VzIChhcyBvcHBvc2VkIHRvIGFkZHJlc3NpbmcgYnVncyBvciBvbWlzc2lvbnMpLiBBIHN0YWJsZSBuYW1lc3BhY2UgaXMgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBuZWNlc3NhcnkgdG8gdGhlIGluY3JlYXNpbmcgbnVtYmVyIG9mIGltcGxlbWVudG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAzLiBDaGFuZ2VkIG5hbWUgb2Ygc2NoZW1hIGZpbGUgdG8gImltc21kX3YxcDJwMi54c2QiIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICB2ZXJzaW9uIGF0dHJpYnV0ZSB0byAiSU1TIE1EIDEuMi4zIiB0byByZWZsZWN0IG1pbm9yIHZlcnNpb24gY2hhbmdlICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDwhLS0gKiogQXR0cmlidXRlIERlY2xhcmF0aW9uICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgIDx4c2Q6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXR0ci50eXBlIj4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IlVSSSI+Ci0gICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVJJIi8+Ci0gICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURVhUIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICA8L3hzZDphdHRyaWJ1dGVHcm91cD4KLQotICAgPHhzZDpncm91cCBuYW1lPSJncnAuYW55Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgbmFtZXNwYWNlZCBlbGVtZW50IGZyb20gYW55IG5hbWVzcGFjZSBtYXkgYmUgdXNlZCBmb3IgYW4gJnF1b3Q7YW55JnF1b3Q7IGVsZW1lbnQuICBUaGUgbmFtZXNwYWNlIGZvciB0aGUgaW1wb3J0ZWQgZWxlbWVudCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGluc3RhbmNlLCBhbmQgdGhlIHNjaGVtYSBtdXN0IGJlIGltcG9ydGVkLiAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InN0cmljdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpncm91cD4KLQotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgPCEtLSAqKiBFbGVtZW50IERlY2xhcmF0aW9uICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICA8eHNkOmVsZW1lbnQgbmFtZT0iYWdncmVnYXRpb25sZXZlbCIgdHlwZT0iYWdncmVnYXRpb25sZXZlbFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJhbm5vdGF0aW9uVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2dlbnRyeSIgdHlwZT0iY2F0YWxvZ2VudHJ5VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9ImNhdGFsb2dUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iY2VudGl0eSIgdHlwZT0iY2VudGl0eVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzc2lmaWNhdGlvbiIgdHlwZT0iY2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dCIgdHlwZT0iY29udGV4dFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250cmlidXRlIiB0eXBlPSJjb250cmlidXRlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHlyaWdodGFuZG90aGVycmVzdHJpY3Rpb25zIiB0eXBlPSJjb3B5cmlnaHRhbmRvdGhlcnJlc3RyaWN0aW9uc1R5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3N0IiB0eXBlPSJjb3N0VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdmVyYWdlIiB0eXBlPSJjb3ZlcmFnZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJkYXRlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGV0aW1lIiB0eXBlPSJkYXRldGltZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0iZGVzY3JpcHRpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlmZmljdWx0eSIgdHlwZT0iZGlmZmljdWx0eVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlZHVjYXRpb25hbCIgdHlwZT0iZWR1Y2F0aW9uYWxUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50cnkiIHR5cGU9ImVudHJ5VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm1hdCIgdHlwZT0iZm9ybWF0VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYWwiIHR5cGU9ImdlbmVyYWxUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaWRlbnRpZmllciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVuZGVkZW5kdXNlcnJvbGUiIHR5cGU9ImludGVuZGVkZW5kdXNlcnJvbGVUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJhY3Rpdml0eWxldmVsIiB0eXBlPSJpbnRlcmFjdGl2aXR5bGV2ZWxUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJhY3Rpdml0eXR5cGUiIHR5cGU9ImludGVyYWN0aXZpdHl0eXBlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImtleXdvcmQiIHR5cGU9ImtleXdvcmRUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ia2luZCIgdHlwZT0ia2luZFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYW5nc3RyaW5nIiB0eXBlPSJsYW5nc3RyaW5nVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9Imxhbmd1YWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVhcm5pbmdyZXNvdXJjZXR5cGUiIHR5cGU9ImxlYXJuaW5ncmVzb3VyY2V0eXBlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZSIgdHlwZT0ibGlmZWN5Y2xlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJsb2NhdGlvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb20iIHR5cGU9ImxvbVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXhpbXVtdmVyc2lvbiIgdHlwZT0ibWluaW11bXZlcnNpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGFzY2hlbWUiIHR5cGU9Im1ldGFkYXRhc2NoZW1lVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGFtZXRhZGF0YSIgdHlwZT0ibWV0YW1ldGFkYXRhVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbmltdW12ZXJzaW9uIiB0eXBlPSJtYXhpbXVtdmVyc2lvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJuYW1lVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InB1cnBvc2UiIHR5cGU9InB1cnBvc2VUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24iIHR5cGU9InJlbGF0aW9uVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVtZW50IiB0eXBlPSJyZXF1aXJlbWVudFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZSIgdHlwZT0icmVzb3VyY2VUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHRzIiB0eXBlPSJyaWdodHNUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZSIgdHlwZT0icm9sZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW1hbnRpY2RlbnNpdHkiIHR5cGU9InNlbWFudGljZGVuc2l0eVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaXplIiB0eXBlPSJzaXplVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZSIgdHlwZT0ic291cmNlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXR1cyIgdHlwZT0ic3RhdHVzVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ic3RydWN0dXJlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InRheG9uIiB0eXBlPSJ0YXhvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXhvbnBhdGgiIHR5cGU9InRheG9ucGF0aFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWNobmljYWwiIHR5cGU9InRlY2huaWNhbFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0idGl0bGVUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0idHlwZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBpY2FsYWdlcmFuZ2UiIHR5cGU9InR5cGljYWxhZ2VyYW5nZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBpY2FsbGVhcm5pbmd0aW1lIiB0eXBlPSJ0eXBpY2FsbGVhcm5pbmd0aW1lVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ2YWx1ZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzb24iIHR5cGU9InBlcnNvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2Y2FyZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9InZlcnNpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFsbGF0aW9ucmVtYXJrcyIgdHlwZT0iaW5zdGFsbGF0aW9ucmVtYXJrc1R5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdGhlcnBsYXRmb3JtcmVxdWlyZW1lbnRzIiB0eXBlPSJvdGhlcnBsYXRmb3JtcmVxdWlyZW1lbnRzVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJkdXJhdGlvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0iaWRUeXBlIi8+Ci0KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDwhLS0gKiogQ29tcGxleCBUeXBlcyAqKiAtLT4KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGlvbmxldmVsVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbm5vdGF0aW9uVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InBlcnNvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJncnAuYW55Ii8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhdGFsb2dlbnRyeVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjYXRhbG9nIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJlbnRyeSIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2VudGl0eVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZjYXJkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzaWZpY2F0aW9uVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InB1cnBvc2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idGF4b25wYXRoIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJrZXl3b3JkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250ZXh0VHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250cmlidXRlVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJvbGUiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNlbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weXJpZ2h0YW5kb3RoZXJyZXN0cmljdGlvbnNUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZhbHVlIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvc3RUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZhbHVlIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvdmVyYWdlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGFuZ3N0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGF0ZXRpbWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXNjcmlwdGlvblR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlmZmljdWx0eVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZHVyYXRpb25UeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkYXRldGltZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVkdWNhdGlvbmFsVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImludGVyYWN0aXZpdHl0eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxlYXJuaW5ncmVzb3VyY2V0eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpbnRlcmFjdGl2aXR5bGV2ZWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic2VtYW50aWNkZW5zaXR5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImludGVuZGVkZW5kdXNlcnJvbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvbnRleHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InR5cGljYWxhZ2VyYW5nZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGlmZmljdWx0eSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ0eXBpY2FsbGVhcm5pbmd0aW1lIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Imxhbmd1YWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRyeVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhbFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpZGVudGlmaWVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InRpdGxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNhdGFsb2dlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGFuZ3VhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJrZXl3b3JkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjb3ZlcmFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic3RydWN0dXJlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImFnZ3JlZ2F0aW9ubGV2ZWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFsbGF0aW9ucmVtYXJrc1R5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZW5kZWRlbmR1c2Vycm9sZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpdml0eWxldmVsVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmFjdGl2aXR5dHlwZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ia2V5d29yZFR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ia2luZFR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGFuZ3N0cmluZ1R5cGUiPgotICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9Ing6bGFuZyIvPgotICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxlYXJuaW5ncmVzb3VyY2V0eXBlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWZlY3ljbGVUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmVyc2lvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzdGF0dXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iY29udHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYXRpb25UeXBlIj4KLSAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGVHcm91cCByZWY9ImF0dHIudHlwZSIvPgotICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvbVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImdlbmVyYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGlmZWN5Y2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Im1ldGFtZXRhZGF0YSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ0ZWNobmljYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZWR1Y2F0aW9uYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0icmlnaHRzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJlbGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjbGFzc2lmaWNhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRhbWV0YWRhdGFUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iaWRlbnRpZmllciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjYXRhbG9nZW50cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvbnRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Im1ldGFkYXRhc2NoZW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5ndWFnZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdGhlcnBsYXRmb3JtcmVxdWlyZW1lbnRzVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGFuZ3N0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb25UeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2Y2FyZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwdXJwb3NlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvblR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJraW5kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJlc291cmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJncnAuYW55Ii8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVpcmVtZW50VHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJtaW5pbXVtdmVyc2lvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJtYXhpbXVtdmVyc2lvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpZGVudGlmaWVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNhdGFsb2dlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmlnaHRzVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iY29weXJpZ2h0YW5kb3RoZXJyZXN0cmljdGlvbnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VtYW50aWNkZW5zaXR5VHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzb3VyY2VUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0YXR1c1R5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nVHlwZSI+Ci0gICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieDpsYW5nIi8+Ci0gICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0dXJlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YXhvbnBhdGhUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idGF4b24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRheG9uVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iaWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZW50cnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idGF4b24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRlY2huaWNhbFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJmb3JtYXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNpemUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJlcXVpcmVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpbnN0YWxsYXRpb25yZW1hcmtzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Im90aGVycGxhdGZvcm1yZXF1aXJlbWVudHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZHVyYXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGl0bGVUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZhbHVlIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGljYWxhZ2VyYW5nZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwaWNhbGxlYXJuaW5ndGltZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRhdGV0aW1lIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWVUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8IS0tICoqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDwhLS0gKiogU2ltcGxlIFR5cGVzICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAKLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmb3JtYXRUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNpemVUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRhdGV0aW1lVHlwZSI+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAKLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZFR5cGUiPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8L3hzZDpzaW1wbGVUeXBlPgotICAgCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWV0YWRhdGFzY2hlbWVUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhdGFsb2dUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1pbmltdW12ZXJzaW9uVHlwZSI+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAKLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXhpbXVtdmVyc2lvblR5cGUiPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL1hNTC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL1hNTC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGFkZDkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9YTUwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0KLSAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gICAgICAgICZsdDtzY2hlbWEgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgotCi0gICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotCi0gICAgICAgICZsdDt0eXBlIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KLSAKLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNGY4NC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZHMJMS43IDA3LzA4LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDEuNAotZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLXNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxhcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0gICAgIHZlcnNpb249IjEuNCI+Ci0KLSAgICAuLi4KLSAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImoyZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0gICAgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotICAgIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotICAgIGFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLSAgICBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLSAgICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLSAgICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLSAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLSAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0gICAgICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0gICAgICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLSAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLSAgICAgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjQiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzExM2IuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbl8xXzQueHNkcwkxLjYgMDgvMDkvMDIKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiAxLjQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QKLWluZGljYXRlIHRoYXQgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2UKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi1hbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci11c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotCi0gICAgLi4uCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIgdHlwZT0iajJlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRQotICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLSAgICBpbiB0aGUgZWFyLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1vZHVsZS9qMmVlOndlYiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0gICAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi1hcHBsaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bW9kdWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0gICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEoyRUUgbW9kdWxlIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQKLSAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuNCIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1vZHVsZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi1jb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi10aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0gICAgICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotICAgICAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0gICAgICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotICAgICAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLSAgICAgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotICAgICAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290Ci0gICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvY29ubmVjdG9yXzFfNS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU1NWJkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIyljb25uZWN0b3JfMV81LnhzZHMJMS4xNiAwNy8wNi8wMgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi1Sb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi1yZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLXBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLWxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLWFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi1VLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLWRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLXdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi1jb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLUphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLUN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLVN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjUgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBDb25uZWN0b3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0Ci1pbmRpY2F0ZSB0aGUgY29ubmVjdG9yIHJlc291cmNlIGFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZQotSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLSAgICAuLi4KLSAgICA8L2Nvbm5lY3Rvcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImoyZWU6Y29ubmVjdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi1nZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHJlc291cmNlIGFkYXB0ZXIgdmVyc2lvbiwKLWljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKLWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudAotcmVzb3VyY2VhZGFwdGVyLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLUphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi1yZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbgotICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLSAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhCi0gICAgICAgIEphdmFCZWFuLgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLWFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotbWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLWFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZQotICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQotICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgIDxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0gICAgICAgICA8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLSAgICAgICAgICAgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUgc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi11bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcwotYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi1zZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi1Ob3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCBpbnRlcmZhY2Ugb3IgdGhlIGRlcHJlY2F0ZWQKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCi0gICAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0gICAgICAgIFRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQKLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0KLSAgICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLSAgICAgICAgc2NvcGUgb2YgdGhlIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLWNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkCi1wcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcwotZm9sbG93cy4KLQotICAgICBTZXJ2ZXJOYW1lCi0gICAgIFBvcnROdW1iZXIKLSAgICAgVXNlck5hbWUKLSAgICAgUGFzc3dvcmQKLSAgICAgQ29ubmVjdGlvblVSTAotCi1BIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0bwotaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMKLXVuZGVybHlpbmcgRUlTLgotCi1Qb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZQotICAgICAgICBTZXJ2ZXJOYW1lCi0gICAgICAgIFBvcnROdW1iZXIKLSAgICAgICAgVXNlck5hbWUKLSAgICAgICAgUGFzc3dvcmQKLSAgICAgICAgQ29ubmVjdGlvblVSTAotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0gICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0gICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZToKLTxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IG1heSBiZSB1c2VkIGZvciBwcm92aWRpbmcKLWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0KLVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwKLXR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLXRoZSBkZXBsb3llciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yCi1hIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLUFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZQotZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi1pbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLXR5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IKLU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci1vZiB0aGlzIHNldC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLSAgICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLSAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotICAgICAgICBFeGFtcGxlOgotICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgICAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCi0gICAgICAgIE9SCi0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0gICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWludGVyZmFjZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb24KLSAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbgotICAgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLSAgICAgICAgZWxlbWVudHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0gICAgICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3RvclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29ubmVjdG9yVHlwZSBkZWZpbmVzIGEgcmVzb3VyY2UgYWRhcHRlci4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yLW5hbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCB2ZW5kb3ItbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgY2FuCi0gICAgICAgIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24KLSAgICAgICAgaW5mby4KLQotICAgICAgICBUaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUKLSAgICAgICAgdXNlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbgotICAgICAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0gICAgICAgIHByb3ZpZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxpY2Vuc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgZXh0ZW5zaW9ucyBjYW4gYmUKLSAgICAgICAgc3BlY2lmaWVkIGJ5IHVzaW5nIHRoZSBkZXBsb3ltZW50LWV4dGVuc2lvbgotICAgICAgICBlbGVtZW50cy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjUiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLSAgICBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotICAgIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24KLSAgICBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0bwotICAgIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSBzcGVjaWZpZXMgdGhlCi1pbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLWNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQocykgdGhhdCB1c2UgdGhpcyB0eXBlLAotaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci1hcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKLWludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5Ci1jb250cmFjdC4KLQotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uCi0gICAgICAgICAgICB2YWx1ZT0iamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbgotYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1zcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLWxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBtZXNzYWdlbGlzdGVuZXItdHlwZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lciIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lci10eXBlIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWNlbnNlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gVGhpcyB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGEKLWxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKLShleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24KLXJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGxpY2Vuc2UtcmVxdWlyZWQgc3BlY2lmaWVzIHdoZXRoZXIgYQotICAgICAgICAgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGUKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotICAgICAgICAgICAgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1tZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzCi1jb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi1tZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLXNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLXJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLW9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlCi0gICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLSAgICAgICAgICA8L21lc3NhZ2VsaXN0ZW5lci10eXBlPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uc3BlY1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0Ci1hbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3IKLWNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi1hbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLQotSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcwotcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi10aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi1zdXBwb3J0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzCi0gICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLSAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbgotICAgICAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZQotICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQotICAgICAgICBlaXRoZXIgYSAidHJ1ZSIgb3IgImZhbHNlIiB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotb2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEKLXJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZAotYnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLgotCi1FeGFtcGxlOgotCi08cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi1yZXNvdXJjZSBhZGFwdGVyIEphdmEgY2xhc3MgbmFtZSwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLAotaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZQotYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIGFuZCBpbmJvdW5kLXJlc291cmNlYWRhcHRlcgotZWxlbWVudHMsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgYWRtaW5pc3RlcmVkIG9iamVjdHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0gICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXIKLSAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yCi0gICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphZG1pbm9iamVjdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci1wZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3Rvcgotc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljCi1yZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLXBlcm1pc3Npb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eQotICAgICAgICBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZQotICAgICAgICBzeW50YXguIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBTdW4ncwotICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbgotICAgICAgICBzcGVjaWZpY2F0aW9uOgotCi0gICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuNC9kb2NzL2d1aWRlL3NlY3VyaXR5L1BvbGljeUZpbGVzLmh0bWwjRmlsZVN5bnRheAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLXVzZWQgYnkgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBOb1RyYW5zYWN0aW9uCi0gICAgTG9jYWxUcmFuc2FjdGlvbgotICAgIFhBVHJhbnNhY3Rpb24KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVHJhbnNhY3Rpb24iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2VqYi1qYXJfMl8xLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvZWpiLWphcl8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZjMTJlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvZWpiLWphcl8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpZWpiLWphcl8yXzEueHNkcwkxLjEwIDA3LzI0LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDIuMSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotICAgICB2ZXJzaW9uPSIyLjEiPgotICAgIC4uLgotICAgIDwvZWpiLWphcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLUoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiIHR5cGU9ImoyZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLSAgICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0gICAgICAgICAgICByZWZlcj0iajJlZTplamItbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotICAgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IKLSAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIHJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi08L3hzZDplbGVtZW50PgotCi0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi1jb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi1tZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0gICAgICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLSAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLSAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLSAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLSAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi1pbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotZGVzdGluYXRpb24gdHlwZSwgZXRjLgotCi1UaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi1UaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi1hcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi1kZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kIGEgbGlzdCBvZgotbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi1vbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZXhjbHVkZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi1hbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotICAgICAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotICAgICAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0gICAgICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotICAgICAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotICAgICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLWNtcC12ZXJzaW9uIGVsZW1lbnRzLgotCi1UaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICAxLngKLSAgICAyLngKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS54Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi1hIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi1yb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi1tZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi10eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0gICAgICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0gICAgICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotICAgICAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotICAgICAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0gICAgICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtci1maWVsZC10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi1tdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi1saXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi1tZXRob2RzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLUV4YW1wbGU6Ci0KLSAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAgICAgIGljb24gZmlsZSBuYW1lCi0gICAgLSBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLSAgICAgIGVudGVycHJpc2UgYmVhbnMKLSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLSAgICAgIGlmIGFueQotICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLSAgICAgIGVqYi1qYXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudGVycHJpc2UtYmVhbnNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotICAgICAgICBwcm9kdWNlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCi0gICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0gICAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLSAgICAgICAgICAgIDwvZWpiLWNsaWVudC1qYXI+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLSAgICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMKLSAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLSAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotICAgIHNjaGVtYS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLWVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotZWpiLWphciBmaWxlLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci10aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLVRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLXJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1FeGFtcGxlOgotCi08ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi1ieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi1vcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi1yZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotICAgICAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi1yZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi1zcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi1zcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi1ieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi1hY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLVRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi1yZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi1yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLWEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLXRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0ibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi1FeGFtcGxlOgotCi08ZWpiLXJlbGF0aW9uPgotICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotPC9lamItcmVsYXRpb24+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotICAgICAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLSAgICAgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bXVsdGlwbGljaXR5VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotICAgICAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0gICAgICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0gICAgICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLSAgICAgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLSAgICAgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotICAgICAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjbXItZmllbGRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGVycHJpc2UtYmVhbnNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi1iZWFuLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlc3Npb24tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZW50aXR5LWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0gICAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotICAgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotICAgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLQotICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpjaG9pY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi1jb25zaXN0cyBvZjoKLQotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICAgICAgaWNvbiBmaWxlIG5hbWUKLSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0gICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0gICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLSAgICAgIGZpZWxkCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0gICAgICBlbnRyaWVzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICAgICAgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0gICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0gICAgICByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgZGVwbG95bWVudC1leHRlbnNpb24KLSAgICAgIGRlY2xhcmF0aW9ucy4KLQotVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotY21wLXZlcnNpb24gMi54LgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi1UaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi1wZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi1mb3IgdGhlIGVudGl0eSBiZWFuLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi1zZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLWFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW0ta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0gICAgICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLSAgICAgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0gICAgICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0gICAgICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLSAgICAgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0gICAgICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y21wLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotICAgICAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0gICAgICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0gICAgICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtcC1maWVsZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICAgIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aAotICAgICAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotICAgICAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0gICAgICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCi0gICAgICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLSAgICAgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gICAgICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgICAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLSAgICAgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotICAgICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnF1ZXJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBleGNsdWRlLWxpc3RUeXBlIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoCi10aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi1pbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi1tZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi10eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Wn1dKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZS4KLSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotICAgICAgdHlwZQotICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICAgICAgZW50cmllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLSAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXRob2QtaW50ZlR5cGUiPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi1kaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi1zZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIEhvbWUKLSAgICBSZW1vdGUKLSAgICBMb2NhbEhvbWUKLSAgICBMb2NhbAotICAgIFNlcnZpY2VFbmRwb2ludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW1zVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtcGFyYW1zVHlwZSBkZWZpbmVzIGEgbGlzdCBvZiB0aGUKLWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotICAgICAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGVybWlzc2lvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi1zZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi1vcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50IGFuZC9vciB3ZWIKLXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLSAgICAgICAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLWludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiwgdGhlCi1iZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLW1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUKLW9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotYWNyb3NzIHRoZSBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotaW50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QKLW5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi1zaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkCi1tZXRob2QgbmFtZS4KLQotVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB1c2luZyBtZXRob2RUeXBlIGVsZW1lbnQKLXdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotCi0xLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0gICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViCi0gICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLTIuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPj4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAgIG5hbWUuCi0KLTMuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAuLi4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLSAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLSAgIFBBUkFNLW4gYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUKLSAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0gICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLSAgIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLSAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycwotICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuCi0KLUV4YW1wbGVzOgotCi1TdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1tZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwKLWFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi1TdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1jcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi1pbnRlcmZhY2UocykuCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi1jcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi1tb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi1mb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi1UaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLW5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yCi13ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLXNpZ25hdHVyZS4KLQotRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLW1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi1jcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaG9tZQotaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLWludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGggcmVlIFN0eWxlcwotb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1pbnRmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtaW50ZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi1yb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIE9uZQotICAgIE1hbnkKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIEJlYW4KLSAgICBDb250YWluZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LgotCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci1tZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi1tZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLUl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi1FeGFtcGxlOgotCi08cXVlcnk+Ci0gICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8L2VqYi1xbD4KLTwvcXVlcnk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LiBJdCBjb250YWlucwotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotICAgICAgICAgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0gICAgICAgICAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLSAgICAgICAgLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi1pbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi1kZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci1zaG91bGQgYmUgZW1wdHkuCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci1iZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi1lbnRpdHkgYmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi13aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLSAgICAgICAgcmVsYXRpb25zaGlwcy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvcgotICAgICAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICAgICAgeHBhdGg9Ii4iLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci1mb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotRUpCT2JqZWN0IHR5cGUuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTG9jYWwKLSAgICBSZW1vdGUKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi1pZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0gICAgICAgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLSAgICAgICAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRISVMgSVMgQSBQTEFDRUhPTERFUiBUWVBFIHdoaWNoIHdpbGwKLWJlIFJFUExBQ0VELiBJdCB3aWxsIGJlIGRlZmluZWQgYmFzZWQgb24KLWRlZmluaXRpb24gdG8gYmUgc3VwcGxpZWQgYnkgSlNSMTA5LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZQotICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLSAgICAgIEVKQiByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0gICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi1lbXB0eS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi10aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi1zZXNzaW9uIGJlYW4uCi0KLVRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLSAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0gICAgICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0gICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXNzaW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0gICAgU3RhdGVmdWwKLSAgICBTdGF0ZWxlc3MKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTm90U3VwcG9ydGVkCi0gICAgU3VwcG9ydHMKLSAgICBSZXF1aXJlZAotICAgIFJlcXVpcmVzTmV3Ci0gICAgTWFuZGF0b3J5Ci0gICAgTmV2ZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICBCZWFuCi0gICAgQ29udGFpbmVyCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9qMmVlXzFfNC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2oyZWVfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxNDI3Mi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2oyZWVfMV80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1HZW5lcmF0ZWQgYnkgVW1pdCBZYWxjaW5hbHAgTWFyY2ggMjAwMi0tPgotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotQCgjKWoyZWVfMV80LnhzZHMJMS4yMCAwMi8wNy8xMgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi1Sb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi1yZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLXBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLWxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLWFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi1VLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLWRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLXdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi1jb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLUphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLUN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLVN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi1zaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLWludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLQotRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGoyZWUgYXBwbGljYXRpb247Ci0gICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICBlbnRlcnByaXNlIGJlYW47Ci0gICAgcmVzb3VyY2UgYWRhcHRlcjsKLQotRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBlYXIgZmlsZTsKLSAgICB3YXIgZmlsZTsKLSAgICBqYXIgZmlsZTsKLSAgICByYXIgZmlsZTsKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZGVwbG95bWVudC1leHRlbnNpb25UeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUKLWV4dGVuc2lvbnMgdG8gdGhlIHNwZWNpZmljIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi1JdCBpcyB1c2VkIGJ5IGRlcGxveW1lbnQtZXh0ZW5zaW9uIGVsZW1lbnRzIHRvIGRlc2lnbmF0ZSBhbgotZXh0ZW5zaW9uIGJsb2NrIHRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24KLWRlc2lnbmF0ZWQgYnkgYSBzZXQgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgYXJlIGRlY2xhcmVkCi1ieSBhIG5hbWVzcGFjZS4gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVzIHRoZSBleHRlbnNpb24gdG8KLXRoZSBkZXBsb3ltZW50IHRvb2wgdGhhdCBwcm9jZXNzZXMgdGhlIGV4dGVuc2lvbi4KLQotVGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBpcyBwcm92aWRlZCBieSB0aGUgQXBwbGljYXRpb24KLUFzc2VtYmxlciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBleHRlbnNpb24gZGVzY3JpYmVkIGlzIGFuCi1lc3NlbnRpYWwgZXh0ZW5zaW9uIHRoYXQgbXVzdCBleGlzdCBpbiB0aGUgY29udGFpbmVyLiBJZgotbXVzdFVuZGVyc3RhbmQgaXMgInRydWUiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgaW5kaWNhdGUKLWFuIGVycm9yIHdoZW4gcHJvY2Vzc2luZyBhIGRlcGxveW1lbnQtZXh0ZW5zaW9uIGVsZW1lbnQgd2l0aAotYSBuYW1lc3BhY2UgaXQgZG9lcyBub3QgdW5kZXJzdGFuZC4gIEV4dGVuc2lvbnMgdGhhdCBhcmUgbm90Ci1lc3NlbnRpYWwgYXJlIGRlY2xhcmVkIGJ5IGRlZmF1bHQgYXMgb3B0aW9uYWwgZXh0ZW5zaW9ucwotdGhhdCBuZWVkIG5vdCBiZSBwcm92aWRlZCBieSBhIGNvbnRhaW5lci4gIEFwcGxpY2F0aW9ucyB0aGF0Ci11c2Ugc3VjaCBleHRlbnNpb25zIGFyZSBwb3J0YWJsZSB0byBvdGhlciBjb250YWluZXJzIGJlY2F1c2UKLWRlcGxveW1lbnQgdG9vbHMgd2lsbCBpZ25vcmUgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgZG9uJ3QKLXN1cHBvcnQuCi0KLVRoZSB0eXBlIG9mIHRoZSBleHRlbnNpb24tZWxlbWVudCBpcyBhYnN0cmFjdC4gVGhlcmVmb3JlLCBhCi1jb25jcmV0ZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KLQotVGhlIHZhbHVlIG9mIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgImZhbHNlIgotYnkgZGVmYXVsdC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpleHRlbnNpYmxlVHlwZSIKLSAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXN0VW5kZXJzdGFuZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvCi1wcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLXRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMKLXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi1EZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi10b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5Ci10aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci1jb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB3aGljaCBpcyB1c2VkCi10byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgIDx4c2Q6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BsYXktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLXRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKLWVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLUV4YW1wbGU6Ci0KLS4uLgotICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgotCi1UaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1saW5rVHlwZSBpcyB1c2VkIGJ5IGVqYi1saW5rCi1lbGVtZW50cyBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmIGVsZW1lbnRzIHRvIHNwZWNpZnkKLXRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4KLWVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUgb3IgaW4gYW5vdGhlciBlamItamFyCi1maWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgbWF5IGJlIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQotY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi1UaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUKLXVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLUV4YW1wbGVzOgotCi0gICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yCi10aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLWhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0gICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZQotICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLXJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50LgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6am5kaS1uYW1lVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItcmVmLXR5cGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1yZWYtdHlwZVR5cGUgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi1yZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLXRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIEVudGl0eQotICAgIFNlc3Npb24KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi1kZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0gICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0gICAgICBiZWFuCi0gICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotICAgICAgZW50ZXJwcmlzZSBiZWFuCi0gICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZi10eXBlVHlwZSIvPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpob21lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZW1vdGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGlzIHVzZWQgdG8gZGVzaWduYXRlIGFuIGVtcHR5Ci1lbGVtZW50IHdoZW4gdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKLWVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlCi1hcHBsaWNhdGlvbidzIGNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZToKLQotICAgIGphdmEubGFuZy5Cb29sZWFuCi0gICAgamF2YS5sYW5nLkJ5dGUKLSAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0gICAgamF2YS5sYW5nLlN0cmluZwotICAgIGphdmEubGFuZy5TaG9ydAotICAgIGphdmEubGFuZy5JbnRlZ2VyCi0gICAgamF2YS5sYW5nLkxvbmcKLSAgICBqYXZhLmxhbmcuRmxvYXQKLSAgICBqYXZhLmxhbmcuRG91YmxlCi0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuCi1vcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUKLXN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LgotCi1JdCBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0gICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLSAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQKLSAgICAgICAgY29udGV4dC4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIDxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0gICAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi0gICAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLSAgICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotICAgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXh0ZW5zaWJsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB3aGljaCBpcyB1c2VkIHRvCi1kZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKLW11c3Qgc3Vic3RpdHV0ZSBhIGtub3duIHR5cGUgdG8gZGVmaW5lIHRoZSBleHRlbnNpb24gYnkKLXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCi1leHRlbnNpb24tZWxlbWVudHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi1KYXZhIGNsYXNzIG9yIGludGVyZmFjZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIHR5cGUgZGVmaW5lcyBmb3VyIGRpZmZlcmVudCB2YWx1ZXMgd2hpY2ggY2FuIGRlc2lnbmF0ZQotYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlCi1ub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJob21lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLUV4YW1wbGU6Ci0KLSAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgaWNvbiB0eXBlIGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMKLXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvcgotSlBFRyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotR1VJIHRvb2wuCi0KLVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotYnkgZGVmYXVsdC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLSAgICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLSAgICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCi0gICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0gICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotICAgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLSAgICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50Ci0gICAgICAgIEZpbGUuCi0KLSAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLSAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLgotVGhlIHVzZXJzIG9mIHRoaXMgdHlwZSBzaG91bGQgZnVydGhlciB2ZXJpZnkgdGhhdAotdGhlIGNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBKYXZhIHJlc2VydmVkIGtleXdvcmRzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IigkfF98XHB7TH0pKFxwe0x9fFxwe05kfXxffCQpKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBBIEpOREkgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsLWhvbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxvY2FsLWhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi1lbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGlzIHVzZWQgdG8gbGluayBhIG1lc3NhZ2UKLWRlc3RpbmF0aW9uIHJlZmVyZW5jZSBvciBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZQotZGVzdGluYXRpb24uCi0KLVRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcwotYmV0d2VlbiBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyBpbiB0aGUgYXBwbGljYXRpb24uCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi1kZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUgb3IgaW4gYW5vdGhlcgotRGVwbG95bWVudCBGaWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotc3BlY2lmeWluZyBhIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkCi1tZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUKLWRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0iIyIuIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQotY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZQotbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLWRlc3RpbmF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi1hc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi1lbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lCi0gICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotICAgICAgICAtIGEgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZQotICAgICAgICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yCi0gICAgICAgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aAotICAgICAgICAtIGEgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgotCi1FeGFtcGxlczoKLQotPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcwotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPgotPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0gICAgICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotICAgICAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotICAgICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLSAgICAgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLSAgICAgICAgJSUlCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZgotdGhlIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlCi1leHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0KLUV4YW1wbGU6Ci0KLSA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotaW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZXMgYXJlIGNvbnN1bWVkIGZyb20gdGhlIG1lc3NhZ2UKLWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi1Bc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLW9mIGEgZGVzdGluYXRpb24gd2l0aCBpdHMgY29uc3VtZXJzLgotCi1UaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi1vbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBDb25zdW1lcwotICAgIFByb2R1Y2VzCi0gICAgQ29uc3VtZXNQcm9kdWNlcwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lc1Byb2R1Y2VzIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi1kZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLWVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgotCi1UaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uCi0gICAgICAgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotICAgICAgICAgIERlcGxveW1lbnQgRmlsZS4KLQotRXhhbXBsZToKLQotPG1lc3NhZ2UtZGVzdGluYXRpb24+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLSAgICAgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLSAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotICAgICAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUKLXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1uYW1lIgotICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHBhcmFtZXRlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIKLSAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLSAgICAgICAgcGFyYW1ldGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwYXRoVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlCi1wYXRoIG9yIGFuIGFic29sdXRlIHBhdGggc3RhcnRpbmcgd2l0aCBhICIvIi4KLQotSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLXNhbWUgRGVwbG95bWVudCBGaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi10aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZgotdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzCi1hcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi1uYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi1vZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotRXhhbXBsZToKLQotICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci1jb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi13aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi1vbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCi10aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLURlcGxveWVyLgotCi1UaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICBBcHBsaWNhdGlvbgotICAgIENvbnRhaW5lcgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMKLW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi1tdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIFNoYXJlYWJsZQotICAgIFVuc2hhcmVhYmxlCi0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVhYmxlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hhcmVhYmxlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLWFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi1lbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLXJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZgotdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLQotRXhhbXBsZToKLQotPHJlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci08L3Jlc291cmNlLWVudi1yZWY+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0Ci0gICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCi0gICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgotICAgICAgICBpbnRlcmZhY2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzb3VyY2UtcmVmVHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdAotY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi1jb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZQotcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKLXRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLShTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtcmVmPgotICAgIDxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0gICAgPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLSAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLTwvcmVzb3VyY2UtcmVmPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0gICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotICAgICAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0gICAgICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtYXV0aCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzLWF1dGhUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXMtc2hhcmluZy1zY29wZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJvbGUtbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcm9sZS1uYW1lVHlwZSBkZXNpZ25hdGVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJ1bi1hc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbXBvbmVudC4gSXQgY29udGFpbnMgYW4KLW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEKLXNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYQotRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLW9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlCi1jb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZQotc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLWFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZAotICAgICAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQotICAgICAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1saW5rIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotICAgICAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0gICAgICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQotc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLUV4YW1wbGU6Ci0KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotICAgICAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InN0cmluZyI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSjJFRSBhcwotYSBiYXNlIHR5cGUgZm9yIGRlZmluaW5nIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMKLXJlcXVpcmUgdHJhaWxpbmcvbGVhZGluZyBzcGFjZSBlbGltaW5hdGlvbiBhcyB3ZWxsIGFzCi1jb2xsYXBzaW5nIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlLCB0aGlzIGJhc2UgdHlwZSBtYXkgYmUKLXVzZWQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cnVlLWZhbHNlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3bwotcGVybWlzc2libGUgdmFsdWVzCi0KLS0gdHJ1ZQotLSBmYWxzZQotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9Iih0cnVlfGZhbHNlKSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHVybC1wYXR0ZXJuVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIEl0IG11c3QKLWZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUgU2VydmxldCBBUEkKLVNwZWNpZmljYXRpb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ3YXItcGF0aFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBhIHBhdGggc3RhcnRpbmcKLXdpdGggYSAiLyIgYW5kIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgV0FSCi1maWxlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvanNwXzJfMC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2pzcF8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ1NjY4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvanNwXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjAiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotQCgjKWpzcF8yXzAueHNkcwkxLjEwIDA4LzIwLzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLXR5cGVzLiAgVGhlIEpTUCAyLjAgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAotc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCi1mcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgotCi1UaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWFwcF8yXzQueHNkCi1maWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcwotdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0YWdsaWJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqc3AtZmlsZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKLXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpwYXRoVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLUFsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuICBUaGUKLWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLQotICAgIC0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLgotICAgIC0gQ29udHJvbCBlbmFibGluZyBvZiBTY3JpcHRpbmcgZWxlbWVudHMuCi0gICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gICAgLSBJbmRpY2F0aW5nIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudAotICAgIC0gUHJlbHVkZSBhbmQgQ29kYSBhdXRvbWF0aWMgaW5jbHVkZXMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWVuYWJsZWQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTEVuYWJsZWQKLSAgICAgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLSAgICAgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0gICAgICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotICAgICAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuIEl0IGlzIGEKLSAgICAgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBkZWZpbmUgdGhlIHBhZ2VFbmNvZGluZwotICAgICAgICBvZiBhIEpTUCBwYWdlIHRocm91Z2ggb25lIHZhbHVlIGluIHRoZSBKU1AKLSAgICAgICAgY29uZmlndXJhdGlvbiBlbGVtZW50IGFuZCB0aGVuIGdpdmUgaXQgYSBkaWZmZXJlbnQKLSAgICAgICAgdmFsdWUgaW4gYSBwYWdlRW5jb2RpbmcgZGlyZWN0aXZlLCBidXQgaXQgaXMgbGVnYWwKLSAgICAgICAgdG8gZ2l2ZSBpdCB0aGUgc2FtZSB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWVuYWJsZWQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNTY3JpcHRpbmdFbmFibGVkCi0gICAgICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwKLSAgICAgICAgc2NyaXB0aW5nIGlzIGVuYWJsZWQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotCQkgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQl0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKLQlhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCi0JSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKLQlwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtcHJlbHVkZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLSAgICAgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotICAgICAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0gICAgICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLSAgICAgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotICAgICAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotICAgICAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0gICAgICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLSAgICAgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotICAgICAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCi0gICAgICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnbGliVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUEgdGFnbGliIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gYSB0YWcKLWxpYnJhcnkgdGhhdCBpcyB1c2VkIGJ5IGEgSlNQIHBhZ2Ugd2l0aGluIHRoZSBXZWIKLUFwcGxpY2F0aW9uLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQotICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQotICAgICAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KLSAgICAgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLgotICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCi0gICAgICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQotICAgICAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL3dlYi1hcHBfMl80LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvd2ViLWFwcF8yXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhjMTU4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvd2ViLWFwcF8yXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuNCI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpd2ViLWFwcF8yXzQueHNkcwkxLjM0IDAyLzA4LzAxCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdAotaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUKLW5hbWVzcGFjZToKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi1hbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci11c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICB2ZXJzaW9uPSIyLjQiPgotICAgIC4uLgotICAgIDwvd2ViLWFwcD4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ianNwXzJfMC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotPHhzZDplbGVtZW50IG5hbWU9IndlYi1hcHAiIHR5cGU9ImoyZWU6d2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpzZXJ2bGV0LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmaWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGZpbHRlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsdGVyLgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmZpbHRlciIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmZpbHRlci1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZWpiLWxvY2FsLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0gICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0gICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotICAgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0gICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQotICAgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIHJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQvajJlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLQotPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1jb25zdHJhaW50VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhdXRoLWNvbnN0cmFpbnRUeXBlIGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0Ci1zaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCi1jb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi10byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cwotZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKLXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIKLWFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKLXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLXRvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZQotY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCi1yb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImF1dGgtbWV0aG9kVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvCi1nYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5Ci1hbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAotdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCi0iRElHRVNUIiwgIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFTSUMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRElHRVNUIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUk0iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xJRU5ULUNFUlQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzcGF0Y2hlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZGlzcGF0Y2hlciBoYXMgdGhyZWUgbGVnYWwgdmFsdWVzLCBGT1JXQVJEIGFuZCBSRVFVRVNUCi1hbmQgSU5DTFVERS4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIKLXdpbGwgYmUgYXBwbGllZCB1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCkgY2FsbHMuCi1BIHZhbHVlIG9mIFJFUVVFU1QgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQKLXVuZGVyIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LiBBIHZhbHVlIG9mCi1JTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCi1SZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuCi1UaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhCi1maWx0ZXItbWFwcGluZyBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nCi1maWx0ZXJzIG9ubHkgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUldBUkQiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkNMVURFIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVCIvPgotCi0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVycm9yLWNvZGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLVVzZWQgaW46IGVycm9yLXBhZ2UKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InBvc2l0aXZlSW50ZWdlciIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1jb2RlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplcnJvci1jb2RlVHlwZSIvPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L2Nob2ljZT4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAgICByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0gICAgICAgIGEgbGVhZGluZyBgLycuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1EZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi1hcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4KLVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLWRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCi1hbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bwotYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCi1zZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCi1lbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi13aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAotZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi1maWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKLXN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwYXRjaGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZpbHRlci1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi1ieSB1c2luZyBmaWx0ZXItbmFtZVR5cGUuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUKLWZpbHRlci4gIEVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYQotVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi1pbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCi0gICAgICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAotYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLXBhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi0gICAgICAgIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZC4KLSAgICAgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzCi0gICAgICAgIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotICAgICAgICB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZAotICAgICAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4KLSAgICAgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0gICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDpkb2N1bWVudGF0aW9uPgotVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIHJlY29nbml6ZWQgYnkgdGhlIHdlYi1hcHAsIGkuZS4KLShHRVQgfCBQT1NUIHwuLi4pLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhFQUQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OUyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFDRSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdGVuZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLWFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0KLVVzZWQgaW46IHdlYi1hcHA6bGlzdGVuZXJUeXBlCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKLSAgICAgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCi1sb2NhbGUtZW5jb2RpbmctbWFwcGluZyhzKS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIgotICAgICAgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIKLSAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLTwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi1lbmNvZGluZyBuYW1lLiBUaGUgbG9jYWxlIG5hbWUgbXVzdCBiZSBlaXRoZXIgIkxhbmd1YWdlLWNvZGUiLAotc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLXN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUiCi0gICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY29kaW5nIgotICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIvPgotPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCi1uZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphdXRoLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8KLSAgICAgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZvcm0tbG9naW4tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotYW5kIGEgbWltZSB0eXBlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLSAgICAgICAgZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1pbWUtdHlwZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWltZS10eXBlVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgZGVmaW5lZCBtaW1lIHR5cGUuCi0KLUV4YW1wbGU6Ci0idGV4dC9wbGFpbiIKLQotVXNlZCBpbjogbWltZS1tYXBwaW5nCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW1xwe0x9XC1ccHtOZH1dKy9bXHB7TH1cLVxwe05kfVwuXSsiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gYXNzb2NpYXRlCi1zZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotY29sbGVjdGlvbnMKLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmF1dGgtY29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCi1zZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2VydmxldC1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi1zZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlcnZsZXRUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHNlcnZsZXQuCi1JdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi1zZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAotZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZAotbG9hZGVkLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqc3AtZmlsZVR5cGUiLz4KLQotICAgICAgICA8L2Nob2ljZT4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9hZC1vbi1zdGFydHVwIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotICAgICAgICBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZQotICAgICAgICBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYgotICAgICAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0gICAgICAgIGVsZW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluCi0gICAgICAgIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZQotICAgICAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotICAgICAgICBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUgc2VydmxldAotICAgICAgICB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZQotICAgICAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotICAgICAgICBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZSBhcHBsaWNhdGlvbiBpcwotICAgICAgICBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci0gICAgICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLSAgICAgICAgYmVmb3JlIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlCi0gICAgICAgIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlciBvZiBsb2FkaW5nIG9mCi0gICAgICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpydW4tYXNUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLWZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXRpbWVvdXQiCi0gICAgICAgICAgICAgICAgIHR5cGU9InhzZDpub25OZWdhdGl2ZUludGVnZXIiCi0gICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0Ci0gICAgICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLSAgICAgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dAotICAgICAgICBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotICAgICAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotICAgICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQotICAgICAgICBvdXQuIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyCi0gICAgICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi1DT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QKLXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCi10aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLWNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlCi1jaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi1DT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLXJlcXVpcmVkLgotCi1Vc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHUkFMIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlCi1wcm90ZWN0ZWQuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi12ZXJzaW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLUV4YW1wbGU6Ci0KLTx3ZWItYXBwPgotICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLS4uLgotPC93ZWItYXBwPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXN0cmlidXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgotICAgICAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dAotICAgICAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZmlsdGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmaWx0ZXItbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2bGV0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlc3Npb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptaW1lLW1hcHBpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZS1saXN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp3ZWxjb21lLWZpbGUtbGlzdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVycm9yLXBhZ2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmpzcC1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvZ2luLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZW52LWVudHJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViLWFwcC12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci1vZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbgotYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmCi1ubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKLSAgICAgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpodHRwLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCi1maWxlcyBlbGVtZW50cy4KLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLSAgICAgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3ByaWNlcXVvdGUvUHJpY2VRdW90ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzJmYmQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmljZS1xdW90ZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InN0b2NrLXN5bWJvbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzdG9jay1wcmljZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDwhLS0gWFhYU0pNIGNoYW5nZSBmb2xsb3dpbmcgdG8gdXNlIHJlZmluZWQgZGF0YXR5cGVzIC0tPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdG9jay1zeW1ib2wiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RvY2stcHJpY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcmEvcmEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcmEvcmEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjlkMTI4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3JhL3JhLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0L3Jvd3NhZmZlY3RlZCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdC9yb3dzYWZmZWN0ZWQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJyb3dzQWZmZWN0ZWQiIHR5cGU9InhzOmludCIvPgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvczRzL1hNTC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4YWRkOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iZW4iPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nIG9yIHhtbDpzcGFjZSBhdHRyaWJ1dGVzCi0gICAgICAgIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotCi0gICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiLz4KLQotICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLQotICAgICAgICAmbHQ7dHlwZSAuIC4gLj4KLSAgICAgICAgIC4gLiAuCi0gICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8+Ci0gCi0gICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlczwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZC4KLSAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICAgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSBjaGFuZ2VzLCB0aGUgdmVyc2lvbgotICAgb2YgdGhpcyBkb2N1bWVudCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOmxhbmd1YWdlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBkdWUgY291cnNlLCB3ZSBzaG91bGQgaW5zdGFsbCB0aGUgcmVsZXZhbnQgSVNPIDItIGFuZCAzLWxldHRlcgotICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIC4gLiAuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9InNwYWNlIiBkZWZhdWx0PSJwcmVzZXJ2ZSI+Ci0gIDx4czpzaW1wbGVUeXBlPgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWZhdWx0Ii8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotIDwveHM6YXR0cmlidXRlPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czphbnlVUkkiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPlNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxiYXNlLyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXR0cmlidXRlLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6YXR0cmlidXRlPgotCi0gPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InNwZWNpYWxBdHRycyI+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6YmFzZSIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIvPgotIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvczRzL1hNTFNjaGVtYS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MU2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NzI1MS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MU2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI1MDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gWE1MIFNjaGVtYSBzY2hlbWEgZm9yIFhNTCBTY2hlbWFzOiBQYXJ0IDE6IFN0cnVjdHVyZXMgLS0+Ci08IS0tIE5vdGUgdGhpcyBzY2hlbWEgaXMgTk9UIHRoZSBub3JtYXRpdmUgc3RydWN0dXJlcyBzY2hlbWEuIC0tPgotCi08IS0tIFRoZSBwcm9zZSBjb3B5IGluIHRoZSBzdHJ1Y3R1cmVzIFJFQyBpcyB0aGUgbm9ybWF0aXZlIC0tPgotCi08IS0tIHZlcnNpb24gKHdoaWNoIHNob3VsZG4ndCBkaWZmZXIgZnJvbSB0aGlzIG9uZSBleGNlcHQgZm9yIC0tPgotCi08IS0tIHRoaXMgY29tbWVudCBhbmQgZW50aXR5IGV4cGFuc2lvbnMsIGJ1dCBqdXN0IGluIGNhc2UgLS0+Ci0KLTwhRE9DVFlQRSB4czpzY2hlbWEgUFVCTElDICItLy9XM0MvL0RURCBYTUxTQ0hFTUEgMjAwMTAyLy9FTiIgIlhNTFNjaGVtYS5kdGQiIFsKLQotPCEtLSBwcm92aWRlIElEIHR5cGUgaW5mb3JtYXRpb24gZXZlbiBmb3IgcGFyc2VycyB3aGljaCBvbmx5IHJlYWQgdGhlCi0gICAgIGludGVybmFsIHN1YnNldCAtLT4KLTwhQVRUTElTVCB4czpzY2hlbWEgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpjb21wbGV4VHlwZSAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpjb21wbGV4Q29udGVudCAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpzaW1wbGVDb250ZW50ICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpleHRlbnNpb24gICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czplbGVtZW50ICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpncm91cCAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4gCi08IUFUVExJU1QgeHM6YWxsICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y2hvaWNlICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2VxdWVuY2UgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YW55ICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YW55QXR0cmlidXRlICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YXR0cmlidXRlICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YXR0cmlidXRlR3JvdXAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6dW5pcXVlICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6a2V5ICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6a2V5cmVmICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2VsZWN0b3IgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZmllbGQgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6aW5jbHVkZSAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6aW1wb3J0ICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6cmVkZWZpbmUgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6bm90YXRpb24gICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IS0tCi0gICAgIGtlZXAgdGhpcyBzY2hlbWEgWE1MMS4wIERURCB2YWxpZAotICAtLT4KLSAgICAgICAgPCFFTlRJVFkgJSBzY2hlbWFBdHRycyAneG1sbnM6aGZwIENEQVRBICNJTVBMSUVEJz4KLQotICAgICAgICA8IUVMRU1FTlQgaGZwOmhhc0ZhY2V0IEVNUFRZPgotICAgICAgICA8IUFUVExJU1QgaGZwOmhhc0ZhY2V0Ci0gICAgICAgICAgICAgICAgbmFtZSBOTVRPS0VOICNSRVFVSVJFRD4KLQotICAgICAgICA8IUVMRU1FTlQgaGZwOmhhc1Byb3BlcnR5IEVNUFRZPgotICAgICAgICA8IUFUVExJU1QgaGZwOmhhc1Byb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZSBOTVRPS0VOICNSRVFVSVJFRAotICAgICAgICAgICAgICAgIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KLTwhLS0KLSAgICAgICAgTWFrZSBzdXJlIHRoYXQgcHJvY2Vzc29ycyB0aGF0IGRvIG5vdCByZWFkIHRoZSBleHRlcm5hbAotICAgICAgICBzdWJzZXQgd2lsbCBrbm93IGFib3V0IHRoZSB2YXJpb3VzIElEcyB3ZSBkZWNsYXJlCi0gIC0tPgotICAgICAgICA8IUFUVExJU1QgeHM6c2ltcGxlVHlwZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heEV4Y2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkV4Y2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heEluY2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkluY2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnRvdGFsRGlnaXRzIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZnJhY3Rpb25EaWdpdHMgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpsZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5MZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhMZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czplbnVtZXJhdGlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czphcHBpbmZvIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZG9jdW1lbnRhdGlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmxpc3QgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czp1bmlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgXT4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYmxvY2tEZWZhdWx0PSIjYWxsIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4wIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJFTiIgeG1sbnM6aGZwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1oYXNGYWNldEFuZFByb3BlcnR5Ij4KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUGFydCAxIHZlcnNpb246IElkOiBYTUxTY2hlbWEueHNkLHYgMS41MyAyMDAzLzAyLzI0IDE3OjQwOjA3IGh0IEV4cCAKLSAgICBQYXJ0IDIgdmVyc2lvbjogSWQ6IGRhdGF0eXBlcy54c2QsdiAxLjU4IDIwMDMvMDIvMjYgMTQ6MDE6MjkgaHQgRXhwIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvWE1ML0dyb3VwLzIwMDIvMDkveG1sc2NoZW1hLTEvc3RydWN0dXJlcy13aXRoLWVycmF0YS5odG1sIj4KLSAgIFRoZSBzY2hlbWEgY29ycmVzcG9uZGluZyB0byB0aGlzIGRvY3VtZW50IGlzIG5vcm1hdGl2ZSwKLSAgIHdpdGggcmVzcGVjdCB0byB0aGUgc3ludGFjdGljIGNvbnN0cmFpbnRzIGl0IGV4cHJlc3NlcyBpbiB0aGUKLSAgIFhNTCBTY2hlbWEgbGFuZ3VhZ2UuICBUaGUgZG9jdW1lbnRhdGlvbiAod2l0aGluICZsdDtkb2N1bWVudGF0aW9uPiBlbGVtZW50cykKLSAgIGJlbG93LCBpcyBub3Qgbm9ybWF0aXZlLCBidXQgcmF0aGVyIGhpZ2hsaWdodHMgaW1wb3J0YW50IGFzcGVjdHMgb2YKLSAgIHRoZSBXM0MgUmVjb21tZW5kYXRpb24gb2Ygd2hpY2ggdGhpcyBpcyBhIHBhcnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoZSBzaW1wbGVUeXBlIGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgbWVtYmVycyBhcmUgZGVmaW5lZAotICAgICAgdG93YXJkcyB0aGUgZW5kIG9mIHRoaXMgc2NoZW1hIGRvY3VtZW50PC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIEdldCBhY2Nlc3MgdG8gdGhlIHhtbDogYXR0cmlidXRlIGdyb3VwcyBmb3IgeG1sOmxhbmcKLSAgICAgICBhcyBkZWNsYXJlZCBvbiAnc2NoZW1hJyBhbmQgJ2RvY3VtZW50YXRpb24nIGJlbG93Ci0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmltcG9ydD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJvcGVuQXR0cnMiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIFRoaXMgdHlwZSBpcyBleHRlbmRlZCBieSBhbG1vc3QgYWxsIHNjaGVtYSB0eXBlcwotICAgICAgIHRvIGFsbG93IGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzIHRvIGJlCi0gICAgICAgYWRkZWQgdG8gdXNlciBzY2hlbWFzLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbm5vdGF0ZWQiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIFRoaXMgdHlwZSBpcyBleHRlbmRlZCBieSBhbGwgdHlwZXMgd2hpY2ggYWxsb3cgYW5ub3RhdGlvbgotICAgICAgIG90aGVyIHRoYW4gJmx0O3NjaGVtYSZndDsgaXRzZWxmCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpvcGVuQXR0cnMiPgotICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJzY2hlbWFUb3AiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBncm91cCBpcyBmb3IgdGhlCi0gICBlbGVtZW50cyB3aGljaCBvY2N1ciBmcmVlbHkgYXQgdGhlIHRvcCBsZXZlbCBvZiBzY2hlbWFzLgotICAgQWxsIG9mIHRoZWlyIHR5cGVzIGFyZSBiYXNlZCBvbiB0aGUgImFubm90YXRlZCIgdHlwZSBieSBleHRlbnNpb24uPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6Z3JvdXAgcmVmPSJ4czpyZWRlZmluYWJsZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmF0dHJpYnV0ZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpub3RhdGlvbiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpncm91cCBuYW1lPSJyZWRlZmluYWJsZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGdyb3VwIGlzIGZvciB0aGUKLSAgIGVsZW1lbnRzIHdoaWNoIGNhbiBzZWxmLXJlZGVmaW5lIChzZWUgJmx0O3JlZGVmaW5lPiBiZWxvdykuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleFR5cGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Z3JvdXAiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YXR0cmlidXRlR3JvdXAiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImZvcm1DaG9pY2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InF1YWxpZmllZCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bnF1YWxpZmllZCIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9InJlZHVjZWREZXJpdmF0aW9uQ29udHJvbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlcml2YXRpb25TZXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7ZXh0ZW5zaW9uLCByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgPHhzOnNpbXBsZVR5cGU+ICAgIAotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6cmVkdWNlZERlcml2YXRpb25Db250cm9sIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiBpZD0ic2NoZW1hIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zY2hlbWEiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpvcGVuQXR0cnMiPgotICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6aW5jbHVkZSIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6aW1wb3J0Ii8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpyZWRlZmluZSIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2NoZW1hVG9wIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgICA8L3hzOnNlcXVlbmNlPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6bm9ybWFsaXplZFN0cmluZyIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsRGVmYXVsdCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2tEZWZhdWx0IiB0eXBlPSJ4czpibG9ja1NldCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlRm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudEZvcm1EZWZhdWx0IiB0eXBlPSJ4czpmb3JtQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJ1bnF1YWxpZmllZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmtleSBuYW1lPSJlbGVtZW50Ij4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6ZWxlbWVudCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotICA8eHM6a2V5IG5hbWU9ImF0dHJpYnV0ZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZSIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotICA8eHM6a2V5IG5hbWU9InR5cGUiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpjb21wbGV4VHlwZXx4czpzaW1wbGVUeXBlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotIAotICA8eHM6a2V5IG5hbWU9Imdyb3VwIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6Z3JvdXAiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0gCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlR3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czphdHRyaWJ1dGVHcm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLSAKLSAgPHhzOmtleSBuYW1lPSJub3RhdGlvbiI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOm5vdGF0aW9uIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iaWRlbnRpdHlDb25zdHJhaW50Ij4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0iLi8veHM6a2V5fC4vL3hzOnVuaXF1ZXwuLy94czprZXlyZWYiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbGxOTkkiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBtYXhPY2N1cnM8L3hzOmRvY3VtZW50YXRpb24+PC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ib2NjdXJzIj4KLSAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+Ci0gICBmb3IgYWxsIHBhcnRpY2xlczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHR5cGU9InhzOmFsbE5OSSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iZGVmUmVmIj4KLSAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+Ci0gICBmb3IgZWxlbWVudCwgZ3JvdXAgYW5kIGF0dHJpYnV0ZUdyb3VwLAotICAgd2hpY2ggYm90aCBkZWZpbmUgYW5kIHJlZmVyZW5jZTwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIvPgotIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0idHlwZURlZlBhcnRpY2xlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAnY29tcGxleFR5cGUnIHVzZXMgdGhpczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIAotCi0gPHhzOmdyb3VwIG5hbWU9Im5lc3RlZFBhcnRpY2xlIj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmxvY2FsRWxlbWVudCIvPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOmdyb3VwUmVmIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnkiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0icGFydGljbGUiPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnkiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0ib3B0aW9uYWwiPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb2hpYml0ZWQiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9wdGlvbmFsIi8+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB0eXBlPSJ4czpmb3JtQ2hvaWNlIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEF0dHJpYnV0ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9ImF0dHJEZWNscyI+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiB0eXBlPSJ4czphdHRyaWJ1dGUiLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVHcm91cCIgdHlwZT0ieHM6YXR0cmlidXRlR3JvdXBSZWYiLz4KLSAgIDwveHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnlBdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICA8L3hzOnNlcXVlbmNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbnlBdHRyaWJ1dGUiIHR5cGU9InhzOndpbGRjYXJkIiBpZD0iYW55QXR0cmlidXRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueUF0dHJpYnV0ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmdyb3VwIG5hbWU9ImNvbXBsZXhUeXBlTW9kZWwiPgotICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzaW1wbGVDb250ZW50Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmNvbXBsZXhDb250ZW50Ii8+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBicmFuY2ggaXMgc2hvcnQgZm9yCi0gICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+Ci0gICAuLi4KLSAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gICAmbHQ7L2NvbXBsZXhDb250ZW50PjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBXaWxsIGJlIHJlc3RyaWN0ZWQgdG8gcmVxdWlyZWQgb3IgZm9yYmlkZGVuPC94czpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiPgotICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgTm90IGFsbG93ZWQgaWYgc2ltcGxlQ29udGVudCBjaGlsZCBpcyBjaG9zZW4uCi0gICAgICBNYXkgYmUgb3ZlcnJpZGVuIGJ5IHNldHRpbmcgb24gY29tcGxleENvbnRlbnQgY2hpbGQuPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0Ii8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbENvbXBsZXhUeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmNvbXBsZXhUeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVzdHJpY3Rpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVSZXN0cmljdGlvbk1vZGVsIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBsZXhSZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bwotICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4gICAgICAgCi0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4gICAgICAgCi0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhDb250ZW50IiBpZD0iY29tcGxleENvbnRlbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleENvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOmNvbXBsZXhSZXN0cmljdGlvblR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ieHM6ZXh0ZW5zaW9uVHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4gICAgIAotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1peGVkIiB0eXBlPSJ4czpib29sZWFuIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIE92ZXJyaWRlcyBhbnkgc2V0dGluZyBvbiBjb21wbGV4VHlwZSBwYXJlbnQuPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlUmVzdHJpY3Rpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnJlc3RyaWN0aW9uVHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIGNob2ljZSBpcyBhZGRlZCBzaW1wbHkgdG8KLSAgICAgICAgICAgICAgICAgICBtYWtlIHRoaXMgYSB2YWxpZCByZXN0cmljdGlvbiBwZXIgdGhlIFJFQzwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlRXh0ZW5zaW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpleHRlbnNpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBObyB0eXBlRGVmUGFydGljbGUgZ3JvdXAgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVDb250ZW50IiBpZD0ic2ltcGxlQ29udGVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zaW1wbGVDb250ZW50Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJlc3RyaWN0aW9uIiB0eXBlPSJ4czpzaW1wbGVSZXN0cmljdGlvblR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ieHM6c2ltcGxlRXh0ZW5zaW9uVHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotIAotIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czp0b3BMZXZlbENvbXBsZXhUeXBlIiBpZD0iY29tcGxleFR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleFR5cGUiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJsb2NrU2V0Ij4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7c3Vic3RpdHV0aW9uLCBleHRlbnNpb24sCi0gICAgcmVzdHJpY3Rpb259PC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPiAgICAKLSAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgPHhzOmxpc3Q+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3Vic3RpdHV0aW9uIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDwveHM6dW5pb24+ICAKLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoZSBlbGVtZW50IGVsZW1lbnQgY2FuIGJlIHVzZWQgZWl0aGVyCi0gICBhdCB0aGUgdG9wIGxldmVsIHRvIGRlZmluZSBhbiBlbGVtZW50LXR5cGUgYmluZGluZyBnbG9iYWxseSwKLSAgIG9yIHdpdGhpbiBhIGNvbnRlbnQgbW9kZWwgdG8gZWl0aGVyIHJlZmVyZW5jZSBhIGdsb2JhbGx5LWRlZmluZWQKLSAgIGVsZW1lbnQgb3IgdHlwZSBvciBkZWNsYXJlIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGxvY2FsbHkuCi0gICBUaGUgcmVmIGZvcm0gaXMgbm90IGFsbG93ZWQgYXQgdGhlIHRvcCBsZXZlbC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB0eXBlPSJ4czpibG9ja1NldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdHlwZT0ieHM6Zm9ybUNob2ljZSIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxFbGVtZW50Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsRWxlbWVudCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czplbGVtZW50Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25Hcm91cCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhYnN0cmFjdCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czp0b3BMZXZlbEVsZW1lbnQiIGlkPSJlbGVtZW50Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWVsZW1lbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJncm91cCIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgZ3JvdXAgdHlwZSBmb3IgZXhwbGljaXQgZ3JvdXBzLCBuYW1lZCB0b3AtbGV2ZWwgZ3JvdXBzIGFuZAotICAgZ3JvdXAgcmVmZXJlbmNlczwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6cGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpvY2N1cnMiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlYWxHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkR3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWxsIj4KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGwiPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOmFsbE1vZGVsIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNob2ljZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOnNpbXBsZUV4cGxpY2l0R3JvdXAiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnJlYWxHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJleHBsaWNpdEdyb3VwIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGdyb3VwIHR5cGUgZm9yIHRoZSB0aHJlZSBraW5kcyBvZiBncm91cDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Z3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6bmVzdGVkUGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHBsaWNpdEdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4cGxpY2l0R3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6bmVzdGVkUGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmdyb3VwIG5hbWU9ImFsbE1vZGVsIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIHdpdGggbWluL21heCBpcyBoZXJlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIGEgcGJsbSB3aXRoIHRoZSBFbHQ6QWxsL0Nob2ljZS9TZXEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljbGUgZGVyaXZhdGlvbiBjb25zdHJhaW50PC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czplbGVtZW50SW5BbGwiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICA8L3hzOnNlcXVlbmNlPgotIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnRJbkFsbCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj5yZXN0cmljdGVkIG1heC9taW48L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmxvY2FsRWxlbWVudCI+Ci0gICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGxOTkkiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPiAgICAKLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgT25seSBlbGVtZW50cyBhbGxvd2VkIGluc2lkZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmFsbE1vZGVsIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGxOTkkiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiIGlkPSJhbGwiIHR5cGU9InhzOmFsbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbGwiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImNob2ljZSIgdHlwZT0ieHM6ZXhwbGljaXRHcm91cCIgaWQ9ImNob2ljZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jaG9pY2UiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0ic2VxdWVuY2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2VxdWVuY2UiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpuYW1lZEdyb3VwIiBpZD0iZ3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZ3JvdXAiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ3aWxkY2FyZCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6bmFtZXNwYWNlTGlzdCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIyNhbnkiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb2Nlc3NDb250ZW50cyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0ic3RyaWN0Ij4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJza2lwIi8+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsYXgiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmljdCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueSIgaWQ9ImFueSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbnkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp3aWxkY2FyZCI+Ci0gICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIHNpbXBsZSB0eXBlIGZvciB0aGUgdmFsdWUgb2YgdGhlICduYW1lc3BhY2UnIGF0dHIgb2YKLSAgICdhbnknIGFuZCAnYW55QXR0cmlidXRlJzwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVmFsdWUgaXMKLSAgICAgICAgICAgICAgIyNhbnkgICAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUgYXQgYWxsCi0KLSAgICAgICAgICAgICAgIyNvdGhlciAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGFyZ2V0TlMKLQotICAgICAgICAgICAgICAjI2xvY2FsICAgIC0gLSBhbnkgdW5xdWFsaWZpZWQgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSAKLQotICAgICAgICAgICAgICBvbmUgb3IgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgIG1vcmUgVVJJICAgICAgICB0aGUgbGlzdGVkIG5hbWVzcGFjZXMKLSAgICAgICAgICAgICAgcmVmZXJlbmNlcwotICAgICAgICAgICAgICAoc3BhY2Ugc2VwYXJhdGVkKQotCi0gICAgIyN0YXJnZXROYW1lc3BhY2Ugb3IgIyNsb2NhbCBtYXkgYXBwZWFyIGluIHRoZSBhYm92ZSBsaXN0LCB0bwotICAgICAgICByZWZlciB0byB0aGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcKLSAgICAgICAgc2NoZW1hIG9yIGFuIGFic2VudCB0YXJnZXROYW1lc3BhY2UgcmVzcGVjdGl2ZWx5PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VMaXN0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2FueSIvPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjb3RoZXIiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmxpc3Q+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czphbnlVUkkiPgotICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2xvY2FsIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czp1bmlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6bGlzdD4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOnRvcExldmVsQXR0cmlidXRlIiBpZD0iYXR0cmlidXRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWF0dHJpYnV0ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkQXR0cmlidXRlR3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YXR0cmlidXRlR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVHcm91cFJlZiI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiB0eXBlPSJ4czpuYW1lZEF0dHJpYnV0ZUdyb3VwIiBpZD0iYXR0cmlidXRlR3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlR3JvdXAiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImluY2x1ZGUiIGlkPSJpbmNsdWRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWluY2x1ZGUiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0icmVkZWZpbmUiIGlkPSJyZWRlZmluZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1yZWRlZmluZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iLz4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnJlZGVmaW5hYmxlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0IiBpZD0iaW1wb3J0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWltcG9ydCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWFMb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9InNlbGVjdG9yIiBpZD0ic2VsZWN0b3IiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2VsZWN0b3IiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4cGF0aCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSBzdWJzZXQgb2YgWFBhdGggZXhwcmVzc2lvbnMgZm9yIHVzZQotaW4gc2VsZWN0b3JzPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMKLXVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgZm9sbG93aW5nIHBhdHRlcm4gaXMgaW50ZW5kZWQgdG8gYWxsb3cgWFBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIHBlciB0aGUgZm9sbG93aW5nIEVCTkY6Ci0gICAgICAgICAgU2VsZWN0b3IgICAgOjo9ICAgIFBhdGggKCAnfCcgUGF0aCApKiAgCi0gICAgICAgICAgUGF0aCAgICA6Oj0gICAgKCcuLy8nKT8gU3RlcCAoICcvJyBTdGVwICkqICAKLSAgICAgICAgICBTdGVwICAgIDo6PSAgICAnLicgfCBOYW1lVGVzdCAgCi0gICAgICAgICAgTmFtZVRlc3QgICAgOjo9ICAgIFFOYW1lIHwgJyonIHwgTkNOYW1lICc6JyAnKicgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ6OiBpcyBhbHNvIGFsbG93ZWQKLSAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8IS0tIFRTSCBjb21tZW50ZWQgb3V0IHNpbmNlIHRoaXMgaW5jb3JyZWN0bHkgZG9lcyBub3QgYWxsb3cgd2hpdGUgc3BhY2UgLS0+Ci0gICAgICAgIDwhLS0gPHhzOnBhdHRlcm4gdmFsdWU9IihcLi8vKT8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSgvKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKihcfChcLi8vKT8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSgvKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKikqIj4gCi0gICAgICAgIDwveHM6cGF0dGVybj4gLS0+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImZpZWxkIiBpZD0iZmllbGQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZmllbGQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4cGF0aCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSBzdWJzZXQgb2YgWFBhdGggZXhwcmVzc2lvbnMgZm9yIHVzZQotaW4gZmllbGRzPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMKLXVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgZm9sbG93aW5nIHBhdHRlcm4gaXMgaW50ZW5kZWQgdG8gYWxsb3cgWFBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIHBlciB0aGUgc2FtZSBFQk5GIGFzIGZvciBzZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2U6Ci0gICAgICAgICAgUGF0aCAgICA6Oj0gICAgKCcuLy8nKT8gKCBTdGVwICcvJyApKiAoIFN0ZXAgfCAnQCcgTmFtZVRlc3QgKSAKLSAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8IS0tIFRTSCBjb21tZW50ZWQgb3V0IHNpbmNlIHRoaXMgaW5jb3JyZWN0bHkgZG9lcyBub3QgYWxsb3cgd2hpdGUgc3BhY2UgLS0+Ci0gICAgICAgIDwhLS0gPHhzOnBhdHRlcm4gdmFsdWU9IihcLi8vKT8oKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikvKSooKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLil8KChhdHRyaWJ1dGU6OnxAKSgoXGlcYyo6KT8oXGlcYyp8XCopKSkpKFx8KFwuLy8pPygoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKS8pKigoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKXwoKGF0dHJpYnV0ZTo6fEApKChcaVxjKjopPyhcaVxjKnxcKikpKSkpKiI+IAotICAgICAgICA8L3hzOnBhdHRlcm4+LS0+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJrZXliYXNlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZWxlY3RvciIvPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZpZWxkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSB0aHJlZSBraW5kcyBvZiBpZGVudGl0eSBjb25zdHJhaW50cywgYWxsIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3IgZGVyaXZlZCBmcm9tICdrZXliYXNlJy4KLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlxdWUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5Ii8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmtleXJlZiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0idW5pcXVlIiB0eXBlPSJ4czprZXliYXNlIiBpZD0idW5pcXVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXVuaXF1ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotIDx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0ieHM6a2V5YmFzZSIgaWQ9ImtleSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLSA8eHM6ZWxlbWVudCBuYW1lPSJrZXlyZWYiIGlkPSJrZXlyZWYiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQta2V5cmVmIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6a2V5YmFzZSI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmZXIiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Im5vdGF0aW9uIiBpZD0ibm90YXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtbm90YXRpb24iLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpYyIgdHlwZT0ieHM6cHVibGljIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icHVibGljIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgcHVibGljIGlkZW50aWZpZXIsIHBlciBJU08gODg3OTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iLz4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhcHBpbmZvIiBpZD0iYXBwaW5mbyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hcHBpbmZvIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uIiBpZD0iZG9jdW1lbnRhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1kb2N1bWVudGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiBpZD0iYW5ub3RhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbm5vdGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YXBwaW5mbyIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZG9jdW1lbnRhdGlvbiIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBub3RhdGlvbnMgZm9yIHVzZSB3aXRoaW4gWE1MIFNjaGVtYSBzY2hlbWFzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpub3RhdGlvbiBuYW1lPSJYTUxTY2hlbWFTdHJ1Y3R1cmVzIiBwdWJsaWM9InN0cnVjdHVyZXMiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOC9YTUxTY2hlbWEueHNkIi8+Ci0gPHhzOm5vdGF0aW9uIG5hbWU9IlhNTCIgcHVibGljPSJSRUMteG1sLTE5OTgwMjEwIiBzeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCIvPgotICAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgTm90IHRoZSByZWFsIHVyVHlwZSwgYnV0IGFzIGNsb3NlIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2FuCi0gICBnZXQgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6c2VxdWVuY2U+Ci0gICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gIDx4czphbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRmlyc3QgdGhlIGJ1aWx0LWluIHByaW1pdGl2ZSBkYXRhdHlwZXMuICBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yCi0gICAgICBpbmZvcm1hdGlvbiBvbmx5LCB0aGUgcmVhbCBidWlsdC1pbiBkZWZpbml0aW9ucyBhcmUgbWFnaWMuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBGb3IgZWFjaCBidWlsdC1pbiBkYXRhdHlwZSBpbiB0aGlzIHNjaGVtYSAoYm90aCBwcmltaXRpdmUgYW5kCi0gICAgICBkZXJpdmVkKSBjYW4gYmUgdW5pcXVlbHkgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZAotICAgICAgYXMgZm9sbG93czoKLSAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZQotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgaW50IGRhdGF0eXBlLCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludAotCi0gICAgICBBZGRpdGlvbmFsbHksIGVhY2ggZmFjZXQgZGVmaW5pdGlvbiBlbGVtZW50IGNhbiBiZSB1bmlxdWVseQotICAgICAgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOgotICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKLSAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGZhY2V0Ci0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSBtYXhJbmNsdXNpdmUgZmFjZXQsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbWF4SW5jbHVzaXZlCi0KLSAgICAgIEFkZGl0aW9uYWxseSwgZWFjaCBmYWNldCB1c2FnZSBpbiBhIGJ1aWx0LWluIGRhdGF0eXBlIGRlZmluaXRpb24KLSAgICAgIGNhbiBiZSB1bmlxdWVseSBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZGF0YXR5cGUsIGZvbGxvd2VkCi0gICAgICAgICAgIGJ5IGEgcGVyaW9kICgiLiIpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBmYWNldAotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgdXNhZ2Ugb2YgdGhlIG1heEluY2x1c2l2ZSBmYWNldCBpbgotICAgICAgdGhlIGRlZmluaXRpb24gb2YgaW50LCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludC5tYXhJbmNsdXNpdmUKLQotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InN0cmluZyIgaWQ9InN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJwcmVzZXJ2ZSIgaWQ9InN0cmluZy5wcmVzZXJ2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJib29sZWFuIiBpZD0iYm9vbGVhbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNib29sZWFuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJib29sZWFuLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZmxvYXQiIGlkPSJmbG9hdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZmxvYXQud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkb3VibGUiIGlkPSJkb3VibGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZG91YmxlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZG91YmxlLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVjaW1hbCIgaWQ9ImRlY2ltYWwiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0idG90YWxEaWdpdHMiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJmcmFjdGlvbkRpZ2l0cyIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkZWNpbWFsLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkdXJhdGlvbiIgaWQ9ImR1cmF0aW9uIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZHVyYXRpb24ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlVGltZSIgaWQ9ImRhdGVUaW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGVUaW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGltZSIgaWQ9InRpbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJ0aW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGF0ZSIgaWQ9ImRhdGUiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnWWVhck1vbnRoIiBpZD0iZ1llYXJNb250aCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXJNb250aC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdZZWFyIiBpZD0iZ1llYXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXIud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdNb250aERheSIgaWQ9ImdNb250aERheSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoRGF5Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgaWQ9ImdNb250aERheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdEYXkiIGlkPSJnRGF5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBpZD0iZ0RheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ01vbnRoIiBpZD0iZ01vbnRoIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJnTW9udGgud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaGV4QmluYXJ5IiBpZD0iaGV4QmluYXJ5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImhleEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSIgaWQ9ImJhc2U2NEJpbmFyeSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImJhc2U2NEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYW55VVJJIiBpZD0iYW55VVJJIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJhbnlVUkkud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWUiIGlkPSJRTmFtZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9IlFOYW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5PVEFUSU9OIiBpZD0iTk9UQVRJT04iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iLz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICBOT1RBVElPTiBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBpbiBhIHNjaGVtYTsgcmF0aGVyIGEgdHlwZQotICAgICAgICBtdXN0IGJlIGRlcml2ZWQgZnJvbSBpdCBieSBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBlbnVtZXJhdGlvbgotICAgICAgICBmYWNldCB3aG9zZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiBhIE5PVEFUSU9OIGRlY2xhcmVkIGluIHRoZQotICAgICAgICBzY2hlbWEuCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iTk9UQVRJT04ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vdyB0aGUgZGVyaXZlZCBwcmltaXRpdmUgdHlwZXMKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiBpZD0ibm9ybWFsaXplZFN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9InJlcGxhY2UiCi0gICAgICAgIGlkPSJub3JtYWxpemVkU3RyaW5nLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idG9rZW4iIGlkPSJ0b2tlbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGlkPSJ0b2tlbi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxhbmd1YWdlIiBpZD0ibGFuZ3VhZ2UiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbGFuZ3VhZ2UiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czpwYXR0ZXJuCi0gICAgICAgIHZhbHVlPSJbYS16QS1aXXsxLDh9KC1bYS16QS1aMC05XXsxLDh9KSoiCi0gICAgICAgICAgICAgICAgaWQ9Imxhbmd1YWdlLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1MYW5ndWFnZUlEIj4KLSAgICAgICAgICAgIHBhdHRlcm4gc3BlY2lmaWVzIHRoZSBjb250ZW50IG9mIHNlY3Rpb24gMi4xMiBvZiBYTUwgMS4wZTIKLSAgICAgICAgICAgIGFuZCBSRkMgMzA2NiAoUmV2aXNlZCB2ZXJzaW9uIG9mIFJGQyAxNzY2KS4KLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUZTIiBpZD0iSURSRUZTIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOklEUkVGIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJJRFJFRlMubWluTGVuZ3RoIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUSUVTIiBpZD0iRU5USVRJRVMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRJRVMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpFTlRJVFkiLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9IkVOVElUSUVTLm1pbkxlbmd0aCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOTVRPS0VOIiBpZD0iTk1UT0tFTiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGMrIiBpZD0iTk1UT0tFTi5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTm10b2tlbiI+Ci0gICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA3IGZyb20gdGhlIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5NVE9LRU5TIiBpZD0iTk1UT0tFTlMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJOTVRPS0VOUy5taW5MZW5ndGgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxpXGMqIiBpZD0iTmFtZS5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1OYW1lIj4KLSAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDUgZnJvbSB0aGUgWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTkNOYW1lIiBpZD0iTkNOYW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TmFtZSI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xpLVs6XV1bXGMtWzpdXSoiIGlkPSJOQ05hbWUucGF0dGVybiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNOVC1OQ05hbWUiPgotICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNCBmcm9tIHRoZSBOYW1lc3BhY2VzIGluIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRCIgaWQ9IklEIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUYiIGlkPSJJRFJFRiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUWSIgaWQ9IkVOVElUWSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVFkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImludGVnZXIiIGlkPSJpbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlY2ltYWwiPgotICAgICAgPHhzOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSIwIiBmaXhlZD0idHJ1ZSIgaWQ9ImludGVnZXIuZnJhY3Rpb25EaWdpdHMiLz4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbLStdP1swLTldKycvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub25Qb3NpdGl2ZUludGVnZXIiIGlkPSJub25Qb3NpdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjAiIGlkPSJub25Qb3NpdGl2ZUludGVnZXIubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5lZ2F0aXZlSW50ZWdlciIgaWQ9Im5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNuZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSItMSIgaWQ9Im5lZ2F0aXZlSW50ZWdlci5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibG9uZyIgaWQ9ImxvbmciPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbG9uZyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItOTIyMzM3MjAzNjg1NDc3NTgwOCIgaWQ9ImxvbmcubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI5MjIzMzcyMDM2ODU0Nzc1ODA3IiBpZD0ibG9uZy5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaW50IiBpZD0iaW50Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9uZyI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItMjE0NzQ4MzY0OCIgaWQ9ImludC5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjIxNDc0ODM2NDciIGlkPSJpbnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InNob3J0IiBpZD0ic2hvcnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc2hvcnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludCI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItMzI3NjgiIGlkPSJzaG9ydC5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjMyNzY3IiBpZD0ic2hvcnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJ5dGUiIGlkPSJieXRlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2J5dGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNob3J0Ij4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0xMjgiIGlkPSJieXRlLm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTI3IiBpZD0iYnl0ZS5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibm9uTmVnYXRpdmVJbnRlZ2VyIiBpZD0ibm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIwIiBpZD0ibm9uTmVnYXRpdmVJbnRlZ2VyLm1pbkluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZExvbmciIGlkPSJ1bnNpZ25lZExvbmciPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRMb25nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTg0NDY3NDQwNzM3MDk1NTE2MTUiCi0gICAgICAgIGlkPSJ1bnNpZ25lZExvbmcubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkSW50IiBpZD0idW5zaWduZWRJbnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRJbnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkTG9uZyI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI0Mjk0OTY3Mjk1IgotICAgICAgICBpZD0idW5zaWduZWRJbnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkU2hvcnQiIGlkPSJ1bnNpZ25lZFNob3J0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkU2hvcnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkSW50Ij4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjY1NTM1IgotICAgICAgICBpZD0idW5zaWduZWRTaG9ydC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRCeXRlIiBpZD0idW5zaWduZWRCeXRlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkQnl0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRTaG9ydCI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIyNTUiIGlkPSJ1bnNpZ25lZEJ5dGUubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InBvc2l0aXZlSW50ZWdlciIgaWQ9InBvc2l0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNwb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIiBpZD0icG9zaXRpdmVJbnRlZ2VyLm1pbkluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlcml2YXRpb25Db250cm9sIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxpc3QiLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5pb24iLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0ic2ltcGxlRGVyaXZhdGlvbiI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpyZXN0cmljdGlvbiIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bGlzdCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6dW5pb24iLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9InNpbXBsZURlcml2YXRpb25TZXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7cmVzdHJpY3Rpb24sIHVuaW9uLCBsaXN0fQotICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxpc3QiLz4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6c2ltcGxlRGVyaXZhdGlvblNldCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgQ2FuIGJlIHJlc3RyaWN0ZWQgdG8gcmVxdWlyZWQgb3IgZm9yYmlkZGVuCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsU2ltcGxlVHlwZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICB0eXBlPSJ4czpOQ05hbWUiPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIFJlcXVpcmVkIGF0IHRoZSB0b3AgbGV2ZWwKLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFNpbXBsZVR5cGUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgRm9yYmlkZGVuIHdoZW4gbmVzdGVkCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6dG9wTGV2ZWxTaW1wbGVUeXBlIiBpZD0ic2ltcGxlVHlwZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Z3JvdXAgbmFtZT0iZmFjZXRzIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIFdlIHNob3VsZCB1c2UgYSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIGZhY2V0cywgYnV0Ci0gICAgICAgdGhhdCdzIHJ1bGVkIG91dCBiZWNhdXNlIGl0IHdvdWxkIGFsbG93IHVzZXJzIHRvCi0gICAgICAgYWRkIHRoZWlyIG93biwgd2hpY2ggd2UncmUgbm90IHJlYWR5IGZvciB5ZXQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1pbkV4Y2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluSW5jbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhFeGNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heEluY2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6dG90YWxEaWdpdHMiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZyYWN0aW9uRGlnaXRzIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpsZW5ndGgiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1pbkxlbmd0aCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4TGVuZ3RoIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czplbnVtZXJhdGlvbiIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6d2hpdGVTcGFjZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6cGF0dGVybiIvPgotICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9InNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiPgotICAgPHhzOnNlcXVlbmNlPgotICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6ZmFjZXRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czplbGVtZW50IG5hbWU9InJlc3RyaWN0aW9uIiBpZD0icmVzdHJpY3Rpb24iPgotICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXJlc3RyaWN0aW9uIj4KLSAgICAgICAgICBiYXNlIGF0dHJpYnV0ZSBhbmQgc2ltcGxlVHlwZSBjaGlsZCBhcmUgbXV0dWFsbHkKLSAgICAgICAgICBleGNsdXNpdmUsIGJ1dCBvbmUgb3Igb3RoZXIgaXMgcmVxdWlyZWQKLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVSZXN0cmljdGlvbk1vZGVsIi8+Ci0gICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibGlzdCIgaWQ9Imxpc3QiPgotICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWxpc3QiPgotICAgICAgICAgIGl0ZW1UeXBlIGF0dHJpYnV0ZSBhbmQgc2ltcGxlVHlwZSBjaGlsZCBhcmUgbXV0dWFsbHkKLSAgICAgICAgICBleGNsdXNpdmUsIGJ1dCBvbmUgb3Igb3RoZXIgaXMgcmVxdWlyZWQKLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpdGVtVHlwZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bmlvbiIgaWQ9InVuaW9uIj4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC11bmlvbiI+Ci0gICAgICAgICAgbWVtYmVyVHlwZXMgYXR0cmlidXRlIG11c3QgYmUgbm9uLWVtcHR5IG9yIHRoZXJlIG11c3QgYmUKLSAgICAgICAgICBhdCBsZWFzdCBvbmUgc2ltcGxlVHlwZSBjaGlsZAotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZW1iZXJUeXBlcyIgdXNlPSJvcHRpb25hbCI+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOlFOYW1lIi8+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2V0Ij4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub0ZpeGVkRmFjZXQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im1pbkV4Y2x1c2l2ZSIgaWQ9Im1pbkV4Y2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5FeGNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWluSW5jbHVzaXZlIiBpZD0ibWluSW5jbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkluY2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9Im1heEV4Y2x1c2l2ZSIgaWQ9Im1heEV4Y2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1tYXhFeGNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4SW5jbHVzaXZlIiBpZD0ibWF4SW5jbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJudW1GYWNldCI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KLSAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idG90YWxEaWdpdHMiIGlkPSJ0b3RhbERpZ2l0cyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXRvdGFsRGlnaXRzIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm51bUZhY2V0Ij4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6cG9zaXRpdmVJbnRlZ2VyIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJmcmFjdGlvbkRpZ2l0cyIgaWQ9ImZyYWN0aW9uRGlnaXRzIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWZyYWN0aW9uRGlnaXRzIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibGVuZ3RoIiBpZD0ibGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWxlbmd0aCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5MZW5ndGgiIGlkPSJtaW5MZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluTGVuZ3RoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1heExlbmd0aCIgaWQ9Im1heExlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1tYXhMZW5ndGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGlvbiIgaWQ9ImVudW1lcmF0aW9uIiB0eXBlPSJ4czpub0ZpeGVkRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1lbnVtZXJhdGlvbiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9IndoaXRlU3BhY2UiIGlkPSJ3aGl0ZVNwYWNlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtd2hpdGVTcGFjZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJwYXR0ZXJuIiBpZD0icGF0dGVybiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXBhdHRlcm4iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9GaXhlZEZhY2V0Ij4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9qYXZhc3JjL1NpbXBsZVBlcnNvblRlc3QuamF2YSBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9qYXZhc3JjL1NpbXBsZVBlcnNvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmNmM3ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvamF2YXNyYy9TaW1wbGVQZXJzb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotaW1wb3J0IG9yZy5vcGVudXJpLm15dGVzdC5QZXJzb247Ci1pbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IGRydGNhc2VzLlRlc3RFbnY7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGVyc29uVGVzdAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEN1c3RvbWVyRG9jdW1lbnQgZG9jID0KLSAgICAgICAgICAgIEN1c3RvbWVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sIiksIG51bGwpOwotCi0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSG93ZHkiLCBwZXJzb24uZ2V0Rmlyc3RuYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsICAgcGVyc29uLnNpemVPZk51bWJlckFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzNiwgcGVyc29uLmdldE51bWJlckFycmF5KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDQsICBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDkzMywgcGVyc29uLmdldE51bWJlckFycmF5KDMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCAgIHBlcnNvbi5zaXplT2ZCaXJ0aGRheUFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBEYXRlKCJUdWUgQXVnIDI1IDE3OjAwOjAwIFBEVCAxOTk4IiksIHBlcnNvbi5nZXRCaXJ0aGRheUFycmF5KDApKTsKLQotICAgICAgICBQZXJzb24uR2VuZGVyLkVudW0gZyA9IHBlcnNvbi5nZXRHZW5kZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhQZXJzb24uR2VuZGVyLk1BTEUsIGcpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkVHSVFUV1laSiIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleCgpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0KCkpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHR0lRVFdZR0ciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXhBdHQoKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdlb3JnZSIsIHBlcnNvbi5nZXRGaXJzdG5hbWUoKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEhleCgiaGV4IGVuY29kaW5nIi5nZXRCeXRlcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGV4IGVuY29kaW5nIiwgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4KCkpKTsKLQotICAgICAgICBwZXJzb24uc2V0QmFzZTY0KCJiYXNlNjQgZW5jb2RlZCIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhc2U2NCBlbmNvZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjQoKSkpOwotCi0gICAgICAgIC8vcGVyc29uLnNldEhleEF0dCgiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLmdldEJ5dGVzKCkpOwotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoImhleCBlbmNvZGluZyBpbiBhdHRyaWJ1dGVzIiwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEhleEF0dCgpKSk7Ci0KLSAgICAgICAgLy9wZXJzb24uc2V0QmFzZTY0QXR0KCJiYXNlNjQgZW5jb2RlZCBpbiBhdHRyaWJ1dGVzIi5nZXRCeXRlcygpKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJiYXNlNjQgZW5jb2RlZCBpbiBhdHRyaWJ1dGVzIiwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0vLwotLy8gICAgICAgIFhtbEN1cnNvciBjcCA9IHBlcnNvbi5uZXdYbWxDdXJzb3IoKTsKLS8vICAgICAgICBSb290LmR1bXAoIGNwICk7Ci0KLS8vICAgICAgICBYbWxDdXJzb3IgYyA9IHBlcnNvbi54Z2V0QmlydGhkYXlBcnJheSgwKS5uZXdYbWxDdXJzb3IoKTsKLQotLy8gICAgICAgIFJvb3QuZHVtcCggYyApOwotCi0vLyAgICAgICAgcGVyc29uLnNldEJpcnRoZGF5KDAsbmV3IERhdGUoIlR1ZSBBdWcgMjUgMTY6MDA6MDAgUERUIDIwMDEiKSk7Ci0KLS8vICAgICAgICBSb290LmR1bXAoIGMgKTsKLQotLy8gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIi0tLSIgKyBjLmdldFRleHQoKSArICItLS0iICk7Ci0KLS8vICAgICAgICBSb290LmR1bXAoIGMgKTsKLQotLy8gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMCksIG5ldyBEYXRlKCJUdWUgQXVnIDI1IDE2OjAwOjAwIFBEVCAyMDAyIikpOwotLy8KLS8vICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLS8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRGaXJzdG5hbWUoKSwgIkdlb3JnZSIpOwotLy8KLS8vICAgICAgICBwZXJzb24uYWRkTnVtYmVyKCAoc2hvcnQpIDY5ICk7Ci0vLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwZXJzb24uY291bnROdW1iZXIoKSwgNSk7Ci0vLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwZXJzb24uZ2V0TnVtYmVyQXJyYXkoNCksIDY5KTsKLS8vCi0vLwotLy8gICAgICAgIHdoaWxlICggYy5oYXNOZXh0VG9rZW4oKSApCi0vLyAgICAgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvcGVyc29uLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFmMzVhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPGN1c3RvbWVyIHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICBnZW5kZXI9Im1hbGUiCi0gIGhleEF0dD0iNDc0NzQ5NTE1NDU3NTk0NzQ3IgotICBiYXNlNjRBdHQ9IiAgICAgICAgCi0JVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoCi0JICAiPgotICA8Zmlyc3RuYW1lPkhvd2R5PC9maXJzdG5hbWU+Ci0gIDxudW1iZXI+NDM2PC9udW1iZXI+Ci0gIDxudW1iZXI+MTIzPC9udW1iZXI+Ci0gIDxiaXJ0aGRheT4xOTk4LTA4LTI2WjwvYmlydGhkYXk+Ci0gIDxudW1iZXI+NDQ8L251bWJlcj4KLSAgPG51bWJlcj45MzM8L251bWJlcj4KLSAgPGJpcnRoZGF5PjIwMDAtMDgtMDYtMDg6MDA8L2JpcnRoZGF5PgotICA8aGV4PjQ1NDc0OTUxNTQ1NzU5NUE0QTwvaGV4PgotICA8YmFzZTY0PlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaDwvYmFzZTY0PgotPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODZlY2IuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNvbiI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlyc3RuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiPgotICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICAgICAgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwIi8+Ci0gICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImJpcnRoZGF5IiB0eXBlPSJ4czpkYXRlIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImhleCIgdHlwZT0ieHM6aGV4QmluYXJ5Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiYXNlNjQiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZW5kZXIiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbGUiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZlbWFsZSIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaGV4QXR0Ij4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aGV4QmluYXJ5Ij4KLSAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iKFs0NV1bMC05QS1GXSkqIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2U2NEF0dCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWR2hwY3lCemRISnBibWNnYVhNZ1ltRnpaVFkwUW1sdVlYSjVJR1Z1WTI5a1pXUWgiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImN1c3RvbWVyIiB0eXBlPSJtdDpwZXJzb24iLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJlbXBsb3llZSI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im10OnBlcnNvbiI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZWlkIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA3NmE5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9zaW1wbGVjLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsaWNpdHkiPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im10OnRob3VzYW5kIj4KLSAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5vdGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGhvdXNhbmQiPgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0gICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGUiIHR5cGU9Im10OnNpbXBsaWNpdHkiLz4KLQotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS8wMDNfcHJvY2Vzc19wb18wMDcueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwM19wcm9jZXNzX3BvXzAwNy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODljNmMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwM19wcm9jZXNzX3BvXzAwNy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIExpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCi0gICAgICBvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCi0gICAgICBGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCi0gICAgICBwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0KLSAgICAkUmV2aXNpb246IDEuMSAkCi0gICAgJERhdGU6IDIwMDMvMDkvMTUgMTg6MjA6NDIgJAotICAgIE9wZW4gQXBwbGljYXRpb25zIEdyb3VwIFhTRAotICAgIENvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotICAgJE5hbWU6ICAkCi0KLWNtawk2LjIuMCAgIAkxMS8yMi8xOTk5CUluaXRpYWwgUmVsZWFzZSAtIHVwZGF0ZSBmcm9tIHZlcnNpb24gMDAzCi0JCQkJCQkJQWRkIFBPTE5TVEFUVVMsIERBVEVUSU1FLk5FRURERUxWIHRvIFBPT1JERVJMSU4KLQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCi1yamoJNy4wLjAJCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKLXJqagk3LjAuMgkJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCi1tbHIJNy4xCQkwNC8xNi8yMDAxCUFkZCBBVFRDSFJFRiB0byBCT0QuCi1hancJCTcuMi4xCQkJMTAvMzEvMjAwMQkJVzNDIFNjaGVtYSBSZWxlYXNlIAotCi1TdHJ1Y3R1cmUgT3ZlcnZpZXcKLQotCVBST0NFU1NfUE8gKFBPT1JERVJIRFIsIFBPT1JERVJMSU4rKQotCQlQT09SREVSSERSIChQQVJUTkVSKywgQVRUQ0hSRUYqLCBDSEFSR0UqLCBQT1RFUk0qKQotCQkJUE9URVJNICgpCi0JCVBPT1JERVJMSU4gKEFUVENIUkVGKiwgQ0hBUkdFKiwgRElTVFJJQlVUTiosIFBBUlRORVIqLCBQT1RFUk0qLCAKLQkJICBQT0JTVUJMSU5FKiwgUE9MSU5FU0NIRCopCi0JCQlQT1RFUk0gKCkKLQkJCVBPU1VCTElORSAoKQotCQkJUE9MSU5FU0NIRCAoKQotCi1Ob3RlczoKLQotLS0+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy8wMDNfcHJvY2Vzc19wb18wMDciIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDAzX3Byb2Nlc3NfcG9fMDA3Ij4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgotCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9DRVNTX1BPXzAwNyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNOVFJPTEFSRUEiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IkRBVEFBUkVBIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFUQUFSRUEiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQUk9DRVNTX1BPIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9DRVNTX1BPIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkhEUiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkxJTiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPT1JERVJIRFIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpEQVRFVElNRUFOWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPVFlQRSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUNLUkVRVUVTVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UUkFDVEIiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09OVFJBQ1RTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6T1BSQU1UQVVUSCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT1JFTEVBU0UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYV0hFWE1QVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpQQVJUTkVSIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLkRPQ1VNRU5UOyk/IC0tPgotCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1RFUk0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEVSTUlEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRBWU9GTU9OVEgiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFJPWE1PTlRIIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZU05VTSIvPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+Ci0JCQkJCTwhLS0gKCVRVUFOVElUWS5QRVJDRU5UOykgLS0+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoKERBWU9GTU9OVEgsIFBST1hNT05USCkgfCBEQVlTTlVNKSwgKCglT1BFUkFNVC5FWFRFTkRFRC5UOykgfCAoJVFVQU5USVRZLlBFUkNFTlQ7KSkgLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT09SREVSTElOIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9MSU5FTlVNIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkFXSU5HIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkhBWlJETUFUTCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFDS0lORyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0xOU1RBVFVTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWFdIRVhNUFQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkFUVENIUkVGIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDSEFSR0UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRJU1RSSUJVVE4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlBBUlRORVIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPVEVSTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9TVUJMSU5FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQT0xJTkVTQ0hEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPCEtLSAoJVFVQU5USVRZLlBFUkNFTlQ7KSkgLS0+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLk5FRURERUxWOyk/IC0tPgotCQkJCTwhLS0gKCVPUEVSQU1ULlVOSVQuVDspPyAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPU1VCTElORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkFXSU5HIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SViIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlZYIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBTQkxJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICglUVVBTlRJVFkuSVRFTTspIC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9MSU5FU0NIRCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFNDTElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLk5FRURERUxWOykgLS0+Ci0JCQkJPCEtLSAoJVFVQU5USVRZLk9SREVSRUQ7KSAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDA0X2Fja25vd2xlZGdlX3BvXzAwOC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDA0X2Fja25vd2xlZGdlX3BvXzAwOC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWJjOWIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwNF9hY2tub3dsZWRnZV9wb18wMDgueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlIGlzIHByb3ZpZGVkIGluIExJQ0VOU0UuVFhULCBhcyBwdWJsaXNoZWQKLQlvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCQotCUZvciBzdXBwb3J0LCBtb3JlIGluZm9ybWF0aW9uLCBvciB0byByZXBvcnQgaW1wbGVtZW50YXRpb24gYnVncywKLQlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0JCi0JJFJldmlzaW9uOiAxLjEgJAotCSREYXRlOiAyMDAzLzA5LzE1IDE4OjIwOjQyICQKLQlPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBYU0QKLQlDb3B5cmlnaHQgMTk5OC0yMDAxLCBBbGwgUmlnaHRzIFJlc2VydmVkCi0JCi0JJE5hbWU6ICAkCi0KLQljbWsJNi4yLjAgICAJMTEvMjIvMTk5OQlJbml0aWFsIFJlbGVhc2UgLSBVcGRhdGUgZnJvbSB2ZXJzaW9uIDAwMwotCQkJCQkJCQlBZGQgUE9MTlNUQVRVUywgREFURVRJTUUuTkVFRERFTFYgdG8gUE9PUkRFUkxJTgotCQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCi0JcmpqCTcuMC4wCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKLQlyamoJNy4wLjIJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCi0JbWxyCTcuMQkJMDQvMTYvMjAwMQlBZGQgQVRUQ0hSRUYgdG8gQk9ELgotCWFqdyA3LjIJCTA5LzMwLzIwMDEgCU1hZGUgQUNLTElORSBzZWdtZW50ICcwIHRvIG1hbnknIHRpbWVzCi0JYWp3CTcuMi4xCTA5LzAxLzAwCVczQyBTY2hlbWEgUmVsZWFzZQotCi0gICAgU3RydWN0dXJlIE92ZXJ2aWV3Ci0KLSAgICBBQ0tOT1dMRURHRV9QTyAoUE9PUkRFUkhEUiwgUE9PUkRFUkxJTiopCi0gICAgICAgIFBPT1JERVJIRFIgKEFDS0hFQURFUiwgQVRUQ0hSRUYqLCBDSEFSR0UqLCBQQVJUTkVSKiwgUE9URVJNKikKLSAgICAgICAgICAgIEFDS0hFQURFUiAoKQotICAgICAgICAgICAgUE9URVJNICgpCi0gICAgICAgIFBPT1JERVJMSU4gKEFDS0xJTkUqLCBBVFRDSFJFRiosIENIQVJHRSosIERJU1RSSUJVVE4qLCBQQVJUTkVSKiwKLSAgICAgICAgICAgIFBPTElORVNDSEQqLCBQT1NVQkxJTkUqLCBQT1RFUk0qKQotICAgICAgICAgICAgQUNLTElORSAoKQotICAgICAgICAgICAgUEFSVE5FUiAoKQotICAgICAgICAgICAgUE9MSU5FU0NIRCAoKQotICAgICAgICAgICAgUE9TVUJMSU5FICgpCi0gICAgICAgICAgICBQT1RFUk0gKCkKLQotTm90ZXM6Ci0KLS0tPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIj4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgotCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tOT1dMRURHRV9QT18wMDgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDTlRST0xBUkVBIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJEQVRBQVJFQSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRBVEFBUkVBIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iQUNLTk9XTEVER0VfUE8iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFDS05PV0xFREdFX1BPIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkhEUiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkxJTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9PUkRFUkhEUiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9JRCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9UWVBFIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBQ0tSRVFVRVNUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTlRSQUNUQiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UUkFDVFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpPUFJBTVRBVVRIIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPUkVMRUFTRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhXSEVYTVBUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IkFDS0hFQURFUiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLkRPQ1VNRU5UOyk/IC0tPgotCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tIRUFERVIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpTRU5ERVIiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS0NPREUiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0FMRVNPUkRJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLlBST01ERUxWOyk/IC0tPgotCQkJCTwhLS0gKCVEQVRFVElNRS5QUk9NU0hJUDspPyAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPVEVSTSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURVJNSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZT0ZNT05USCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQUk9YTU9OVEgiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEQVlTTlVNIi8+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICgoREFZT0ZNT05USCwgUFJPWE1PTlRIKSB8IERBWVNOVU0pLCAoKCVPUEVSQU1ULkVYVEVOREVELlQ7KSB8ICglUVVBTlRJVFkuUEVSQ0VOVDspKSAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPT1JERVJMSU4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpRVUFOVElUWSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0xJTkVOVU0iLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQVdJTkciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SEFaUkRNQVRMIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SViIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlZYIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQUNLSU5HIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPTE5TVEFUVVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYV0hFWE1QVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iQUNLTElORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6RElTVFJJQlVUTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQT1NVQkxJTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPTElORVNDSEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8IS0tICglUVVBTlRJVFkuUEVSQ0VOVDspKSAtLT4KLQkJCQk8IS0tICglREFURVRJTUUuTkVFRERFTFY7KT8gLS0+Ci0JCQkJPCEtLSAoJU9QRVJBTVQuVU5JVC5UOyk/IC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNLTElORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS0NPREUiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTQUxFU09SRElEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICglREFURVRJTUUuUFJPTURFTFY7KT8gLS0+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLlBST01TSElQOyk/IC0tPgotCQkJCTwhLS0gKCVRVUFOVElUWS5PUkRFUkVEOyk/IC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9TVUJMSU5FIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQVdJTkciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SVlgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFNCTElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwhLS0gKCVRVUFOVElUWS5JVEVNOykgLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0xJTkVTQ0hEIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQU0NMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICglREFURVRJTUUuTkVFRERFTFY7KSAtLT4KLQkJCQk8IS0tICglUVVBTlRJVFkuT1JERVJFRDspIC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRkZDRmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9InB1YmxpY2lkOm9yZy54Q0JMOnNjaGVtYXMvWENCTDM1L09yZGVyLnhzZCIgdGFyZ2V0TmFtZXNwYWNlPSJwdWJsaWNpZDpvcmcueENCTDpzY2hlbWFzL1hDQkwzNS9PcmRlci54c2QiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgWE1MIENvbW1vbiBCdXNpbmVzcyBMaWJyYXJ5IDMuNQotICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDAgQ29tbWVyY2UgT25lLCBJbmMuCi0gICAgICAgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICAgICAgICBEVEQncywgc2NoZW1hcyBhbmQgbW9kdWxlcyBpbiB0aGUgQ29tbWVyY2UgT25lIFhNTCBDb21tb24gQnVzaW5lc3MKLSAgICAgICAgICAgIExpYnJhcnkgVmVyc2lvbiAzLjUgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc3BlY2lmaWVkCi0gICAgICAgICAgICBhdCBodHRwOi8vd3d3LnhjYmwub3JnL2xpY2Vuc2UuaHRtbAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAlQTEVBU0UgTk9URTogVGhpcyBzY2hlbWEsIHdoaWxzdCBpdCBkZXNjcmliZXMgaW4gZW50aXJldHkgYSB2YWxpZCwgc2luZ2xlLAotICAgICAgICAJeENCTCAzLjUgZG9jdW1lbnQsIGlzIGRlZmluZWQgdG8gYmUgaW4gYSBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0aGUgbWFpbiB4Q0JMIDMuNQotICAgICAgICAJbmFtZXNwYWNlLiBUaGVyZWZvcmUgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZnVsbCB4Q0JMIDMuNSBzY2hlbWEgaXMgdXNlZAotICAgICAgICAJZm9yIGZ1bGwgcHJvZHVjdGlvbiBzaXR1YXRpb25zLiBQbGVhc2Ugc2VlIHRoZSBub3RlcyBhdAotICAgICAgICAJPGEgaHJlZj0iaHR0cDovL3d3dy54Y2JsLm9yZy94Y2JsMzUveHNkL3NjaGVtYXMuaHRtbCI+d3d3LnhDQkwub3JnPC9hPi4KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJIZWFkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJTdW1tYXJ5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlciIgdHlwZT0iT3JkZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVySGVhZGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJJc3N1ZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlclJlZmVyZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlbGVhc2VOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlB1cnBvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmVxdWVzdGVkUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEFjY291bnRpbmdDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckxhbmd1YWdlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJUYXhSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUYXhSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJJbnZvaWNlTWVkaXVtVHlwZUNvZGVkIiB0eXBlPSJPcmRlckludm9pY2VNZWRpdW1UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJJbnZvaWNlTWVkaXVtVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydGlhbFNoaXBtZW50QWxsb3dlZCIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRMb2NhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJPcmRlclRlcm1zT2ZEZWxpdmVyeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlRlcm1zT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckhlYWRlclByaWNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJpY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJQYXltZW50SW5zdHJ1Y3Rpb25zIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGF5bWVudEluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckFsbG93YW5jZXNPckNoYXJnZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUm91bmRUcmlwSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySGVhZGVyTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySGVhZGVyQXR0YWNobWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVySGVhZGVyIiB0eXBlPSJPcmRlckhlYWRlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJOdW1iZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJ1eWVyT3JkZXJOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlck9yZGVyTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk1lc3NhZ2VJRCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJOdW1iZXIiIHR5cGU9Ik9yZGVyTnVtYmVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZNZXNzYWdlSUQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik1lc3NhZ2VJRCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTWVzc2FnZUlEIiB0eXBlPSJMaXN0T2ZNZXNzYWdlSUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lc3NhZ2VJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUROdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklEQXNzaWduZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSURBc3NpZ25lZERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVzc2FnZUlEIiB0eXBlPSJNZXNzYWdlSUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IklEQXNzaWduZWRCeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSURBc3NpZ25lZEJ5Q29kZWQiIHR5cGU9IlBhcnR5Um9sZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IklEQXNzaWduZWRCeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IklEQXNzaWduZWRCeSIgdHlwZT0iSURBc3NpZ25lZEJ5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhcnR5Um9sZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZkRlc3RpbmF0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZi1PcmlnaW5QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXJzU2VydmljaW5nQmFua09uVGhlUmVjZWl2aW5nU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyc1NlcnZpY2luZ0JhbmtPblRoZVNlbmRpbmdTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3JvbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUHVyY2hhc2Vyc0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZEJ5T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZUNhcmVIb3NwaXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQaWNrVXBBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpb25DZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ1N1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdWx0RGF5Q2FyZVByb2dyYW1GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlVGhyb3VnaEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGVkQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUdyYW50aW5nU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlEU09yQVJDVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQW1idWxhbmNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRm9yY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGlzbUFuZE90aGVyQ2hlbWljYWxEZXBlbmRlbmN5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeUlucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeU91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaWVuQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2VkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsaWVkSGVhbHRoUHJvZmVzc2lvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVSZXR1cm5BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUFkZHJlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsemhlaW1lcnNEaWFnbm9zdGljT3JBc3Nlc3NtZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkluZGlhbi1Pd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWljdXNDdXJpYWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaW9sb2d5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2lvcGxhc3R5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbEJlaW5nSW52ZXN0aWdhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlbGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVsbGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudENvbWFrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudEZvckpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNDb3NpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZENvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyY2hpdGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJjaGl0ZWN0LURlc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm15RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGhyaXRpc1RyZWF0bWVudENlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRBY2NvdW50SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRVU1RydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZUdlbmVyYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yRGVmZW5kYW50UHJpdmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JEZWZlbmRhbnRQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leU9mUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWN0aW9uZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkFzc2lnbmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRBY2NlcHRpbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEltcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTWFya2V0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkVHJhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWREYXRhUHJvY2Vzc2luZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVdpdGhCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlTaGlwVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UmVmZXJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQZXJpb2RFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0dGVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhbE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsLVRvUGFydHlGb3JEaXZlcnNpb25DaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aGluZ1Jvb21PckxEUlBSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRocGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb29kQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZlJlYWx0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsU2VydmljZVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kc21hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29ra2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcnJvd2Vyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFrZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa0JlcnRoT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9hZGNhc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9waW5pb25PckFuYWx5c2lzUmVxdWVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPclNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJzQXNzaXN0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGVyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdJbnNwZWN0b3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZUVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZVB1cmNoYXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1T2ZMYW5kTWFuYWdlbWVudFByb3BlcnR5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybkNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Fzc29jaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyQXNPZmZpY2lhbGx5UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNRdWFsaXR5UmV2aWV3Qm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZ0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5kaWRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmR5QW5kQ29uZmVjdGlvbnNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjQ2F0aGVyaXphdGlvbkxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNJbnRlbnNpdmVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY1JlaGFiaWxpdGF0aW9uUHJvZ3JhbUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjUmVoYWJpbGl0YXRpb25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0SXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbExldmVsQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbFN1Yi1BY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sVG9wQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQmFua09yUmVndWxhdG9yeUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbENhdGFsb2d1ZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZ5aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWlycGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNQYXllckF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlRHJhd25CYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZEZXB1dHlDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNDaHJvbmljRGlzZWFzZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNEYXlDYXJlQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0dlbmVyYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNPcnRob3BlZGljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc090aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1BzeWNoaWF0cmljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1JlaGFiaWxpdGF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1R1YmVyY3Vsb3Npc0FuZE90aGVyUmVzcGlyYXRvcnlEaXNlYXNlc0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlyb3ByYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNEaXNlYXNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNPYnN0cnVjdGl2ZVB1bG1vbmFyeURpc2Vhc2VTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNodXJjaE9wZXJhdGVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZXNBbmRUb2JhY2NvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdExvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRBdXRob3JpemVkUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZERvb3JQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ291bnNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1EZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbmFibGVBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvblByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QXNzaWduZWRXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SW50ZXJ2aWV3ZXJXb3Jrc0ZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUluV2hpY2hJbnRlcmVzdEhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlNZXJnZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlXaGljaEhvbGRzRmluYW5jaWFsSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVJlbnRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGluZ1Byb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbmFudHNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVoZW5zaXZlR2VyaWF0cmljQXNzZXNzbWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdG9yUGlsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZU9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVRvQmVTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZS1Ub1JlY2VpdmVMYXJnZVBhcmNlbHNBbmRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUtVG9SZWNlaXZlTWFpbEFuZFNtYWxsUGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25Db250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25GaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0YW50c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJDcmVkaXRBY2NvdW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJSZWZlcnJhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlckN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RCYW5rMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JPckxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUmV0dXJuQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3VydmV5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkbWluaXN0cmF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdGVkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RpbmdPZmZpY2VyUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItR2VuZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLUxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItTWFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeU1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbFJlY2VpcHRNZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlclF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udm95aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1PcGVyYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQnV5aW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Pd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tUGFydGljaXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLVByb2R1Y2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5TWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGlvbkZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VuY2lsT2ZHb3Zlcm5tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0QXBwb2ludGVkQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmF0aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvcnRpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1lVmljdGltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0NsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zcy1Ub3duU3dpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVFNjYW5uZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RW1wbG95ZXItUHJpbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEVtcGxveWVyLVNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b2RpYWxQYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRk9yV2hvbVNhbWVPclNpbWlsYXJXT3JrV2FzUGVyRm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcklkZW50aWZpY2F0aW9uRmlsZUN1c3RvbWVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFQcm9jZXNzaW5nU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvci1Jbi1Qb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRQYXltZW50QXV0aG9yaXNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNpc2lvbk1ha2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0T3JGb3JlY2xvc3VyZVNwZWNpYWxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaWNhdGVzc2VuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkp1c3RpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRIYXphcmRvdXNXYXN0ZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY1JhZGlvaXNvdG9wZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFseXNpc0NlbnRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZmZlcmVudFByZW1pc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzaW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NpcGxpbmFyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RpbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEp1c3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N0b3JPZk9wdG9tZXRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdG9yT2ZPc3Rlb3BhdGh5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY291bnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NvdW50UGFydHlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRSZWltYnVyc2luZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0U2Vjb25kQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Q3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE9yTWVzc2FnZUlzc3Vlck9yU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9pbmdCdXNpbmVzc0FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtRmlyc3RTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmlsbGluZ0NvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5R3JvY2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmFibGVNZWRpY2FsRXF1aXBtZW50U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjb25vbWljYWxseURpc2FkdmFudGFnZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3JQb2ludEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblV0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNSZXR1cm5PcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVtZW50YXJ5U2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJsZVBhcnR5VG9UaGVDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2libGVQYXJ0eVRvVGhlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudFNvY2lhbFdvcmtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5TWVkaWNhbFRlY2huaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lSZXNwb25zZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnaW5nU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJSZXR1cm5BZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlFcXVpcG1lbnREZXNwYXRjaFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUVxdWlwbWVudFJldHVyblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lJbmZvcm1hdGlvbkFkbWluaXN0cmF0aW9uLU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1Db25zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLUNvbnN1bHRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlck1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlclBpbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1SZXNpZGVudENvbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eUhvbGRpbmdUaGVJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5SW5XaGljaEFGaW5hbmNpYWxJbnRlcmVzdElzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UHJvdmlkaW5nVGhlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVzcG9uc2libGVGb3JGb2xsb3ctVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRUZWNobmljYWxBc3Nlc3NtZW50R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudERyb3AtT2ZmUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlQ29tbWl0dGVlTWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRvck9mRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVydFdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeC1TcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWNvcnBvcmVhbFNob2NrLVdhdmVMaXRob3RyaXB0ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3Rvci1Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbGx5Q2hhcnRlcmVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdGF0ZUNvdW50eU9yQ2l0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWxsb3dzaGlwSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRvckJyYW5jaE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbEN1c3RvbWVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlUGVyaW9kRGVzaWduYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBsYW5uZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcHByYWlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXRuZXNzQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZENlcnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REZXRlcm1pbmF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RTZXJ2aWNlT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRGlzY2xvc3VyZUluZm9ybWF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGFuZ3VhZ2VTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVnaXN0cmF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25TdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJseURvaW5nQnVzaW5lc3NBcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVybHlLbm93bkFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclJlZ2lzdGVyZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlb25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0TWFuYWdlbWVudEZhY2lsaXRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0T3JDaGFyZ2VzUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1dHVyZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5pbmdJbnZlbnRvcnlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm5pc2hlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uRW5kaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25TdGFydGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRld2F5UHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxJbnBhdGllbnRDYXJlRm9yQUlEU09yQVJDRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZWRpY2FsQW5kU3VyZ2ljYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lcmNoYW5kaXNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXRpY0NvdW5zZWxpbmdPclNjcmVlbmluZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNBY3V0ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNDbGluaWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaWZ0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVsZWFzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtQ29tYmluZWRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtTWlsaXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1PdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLVZldGVyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHlGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudExvYW5BZ2VuY3lTcG9uc29yT3JBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Mb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbmRwYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZEFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBZmZpbGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWZmaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwaW5nQ2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFByYWN0aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFB1cmNoYXNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZUdlbmVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQW5kQmVhdXR5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb2Zlc3Npb25hbFNob3J0YWdlQXJlYUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWlzY2VsbGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoU2NpZW5jZXNMaWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZW1vZGlhbHlzaXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzb3BhdGhvbG9neUxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc3BhbmljU2VydmljZUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aENvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTdGF0ZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEF1eGlsaWFyeVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzdHJpY3RPckF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbFVuaXRXaXRoaW5Bbkluc3RpdHV0aW9uRm9yVGhlTWVudGFsbHlSZXRhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zdGlsZVdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVkRnJvbUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRMYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50UGh5c2ljaWFuc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lbGlnaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkRpc3NlbWluYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uTWFpbnRlbmFuY2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVmZXJlbmNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbE1lZGljYWxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluamVjdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1QYXRpZW50UGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU2VydmljZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uT25TaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkZvck1lbnRhbFJldGFyZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TdG9yZUJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDbGFpbUFkanVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZE9yU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hdGVyaWFsTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWxsZWN0dWFsUHJvcGVydHlPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybGluZVNlcnZpY2VDb21taXRtZW50Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJhbmsyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlPckJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVMZXZlbFBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5zaGlwRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnByZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9sdmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmV2b2NhYmxlQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZEZWJpdE9yQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludEFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRBbm51aXRhbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50RGVidG9yQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckpvaW50QW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lclBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5pb3JIaWdoU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZVZpY3RpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpZG5leURpYWx5c2lzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdXJwbHVzQXJlYUZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRsb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXJnZUJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0S25vd25Tb3VyY2VPZlN1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdFbmZvcmNlbWVudEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxUaXRsZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2Vlc1N1cnZleW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRMaWFiaWxpdHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0TWFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdGVyYWxseVRyYW5zbGF0ZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5BcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Ccm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuSG9sZGVyRm9yUmVhbEVzdGF0ZUFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEdvdmVybm1lbnRTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kc0ZvckN1c3RvbXNFeGFtaW5hdGlvbkJlZm9yZUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkxvYWRFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlByaW5jaXBhbEFzc2V0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlNwb3RGb3JTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybUNhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZy1UZXJtRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc2luZ0ludmVudG9yeU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NQYXllZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWdpc3RyYXRlSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25ldGljUmVzb25hbmNlSW1hZ2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlkZW5OYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlubGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Vc2VkRm9yRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5U2NyZWVuaW5nQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRDb250cm9sQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnROb24tT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdHZW5lcmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFRpbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrLUZvclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyR2VuZXJhbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkF1dGhvcml6YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0Q2hhcnRlcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbERvY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxOdXJzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN1cmdpY2FsT3JPdGhlckludGVuc2l2ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50RXhlY3V0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50UHJlc2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWdhdm9sdGFnZVJhZGlhdGlvblRoZXJhcHlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50QmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55V2l0aFJldGFpbmVkSWRlbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1leGljYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRkbGVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnRIZWFsdGhDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHktT3duZWRCdXNpbmVzc0xhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eS1Pd25lZEJ1c2luZXNzU21hbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNIZWFsdGhDYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbml0b3JpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlUmVwb3J0UHJvdmlkZXJDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVDaGFuZ2VkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVOb3RUb0JlQ29uZnVzZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lb25DcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVW5kZXJXaGljaEZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVmFyaWF0aW9uU3lub255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGl2ZUhhd2FpaWFuT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXZ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ2xlY3RlZE9yRGVsaW5xdWVudEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvcmhvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lb25hdGFsSW50ZW5zaXZlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldHdvcmtOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1NlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3c3BhcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdXBwbHlTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWNrbmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9IZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRGcmVpZ2h0Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLURvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmVtcGxveW1lbnRJbmNvbWVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1IZWFsdGhDYXJlTWlzY2VsbGFuZW91c0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUludmFzaXZlQ2FyZGlhY0Fzc2Vzc21lbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU9jY3VwYW50Q28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9kdWN0aW9uU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbnByb2ZpdEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmFpbHJvYWRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJlZ2lzdGVyZWRCdXNpbmVzc05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRHcm91cENvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbEFjY291bnRJcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50SW5zdHJ1Y3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50VGhpcmRQYXJ0eUNvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVRlbXBvcmFyeVN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnlQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGVDby1TaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Rm9yU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlObzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Tm8yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2YXRpb25Sb29tU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NBbmRHeW5lY29sb2d5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5UYXJpZmZDb25mZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQW5kR2FzQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxBbmRHYXNSZWd1bGF0b3J5QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQmVoYWxmT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uLUNhbGxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25jb2xvZ3lDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tSGVhcnRTdXJnZXJ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3ItQ29tbXVuaWNhdGlvbkNoYW5uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yLUVzc2VudGlhbFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mUHJvcGVydHlPckVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlU291cmNlVHJhbnNmZXJQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT2ZTaGlwcGVyc09yZGVycy1UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPZlRoZVNoaXBwZXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQ29tcGxldGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25IYXZpbmdTb3VyY2VDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZWRPdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplZFNvY2lhbFdvcmtTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5PclRpc3N1ZVRyYW5zcGxhbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yT2ZBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN1YmxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9wZWRpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob3BlZGljU3VyZ2VyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmRpdmlkdWFsRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb3QtRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBlcnNvbk9yRW50aXR5QXNzb2NpYXRlZFdpdGhTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJSZWxhdGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRUeXBlT2ZPcmdhbml6YXRpb25hbEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTb2NpYWxXb3JrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnZXJ5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnaWNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUluc3BlY3Rpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVUZXN0QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZk1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPckxlc3NvcnNTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnNoaXBGb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZW1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHNEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBY2NvcmRpbmdUb0RvY3VtZW50YXJ5Q3JlZGl0VHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXNzaWduaW5nQVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdEZpbmFsUGxhY2VPZlBvc2l0aW9uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF0UGljay1VcExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6ZWR0b0RlZmluaXRpemVDb250cmFjdEFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemVkVG9NYWtlRGVmaW5pdGVBQ29udHJhY3RBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXppbmdEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemluZ1JlbGVhc2VPZlNlY3VyaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGF0YVJlc3BvbnNpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVjbGFyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9FeGVjdXRlUmUtSWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvRXhlY3V0ZVNhbml0YXJ5UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9Qcm92aWRlTGl2aW5nQW5pbWFsQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlFeGVjdXRpbmdBbmRWZXJpZnlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RmlsbGluZ1NoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Rm9yV2hvbUl0ZW1Jc1VsdGltYXRlbHlJbnRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGcm9tV2hvbUN1c3RvbXNEb2N1bWVudHNBcmVUb0JlUGlja2VkVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnJvbVdob21Ob24tQ3VzdG9tc0RvY3VtZW50c0FyZVRvQmVQaWNrZWRVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGdWxmaWxsaW5nQWxsT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJblBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SXNzdWluZ011dHVhbGx5QWdyZWVkQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVDb2Rlc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVJZGVudGlmaWVyc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFuZGF0ZWRUb0xpcXVpZGF0ZUFuRW50ZXJwcmlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYW51ZmFjdHVyZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Tm90VG9CZUNvbmZ1c2VkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQYXNzaW5nVGhlVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdUYXNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdWZXJpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UHJvdmlkaW5nRmluYW5jaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVByb3ZpZGluZ0dvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZWNvdmVyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckRpc2luZmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckZpbmFuY2lhbFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JSZWZ1ZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U3VibWl0dGluZ1F1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRoYXRSZWNlaXZlZERpc2Nsb3N1cmVTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VGhhdFJlbWl0c1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9BcHBlYXJCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9BcHByb3ZlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b2JlYWR2aXNlZC1Xcml0dGVuT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQmVCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9CZUJpbGxlZEZvck90aGVyVGhhbkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0ZpbGVQZXJzb25hbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvTGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9QZXJmb3JtUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUHJpbnRTb21lRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Qcm92aWRlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQWxsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWVkSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpZWRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb21tZXJjaWFsSW52b2ljZVJlbWl0dGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvcnJlc3BvbmRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVsZWN0cm9uaWNNZW1vT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVGcmVpZ2h0QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnNwZWN0aW9uUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUludml0YXRpb25Ub09mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUludm9pY2VGT3JHb29kc09yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW52b2ljZUZvckxlYXNlUGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTGltaXRhdGlvbnNPZkhlYXZ5RWxlbWVudHNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTWF0ZXJpYWxSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU5vbi1DdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU9yZGVyVG9TdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUGFja2luZ0NyYXRpbmdBbmRIYW5kbGluZ0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQYXBlck1lbW9PZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlUHJvcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNjYWxlVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNoaXBwaW5nTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU2hpcHBpbmdOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVN0YXRlbWVudE9mQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTdGF0ZW1lbnRPZkZlZXNEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVRlY2huaWNhbERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVUcmFuc3BvcnRhdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1dob21BY2tub3dsZWRnbWVudFNob3VsZEJlU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1dob21Eb2N1bWVudHNBcmVUb0JlUHJlc2VudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvV2hvbVByb3Rlc3RTdWJtaXR0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2FpdmluZ1JlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaERlbGl2ZXJzQ29uc2lnbm1lbnRzVG9UaGVUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaFBpY2tzVXBDb25zaWdubWVudHNGcm9tVGhlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hvU2lnbmVkVGhlRGVsaXZlcnlSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdpdGhLbm93bGVkZ2VPZkFmZmFpcnNPZlRoZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2l0aFBvd2VyVG9Wb3RlU2VjdXJpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Q29tcGFuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RWR1Y2F0aW9uVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50UmVwcmVzZW50YXRpdmVTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0NvbXBhbnlOYW1lT3JJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyT2ZMYXN0UmVzb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDb21wYW55TmFtZU9ySWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5LVRvUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGVzdHJpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGlhdHJpY0FjdXRlSW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uRm9yV2hvc2VCZW5lZml0UHJvcGVydHl3YXNTZWl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT25DbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFDaGlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFuZFdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eVdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5DbGluaWNPckdyb3VwUHJhY3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbkhvc3BpdGFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4tU3BlY2lhbGlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnRCb3VuZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJvdHRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEaXN0aWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZlBlcmZvcm1hbmNlQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWludGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nT3JNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1NjaGVkdWxlT3JNYXRlcmlhbFJlbGVhc2VJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5TcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRDbGVhcmFuY2VPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2RpYXRyaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2ludE9mU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGxpbmdTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1TZWNvbmRhcnlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90ZW50aWFsU291cmNlT2ZTdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyT2ZBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1LRGF5Q2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlDdXN0b21lck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VQZXJpb2REZXNpZ25hdGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0J1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRHcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlYnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOYW1lT2ZGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c093bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RpdGxlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUcmFkZVVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2hlY2tTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUluc3VyZWRPclN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRlcmV4Y2hhbmdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludGVybmF0aW9uYWxUZWxlY29tQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludHJhLUxBVEFDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW52ZW50b3J5Q29udHJvbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVN1cHBvcnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxCb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsRXhlY3V0aXZlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFzZUp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGl0bGVFdmlkZW5jZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9Cb25vQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRSZXNwb25zaWJpbGl0eUZvck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UG9zaXRpb25Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTZXJ2aWNlc0FuZFJlcGFpcnNDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvb3JkaW5hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPckJ1aWxkaW5nTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvU2VDb3Vuc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljQ2hpbGRPckFkb2xlc2NlbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNDb25zdWx0YXRpb24tTGlhaXNvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VkdWNhdGlvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VtZXJnZW5jeVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0dlcmlhdHJpY1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0hlYWx0aEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0lucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljT3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY1BhcnRpYWxIb3NwaXRhbGl6YXRpb25Qcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNob2xvZ2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljQWx0ZXJuYXRpdmVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aFNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoU2VydmljZUluZGlhblNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljb3JQcml2YXRlT3JnYW5pemF0aW9uRm9yVGhlRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1ByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzRGVwYXJ0bWVudEJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmeWluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YXRpb25SZXF1ZXN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW1wbGFudHNVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0NvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRNZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Wm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0NvcnJlc3BvbmRlbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc1N1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZhY2lsaXR5U2NoZWR1bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BvaW50Rm9yQ3VzdG9tZXJTYW1wbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdTdWItTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQ2l2aWxvckxlZ2FsTGlhYmlsaXR5UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZC1LZWVwaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyZWF0aW9uYWxUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnlPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnVzaW5lc3NOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdOb25wYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25UcmlidW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhckRlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVN0YXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlTdGF0ZUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25JbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbk91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbWJ1cnNpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUludGVybWVkaWFyeU9yQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRHJheW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZVRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmRlcmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyaW5nT3V0bGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPclJlZnVyYmlzaExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyc05vbWluYXRlZEFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByb2R1Y3RpdmVIZWFsdGhTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGVEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZvaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZU9yRG9taWNpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jeUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEluc3RydWN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BpcmF0b3J5VGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwaXRlQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUV4aGliaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVHb3Zlcm5tZW50QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJvY2Vzc2lvbmFpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0eU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXJhbEhlYWx0aENsaW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBc3Npc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sLUJhc2VkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JlZW5pbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUludmVudG9yeUNvbnRyb2xBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TG9jYXRpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVdhcnJhbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTGV2ZWxQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbjhBUHJvZ3JhbVBhcnRpY2lwYW50RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJBc09mZmljaWFsbHlSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJPZkZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzQ29ycmVzcG9uZGVudEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmlvck1lbWJlcnNoaXBQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWFuY2VTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsdGVyZWRXb3Jrc2hvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGluZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nU2NoZWR1bGVJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWJsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmlmaWNhbnRPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUGhvdG9uRW1pc3Npb25Db21wdXRlcml6ZWRUb21vZ3JhcGh5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZU9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ29yT3RoZXJMb25nLVRlcm1DYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3RDaGFydGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQmFzZVN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxDb250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5RGlzYWR2YW50YWdlZEluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5SW5zdXJlZFBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdGllc0NvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlPZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNBbmRBbmFseXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9BbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0lmRGlmZmVyZW50RnJvbUJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZVByb3ByaWV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlUGFydHlPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvdW5zZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkTW9iaWxlUmFkaW9TZXJ2aWNlTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkT3V0cGF0aWVudFByb2dyYW1Gb3JBSURTT3JBUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVjaFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvcnRzTWVkaWNpbmVDbGluaWNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZUluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWRDb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyZWRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlhdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlS2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yLU5vbWluYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvcldpdGhEaXJlY3RQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJncm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdE9mSW5xdWlyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlck9mU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc1NjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnlEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzZnVsSm9iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc2luZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyT3JNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nUGVyc29ubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Rm9yQWRkaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlGb3JBbnRpZHVtcGluZ09yQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGlzY2hhcmdlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlTWFuYWdlbWVudEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycGx1c0RlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3ItUG9mZXNzaW9uYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JUb3BvZ3JhcGhpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJ0aWFyeVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyQ2lyY3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNSYWRpb2lzb3RvcGVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU1hcmtldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlSW5zdXJhbmNlU2VydmljZXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0Rlc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0ZhYnJpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BQYXJlbnRDb21wYW55SW5TYW1lQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZVN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlVW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Q2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRlck9mSGF6YXJkb3VzV2FzdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdW1hQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWVzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0T2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RPckVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXJjdWxvc2lzQW5kT1RoZXJSZXNwaXJhdG9yeURpc2Vhc2VzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlU2FtZUNvdW50cnlQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRyYXNvdW5kVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hc3NpZ25lZEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5leHBlY3RlZEhhbmRsaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNDdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNPdmVyc2Vhc1NlY3VyaXR5QWRtaW5pc3RyYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2l0eS1Db2xsZWdlT3JTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNlcnZpY2VhYmxlTWF0ZXJpYWxDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbk1hbmFnZW1lbnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkTmV0d29ya1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlU2FsdmFnZUFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTWFzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkxvYW5BdXRob3JpemVkU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25Mb2FuR3VhcmFudHlBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcmlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyeUhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWN0aW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZGVvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50ZWVyU2VydmljZXNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVhcm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUtlZXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDYXNpbmdEZXB0aEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBhZENvbnN0cnVjdGlvbkNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xseS1Pd25lZFN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpbm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUHJvc2VjdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3NMYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzc1NtYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21lbnNIZWFsdGhDZW50ZXJPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtUmF5UmFkaWF0aW9uVGhlcmFweVVuaXQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyUmVmZXJlbmNlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50Q29kZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cmFjdFJlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250cmFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJRdW90ZVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlck9yZGVyUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyUmVmZXJlbmNlcyIgdHlwZT0iT3JkZXJSZWZlcmVuY2VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZk51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9IlJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udHJhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRyYWN0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250cmFjdCIgdHlwZT0iTGlzdE9mQ29udHJhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdElEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRyYWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTeXN0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3QiIHR5cGU9IkNvbnRyYWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklkZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJZGVudGlmaWVyIiB0eXBlPSJJZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBZ2VuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeUNvZGVkIiB0eXBlPSJBZ2VuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeSIgdHlwZT0iQWdlbmN5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFnZW5jeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQU1WQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJDRC1UaGVNaWNyb2NvbXB1dGVySW5kdXN0cnlBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNHSUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDT1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRUNNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlIQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYWJhbWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWludW1Bc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5BcHBhcmVsTWFudWZhY3R1cmVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkZ1cm5pdHVyZU1hbnVmYWN0dXJlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Jcm9uQW5kU3RlZWxJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTWVkaWNhbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBhcGVySW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBXQUFuZE9DU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuU29jaWV0eUZvckF1dG9tYXRpb25JblBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRleHRpbGVNYW51ZmFjdHVyZXJzSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTlNJQWNjcmVkaXRlZFN0YW5kYXJkc0NvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJpem9uYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJrYW5zYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlCdXllck9yQnV5ZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5RGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYXJrZXRQbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU5hdGlvbmFsVHJhZGVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlPd25lck9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5UGFydHlPcmlnaW5hdGluZ1RoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlTZWxsZXJPclNlbGxlcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVRyYW5zcG9ydENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1HZWxkYXVzZ2FiZWF1dG9tYXRlblNlcnZpY2VHZXNlbGxzY2hhZnRNQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUF1c3RyaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtQXVzdHJpYW5QVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULVZlcmJhbmRPZXN0ZXJyZWljaGlzY2hlckJhbmtlblVuZEJhbmtpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BQ09TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFJSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFQQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFRSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUF1c3RyaWFuQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLURPSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtSElDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1MSUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1OQ0NIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ST0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtVHJhZGVnYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFZU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbk1pbmlzdHJ5T2ZGaW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWxsY29yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0luZHVzdHJ5U3lzdGVtc0Fkdmlzb3J5Q29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUi1CYW5jb0NlbnRyYWxEb0JyYXppbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlItTUFBbmRSQUFBbmRMSU1ORVRBbmRSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtQ1BBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1DU0lPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRnJlaWdodENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJiaWRlTWFudWZhY3R1cmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtUmV2ZW51ZUNhbmFkYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtU0NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYSUlJRDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJMDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJQjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhYSVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFRklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQWRtaW5pc3RyYXRpb25GZWRlcmFsZURlc0NvbnRyaWJ1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUFzc29jaWF0aW9uU3Vpc3NlQ29kZURlc0FydGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DYXJidXJhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DZW50cmFsZVN1aXNzZVBvdXJMSW1wb3J0YXRpb25EdUNoYXJib24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILURpcmVjdGlvbkdlbmVyYWxlRGVzRG91YW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRGl2aXNpb25EZXNJbXBvcnRhdGlvbnNFdEV4cG9ydGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRW50cmVwcmlzZURlc1BUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtTWluaXN0cnlPZlRheGF0aW9uQ2VudHJhbEN1c3RvbXNBbmRUYXhBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtT2ZmaWNlRmlkdWNpYWlyZURlc0ltcG9ydGF0ZXVyc0RlRGVucmVlc0FsaW1lbnRhaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtU3dpc3NTZWN1cml0aWVzQ2xlYXJpbmdDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtVGVsZWt1cnNBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lFQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVBc3NpZ25lZEJ5VGhlT3JnYW5pemF0aW9uVGhhdElzVGhlVWx0aW1hdGVEZXN0aW5hdGlvbk9mVGhlVHJhbnNhY3Rpb25TZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPLURJQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yYWRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tYW5kZXJSb21lQWlyRGV2ZWxvcG1lbnRDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNvcmRFRElHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGljdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25zT25TQURBbmRUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXJBbmRCcmFzc0ZhYnJpY2F0b3JzQ291bmNpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08tU0JEQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1NJRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVU0lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUFSRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQkRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1EVEFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1FRElCQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VMb2dpc3RpY3NBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdEViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR2VybWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HZXJtYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HTUJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxhd2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mQWlyRm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkFybXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhlYWx0aEFuZEh1bWFuU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhvdXNpbmdBbmRVcmJhbkRldmVsb3BtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVGhlTmF2eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtU2llbWVuc0FHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1WREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRGQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0aW9uR2VuZXJhbGVEZXNEb3VhbmVzRXREcm9pdHNJbmRpcmVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZDb2x1bWJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLUVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstTUhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1OQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLVBCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlidWlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpZWxOb3JkaWNGb3J1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJRklDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFSURYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY1V0aWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0luZHVzdHJpZXNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVNEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMtT0RFVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTLVNwYW5pc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1FRElGSUNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtRVRJUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtUk9GRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBU0xJTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1GaW5uaXNoQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktVEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLVRoZUZpbm5pc2hCYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JpZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1BR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUFydkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUJhbnF1ZURlRnJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1DRk9OQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQ05BTVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1EQ1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLURHSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRlJBTkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElUUkFOU1BPUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUdBTElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1HRU5DT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUlOU0VFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1SQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFCSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQUJUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXJ0aWNsZU51bWJlckFzc29jaWF0aW9uTGltaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXNzb2NpYXRpb25Gb3JQYXltZW50Q2xlYXJpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQkFDU0xpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUNIQVBTQW5kVG93bkNsZWFyaW5nQ29tcGFueUxpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUZMRUVUTkVUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1ITUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItVGhlQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcmdpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGhpY3NDb21tdW5pY2F0aW9uc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSLUdyZWVrQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXdhaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLLUhvbmdLb25nQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBUFNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0FPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRhaG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRS1SZXZlbnVlQ29tbWlzc2lvbmVyc0N1c3RvbXNBRVByb2plY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMLUlzcmFlbEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbGlub2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyQ29udGFpbmVySW50ZXJGcmlnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc29jaWF0aW9uT2ZDb3Jwb3JhdGlvbkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzb2NpYXRpb25PZkluZHVzdHJpYWxBY2NpZGVudEJvYXJkc0FuZENvbW1pc3Npb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRzT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJb3dhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkFuZFN0ZWVsU3RhbmRhcmRzQ29tbWl0dGVlSVNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUy1JY2VsYW5kQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VTZXJ2aWNlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUFzc29jaWF6aW9uZUJhbmNhcmlhSXRhbGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUl0YWxpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULVNvY2llYXRhSW50ZXJiYW5jYXJpYVBlckxBdXRvbWF6aW9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFwYW5lc2VTdGFuZGFyZHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtSmFwYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1NT1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU1TQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTkFDQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbnNhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VudHVja3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNpbmdJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUFuZEFubnVpdHlJbmR1c3RyeUNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEktTGllY2h0ZW5zdGVpbkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzUmVnaXN0ZXJPZlNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3Vpc2lhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVS1MdXhlbWJvdXJnQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJ5bGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzc2FjaHVzZXR0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljaGlnYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm5lc290YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2lzc2lwcGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3NvdXJpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250YW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhbmtlcnNBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktRGFnYW5nTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWxjb2hvbEJldmVyYWdlQ29udHJvbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCdXNpbmVzc0FuZEVkdWNhdGlvbmFsUmFkaW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NGb3Jtc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENlbnRlcmZvclN0YXRlQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdHRvbkNvdW5jaWxPZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbE1lcmNoYW50c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFdob2xlc2FsZURydWdnaXN0c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQVRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmFsR2FzVXRpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQ0lDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWJyYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2YWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIYW1wc2hpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0plcnNleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWV4aWNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdzcGFwZXJBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkZQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklDQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRoZXJsYW5kc1JhaWx3YXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1CYW5rR2lyb2NlbnRyYWxlQlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUJFQU5FVEJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1FQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5Q2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5R2lyYWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1OZXRoZXJsYW5kc0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9yd2VpZ2lhblN0YXRlUmFpbHdheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5PUlBSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5JbnRlcmJhbmtSZXNlYXJjaE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhLVRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Rm9ydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aLU5ld1plYWxhbmRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mTWFuYWdlbWVudEFuZEJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVByb2R1Y3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPa2xhaG9tYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbEluZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVnb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9TSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbm5zeWx2YW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVubnN5bHZhbmlhQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULUNCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1Qb3J0dWd1ZXNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtU0lCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZUluZm9ybWF0aW9uSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJob2RlSXNsYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVLUJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUtU0ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBLVNhdWRpQXJhYmlhQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN2ZW5za2FCYW5rZm9lcmVuaW5nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN3ZWRpc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVNBQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFnZW5jeUFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50TG9hbkd1YXJhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlIZWxwSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm5lc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRpbGVEaXN0cmlidXRvcnNBc3NvY2lhdGlvbkluYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVERDQy1FRElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVy1DaGluZXNlVGFpcGVpQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFctVHJhZGUtdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVORUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkNUQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0NvdXJ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzTWFyaW5lQ29ycHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc051Y2xlYXJSZWd1bGF0b3J5Q29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFJQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFpclRyYW5zcG9ydEFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BSVNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQU5TSUFTQ1gxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BU1RNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJBVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJYQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ0hJUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNJRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DT1BBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREFuZEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESEhTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNDVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURMTVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9EQUFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRFNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRUlBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRklQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRk1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUdTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ITDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUlTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTUFSQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5BQkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQUlDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05hdGlvbmFsQ2VudGVyRm9ySGVhbHRoU3RhdGlzdGljc0NvbW1pc3Npb25PZlByb2Zlc3Npb25hbEFuZEhvc3BpdGFsQWN0aXZpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OYXRpb25hbFJldGFpbEZlZGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5DQ01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OSVNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5XREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9EVEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9GQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9NQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1URENDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVOLVNQU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNDZW5zdXNCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1WSUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1XU1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGFoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXR5SW5kdXN0cnlHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVybW9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc2hpbmd0b24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildlc3RWaXJnaW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0hNSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpc2NvbnNpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3lvbWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3JHZW5lcmFsT2ZDYW5hZGEiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VTaXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvcmRFdXJvcGVlblJlbGF0aWZBdVRyYW5zcG9ydEludGVybmF0aW9uYWxEZXNNYXJjaGFuZGlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRBbmFseXNpc0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0luZm9ybWF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJlbGF0aW9uc2hpcFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25NZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbk1ldGhvZFN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXRlUHJpbmNpcGFsZUV4ZXJjZWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRPdXRjb21lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaWRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ29tbW9kaXR5QW5kU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRNaXNzaW9uRGVzaWduU2VyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydE9yQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUZXJtaW5hbElkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBhdGllbnREaWFnbm9zaXNSZWxhdGVkR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQYXRpZW50UmVmaW5lZERpYWdub3Npc1JlbGF0ZWRHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25Mb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnRDb2RlLUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUHN5Y2hpYXRyaWNBc3NvY2lhdGlvbkRpYWdub3N0aWNTdGF0aXN0aWNhbE1hbnVhbE9mTWVudGFsRGlzb3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblNvY2lldHlGb3JUZXN0aW5nQW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hUG9sYXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hU3RydWN0dXJlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Q2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkFja25vd2xlZGdlbWVudEFuZEVycm9yQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblF1ZXN0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aWNsZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFJlY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U3RhdHVzT3JUcmFuc2FjdGlvblJlcG9ydGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHJhbnNmZXJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzRGVwcmVzY3JpcHRpb25EaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNEZXByZXNjcmlwdGlvbkV4Y2VwdGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhdGVFZGlOZXR3b3JrRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZURlc2NyaXB0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZU1hc3RlckRlc2NyaXB0aW9uSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N3aXRjaFJlbGVhc2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdXJlZERlbGl2ZXJ5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkRGF0YVByb2Nlc3NpbmdFcXVpcG1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBZG1pbmlzdHJhdGlvbkluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0JyYW5jaFNvcnRpbmdJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rU2VjdXJpdGllc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzT2ZKdXJpc2RpY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZFJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkT2ZmaWNlSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDbGF1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVBhcnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5UmVzcG9uc2liaWxpdHlMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5U2hpcExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ3JlZGl0UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ0RldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1JlcG9ydFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1NlY3VyaXRpZXNJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaW5hbmNpYWxJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMZWdhbFN0cnVjdHVyZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ25EaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW50ZXJFZGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VEZXNpZ25hdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT3JpZ2luQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaERpc2NvdW50U3RpcHVsYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VpbGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUmVxdWlyZW1lbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlTdWJkaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1QYXltZW50UmVtYXJrQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZlBpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VTdGF0dXNUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VBdXRvbWF0ZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50c0lkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVuaXZlcnNhbElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FzdERlc2lnbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29nbml6YW5jZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1JbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLUxvc3NDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qb2ludHNPZkltcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaXRlcm1zMTk5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFuZEdvdmVybm1lbnRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zQ29tbW9kaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zSGF6YXJkb3VzTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1NhZmV0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zUm91dGluZ0lkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25UeXBlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50UmVxdWVzdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VSZXZpZXdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jbHVzaW9uRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUHJlbWlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkFuZENvbnRhaW5lcml6YXRpb25Qb2ludENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0b3JBbGVydExpc3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbmRSb2xsLU9uT3JSb2xsLU9mZk51bWJlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZW50SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDbG9zZS1PdXRHcm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVsaXZlcnlEYXRlUmV2aXNpb25BZ2VudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZFJlcG9ydGluZ1RyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckFsZXJ0TGlzdFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJldmlld0xpc3RTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudERlZHVjdGlvbk9yQ29sbGVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudExpbmVJdGVtU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTaGlwbWVudEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRJbnZlbnRvcnlJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXREZXNpZ25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGlvbk9mZmVuc2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUxvZ2lzdGljc1Byb2dyYW1TdXBwb3J0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlRmluYW5jaWFsRmlsaW5nQ3JpdGVyaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN0YXRlbWVudEZpbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25PckNoYW5nZUZvclN0b3JhZ2VJdGVtUmVjb3Jkc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlBbmRBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlDb2RlLUZpbmFuY2VBbmRBY3F1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeVN1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkFkanVzdG1lbnRSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEFwcGVhcmFuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRDYXNlU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RG9jdW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRJc3N1ZWRXYXJyYW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdFdmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBhcnR5U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBsZWFkaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlTW9kaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNwYS1DYW5hZGlhblBheW1lbnRzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbENoYXJnZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbGl0eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdWlzaW5lVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBc3NldERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREZW50YWxUZXJtaW5vbG9neUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VMZXZlbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJXaXRoaW5Db3VudHJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9taXplZE5vdGljZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQXJlYU9mVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEb21lc3RpY1BvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9yZWlnblBvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5zcGVjdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NpbXBsaWZpZWRQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTcGVjaWFsQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdGF0dXNPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNpdEd1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVmFsdWF0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1BhY2tpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVTaGlwcGVkT3JSZWNlaXZlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckJ1c2luZXNzVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbmRhbnRQbGVhVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQW5kQWxsb2NhdGlvbnNTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpZW5jeUNhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2llbmN5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpbnF1ZW5jeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRlcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pbGl0YXJpemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlQXZhaWxhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUV2ZW50UHJvYmxlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZU9wZXJhdG9yVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVVzYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNFbmNvdW50ZXJlZER1cmluZ0V4YW1pbmF0aW9uQW5kSW52ZXN0aWdhdGlvbk9mSW5kaXZpZHVhbHNBbmRQb3B1bGF0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY0FuZFN0YXRpc3RpY2FsTWFudWFsT2ZNZW50YWxEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdE51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lTdGF0dXNPckRpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxBdXRob3JpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZEJ5Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9kYWFjLURlcGFydG1lbnRPZkRlZmVuc2VBY3Rpdml0eUFkZHJlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0xpbmVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zZUZvcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRHVlUHJvY2Vzc1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRXh0ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnU3RhdHVzQWR2ZXJzZUV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bXBpbmdPckNvdW50ZXJ2YWlsaW5nQXNzZXNzbWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVtcGluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5zLUR1bkFuZEJyYWRzdHJlZXRQbHVzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuc1N0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uMlBsdXMyRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVRheE9yRmVlUGF5bWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHluYW1pY0dlbmVyYXRvclNldENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5bmFtaWNMb2NvbW90aXZlVGFnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpcmEtSWQtRWRpUmVnaXN0cmF0aW9uQXV0aG9yaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRFcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbFN0dWR5QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb21hZ25ldGljVHJhbnNtaXR0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5oYW5jZWRQYXJ0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVsYXRpb25zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdGF0dXNMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3NlbnRpYWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRUaW1lT2ZBcnJpdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVUeXBlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0aW5nTWV0aG9kU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRobmljaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0ZVdvcmtDYW5kaWRhdGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRlV29ya0NhbmRpZGF0ZVJlYXNvbkxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRBYmF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudE9yRXhwb3N1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlYXBwZWFyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2F2YXRpb25JbmZvcm1hdGlvbkNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNYXRlcmlhbERpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q29tbW9kaXR5Q2xhc3NpZmljYXRpb24tVVNTY2hlZHVsZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5zaW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5U2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVUb0F3YXJkUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlUGxhbkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVBvb2xGZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tUmVtaXR0YW5jZVByb2dyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1TcGVjaWFsRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVJlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRmluYW5jZUNvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhlYWx0aENhcmVDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMb2dpc3RpY3NDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQcm9jdXJlbWVudENvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zcG9ydGF0aW9uQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBbmFseXNpc0NhdGVnb3JpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbUFsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1BdHRyaWJ1dGVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbVJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRTZXJ2aWNlQ2FzaC1MaW5rQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSZWdpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudEZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93T2ZUaGVHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sbG93LVVwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGluZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0NvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdSZXN0cmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1SZW1pdHRhbmNlUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1TcGVjaWFsQ2hhcmFjdGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1JlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZFNpdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3lCYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFB1cnBvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5Pckxvc3NJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvbkN1c3RvbWVyU3VwcGx5Q2VudGVyTnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFRlcnJpdG9yeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldE1vdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGFzc0FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlT2ZEaWZmaWN1bHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhaXJDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pemVkU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0NyZWRlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1Jlc3BvbnNlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVDbGFpbVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW1QcmluY2lwYWxQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkR1cmFibGVNZWRpY2FsRXF1aXBtZW50UmVnaW9uYWxDYXJyaWVyQ2VydGlmaWNhdGVPZk1lZGljYWxOZWNlc3NpdHlGb3JtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb3ZpZGVyQ2hhcmFjdGVyaXN0aWNzQW5kUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvdmlkZXJUYXhvbm9teSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5T3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvYmJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2QxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmeWluZ0NoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlEaXNjbG9zdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tdW5pemF0aW9uSW5qZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0QXhpc09yQW5hbG9nUG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdFJlY29yZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudENvbnNlcXVlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50UmVsYXRlZEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY290ZXJtczE5ODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxJbnN1cmFuY2VGaW5hbmNpYWxEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxQYXJ0aWNpcGF0aW9uSW5Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZXF1ZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVNlbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvdmVyYWdlRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbmZvcm1hdGlvbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhbkRlc2NyaXB0aW9uQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJRdWFudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvblByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uUHJpbmNpcGFsUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb24tSWNkLTktQ21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmREZXNpZ25hdGlvblN5c3RlbUZvclRlZXRoQW5kQXJlYXNPZlRoZU9yYWxDYXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25TdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50RnVuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnNRdWFsaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU291cmNpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYkNoYXJhY3RlcmlzdGljc0xvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JpZ2luYXRvckxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaWZlSW5zdXJhbmNlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbEhlYXJpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxPcmRlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbFNlbnRlbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaW5kT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpbmRPZk1vZGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZXN1bHRzSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5VGVzdENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQ2FzZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsRXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZSZWNvbW1lbmRhdGlvblJhdGluZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5UHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTZXJ2aWNlRmVhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTdGF0dXNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZVJlaW5zdXJhbmNlTWVzc2FnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGVPZkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbnNGb3JUYXJpZmZDYWxjdWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc0FuZENvZGVzQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc0NvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzRGVzY3JpcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzU2V2ZXJpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JGb3JjZVByb2dyYW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEluZGljYXRvckNvZGUtUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZUJlcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVXaGFyZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VPcmdhbml6YXRpb25JRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VUcmFkaW5nUGFydG5lcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZDb21tdW5pY2F0aW9uc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaXphdGlvbk9mQ29udHJhY3RBZG1pbmlzdHJhdGlvblNlcnZpY2VzU3lzdGVtRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpYUFuZFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxCZW5lZml0c1NjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1PZlRyYW5zbWlzc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck9yZ2FuaXphdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RzT2ZQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFuZENpdmlsaWFuR3JhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFzc2lzdGFuY2VQcm9ncmFtQWRkcmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaW9uSW1wYWN0U3RhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlGdW5jdGlvbkRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbmRleFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLU1lZGlhT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYWNoYS1OYXRpb25hbEF1dG9tYXRlZENsZWFyaW5nSG91c2VBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsRm9yUHJlc2NyaXB0aW9uRHJ1Z1Byb2dyYW1zUmVqZWN0T3JQYXltZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVBhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RhbmRhcmRUb290aE51bWJlcmluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRGVidENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mU3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZTdWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Mb25nZXJDb25zaWRlcmVkRm9yQXdhcmRSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWVuY2xhdHVyZUFjdGl2aXR5Q2xhc3NpZmljYXRpb25FY29ub215Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVBvc3RhbFRvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1lQWN0aXZpdGVGcmFuY2Fpc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmxpZ2F0aW9uVmFyaWFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvbk5hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25QYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25Tb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNhcnJpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckFuZFJlbGVhc2VPcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc05hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNQYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNTb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVPck92ZXJ3ZWlnaHRDcmVkZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBSaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VGYWlsdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0FuZE9yVW5wYWNraW5nRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRPZkJvZHlBZmZlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RXZlbnRQcm9ibGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJlaGF2aW91clJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRlc3RyaWFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eUFuZENvbnRlbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQmlsbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUxhbmRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTGVhc2VTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3REaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFBvaW50LU9mLVNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RTZWxsaW5nQXJyYW5nZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RWYWx1ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJlZ3VsYXRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5Q2FsY3VsYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVW5pdGVkU3RhdGVzR2VvbG9naWNhbFN1cnZleUZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxDbGFzc2lmaWNhdGlvblN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsU2h1dC1JblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbFRlc3RJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudENsZWFyYW5jZU9mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5T25DbGFpbUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5UmVzZXJ2ZVZhbHVhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhbElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsU2VydmljZUNhcnJpZXJSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGNvZGVEaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RNYXJrZXRTdHVkeVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aW9uRGF0YUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGlvbk1hdGVyaWFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmVudGl2ZU1lYXN1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbERpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUGFydHlDaXRpemVuc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlckZpbmFuY2lhbEhpc3RvcnlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RRdWFsaXR5RGVmaWNpZW5jeVJlcG9ydFN1bW1hcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3VwcGx5Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxEZXNpZ25hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtT3JpZ2luYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1ZZWFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU93bmVyc2hpcEV4dGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPd25lcnNoaXBUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlSZWNvcmRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlVbmRlcndyaXRpbmdDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0T2ZmaWNlckluc3RydWN0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cnBvc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QWxlcnRMaXN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlU2l0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclVuaXRQYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnlPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9GcmVxdWVuY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1NlcnZpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1N5c3RlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxBZGRpdGlvbmFsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGNhckxldHRlck1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxEb2N1bWVudE5hbWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFuZGxpbmdSZXN0cmljdGlvbnNBbmRJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYXJtb25pemVkQ29kaWZpY2F0aW9uT2ZUYXJpZmZzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFybW9uaXplZEVxdWlwbWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxVbmlmaWVkTm9tZW5jbGF0dXJlT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbXBhbnlOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlGcm9udGllckFuZFRyYW5zaXRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUxvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVNlcnZpY2VzSGFybW9uaXplZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nU3VtbWFyeVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JDb250cmFjdERlbGl2ZXJ5RGF0ZVJldmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRGVsYXllZENsb3NpbmdPZkNvbnRyYWN0RmlsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckRpc3Bvc2FsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRmluYW5jaWFsSXRlbURldGFpbENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yUHVibGljUmVjb3JkRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JSZXF1aXNpdGlvbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQmlsbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGF0aW9uc1JlZ2FyZGluZ0RlbGF5ZWREZWxpdmVyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkUHJlY2VkZW5jZUJhc2VkT25JdHNDdXJyZW5jeUluVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlQW5kU3RhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb25Vbml0T3BlcmF0aW5nTW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlTW9uZXRhcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBvbGljeUF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREZXZpY2VBcHBsaWNhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWdpb3VzQWZmaWxpYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1lZGlhbEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZUFjY2Vzc29yaWVzQW5kU3BlY2lhbEVxdWlwbWVudE9uUmFpbGNhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydERpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlQnV5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY3lJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsQW5kQ29tbWVyY2lhbFJvb21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0aW9uc0FuZFByb2hpYml0aW9uc1BsYWNlZE9uVGhlUmUtVXNlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VsdEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDaGFyYWN0ZXJpc3RpY0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1blR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEZpdG5lc3NFbGVjdHJvbmljUmVjb3JkU3lzdGVtc0Vycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kRml0bmVzc0VsZWN0cm9uaWNSZWNvcmRTeXN0ZW1zU3Vic2NyaXB0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlIYXphcmRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eVJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJpY2VDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlRGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVFeHRyYWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXZhbk93bmVyc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeURpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U291cmNlT2ZJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQW5kQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T3BlcmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9yUGF5b3V0T3B0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRBY2NlcHRhbmNlRGlzY3JlcGFuY3lFeHBsYW5hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVsZWFzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVN0YXRlUmVnaXN0cmF0aW9uU3lzdGVtQW5kT3BlcmF0aW5nQXV0aG9yaXR5Q3JlZGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVXNlTGFiZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplQW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpblRvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEFybXNFcnJvclRyYW5zYWN0aW9uUmVqZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxBcm1zVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb25DYW5jZWxsYXRpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU1haW50ZW5hbmNlQW5kUmVjb3ZlcmFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRlcG9zaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRpc2Nsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMZWFkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnRyYWN0UHJvdmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWFya2V0aW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXJraW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hdGVyaWFsSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvZ3JhbVJlcXVpcmVtZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlaW1idXJzYWJsZVByb3Zpc2lvbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVxdWlyZW1lbnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZXF1aXJlbWVudHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRBY2NvcmRpbmdVU0VtYmFyZ29SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Q2xhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Rm9yRXhwb3J0QWNjb3JkaW5nTmF0aW9uYWxQcmVzY3JpcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvbkNsYXNzaWZpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxBZG1pbmlzdHJhdGl2ZUluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxOYXR1cmVPZlRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbE9iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNCdW5kZXNBbXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tGdW5kT3JOb24tU3RvY2tGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50QWN0aXZpdHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudEF3YXJkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25BY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblBheW1lbnRPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblJlcXVlc3RDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25SZXNwb25zZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZVR5cGVPZlBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhPckxpbWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbW9uc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5QWNjb3VudGluZ0NsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzU3RvY2tUdXJub3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5Q29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURlc2NyaXB0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ludGF4Tm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZU9mSHVtYW5BbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFzc2Vzc21lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9yRmVlRXhlbXB0aW9uUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGFydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQXNzZXNzbWVudENoZWNrbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lRGlyZWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZUNoYXJhY3RlcmlzdGljTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZU93bmVyTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVR5cGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcnRpYXJ5RGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nRGVtb2dyYXBoaWNDYXRlZ29yeUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZVF1ZXN0aW9uQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTdGF0aXN0aWNhbENhdGVnb3J5Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXN1bHRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVEb2N1bWVudENvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUV4Y2VwdGlvbkFuZFJlcXVpcmVtZW50Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TdGF0dXNJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkhvbGRpbmdEZWxheUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uTW9kZU9yTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Nb2RlUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Qcmlvcml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGVBbmRCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5U3ltYm9sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZW5kUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQWRqdXN0bWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBbmRDYXVzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVEdWUtSW5JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJZGVudGl0eUNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJbnNwZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZBc3NldHNBbmRMaWFiaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQXNzaXN0YW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNhcmdvQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb250cmFjdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRGVsYXlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaXJtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5kdXN0cmlhbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbnF1aXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSXNzdWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMb2NhdGlvblJlY29uY2lsaWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTWVkaWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU3RvcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlN1cnZleVF1ZXN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlUGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVQaHlzaWNhbEludmVudG9yeU9yVHJhbnNhY3Rpb25IaXN0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNpcGllbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNsYWltZWRQcm9wZXJ0eUFkZGl0aW9uc0RlbGV0aW9uc0FuZERlZHVjdGlvbnNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jbGFpbWVkUHJvcGVydHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNpZGVudGlhbEFwcHJhaXNhbEF0dHJpYnV0ZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0NvbW1vbkNvZGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc1N0YW5kYXJkUHJvZHVjdHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzRGVwYXJ0bWVudE9mSGVhbHRoQW5kSHVtYW5TZXJ2aWNlc09mZmljZU9mVml0YWxTdGF0aXN0aWNzRS1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGljaXRlZFByb3Bvc2FsUmVqZWN0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uSW5ub2N1bGF0aW9uT3JJc29sYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlT2NjdXBhbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3RhdHVzQW5kVGVybXNPZkNhcnJpYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3Rvd2FnZUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3VzdGFpbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZXdQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW9sYXRpb25UeXBlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZURvY3VtZW50TnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTWFuaWZlc3RSZWZlcmVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJlc2VydmVNYXRlcmlhbFJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb21tb2RpdHlBbmRTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclRlcm1pbmFsSWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9yRnJhZ2lsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlbkRpc2NvdmVyZWRMb29rdXAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RUeXBlQ29kZWQiIHR5cGU9IkNvbnRyYWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0VHlwZSIgdHlwZT0iQ29udHJhY3RUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckRpZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlUGVyRGllbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkR3Jvd2luZ0VxdWl0eU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eUFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5VmV0ZXJhbnNBZmZhaXJzRml4ZWRSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbFNlY29uZE1vcnRnYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsRml4ZWRSYXRlTW9ydGdhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eVZldGVyYW5zQWZmYWlyc0dyYWR1YXRlZFBheW1lbnRNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZENvbnZlbnRpb25hbEdyYWR1YXRlZFBheW1lbnRPclN0ZXBSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbEFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzSW5jZW50aXZlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0U2hhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzQXdhcmRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzRml4ZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVJpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtb3JBY3R1YWxDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZUZpcm1UYXJnZXRXaXRoUGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVGaXJtVGFyZ2V0V2l0aG91dFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlUmVkZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVTdWNjZXNzaXZlVGFyZ2V0V2l0aFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlU3VjY2Vzc2l2ZVRhcmdldFdpdGhvdXRQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUF3YXJkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Db3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyb2FjdGl2ZUZpeGVkUHJpY2VSZWRldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1GaXhlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVjb25vbWljUHJpY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3NwZWN0UmVzZXJ2YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVQZXJjZW50YWdlYXNGaWxtUmVudGFsRWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lYW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eURhdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFydERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVuZERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRpdHlEYXRlcyIgdHlwZT0iVmFsaWRpdHlEYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIgdHlwZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZWQiIHR5cGU9IlJlZmVyZW5jZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcG9ydGluZ1JlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwb3J0aW5nU3ViUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VDb2RlZCIgdHlwZT0iUmVmZXJlbmNlQ29kZWQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYmJyZXZpYXRlZE5ld0RydWdBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZURVTlNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VQdXJjaGFzZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZVN1cHBsaWVySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc29yaWFsUmFpbERpdmVyc2lvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzb3JpYWxTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0VxdWlwbWVudExvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nRmlsZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE1hbmFnZXJzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBhcnR5c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXJ0eXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXlhYmxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nQmFua3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZUN1c3RvbWVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVPcGVuSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlU3RhdGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50T2ZPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT25TeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NlZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRSZXByaWNlZENsYWltUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFJlcHJpY2VkTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50TWVtb0NoYXJnZUJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNhcnlDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkNvbGxlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZVRocm91Z2hCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWVyb25hdXRpY2FsRXF1aXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmVjdGVkU3Vic3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUFzc2lnbmVkRW1wbG95ZWVJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5QXNzaWduZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJREFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lIaWVyYXJjaGljYWxMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5TG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lzU3R1ZGVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzU2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFHRVJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnb1RyYW5zZmVyTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRpbWVuc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZXNGbGlnaHRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlY2lwaWVudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWRVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50RmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkJhbmtlcnNBc3NvY2lhdGlvblRyYW5zaXRPclJvdXRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuR2FzQXNzb2NpYXRpb25FcXVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Pc3Rlb3BhdGhpY0Fzc29jaWF0aW9uQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVEZWR1Y3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZVdlbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYWx5c2lzTnVtYmVyT3JUZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lhTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU3BlY2llcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU3RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpRHVtcGluZ0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYWJsZUNvZWZmaWNpZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FibGVJbnN0cnVjdGlvbnNPclN0YW5kYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlckxpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvcHJpYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TGluZUZlZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2Vzc21lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlUcmFuc2FjdGlvblNldFNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudFJlY29yZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZENhc2VDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkSW52b2ljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JKb2luZWRVbml0Tm90UmVzdWJkaXZpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9yTGltaXRlZENvbW1vbkVsZW1lbnRQYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9yVW5pdFBhcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQdXJjaGFzZU9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzUmFpbHdheUFjY291bnRpbmdSdWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdW1pbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdGFDYXJuZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0b21pY1NhZmV0eWFuZExpY2Vuc2luZ0JvYXJkUGFuZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaGVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNhdGlvbkZvclJlcGFpclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5SXNzdWVkRXF1aXBtZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25OdW1iZXJGb3JFeGNlcHRpb25Ub0Rhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVG9NZWV0Q29tcGV0aXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9Mb3NzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIUmV0dXJuT3JOb3RpZmljYXRpb25PZkNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSEVudHJ5RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFN0YW5kYXJkRW50cnlDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIVHJhY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZFVuZGVyd3JpdGluZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3V0UHJvY2VkdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFkZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VEdWVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBc3NpZ25lZEJhbmtlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBc3NpZ25lZFNlY3VyaXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0FjY2VwdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lQcm9jZWR1cmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtzQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtzSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVGVsZWdyYXBoaWNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUb0JhbmtJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyQ29kZWRMYWJlbFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyQ29kZWRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0NvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoTnVtYmVyT3JMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1Bc3NlbWJseUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2luTWlsZU1hcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0thbmJhblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTWV0ZXJSZWFkaW5nQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdNZXRlclJlYWRpbmdFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGF0ZXJhbENhclNlcnZpY2VBZ3JlZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kSG9sZEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQ2VudGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxvZk1hdGVyaWFsUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZlF1YW50aXRpZXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmFyeU9iamVjdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbkxvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsZW5kZWRXaXRoQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsZW5kZWRXaXRoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZUNyb3NzUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVTaGllbGRQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZGVkQ2FycmllckludGVybmFsUmV2ZW51ZVNlcnZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyZWF1TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3JTYWxlc09mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2Vyc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldENoYXB0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdW9mTGFib3JhbmRTdGF0aXN0aWNzU2NoZWR1bGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVTaWduaW5nT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdVNpZ25pbmdTUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUYXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0FwcHJvdmFsTWFyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2F0YWxvZ3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRGViaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEZWJ0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTaGlwbWVudE1hcmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhZEZpbGVMYXllckNvbnZlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsU2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5FeGNpc2VFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5GaW5hbmNpYWxJbnN0aXR1dGlvbkJyYW5jaEFuZEluc3RpdHV0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkdvb2RzQW5kU2VydmljZXNvclF1ZWJlY1NhbGVzVGF4UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblByb3ZpbmNlT3BlcmF0aW5nQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblNvY2lhbEluc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5XaGVhdEJvYXJkUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxlZFJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFJlcG9ydGluZ0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50UmVwb3J0aW5nTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEJpbGxpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZElzc3VlclRyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BY2NlcHRhbmNlT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRDb25zaWduZWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFBhY2thZ2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRTaGlwcGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0N1c3RvbXNCb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzdWFsdHlSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc3VhbHR5UmVwb3J0U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9ndWVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YXN0cm9waGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGVnb3J5T2ZXb3JrUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRlbnRzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlaWxpbmdGb3JtdWxhUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNBdXRvbWF0ZWRGaWxlc0lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdFN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXJDaGlsZERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyUGFyZW50RGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlb2ZJbmNvcnBvcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZW9mVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZE1haWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTVBVU0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPcmRlckF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVmVyaWZpY2F0aW9uUHJvY2VkdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQ2FyZEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU5vdGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsQWJzdHJhY3RTZXJ2aWNlUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGFyUHVibGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbk9mT3BpbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25PZlN0YXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5zaGlwRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsQWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0aWVzb2ZPaWxDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudHNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRzU3lzdGVtU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtUGFydGljaXBhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtVXNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJUZXh0Q2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnRDb21wYW55Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnRSZXBvcnRpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljYWxMYWJvcmF0b3J5SW1wcm92ZW1lbnRBbWVuZG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbEF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZU9mRmVkZXJhbFJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xkUm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbG9jYXRpb25JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxPclByaXZhdGVQYXNzZW5nZXJWZWhpY2xlUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQWNjb3VudFN1bW1hcnlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxhbmRHb3Zlcm5tZW50RW50aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVTYWZldHlBc3N1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZU9uVW5pZm9ybVNlY3VyaXR5SWRlbnRpZmljYXRpb25Qcm9jZWR1cmVzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkFjY2Vzc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRQbGFjZVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFN5bmRpY2F0ZVJlZmVyZW5jZTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRTeW5kaWNhdGVSZWZlcmVuY2UyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SXNzdWVkRXF1aXBtZW50SWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlQZW5kaW5nU2FsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5U2FsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5VmVyaWZpY2F0aW9uU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRlbnRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkVW5pdHNQYXltZW50UmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZUNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uT2ZQdXJjaGFzZURvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25PZlNhbGVEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZG9taW5pdW1JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZ3Jlc3Npb25hbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW5nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzRnVydGhlck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1NoaXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudENsYXNzaWZpY2F0aW9uSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNGdXJ0aGVyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25TaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yc1JlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cmFpbnROb3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1wdGlvbkRhdGFSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPckVxdWlwbWVudFJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9yUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzcG9zaXRpb25PcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJvckVxdWlwbWVudFJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclByZWZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldvcmtPcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25Vbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNNb3ZlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzVHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWRkZW5kdW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXVkaXRvcklETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJyZWFrZG93blJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb29wTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JEYXRhUmVxdWlyZW1lbnRzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckVzdGFibGlzaG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yUmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXJ0eVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aW9uQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcm5ib3JlQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbGxvY2F0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0YVJpY2FuSnVkaWNpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlCdXNpbmVzc1JlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5TGVnaXNsYXRpdmVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uRGlzdHJpYnV0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25SZWRlbXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvdW5zZWxpbmdJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0TWVtb051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yRGViaXRBZGp1c3RtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJhdGluZ0FnZW5jeXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvc2l0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxpdHlEZXNpZ25hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9wWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NMaXN0ZWRDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUzU0S2V5VHJhaW5JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUzU0S2V5VHJhaW5JbmRpY2F0b3JHcm91cE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRvckxhdGVzdENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDYXRhbG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlUGVyaW9kU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWF0ZXJpYWxTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclByb2Nlc3NTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXJBc3NpZ25lZFRvUHJldmlvdXNCYWxhbmNlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc0NvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzVW5pdEludmVudG9yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJUcmFja2luZ051bWJlckZvckxvYW5lZE1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0JhckNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNpc2lvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RyYXdiYWNrRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNHdWFyYW50ZWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNob3VzZUJyb2tlckxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJlZmVyZW5jZUlucXVpcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWxlYXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ZhbHVhdGlvbkRlY2lzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzVHJhbnNwb3J0TGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUF1dGhlbnRpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhSXRlbURlc2NyaXB0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUXVhbGl0eVJlamVjdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVJlbGlhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVN0cnVjdHVyZVRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlcnB1cmNoYXNlb3JkZXJudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlclR5cGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzQ3VzdG9tc0lkZW50aXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlY3RDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQWxsb2NhdGlvblN5c3RlbVByaW9yaXR5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcm1lbnRBcHByb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQYXltZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRyYWlsZXJNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsUmVhc29uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3RMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkFncmljdWx0dXJlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZDb21tZXJjZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUZvcm0yNTBSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkREVFNDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mRWR1Y2F0aW9uQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZFbmVyZ3lBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhIU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVURBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mSW50ZXJpb3JBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkp1c3RpY2VBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkxhYm9yQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZTdGF0ZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mdGhlVHJlYXN1cnlBY3F1aXNpdGlvbk9yUHJvY3VyZW1lbnRSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZUcmFuc3BvcnRhdGlvbkFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVHJhbnNwb3J0YXRpb25Cb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZUcmFuc3BvcnRhdGlvbkhhemFyZG91c051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVmV0ZXJhbnNBZmZhaXJzQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudFdoZXJlSW5qdXJ5T2NjdXJyZWRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25DbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvcnlUcnVzdENvbXBhbnlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhdENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNjcmlwdGlvbk9mQ2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hBZHZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVBvc3RQYXJjZWxzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9ub2ZTaGlwbWVudEhhcm1vbml6ZWRCYXNlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0RGViaXRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5SW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudGVyUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwZW5zYXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsVHVybkluRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3B1dGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU3RhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JBc3NpZ25lZE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckFzc2lnbmVkVHJhbnNhY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dE9ySW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzQWNjb3VudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNSZXByZXNlbnRhdGl2ZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNTcGxpdEFnZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja1JlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlQYXltZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uQWZmZWN0ZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRWb2x1bWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmxpZ2h0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ludmVudG9yeU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZUJyYW5jaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taW5pb25PZkNhbmFkYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1TaGlwcGVyQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdlZXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uT3JkZXJCbGFua051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0Zvcm11bGFyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldENhbmFkYXM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRVUzhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFVOU051bWJlcndpdGhGb3VyQ2hhcmFjdGVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TTnVtYmVyRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlQmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlV2F5YmlsbGluUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZVdheWJpbGxOb3RJblJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RnJlZVByb2R1Y3RzUmVjZWlwdEF1dGhvcmlzYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlGcmVlUHJvZHVjdHNTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eU1lbW9OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGlvbkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljZGV2aWNlcGlubnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRnVuZHNUcmFuc2ZlcklETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUGF5bWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxldmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1pc3Npb25EZXNpZ25hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZU9yTm9uRW1wbG95ZWVDbGFzc2lmaWNhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUYXhGaWxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcklkZW50aWZpY2F0aW9uTnVtYmVyT2ZTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcnNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJzU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRWaXNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5UmVwb3NpdGlvbmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0thbmJhblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTWV0ZXJSZWFkaW5nQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdNZXRlclJlYWRpbmdFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1BhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kTWlsZU1hcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlcnNQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZVByb3Bvc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlckNoaWxkRG1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlclBhcmVudERtciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5VGVzdFR5cGVQdXJwb3NlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lUcmFuc3BvcnRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRJbml0aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VHJhbnNwb3J0Q2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdmFsZW50Q291cnNlTnVtYmVyYXRSZXF1ZXN0aW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9ySWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3dGaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVPcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRlcm1zUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NUcmFuc3BvcnRhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdERpc3RyaWJ1dGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbnNpb25vbkVmZmVjdG9mQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDbGVhcmFuY2VJbnN0cnVjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RXN0YWJsaXNobWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkT3JFeGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Q2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlNZWFzdXJlbWVudFBvaW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eU5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZUFuYWx5c2lzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlbWVjaGFuaXNtbnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5VW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlU2VsbGVyU2VydmljZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQnVyZWF1T2ZJbnZlc3RpZ2F0aW9uSW5kaXZpZHVhbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25UcmFkZU9yQnJhbmRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRW5lcmd5UmVndWxhdG9yeUNvbW1pc3Npb25DZXJ0aWZpY2F0ZU9mUHVibGljQ29udmVuaWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZITE1DRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQWRtaW5pc3RyYXRpb25DYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSFVNUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBZG1pbmlzdHJhdGlvbk9yaWdpbmF0b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluZm9ybWF0aW9uUmVzb3VyY2VzTWFuYWdlbWVudFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNYXJpdGltZUNvbW1pc3Npb25Gb3J3YXJkZXJzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWFyaXRpbWVDb21taXNzaW9uVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlTY2hlZHVsZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRheHBheWVyc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsV2lyZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRURXSVJFQ29uZmlybWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVTY2hlZHVsZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlQ29udmVyc2lvbkpvdXJuYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVMaW5lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJDb2RlSXNzdWVkYnlCdXJlYXVPZkNlbnN1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJDb2RlSXNzdWVkQnlDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJQcm90b2NvbExvY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFdvcmtDYW5kaWRhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsRGV0YWlsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsTWFuYWdlbWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGhhc2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFNldHRsZW1lbnRQYXJ0eXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5kZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmVMaW5lQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaExvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGVldFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxleGlibGVTcGVuZGluZ0FjY291bnRJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGV4aWJsZVNwZW5kaW5nQWNjb3VudEluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REYXRhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2Rab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JQbGFuQXBwcm92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvbkFjY2Vzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvblByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uUHJvZHVjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc3VyZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3Jlc3RyeVBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWFsU3RhdGVtZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclBpY2t1cExpbWl0ZWRGcmVpZ2h0VGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzT3JBZ2VudHNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZVRheEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNTZWxsZXJTZXJ2aWNlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVpvbmVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXlvclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFRpbWVPclBhcnRUaW1lRW1wbG95ZWVDbGFzc2lmaWNhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsV29ya0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kTWFuYWdlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQW5hbHlzaXNTb3VyY2VNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQ3VzdG9kaWFuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29Db25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbERlY2xhcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTGVkZ2VyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUHVycG9zZU1lc3NhZ2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNEZXN0aW5hdGlvblpvbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNJbmRleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0tleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1Njb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaW5uaWVNYWVQb29sUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc2FuZFNlcnZpY2VUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybmluZ0NsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFjY291bnRpbmdDbGFzc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFkdmFuY2VQcm9ncmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFnZW5jeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFByaW9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UXVhbGl0eUFzc3VyYW5jZUFuZENvbnRyb2xMZXZlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFRyYW5zcG9ydGF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5CbG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5PcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jhdml0eVNvdXJjZU1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVlbkNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWNjb3VudGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwT3JQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm93dGhGYWN0b3JSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvclVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXNlZFN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXplZENvZGVTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhc3RlbmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzRXhlbXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZU1hbmlmZXN0RG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbk5hdGlvbmFsUGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uTmF0aW9uYWxQcm92aWRlcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVNYW5wb3dlclNob3J0YWdlQXJlYUZhY2lsaXR5SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDQ0xhYmVsZXJJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VSYXRpbmdBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VSYXRpbmdTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoT3JXaWRlRmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdENlbnN1c1RyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0QmxvY2tOdW1iZXJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0Q291bnR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdE1ldHJvcG9saXRhblN0YXRpc3RpY2FsQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdFN0YXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvbnRhbENvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlcG93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZVdheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGFDYXJnb0FnZW50Q2Fzc0FkZHJlc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGFDYXJnb0FnZW50Q29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNEOUNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbkNhcmRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1hZ2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1lZGlhdGVFeHBvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWVkaWF0ZVRyYW5zcG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25WZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRDbGVhcmFuY2VJbnN0cnVjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyc1JlZmVyZW5jZU51bWJlclRvTGV0dGVyT2ZDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXRhdGlvbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZFRvT3JPdXRib3VuZEZyb21QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZFRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMZWdhbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGVhbGVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGYWlsdXJlQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTYW1wbGVJbnNwZWN0aW9uUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJvdWJsZUluZGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5UmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbmFuZFN1cnZleVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRlT2ZTZWN1cml0eUFuZEZ1dHVyZU1hcmtldERldmVsb3BtZW50U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb250cmFjdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkUGFyY2VsUG9zdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZHNMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyQXNzaWduZWRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3Vyb3JQb29sSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRMb2dpc3RpY1N1cHBvcnRDcm9zc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hc3RlclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXN0ZXJTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlTnVtYmVyTmV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZU51bWJlck9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VUcmFpbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmdvdmVybm1lbnRhbE1hcml0aW1lT3JnYW5pemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbEN1c3RvbWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbERhdGFQcm9jZXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFB1cmNoYXNlT3JkZXJJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFB1cmNoYXNlT3JkZXJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFZlbmRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyQ2hpbGREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyUGFyZW50RGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRmxpZ2h0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnVlbFRheEFncmVlbWVudEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZWdpc3RyYXRpb25QbGFuQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJlZ2lzdHJhdGlvblBsYW5TdGlja2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Eb21pbmlvbk9mQ2FuYWRhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyc3RhdGVDb21tZXJjZUNvbW1pc3Npb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYVBsYW50Um91dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3JpYWxOZXdEcnVnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JBc3NpZ25lZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yTm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOdW1iZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RhdGFTaGVldFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkNoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNGTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JQcm9qZWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50Q3JlZGl0U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRseUFkbWluaXN0ZXJlZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50VmVudHVyZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uYWxDb21tdW5pdHlOYW1lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uYWxDb21tdW5pdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yT3BlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcm9yQWZmaWxpYXRpb25JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFRyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZUV4cHJlc3NlZGluRGVncmVlc01pbnV0ZXNhbmRTZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZUV4cHJlc3NlZGluU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQWdyZWVtZW50QW1lbmRtZW50TnVtYmVyTWFzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUNvbnRyYWN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VSaWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlckJsYW5rZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJQcmlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlclJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJFbnRpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlclVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlQmlsbENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJvZkNyZWRpdERyYWZ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyb2ZDcmVkaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcnNvck5vdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZ5aW5nT2ZmaWNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUGxhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VCaWxsaW5nQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUJpbGxpbmdTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUGFydG5lcnNoaXBJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lb2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQ3JlZGl0Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmtTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdEJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RPZk1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzQ2xhaW1zT2ZmaWNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZExpbmVDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFBsYW5uaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQWNxdWlzaXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5GZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblByb3NwZWN0b3JLZXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsbHlBc3NpZ25lZENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsTWVkaWFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNjaG9vbENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTY2hvb2xEaXN0cmljdENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTdHVkZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRXhjZXB0aW9uT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbm9uUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uU3BlY2lmaWNTZXJ2aWNlc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25XaXRoaW5FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2tib3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naWNhbE9ic2VydmF0aW9uSWRlbnRpZmllck5hbWVzYW5kQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc1N1cHBvcnREb2N1bWVudGF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkZUV4cHJlc3NlZEluRGVncmVlc01pbnV0ZXNhbmRTZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGVFeHByZXNzZWRpblNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdUZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yRXZlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJBcnRpY2xlTnVtYmVyT2ZSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnYXppbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsYm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsU2xvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VBdmFpbGFiaWxpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yRm9yY2VQcm9ncmFtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvclN5c3RlbUFmZmVjdGVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZWdvb2RDb21tZXJjaWFsTGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFtbW9ncmFwaHlDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0S2V5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxQcm9jZXNzaW5nQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJEZWZpbmVkUmVwYWlyUmF0ZXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc01hdGVyaWFsU2FmZXR5RGF0YVNoZWV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0RpcmVjdGl2ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ09wZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVEZWNsYXJhdGlvbm9mSGVhbHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nT3JMYWJlbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGFiZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxlYXNlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclNvbGljaXRhdGlvblByb2NlZHVyZXNUZXJtc0FuZENvbmRpdGlvbnNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFN0b3JhZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJlZENlcnRpZmljYXRlT2ZEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0UHJvY2Vzc2luZ0VzdGFibGlzaG1lbnRSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUmVjaXBpZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxBc3Npc3RhbmNlQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxSZWNvcmRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVWZXJzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbmRpc2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbnRDYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VBZGRyZXNzb3JJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRGVzaWduR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclByb3ZpbmdSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZ0F0VGhlQmVnaW5uaW5nT2ZUaGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nQXRUaGVFbmRPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUNSTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWNyb2ZpbG1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlDYWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUludGVyZGVwYXJ0bWVudGFsUHVyY2hhc2VSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeU9yZG5hbmNlU2VjdXJpdHlSaXNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVJhbmtPckNpdmlsaWFuUGF5R3JhZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbGluZ2luVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmlzdGVyaWFsQ2VydGlmaWNhdGVPZkhvbW9sb2dhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbHllYXJudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzSW5zdGl0dXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNVc2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFja2VkU2VjdXJpdHlMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhY2tlZFNlY3VyaXR5UG9vbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VFbGVjdHJvbmljUmVnaXN0cmF0aW9uU3lzdGVtT3JnYW5pemF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VDb21wYW55TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZUluZGljYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckZ1ZWxDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlSUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpZmFtaWx5UHJvamVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZUJvb2tUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlTWFwWENvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VNYXBZQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVN1YkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlUE9PZkFuSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVab25lT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbGl0eUFzc2lnbmVkQnVzaW5lc3NSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lZEJhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFlcm9uYXV0aWNzYW5kU3BhY2VBZG1pbmlzdHJhdGlvbkZBUlN1cHBsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkJvYXJkc09mUGhhcm1hY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkluc3VyYW5jZUNvbW1pc3Npb25lcnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ3JpbWluYWxJbmZvcm1hdGlvbkNlbnRlck9yaWdpbmF0aW5nQWdlbmN5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ29tbXVuaXR5TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db21tdW5pdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ291bnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbU1hcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxHb3Zlcm5tZW50QnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJhbEdhc1BvbGljeUFjdENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RHJ1Z0FwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIZWFsdGhJbnN1cmFuY2VDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3UGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbnRhbEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbnRhbEFncmVlbWVudFJlYXNvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNoaXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXJDb250aW51b3VzTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25BbWVyaWNhbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Db25mb3JtYW5jZVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uTmVnb3RpYWJsZU1hcml0aW1lVHJhbnNwb3J0RG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk9yaWdpbmF0aW5nVGhpcmRQYXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUGlja3VwTGltaXRlZFRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUHJvdmlzaW9uYWxQYXRlbnRBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uU3BvdXNlVGllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb09UNUF1dGhvcml0eVplcm9NaWxlYWdlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkRhdHVtU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5GcmVlVHJhZGVBZ3JlZW1lbnRDb21wbGlhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSGF6YXJkb3VzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5IYXphcmRvdXNHb29kc0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uU3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9USUNPTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUZW1wb3JhcnlJbXBvcnRhdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcm9kZUNlZHVsYWRlSWRlbnRpZGFkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcm9kZUlkZW50aWZpY2FjaW9uVHJpYnV0YXJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5YW5kSGVhbHRoQWRtaW5pc3RyYXRpb25DbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQmlsbG9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbnRhaW5lck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZW5kZXJUcmFja2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZW5zZVRyYWNraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3ltYm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lQ2FsbEFnZW5jeVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25saW5lUHJvY3VyZW1lbnRhbmRBY2NvdW50aW5nQ29udHJvbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuYW5kUHJlcGFpZFN0YXRpb25MaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQXNzaWduZWRVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25Qb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT3JQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXJDb25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lcnNTZWNvbmRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQnJlYWtkb3duU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZkb1RyYW5zYWN0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZXR1cm5SZXF1ZXN0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXJzQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlckNoaWxkRGF0YU1haW50ZW5hbmNlUmVxdWVzdExvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyUGFyZW50RGF0YU1haW50ZW5hbmNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVm91Y2hlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0NvbXBhbnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0RlcG9zaXRvcnlGaW5hbmNpYWxJbnN0aXR1dGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0b3JzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5Ib3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luT2ZTaGlwbWVudEhhcm1vbml6ZWRCYXNlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9UNUF1dGhvcml0eUNvbmRpdGlvbk9yUmVzdHJpY3Rpb25vbkNhckhpcmVSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkVHlwZU9mUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRib3VuZEZyb21QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkJsb2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlcnBhY2thZ2luZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0bGV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRvZlNlcnZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0J1cmVhdUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrQW5kSG9sZEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0dyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nR3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1BsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhZ3JhcGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljYWxJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50RmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydENhdXNpbmdSZXBhaXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRDb25zaWdubWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbFBheW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0SW50ZXJjaGFuZ2VhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVmZXJlbmNlSW5kaWNhdG9ySW5BRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJbmZvcm1hdGlvbk1lc3NhZ2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50Q29vcGVyYXRpb25UcmVhdHlBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0cm9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0ZpbmFuY2lhbEluc3RpdHV0aW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2l0Um91dGluZ05vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyQXNzaWduZWRSZXN1Ym1pc3Npb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2l0Um91dGluZ05vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRIaXN0b3J5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5BZHZhbmNlUmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluc3RhbG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGxhblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5b3JzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQY3NDYXRhc3Ryb3BoZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvbkFwcHJvdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuc2lvbkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY2l0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJZGVudGl0eUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVBvb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeVByZXNjcmlwdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvbmVDYWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxJbnZlbnRvcnlSZWNvdW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVPZkFjdHVhbFByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVPZkFHZW5lcmljUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdExpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuTmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1BhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxvdEZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdWdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUxpbmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sbHV0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RFbnRyeVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlQXdhcmRTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpbmN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkZWNlc3NvckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRldGVybWluYXRpb25vZkJlbmVmaXRzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZENhbGxTaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvblNpdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5V29ya0NhbmRpZGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWFya2V0QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1hcmtldE5vdGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0UHJpb3JpdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRQdXJwb3NlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0VHlwZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1SYXRlVGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyc1ZlcmlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc0Zvcm1JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmlsbG9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NhcmdvQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDbGFpbUhpc3RvcnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRPckRlYml0QWRqdXN0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRBZHZpY2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVsaXZlcnlJbnN0cnVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWxpdmVyeVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Rpc3RyaWJ1dG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVwb3J0ZWRTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlbnRhbEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVxdWVzdEZvck1ldGVyZWRSZWFkaW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NjaGVtZU9yUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTZXF1ZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTaGlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyQ29udGludW91c01vdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGF4Q29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlT3JTYWxlc0NhdGFsb2d1ZVJlc3BvbnNlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFyZWFOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdENoYW5nZW9ySXNzdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0VmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VWYXJpYXRpb25Gb3JtdWxhUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3JDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yRGF0YVVuaXZlcnNhbE51bWJlclN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JIZWFsdGhJbmR1c3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJZGVudGlmaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdEJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBob25lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQb3N0YWxaaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ycHVyY2hhc2VvcmRlcm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUcmFkaW5nUGFydG5lcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclVuaXZlcnNhbFByb3ZpZGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2NlZWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3JzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRCdWRnZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50UmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyaW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlSW5mb3JtYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWNlbnNpbmdBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UGVyaW9kRm9yV2hpY2hMYWJvckNvc3RzQXJlRmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFJlc2VydmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U291cmNpbmdBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTcGVjaWZpY2F0aW9uRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9maWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JEZWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Q29tcG9uZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Q29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlMb3NzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2FsUGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZEdyb3VwV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG9jb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RyYWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNvbW1lcmNpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJPcmRlclRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJQbGFuTmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclNpdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyVVBJTk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmluY2lhbENhbmFkaWFuU2FsZXNUYXhFeGVtcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpbmNpYWxUYXhJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXRlbnRBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25Jc3N1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljRGVlZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljRmlsaW5nUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNVdGlsaXRpZXNDb21taXNzaW9uQ2VydGlmaWNhdGVPZlB1YmxpY0NvbnZlbmllbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9wdGlvbkFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckxpbmVJdGVtSWRlbnRpZmllckJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVySW5jbHVkZWRpbk9uT3JkZXJQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlck9mT3JkZXJSZWNlaXZlZFNpbmNlTGFzdFJlcG9ydGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJPZlNoaXBtZW50UmVjZWl2ZWRTaW5jZUxhc3RSZXBvcnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVzcG9uc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VSZXF1aXNpdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc1JlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdBY3Rpdml0eUNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWVkTWF0ZXJpYWxzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWVkUHJvZHVjdHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5RGlzcG9zaXRpb25BcmVhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUluc3BlY3Rpb25BcmVhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJldmlld01hdGVyaWFsQ3JpYklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJhbnRpbmVPclRyZWF0bWVudFN0YXR1c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNwb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVPclNob3BwaW5nQ2FydElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWNrVHlwZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbE9yUm9hZFJvdXRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbW1pc3Npb25PaWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkQ29tbWlzc2lvblJlY29yZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFJvdXRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsV2F5QmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbnNpZ25tZW50Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVdhZ29uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29uZmVyZW5jZUlEQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZU5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF3bWF0ZXJpYWxTdXBwbGllckR1bkFuZEJyYWRzdHJlZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVPd25lZFByb3BlcnR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Ob3RMb3dlc3RDb3N0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNhbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFzc2lnbmVkRHJvcFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVySURRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0ZpbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU3ViSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0FkdmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQmFua3NBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb21wYW55SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRGVwb3NpdG9yeUZpbmFuY2lhbEluc3RpdHV0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQYXJ0eXNNZW1iZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25jaWxpYXRpb25SZXBvcnRTZWN0aW9uSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjZWRFYXJuaW5nV2Vla0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZFBhdHRlcm5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlRHJhd2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyQXNzaWduZWRCeVRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlck9mQVJlcXVlc3RGb3JNZXRlcmVkUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyUXVvdGVkT25TdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlclRvUHJldmlvdXNNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRQcm9kdWN0Rm9yQ2hlbWljYWxBbmFseXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRQcm9kdWN0Rm9yTWVjaGFuaWNhbEFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpcmlzdG9GZWRlcmFsRGVDb250cmlidXllbnRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXJpc3RvRmVkZXJhbGRlQ29udHJpYnV5ZW50ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDYXBpdGFsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3RvckFjdGl2aXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE1haWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uTnVtYmVyT2ZQcmV2aW91c0N1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9JbmZvcm1hY2lvbkZpc2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9OYWNpb25hbGRlQ29udHJpYnV5ZW50ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9Vbmljb2RlQ29udHJpYnV5ZW50ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdGlvblByaW1hcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRpb25TZWNvbmRhcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlHdWlkZWxpbmVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmVyc0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWlzc3VlQ2Vzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZENvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE5vbmNvbmZvcm1hbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkT2JqZWN0SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFZlbmRvck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlSW52b2ljZU51bWJlckZvclByaW9yQmlsbEFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckNhdGVnb3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJEYXRhUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRXN0aW1hdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBlYXRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZUJvb2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVDYXJnb1NoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlUGF0dGVybkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVXYXliaWxsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRBc3NlbWJseU1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudENsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudERydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJSYW5nZUVuZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJSYW5nZVN0YXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByaWNlZENsYWltUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByaWNlZExpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yQ2FuY2VsbGF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Zm9yUXVvdGF0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlQXNzZW1ibHlMaW5lRmVlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZVNjcmVlbmluZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VVdGlsaXphdGlvbkdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZXRvYVJlcXVlc3Rmb3JRdW90YXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBdmFpbGFiaWxpdHlBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXZhaWxhYmlsaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvblJlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWl0bnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxNZXJjaGFudHNDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50UGxhbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRQbGFuUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEdvb2RzQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuR29vZHNCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk1hdGVyaWFsQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuc05vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZW51ZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdlckZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJJRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ29uc2lnbm1lbnROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckRvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRW1lcmdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nSW5zdHJ1Y3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVsZVNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZWtlZXBpbmdBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlFcXVpcG1lbnRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5b2ZSYWRpb0NlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlvZlNoaXBDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPclRlcnJpdG9yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQWxsb3dhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0RlcGFydG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRm9yZWNhc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1BlcnNvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcm9ncmFtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlZ2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwcmVzZW50YXRpdmVPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXZpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuTGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVtZU9yUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsT2ZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsT25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXJjaEtleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q292ZXJhZ2VDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q292ZXJhZ2VDb21wYW55TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDdXN0b21zUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlFbXBsb3llZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlIZWFsdGhJbnN1cmFuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U3VmZml4Q29kZUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQmVuZWZpY2lhcnlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhZGVDb21lcmNpYXlGYW1lbnRhSW5kdXN0cmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJ5b2ZTdGF0ZUFzc2lnbmVkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25PZlRoZU5hdGlvbmFsSG91c2luZ0FjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5SW5zdHJ1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJhbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVyQXV0aG9yaXphdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlck9yZ2FuaXphdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNDYXRhbG9ndWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNDcmVkaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRGViaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc1NhbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBcnJhbmdlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyRGVmaW5lZENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0NsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0ZpbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNSZWZlcmVuY2VUb1RoZU9yaWdpbmFsTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ0JhbmtSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdDb21wYW55QXVkaXROdW1iZXJBdXRvbWF0ZWRDbGVhcmluZ2hvdXNlVHJhbnNmZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1bGxldGluTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFc3RpbWF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUdyb3VwSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VJbnRlcnJ1cHRUcmFja2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzdGluYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudE9yaWdpbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90aWNlT3JNYW5pZmVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG93bmVyc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDYXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNCb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0hhemFyZG91c051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdMYWJlbFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydFRlcm1EaXNhYmlsaXR5UG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG93SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVUcmFuc2FjdGlvblNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVJFTk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lSRVROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGVTcGVjaWZpY1Byb2NlZHVyZXNUZXJtc0FuZENvbmRpdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbEluc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlvZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNhbmRBbmFseXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0QW5kU2VncmVnYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VEb2N1bWVudEludGVybmFsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjaW5nVW5pdE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxCdWRnZXRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2hhcmdlT3JBbGxvd2FuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsR292ZXJubWVudEFjY291bnRpbmdDbGFzc2lmaWNhdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEluc3RydWN0aW9uc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1vdmVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYWNrYWdpbmdJbnN0cnVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBheW1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9jZXNzaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsdHlMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uQ2xhc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25SZXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2ltZW5JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdEJvb2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UHJlbWl1bUF1ZGl0Q2hhbmdlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRTaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZVRpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyeUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmROdW1iZXJPZkluc3BlY3Rpb25Eb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQb2ludExvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZUJyaWRnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVSZXBsYWNlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0aW5nUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBc3NlbWJseURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNoYXJ0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29udHJvbGxlZFN1YnN0YW5jZUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ3JpbWluYWxIaXN0b3J5UmVwb3NpdG9yeUluZGl2aWR1YWxJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEZXBhcnRtZW50STIwRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEZXBhcnRtZW50SUFQNjZGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUhhemFyZG91c1dhc3RlRW50aXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVJbmR1c3RyaWFsQWNjaWRlbnRQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMZWdpc2xhdGl2ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxpY2Vuc2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVOb25SZXNpZGVudFZpb2xhdG9yQ29tcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNlQXNzaWduZWRCdXNpbmVzc1JlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2VBc3NpZ25lZEVudGl0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbGVzVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2VuYXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU3R1ZGVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZXdpZGVDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0NlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvbXBhbnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0tlZXBpbmdVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlSW5mb3JtYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmFzc2VtYmx5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckRhdGFSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmRheU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZGl2aXNpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJleGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YkZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmhvdXNlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlOb25TYWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eVZlcmlmaWNhdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibGluZW9mSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlckF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJTZXJ2aWNlckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0YW50aXZlbHlDb25zb2xpZGF0ZWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlQWlyV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZU1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YlN1YmhvdXNlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzb3JBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyaW50ZW5kZW5jaWFkZUludmVyc2lvbmVzRXh0cmFuamVyYXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQWdyZWVtZW50QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRG9jdW1lbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ3JlZGl0Q2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRpbmdEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Qm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YXBPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUTVQxMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUTVQyMDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUQ29uZmlybWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1ib2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bWJvbE51bWJlckZvck1pbGVzdG9uZU9yTE9CUmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtYXRpemVkTm9tZW5jbGF0dXJlb2ZIdW1hbmFuZFZldGVyaW5hcnlNZWRpY2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtZUluZm9ybWF0aXF1ZVBvdXJMZVJlcGVydG9pcmVEZXNFbnRyZXByaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtZUluZm9ybWF0aXF1ZVBvdXJMZVJlcGVydG9pcmVEZXNFdGFibGlzc2VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmUnVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2VjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU3VmZml4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTdXBwbGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXNrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhjaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHRpb25MaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Rm9ybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGluZ0F1dGhvcml0eUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWNlbnNlRXhlbXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWVuSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFNjaGVkdWxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4U2hlbHRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4V29ya3NoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYW1Bc3NpZ25tZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudGF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbEluZm9ybWF0aW9uUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFBoYXNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbkNpcmN1aXRTdXBwbGVtZW50YWxJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhNZXNzYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbFJlbGVhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb25GaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dEVsZW1lbnRJZGVudGlmaWVyRGVsZXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0ZXJTY3JlZW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkQmFua3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBZG1pbmlzdHJhdG9yQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlOb3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5T3JpZ2luYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdoQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJDYXJuZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJUk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVDb21wYW55Q29kZUJvb2tSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRG9jdW1lbnRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVhJWElkZW50aWZpZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRva3lvU2hva29SZXNlYXJjaEJ1c2luZXNzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9sbEJpbGxpbmdUZWxlcGhvbmVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3ljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3JkZXJDeWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRveGljb2xvZ3lJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2VyQWN0aW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZXJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkaW5nUGFydG5lcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyVHlwZVF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclVzZUFncmVlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nRmxpZ2h0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbkNhdGVnb3J5T3JUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRHdWFyYW50ZWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9uZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFjY291bnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25FeHBvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uUHJpb3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyYWN0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb3N0c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFJldHVyblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RyaXBwaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0dWZmaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTZWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbExvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcGxlYmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tlcnNCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTUkJ1c2luZXNzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29tbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRXNjcm93TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZIb3VzZWhvbGRHb29kc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkxhd1N1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZk91dHN0YW5kaW5nSnVkZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlNjaWVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuRGVmZW5zZUZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25TdXBwbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuRGVwYXJ0bWVudE9mVmV0ZXJhbnNBZmZhaXJzQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuR292ZXJubWVudFRyYW5zcG9ydGF0aW9uQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VEVU5TTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VQdXJjaGFzZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlU3VwcGxpZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nQWxlcnRSZWZlcmVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmVtcGxveW1lbnRJbnN1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ0NvbGxhdGVyYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNvdXJjZUxvY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDbGFpbXNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ29uc2lnbm1lbnRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDb25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ3VycmFjUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZU1hcmtldFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlUmVpbmFjUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZVN1cHBsaWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNIYXphcmRvdXNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzR292ZXJubWVudFZpc2FOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc1N0YW5kYXJkTWV0cm9wb2xpdGFuU3RhdGlzdGljYWxBcmVhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVsaWVmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVwb3J0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVwb3J0UGVyaW9kSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsUmFpbHJvYWRSZXZlbnVlV2F5YmlsbElkZW50aWZpZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvckVhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvck5vcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3Jab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhaWRJbnN0YWxsbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBwZXJTZXJpYWxOdW1iZXJPZlJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVNoaXBwZXJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VBbnRpRHVtcGluZ0R1dHlDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQmluZGluZ1J1bGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUNvbW1lcmNpYWxEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUNvdW50ZXJ2YWlsaW5nRHV0eUNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUVudHJ5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VQcmVBcHByb3ZhbFJ1bGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVByZUNsYXNzaWZpY2F0aW9uUnVsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlU3RhdGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RPRUFuZE5DRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRE9UQm9uZFN1cmV0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZDQ0ltcG9ydENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZlZGVyYWxJbmZvcm1hdGlvblJlc291cmNlc01hbmFnZW1lbnRSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0Zvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Fc3RhYmxpc2htZW50SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHb3Zlcm5tZW50QWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXRSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVCdXNpbmVzc1VzZVF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUxpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSYWRpdXNvZk9wZXJhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJlbGF0ZWRTZXJ2aWNlc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVNpemVDbGFzc1F1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQWJicmV2aWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hhbmdlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGFuZ2VQcm9jZWR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9ySUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvck9yZGVyTnVtYmVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzUHJldmlvdXNKb2JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25Tb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uQ29kZUxvY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uQ29kZU5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJ0aWNhbENvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsQWdlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uT3JpZ2luYXRvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FmZmFpcnNDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2FUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVB1cmNoYXNlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3VjaGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUVudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VQaWNrVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTdG9yYWdlTG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5Q292ZXJhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VhcG9uU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xUYXhSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1NoaWZ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrSXRlbVF1YW50aXR5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1NoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Rhc2tDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJkUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlB1cnBvc2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2VDb2RlZCIgdHlwZT0iUHVycG9zZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJQdXJwb3NlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlB1cnBvc2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Pbmx5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkUmVzcG9uc2VDb2RlZCIgdHlwZT0iUmVxdWVzdGVkUmVzcG9uc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RlZFJlc3BvbnNlIiB0eXBlPSJSZXF1ZXN0ZWRSZXNwb25zZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VIb2xkU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRXaGVuRXJyb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlTm9EZXRhaWxPckNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VPbmx5Q2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VQcm9kdWN0UmVwbGVuaXNobWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VXaXRoRGV0YWlsQW5kQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZVdpdGhEZXRhaWxOb0NoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlV2l0aERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZVdpdGhvdXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlQW5kQWNrbm93bGVkZ2VtZW50Rm9yRGlyZWN0RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZVJlcXVlc3RlZEZvckRpcmVjdERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZUZvckVhY2hUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2VNZXNzYWdlQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnRGb3JFYWNoVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0Fja25vd2xlZGdlbWVudE5lZWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VFeHBlY3RlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclR5cGVDb2RlZCIgdHlwZT0iT3JkZXJUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJUeXBlIiB0eXBlPSJPcmRlclR5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3JkZXJUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE9mT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDbGFpbUZvclBhcnRzQW5kT3JMYWJvdXJDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkFuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZEaXN0cmlidXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdJdGVtc1RvQmVCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT0dDcml0aWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9HU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25BY2tub3dsZWRnZW1lbnRBbmRFcnJvclJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvckFuZEFja25vd2xlZGdlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvck1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRGVzaWduYXRpb25PZkJlcnRoaW5nUGxhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckV4Y2hhbmdlQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yUGh5dG9zYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclNoaWZ0aW5nRnJvbVRoZURlc2lnbmF0ZWRQbGFjZUluUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JVc2FnZU9mQmVydGhPck1vb3JpbmdGYWNpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclZlc3NlbHNFbnRlcmluZ0ludG9Qb3J0QXJlYUluTmlnaHQtVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRVbnByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb3J0bWVudEFnYWluc3RCbGFua2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdGFDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Ub1BsYW5BbmRTaGlwT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVG9QbGFuQW5kU3VnZ2VzdE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5VG9Qcm9jZWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzR3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVG9CYW5rRnVuZHNUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljT3JkZXJpbmdBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxhbmRIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXJFc3RpbWF0ZWRRdWFudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0UHVyY2hhc2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGFyeVF1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlBbWVyaWNhQ2VydGlmaWNhdGVPZkNvbXBsaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbGluZ0ZvcndhcmROb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wYWlnblByaWNlU2FsZXNDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FuYWx5c2lzVm95YWdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0RlY2xhcmF0aW9uQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29EZWNsYXJhdGlvbkRlcGFydHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Nb3ZlbWVudEV2ZW50TG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01vdmVtZW50Vm95YWdlU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29SZWxlYXNlTm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29WZXNzZWxEaXNjaGFyZ2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29WZXNzZWxMb2FkaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2VPcmRlckxvY2FsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luRm9ybUdzcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mU2VhbGluZ09mRXhwb3J0TWVhdExvY2tlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZENvc3RBbmRQcmljZURhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEluc3BlY3Rpb25BbmRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVG9Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVG9QdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VUb1JlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0eUZvck9pbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZU91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJhbmNlQ2VkaW5nQm9yZGVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRDZXJ0aWZpY2F0ZU9mVmFsdWVBbmRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkVHJhbnNwb3J0QmlsbE9mTGFkaW5nTXVsdGltb2RhbEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBY2NvdW50U3VtbWFyeVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRGlzcHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlV2hpY2hJbmNsdWRlc0FQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbk5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2l0ZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zaXRlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50VW5wYWNrUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRDcmVkaXROb3RlR29vZHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNjaGFyZ2VMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNYW5pZmVzdFVuaXRQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT2ZmSGlyZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3RyaXBwaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF3YXJkTm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJpbGxPZlF1YW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZHNTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2VjdXJpdHlDbGFzc2lmaWNhdGlvblNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xEb2N1bWVudFQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25Db21iaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uRGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdXBlcmFubnVhdGlvbkNvbnRyaWJ1dGlvbnNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0RGF0YVN1bW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFNjaGVkdWxlU3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Zlck5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVGb3JQcmljZVZhcmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0ZpbmFuY2lhbEFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlUmVsYXRlZFRvR29vZHNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3TGlzdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3c0VmZmVjdHNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdTZXJ2aWNlc09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2VOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDcmV3QW5kQ29udmV5YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uUG9zdFBhcmNlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbkZvckNhcmdvRXhhbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbkZvckNhcmdvRXhhbWluYXRpb25BbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhDb21tZXJjaWFsQW5kSXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhvdXRJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVsaXZlcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRG9jdW1lbnRzRXhwaXJhdGlvbk5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ltbWVkaWF0ZVJlbGVhc2VEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N1bW1hcnlEZWNsYXJhdGlvbldpdGhDb21tZXJjaWFsRGV0YWlsQWx0ZXJuYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlUmVsYXRlZFRvRmluYW5jaWFsQWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25PZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWdhcmRpbmdUaGVJbndhcmRBbmRPdXR3YXJkTW92ZW1lbnRPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGNyZWRlcmVJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUZvcmVjYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlKdXN0SW5UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWNlR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWNlUmFpbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmF0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVQb3N0UGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY2VwdGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRDb2xsZWN0aW9uSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0SXNzdWFuY2VJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRMZXR0ZXJPZkluZGVtbml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROZWdvdGlhdGlvbkFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRUcmFuc2ZlckFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50c1ByZXNlbnRhdGlvbkZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZpbmdMaWNlbmNlSW50ZXJuYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VOYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcHNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlBc3NvY2lhdGVkT2JqZWN0QWRtaW5pc3RyYXRpb25NZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckRpc3Bvc2l0aW9uT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRPZmZpY2lhbFJlY29nbml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2VwdGlvbmFsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQ29udHJvbERlY2xhcmF0aW9uSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUNvbnRyb2xEZWNsYXJhdGlvbkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRXhwb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRDcmVkaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYS1Db21tdW5pdHlUcmFkZVN0YXRpc3RpY2FsRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY2F0ZUFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTGFiZWxBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQYXltZW50UmVxdWVzdEJhc2VkT25Db21wbGV0aW9uT2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRPZkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U2FtcGxlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtdWxhRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNBZHZpY2VUb0V4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQWR2aWNlVG9JbXBvcnRBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0JpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0NlcnRpZmljYXRlT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQ2VydGlmaWNhdGVPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNXYXJlaG91c2VSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlUGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvU3VtbWFyeU1hbmlmZXN0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckN1c3RvbXNUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9yRXhwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JIb21lVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9ySW1wb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0Q2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlbWVhdFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZVdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wZW5kaW5nQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25HdWlkZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9ySW1wb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5RGVmaW5pdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5RGVmaW5pdGVRdWFudGl0eUNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlJbmRlZmluaXRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeUluZGVmaW5pdGVRdWFudGl0eUNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVN1cGVyYW5udWF0aW9uQ29udHJpYnV0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlTdXBlcmFubnVhdGlvbk1lbWJlck1haW50ZW5hbmNlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lZGlibGVTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5QmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNGb3JCYW5rVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uVG9Db2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlRGVjbGFyYXRpb25TaGVldEJvcmRlcmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUG9saWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1BcHBsaWNhdGlvbkZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsVHJhbnNwb3J0T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhc3RhdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlBZGp1c3RtZW50U3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlTdGF0dXNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbXNCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JMb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbmJhblNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VCbGFua2V0QWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlckNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkluZGVtbml0eUZvck5vbi1TdXJyZW5kZXJPZkJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZJbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VQYXlyb2xsRGVkdWN0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkbGluZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZVBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZU9yQnV5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lRGVjbGFyYXRpb25PZkhlYWx0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbEluc3BlY3Rpb25BbmRSZWNlaXZpbmdSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVTUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydGF0aW9uQXZhaWxhYmlsaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRhdGlvblNjaGVkdWxlSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRBbmRNZWF0QnktUHJvZHVjdHNTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0Rm9vZFByb2R1Y3RzU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUluRGV2ZWxvcG1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlcmVkU2VydmljZXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGlmaWNhdGlvbk9mRXhpc3RpbmdNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlbWVudENlcnRpZmljYXRlQVRyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlkcm9wT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpbW9kYWxDb21iaW5lZFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGltb2RhbFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVQcm9kdWN0UGxhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0NvZGVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNZXNzYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1Byb2R1Y3RJbnRyb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlT3BlbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU5lZ290aWFibGVNYXJpdGltZVRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmUtQXV0aG9yaXNlZERpcmVjdERlYml0UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlT2ZDaXJjdW1zdGFuY2VzUHJldmVudGluZ0RlbGl2ZXJ5R29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZU9mQ2lyY3Vtc3RhbmNlc1ByZXZlbnRpbmdUcmFuc3BvcnRHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZFbWVyZ2VuY3lTaGlmdGluZ0Zyb21UaGVEZXNpZ25hdGVkUGxhY2VJblBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJRdW90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbENoYXJhY3RlclJlYWRpbmdQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGF0dXNFbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yUGVyZm9ybWFuY2VCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UmVxdWVzdEZvckNvbXBsZXRlZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uRm9yVW5zY2hlZHVsZWRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjZXV0aWNhbFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXRvc2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhcmdlc0RvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnlTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhZHZpY2VPZkFDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZUF1dGhvcml6ZWREaXJlY3REZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlQXV0aG9yaXplZERpcmVjdERlYml0UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVyZW5jZUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5Q3JlZGl0QXNzZXNzbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlTYWxlc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGF5bWVudEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VzdG9tc0RvY3VtZW50TWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VTYWxlc0NhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VTYWxlc0NhdGFsb2d1ZVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRBbHRlcm5hdGVUZW5kZXJCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VkVGVuZGVyQm9xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZU5lZ290aWF0aW9uUmVzdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVZhcmlhdGlvbkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NEYXRhUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQZXJmb3JtYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNwZWNpZmljYXRpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NpdmVEaXNjaGFyZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYXN0ZXJQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFzdGVyU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbm5pbmdBdmFpbGFibGVSZXNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFubmluZ0NhbGVuZGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvZHVjdGlvblBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RSZWNvdmVyeVBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eURhdGFNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFQcmlvckFsbG9jYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENvbnNpZ25tZW50Tm90ZUdlbmVyaWNUZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvckRlc3BhdGNoQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNoYXJnaW5nRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZFVwZGF0ZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsQXBwZWxsYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25Eb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uUmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWREaXJlY3REZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlQWdhaW5zdEFzc29ydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VPckRlbGl2ZXJ5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmV3YWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBbmRSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRPZlRyYW5zYWN0aW9uc0ZvckluZm9ybWF0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0T2ZUcmFuc2FjdGlvbnNXaGljaE5lZWRGdXJ0aGVySW5mb3JtYXRpb25Gcm9tVGhlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JBbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRGVsaXZlcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JGaW5hbmNpYWxDYW5jZWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JTdGF0aXN0aWNhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudHNDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtU2VuZGluZ0NvbnNpZ25tZW50Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb0FuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9BVHJhZGVTdGF0aXN0aWNzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1ByZXZpb3VzQmFua2luZ1N0YXR1c01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9RdWVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1JlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1bWVXb3JrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbGVyUHJlY29tbWl0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkRlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ29uc2lnbm1lbnROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkTGlzdC1TbWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXNoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEhhemFyZERhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZFcXVpcG1lbnRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZSYWRpb0NlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZlNoaXBDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXNvblRpY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudENoYW5nZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmQmlsbGVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZi1CaWxsZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXF1ZW5jZWREZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRGlyZWN0b3J5RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9mQUxldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzTGV0dGVyT2ZJbnN0cnVjdGlvbnNBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ05vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBzU3RvcmVzRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVBZG1pbmlzdHJhdGl2ZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFyZVBhcnRzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZEFsb25lT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mQWNjb3VudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsQW5kT3RoZXJBZG1pbmlzdHJhdGl2ZUludGVybmFsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGVmaW5pdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRG9jdW1lbnRFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRG9jdW1lbnRJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZXNSZXF1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tYXJ5U2FsZXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlEb2N1bWVudEZvckFwcGxpY2F0aW9uRm9yQ2FyZ29PcGVyYXRpb25PZkRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5RG9jdW1lbnRGb3JBcHBsaWNhdGlvbkZvclRyYW5zcG9ydE9mRGFuZ2Vyb3VzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseU9yU2VydmljZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtlckJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFza09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDYWxjdWxhdGlvbkNvbmZpcm1hdGlvblJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVjbGFyYXRpb25HZW5lcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZWNsYXJhdGlvblZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlmRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZU1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xsQ29udmVyc2lvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ051bWJlckFzc2lnbm1lbnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q2FyZ29SZWxlYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERlcGFydHVyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGlzY2hhcmdlSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERpc2NoYXJnZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1wdHlFcXVpcG1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEFjY2VwdGFuY2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGFtYWdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREZWxpdmVyeU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGlyZWN0SW50ZXJjaGFuZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEVtcHR5UmVsZWFzZUluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRJbXBlbmRpbmdBcnJpdmFsQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpck5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrRXN0aW1hdGVBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0VzdGltYXRlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1vdmVtZW50SW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1vdmVtZW50UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPZmZIaXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPZmZIaXJlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T25IaXJlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uSGlyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T25IaXJlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGFja2luZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrVXBBdmFpbGFiaWxpdHlDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2tVcEF2YWlsYWJpbGl0eVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2tVcFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U2hpZnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFNwZWNpYWxTZXJ2aWNlSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0YXR1c0NoYW5nZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RvY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlPcmRlclJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFVucGFja2luZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRVbnBhY2tpbmdSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydExvYWRpbmdJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TG9hZGluZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TW92ZW1lbnRHYXRlSW5SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydE1vdmVtZW50R2F0ZU91dFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTdGF0dXNSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50RGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50TmlsT3V0dHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50UGVyc29uYWxFZmZlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFRpbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50VGltZVVwVW5kZXJib25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRVbmRlcmJvbmRCeVNlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJib25kQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXREb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zU3RhbmRhcmRNZXNzYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdEV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxNdWx0aXB1cnBvc2VUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGlwUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnRTZXJ2aWNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlckRpcmVjdG9yeURlZmluaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRlZFByaWNlZFRlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsVW5wYWNrUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VXYXJyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sSGVhbHRoQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5JbnN0cnVjdGlvbnNJbkNvbmZvcm1hbmNlV2l0aEFkckFydGljbGVOdW1iZXIxMDM4NSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VycmVuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5Q29kZWQiIHR5cGU9IkN1cnJlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ3VycmVuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeSIgdHlwZT0iQ3VycmVuY3kiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ3VycmVuY3lDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk9CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1ZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYUEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhSSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREtLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREpGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFR1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVUQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYRVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZLUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0hDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdORiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1dQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhURyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIS0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklEUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklRRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1pUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUtEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVlSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTURMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCT1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFORyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFdEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEhQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT01SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJST0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUldGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0xMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0REIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1pMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEhCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE1NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUdYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVlVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlVWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWldEIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMYW5ndWFnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGFuZ3VhZ2VDb2RlZCIgdHlwZT0iTGFuZ3VhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMYW5ndWFnZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2FsZUNvZGVkIiB0eXBlPSJMb2NhbGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhbGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJMYW5ndWFnZURlcGVuZGVudCIgdHlwZT0ieGNibEJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGFuZ3VhZ2UiIHR5cGU9Ikxhbmd1YWdlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ikxhbmd1YWdlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJheiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJldSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJociIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imp3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im15Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzcSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InV6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ4aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iemgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inp1Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvY2FsZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJidSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJieiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZHoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaG4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImptIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ianAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJreiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im10Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im13Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im16Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5pIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im56Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InFhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2YyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3ZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InphIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ienciLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRheFJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJUYXgiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhUcmVhdG1lbnRDb2RlZCIgdHlwZT0iVGF4VHJlYXRtZW50Q29kZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhUcmVhdG1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhSZWZlcmVuY2UiIHR5cGU9IlRheFJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4TG9jYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRheExvY2F0aW9uIiB0eXBlPSJUYXhMb2NhdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGVkIiB0eXBlPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheENhdGVnb3J5Q29kZWQiIHR5cGU9IlRheENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlZCIgdHlwZT0iUmVhc29uVGF4RXhlbXB0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheFR5cGVDb2RlZCIgdHlwZT0iVGF4VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFR5cGVDb2RlZE90aGVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGVkIiB0eXBlPSJUYXhQYXltZW50TWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheGFibGVBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhhYmxlQW1vdW50SW5UYXhBY2NvdW50aW5nQ3VycmVuY3kiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4QW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4QW1vdW50SW5UYXhBY2NvdW50aW5nQ3VycmVuY3kiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRheExvY2F0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXgiIHR5cGU9IlRheCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRHV0eVRheE9yRmVlQ3VzdG9tc0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZBbGxEdXRpZXNUYXhlc0FuZEZlZXNDdXN0b21zSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkVhY2hEdXR5VGF4T3JGZWVUeXBlQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mQWxsRHV0aWVzVGF4ZXNBbmRGZWVUeXBlc0N1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhSZWxhdGVkSW5mb3JtYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRWZXRlcmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5UGFpZEJ5U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tQ291bnR5UHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21Mb2NhbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tU2Nob29sUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21TdGF0ZVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRHb29kc2FuZFNlcnZpY2VzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMZXR0ZXJPbkZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExvY2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Tm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUGVyU3RhdGVMYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFByb3ZpbmNpYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0U2FsZVRvVVNHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRUb2xsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUV4cG9ydEl0ZW1UYXhOb3RDaGFyZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoZXJSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGF4YWJsZU1hdGVyaWFsRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlclJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4YWJsZUxhYm9yRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZFRheFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Ib21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vLU5vdFRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHROb3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRheGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5TcGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQcm9wZXJ0eVRheEV4ZW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcjY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VzT3V0c2lkZVNjb3BlT2ZUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxseUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4RHVlRnJvbUFQcmV2aW91c0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhOb3ROb3dEdWVGb3JQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzLVRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmVyb1JhdGVkR29vZHMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Gb3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlcy1UYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vLU5vdFRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0T3JGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Ob3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5SWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1TYWxlVG9VU0dvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1QZXJTdGF0ZUxhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUYXhhYmxlTWF0ZXJpYWxFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4YWJsZUxhYm9yRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUYXhhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0VG9sbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Hb29kc0FuZFNlcnZpY2VzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUHJvdmluY2lhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblNwYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMb2NhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkVmV0ZXJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcjY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tU2Nob29sUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21Mb2NhbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21Db3VudHlQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxseUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21TdGF0ZVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclByb3BlcnR5VGF4RXhlbXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtTGV0dGVyT25GaWxlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExQ2l0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExQ291bnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMVN0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY29tbW9kYXRpb25zVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZFZhbG9yZW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbEV4cG9ydFJlYmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsbGV2eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGljQmV2ZXJhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xNYXJrVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aS1EdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXNzbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1ByaXZpbGVnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5UmVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5U2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZmZlZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbk9wZXJhdGVkRGV2aWNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlTcGVjaWZpY1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlSW5jb21lVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eVJlbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdExhYm9yVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuaGFuY2VkOTExU3RhdGVFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5jb21lVGF4V2l0aGhvbGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWYWx1ZUFkZGVkVGF4T25Hb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZhbHVlQWRkZWRUYXhPblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVJbkxpZXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FNZWRpY2FyZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQVNvY2lhbFNlY3VyaXR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxMVVNUVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3BpbGxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXBlckZ1bmRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbWluZ1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENvbnN0cnVjdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lmdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZWNlaXB0c1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGljYXBUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdod2F5VXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGx1bWluYW50c1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsSW5jb21lVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmhlcml0YW5jZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZ1ZWxUYXhBZ3JlZW1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQnlUcmFkZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha3lVbmRlcmdyb3VuZFN0b3JhZ2VUYW5rVGF4RmVkZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha3lVbmRlcmdyb3VuZFN0b3JhZ2VUYW5rVGF4U3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZ2h0RHVlc1BheWFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ29uc3RydWN0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVzdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvcG9saXRhblRyYW5zaXRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNDYXNoRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c1N0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUNvbXBlbnNhdG9yeUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JGdWVsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXJDb25zb3J0aXVtVGF4LUl0YWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RUaHJlc2hvbGRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcmVuY2VEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVUaHJlc2hvbGRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsY291bnRlcnZhaWxpbmdEdXR5Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxDb3VudGVydmFpbGluZ0R1dHlDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbER1dHlCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbER1dHlDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhBbmRFZHVjYXRpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBbmRVc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGVyY2VudGFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V2ZXJhbmNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVkU29jaWFsU2VjdXJpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlZFdhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGlkV2FzdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb25zdHJ1Y3Rpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWRpdW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1wRHV0eS1JbXBvc3RhZGlCb2xsbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVhbmRMb2NhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFuZExvY2FsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFuZFByb3ZpbmNpYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbEZ1ZWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jaWFsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsVGF4T25Hb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxUYXhPblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVJlbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUYXhvblNwZWNpZmljTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyZnVuZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNEZXZpY2VGb3JUaGVEZWFmU2VydmljZUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvYmFjY29UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbm5hZ2VUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdXJpc21UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5PdmVyVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmVtcGxveW1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl0eVVzZXJzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGhvbGRpbmdUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtlcnNDb21wZW5zYXRpb25UYXgiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDEwXzQiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZBc3Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheVZlbmRvciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMjFfNiI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjYiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxBZGRyZXNzSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJOYW1lQWRkcmVzcyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJMb2NhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25Ub1JlY2VpdmVDcmVkaXRGb3JVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGluZ1V0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUJhc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtYW5lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aHBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JsZHdpZGVHZW9ncmFwaGljTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWFyZXN0Q3Jvc3NTdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNyb3NzU3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlcklkZW50aWZpZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlU3ViZGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGUtTG9uZ2l0dWRlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpZFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpcXVvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vdGFnZUNhbGxEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBRdWFkcmFuZ2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxNZXJpZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljaWFsUHJvdHJhY3Rpb25EaWFncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclF1YXJ0ZXJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnN0cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWd1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yUXVhZHJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJzZURpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFN0YXRlbWVudHNNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eWFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRWNvbm9taWNBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcG9saXRpY2FsTmFtZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VzdG9tc09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlc3BvbmRlbmNlTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmF0ZUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaEFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuU1BMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb24tU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0RXF1YWxpemF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25GcmVpZ2h0Rm9yd2FyZGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblByb2Nlc3NpbmdTdGFuZGFyZHM1NS1OYW1lZFBvcHVsYXRlZFBsYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkN1c3RvbXNGYWNpbGl0aWVzSW5mb3JtYXRpb25hbmRSZXNvdXJjZU1hbmFnZW1lbnRTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3RhdGlvbkFjY291bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlQWxvbmdzaWRlVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdGF0aW9uR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Mb2NhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE1vdmVtZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eUZPQlBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm9wb2xpdGFuU2FtcGxpbmdBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV4aWNhblBvc3RhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlRnJvbVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLUFmdGVyTG9hZGluZ09uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkRnJlZU9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBheVN0YXRpb25MaXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZEFjY2VwdGFuY2VQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLVNoaXBwaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudHNBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsU2VydmljaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdFVTWklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RGlnaXRVU1pJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNURpZ2l0VVNaSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdENhbmFkaWFuUG9zdGFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNkRpZ2l0Q2FuYWRpYW5Qb3N0YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxFZHVjYXRpb25TZXJ2aWNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1cmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlQWRtaW5pc3RyYXRpdmVNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VidXJiYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlQW5kUG9pbnRzV2l0aGluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDYW1wdXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1TUExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU3RvcmFnZVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0Rpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2NvbnRpbmVudGFsRnJlaWdodEJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDYXJnb0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRlcnJpdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aW5nRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyYmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWxsYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdG93YWdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzZWFzQW5kUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RDaGFyZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mTWFuaWZlc3RPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZk1hbmlmZXN0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblJhaWxJbnRlcm1vZGFsVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uUmFpbEludGVybW9kYWxUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kT3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNvbGlkYXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtQ29uc29saWRhdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWFibGVBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkV4aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwYXRjaGluZ1Bvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Qb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50UG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZENoYXJnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWxlYXNlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxheVBvcnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jSUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciIgdHlwZT0iTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lQWRkcmVzcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFeHRlcm5hbEFkZHJlc3NJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYW1lMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmFtZTMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQT0JveCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIb3VzZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RyZWV0U3VwcGxlbWVudDEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0cmVldFN1cHBsZW1lbnQyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdWlsZGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmxvb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJvb21OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkluaG91c2VNYWlsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZXBhcnRtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXN0cmljdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRpbWV6b25lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJBZGRyZXNzVHlwZUNvZGVkIiB0eXBlPSJBZGRyZXNzVHlwZUNvZGUiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9Ik5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQWRkcmVzc1R5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVBZGRyZXNzIiB0eXBlPSJOYW1lQWRkcmVzcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUE9Cb3giPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJQT0JveFBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUE9Cb3giIHR5cGU9IlBPQm94Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWdpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZ2lvbkNvZGVkIiB0eXBlPSJSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWdpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWdpb24iIHR5cGU9IlJlZ2lvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZWdpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVBQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVTlNXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVU5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVFMRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVdBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkdPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU1CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU9OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVlUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkZNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQklXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQktFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQktIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk9NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk9YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEdFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEdPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEdSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVElNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVElTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE5PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0hJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0tTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0tZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0xBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05KIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU09IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU09LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU09SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1BBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1BSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1JJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1RYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1VUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dZIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb3VudHJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Q29kZWQiIHR5cGU9IkNvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHJ5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0iQ291bnRyeSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb3VudHJ5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaVyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGltZXpvbmUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRpbWV6b25lQ29kZWQiIHR5cGU9IlRpbWV6b25lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGltZXpvbmVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUaW1lem9uZSIgdHlwZT0iVGltZXpvbmUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGltZXpvbmVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAwLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDAuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMi4wMCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBZGRyZXNzVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlbGl2ZXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVJldHVybkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlQWRkcmVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5pbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZFNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmR5QW5kQ29uZmVjdGlvbnNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFzc2lnbmVkV2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueS1Pd25lZE9pbEZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0YW50c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlmZmVyZW50UHJlbWlzZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRPck1lc3NhZ2VJc3N1ZXJPclNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1NZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wLU9mZkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1lc3NhZ2VSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9yYWxEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRGlzY2xvc3VyZUluZm9ybWF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVnaXN0cmF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lckFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVvbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uRW5kaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25TdGFydGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZWRGcm9tTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQW5kQWNjZXB0YW5jZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlZEF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TdG9yZUJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEJyZWFrVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ2hhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzRm9yQ3VzdG9tc0V4YW1pbmF0aW9uQmVmb3JlQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mTG9hZEV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mU3BvdEZvclN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQXV0aG9yaXphdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvcmhvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N1cHBseVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0U2NoZWR1bGVkRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1UZW1wb3JhcnlTdG9yYWdlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZUaGVUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN1YmxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEZXBhcnRtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0ludmVudG9yeUNvbnRyb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudEJvdW5kYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQm90dGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5SW5zcGVjdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTZXJ2aWNlc0FuZFJlcGFpcnNDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb29yZGluYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9Db250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BvaW50Rm9yQ3VzdG9tZXJTYW1wbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdTdWItTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmQtS2VlcGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJpbmdPdXRsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yUmVmdXJiaXNoTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlYXJjaEluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmNlT3JEb21pY2lsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlMb2NhdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEhvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbHRlcmVkV29ya3Nob3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQmFzZVN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxDb250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9BbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0lmRGlmZmVyZW50RnJvbUJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eWF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eUF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE9yQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeURpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllck9yTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWRlb0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR1BTQ29vcmlkaW5hdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJHUFNTeXN0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYXRpdHVkZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxvbmdpdHVkZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iR1BTQ29vcmlkaW5hdGVzIiB0eXBlPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4VHJlYXRtZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vVGF4QXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0SW52b2ljZUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0ludm9pY2VMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TGluZUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0xpbmVMZXZlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcmRlckludm9pY2VNZWRpdW1UeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXRzd2l0Y2hpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSSU5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJsZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESVRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY01haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyQWNjZXNzTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlRmF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRUlTTWFpbGJveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUJNSW5mb3JtYXRpb25FeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0Qm94Tm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tldFN3aXRjaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYXBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZU1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVUZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUV1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlguNDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZXF1aXJlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJEYXRlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWRTaGlwQnlEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcXVlc3RlZERlbGl2ZXJCeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvbWlzZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYW5jZWxCeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEYXRlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyRGF0ZXMiIHR5cGU9Ik9yZGVyRGF0ZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGVDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGF0ZUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEYXRlQ29kZWQiIHR5cGU9Ikxpc3RPZkRhdGVDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGF0ZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkRhdGVRdWFsaWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVDb2RlZCIgdHlwZT0iRGF0ZUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEYXRlUXVhbGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkRhdGVRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZVF1YWxpZmllciIgdHlwZT0iRGF0ZVF1YWxpZmllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2MDMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjUzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1NjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjAyODMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjUyODMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjU2MjgzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0U2NoZWR1bGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0U2NoZWR1bGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlbGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVPZkdvb2RzRGVjbGFyYXRpb25DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZVRpbWVPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEJlbmVmaXRBZ2VMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50SW5zdXJhbmNlRWxpbWluYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50TGlmZXRpbWVCZW5lZml0UXVhbGlmaWNhdGlvbkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGFudHNPcGluaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENsb3NlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdNZXRob2RvbG9neUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nVHJhbnNhY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9wZW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlLVN0YXRlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5UmVwb3J0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlQZXJpb2REYXRlUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsQXJjaGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZURhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxQb3J0T2ZFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmV0dXJuVG9Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlTWFuaWZlc3RhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlTWFuaWZlc3RhdGlvbk9mQUNocm9uaWNDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGpvdXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29udGVzdGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkRGVhdGhCZW5lZml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRIaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50RWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UHJvY2Vzc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UHJvbWlzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRUb0JpbGxEYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvck9yZGVyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pc3Npb25EYXRlQW5kT3JUaW1lRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkb3B0aW9uRGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQWZ0ZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQmVmb3JlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUNvbXBsZXRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VPbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FibGVFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93ZWRSZW5ld2FsRHVyYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUJhc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVByb2JsZW1SZXNvbHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUR1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYWx5c2lzTW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaWFBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydERlbGlucXVlbnRPbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydEZpbGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydE1haWxpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXR5Q29tbWVuY2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRDbG9zaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWFuY2VQbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudFNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uTG9nZ2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25TdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudEV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbE9yZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUF0SW5pdGlhbFBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVPZlRyYW5zcG9ydExlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5Db3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRlcmlhbEJsb29kR2FzVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0QW5kTGlhYmlsaXR5U2NoZWR1bGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldERvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnRSZWNvcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW5jZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaWVuY2VEZWZpY2llbmN5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdFBlcmlvZEFmdGVyU3BsaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdFBlcmlvZFByaW9yVG9TcGxpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvblZhbGlkYXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRpY1ByZW1pdW1Mb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VEZWxpdmVyeURlbGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlUGF5bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPbk1hcmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyRGVsaXZlcnlEYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZURhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlU2hlZXREYXRlTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmVDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVmb3JlSW52ZW50b3J5SXNSZXBsZW5pc2hlZEJhc2VkT25TdG9ja0NoZWNrTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0xheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2luVGhlcmFweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFua3NEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBcHBsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXREZWJpdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdERlYml0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQYXltZW50c1Rlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFJlbGVhc2VBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdHNQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUeXBlR3Jvc3NXZWVrbHlBbW91bnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUeXBlTmV0V2Vla2x5QW1vdW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdEJlZm9yZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RUaW1lVG9DYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWFubnVhbFRlcm1pbmFsSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbkRhdGVCaWRzV2lsbEJlT3BlbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRQcmljZUV4Y2VwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkVGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtzVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlcHJpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNJbmNvbXBsZXRlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc05vdEF1dGhvcml6ZWRBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzTm90Q29tcGxldGVBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpdGlzaFRoZXJtYWxVbml0VGVzdFBlcmZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0TGluZUFwcGxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDb250cm9sQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NPcGVuZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1Rlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzTG9jYWxUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyRXhDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlckV4RmFjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3REZWxpdmVyZWRCeVRoaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdFB1Ymxpc2hlZEJ5VGhpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90U2hpcHBlZEJ5VGhpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkRhdGVUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGFsaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRpb25QZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRpb25QZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Cb29raW5nQ29uZmlybWVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvUmVsZWFzZURhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VDb252ZXJ0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VSZW9wZW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaENhbGxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRlZ29yeUNoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWFzZWRPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbk9mV2VpZ2h0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25QZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblJldmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWNjb3VudGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VCYWNrRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydE9mQWNjb3VudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZGJpcnRoRGF0ZUFuZE9yVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRiaXJ0aERhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocmlzdGVuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbnNoaXBDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JLbm93bGVkZ2VPZlRoZUluanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yTm90aWZpZWRPZkVtcGxveWVlTGVnYWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1JbmN1cnJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTWFkZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTm90aWZpY2F0aW9uUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltc01hZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltU3RhdGVtZW50UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVN0YXRlbWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyYW5jZURhdGVDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNhbEV4YW1pbmF0aW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRVbnRpbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdEYXRlT2ZGaXJzdEJhbGFuY2VTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zdXJlRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbkRhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25EYXRlVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVuY2VkUHVtcGluZ0JhbGxhc3REYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVuY2VkVGFua0NsZWFuaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyaXNvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25EYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQdW1waW5nQmFsbGFzdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRUYW5rQ2xlYW5pbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lTm90QWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lTm90QmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uSW5pdGlhbFRyZWF0bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uRGF0ZUxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBUXVhbGlmeWluZ0V2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNhZmV0eUNvbnZlbnRpb25Dc2NJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2FmZXR5Q29udmVudGlvbkNzY1BsYXRlRXhwaXJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0cmlwcGluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVzdGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW5jeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbk9mUGF5U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51aW5nRWR1Y2F0aW9uUmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNDb3ZlcmFnZURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzUGFzc2l2ZU1vdGlvbkNQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBdWRpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXdhcmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCaW5kaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb3N0c1Rocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REZWZpbml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RNYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyZm9ybWFuY2VEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJmb3JtYW5jZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSZS1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbERlbGl2ZXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25QZXJpb2RFbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uUGVyaW9kU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uc0NlYXNpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb3ZlcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uUHJpdmlsZWdlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uVG9SZXBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25JbnRvSG9sZGluZ0NvbXBhbnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0ZWRUb0VsZWN0cm9uaWNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0c0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWREYXRlT2ZCaXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXJTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RGlzbWlzc2FsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnROb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRJbmNvbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0RG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzUmVxdWVzdGVkVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc2JvcmRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cmVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXV0aG9yaXR5Q29udHJvbFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kTGFzdERheVdvcmtlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEluY29tZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExlZ2FsU3RydWN0dXJlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudE5hbWVFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNjaGVkdWxlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTY2hlZHVsZVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnRhaWxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VydGFpbG1lbnREYXRlZnJvbUFkdmljZU9mUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2FyZ29SZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRW50cnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQWNjb3VudE1hdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBY3F1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFuZE9yVGltZU9mSGFuZGxpbmdFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBc0F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQXNzaWdubWVudEZpbGVkRm9yUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5RmlsZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQmVjYW1lQXdhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDbGFpbVBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDb3Vyc2VPZk9ydGhvZG9udGljc1RyZWF0bWVudEJlZ2FuT3JJc0V4cGVjdGVkVG9CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURlZWRGaWxlZEZvclJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURlZmF1bHRXYXNDdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURvY3VtZW50YXRpb25PclBhcGVyd29ya09yQm90aFdhc1NlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlUHJvY2VlZGluZ3NJbnN0aXR1dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVTYWxlU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yVGhlTGFzdFVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUhhemFyZEluc3VyYW5jZVBvbGljeUNhbmNlbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUhhemFyZEluc3VyYW5jZVBvbGljeVJlZnVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVNYXRlcmlhbFVzYWdlU3VzcGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBYmFuZG9ubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNxdWlzaXRpb25PZlRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFwcHJhaXNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXNzaWdubWVudEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBc3NpZ25tZW50UmVqZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2xvc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGFtYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNlYXNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVlZEluTGlldSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGl2b3JjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRXh0ZW5zaW9uVG9Db252ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcm1Db21taXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdE1vcnRnYWdlUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RSZWdpc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0VW5jdXJlZERlZmF1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZvcmVjbG9zdXJlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdERyYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RJbnN0YWxsbWVudFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0UGF5bWVudFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0VXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUFwcHJvdmFsT2ZDb252ZXlhbmNlT2ZEYW1hZ2VkUmVhbEVzdGF0ZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUFwcHJvdmFsT2ZDb252ZXlhbmNlT2ZPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VDZXJ0aWZpY2F0aW9uT2ZDb252ZXlhbmNlT2ZEYW1hZ2VkUmVhbEVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTWF4aW11bU1lZGljYWxJbXByb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlT2ZQcm9iYWJsZUluZWxpZ2liaWxpdHlGb3JBc3NpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VPZlJlZmVycmFsRm9yQXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlVG9Db252ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3JkZXJMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUG9zc2Vzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJvZHVjdEZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb3BlcnR5SW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUZyb21CYW5rcnVwdGN5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVwYWlyT3JTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTZWl6dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTb3VyY2VEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPbldoaWNoQXNzZXRzSnVkZ2VkSW5zdWZmaWNpZW50VG9QYXlDcmVkaXRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPdXRzdGFuZGluZ0xvYW5CYWxhbmNlUmVwb3J0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUGxhY2VkSW5EaXNmYXZvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQb3NzZXNzb3J5QWN0aW9uSW5pdGlhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJhY3RpY2VDZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcmFjdGljZUVzdGFibGlzaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJvcGVydHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVhZHlGb3JDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVkZW1wdGlvblBlcmlvZEVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWZlcnJlZFRvQXR0b3JuZXlGb3JGb3JlY2xvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaHJvdWdoV2hpY2hQcm9wZXJ0eVRheGVzSGF2ZUJlZW5QYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mRGlzY291bnRUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkludGVyZXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mTGF0ZXN0QWNjb3VudHNGaWxpbmdBdFB1YmxpY1JlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVG90YWxBbW91bnRPZkRlbGlucXVlbmN5UmVwb3J0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVWb2x1bnRhcnlDb252ZXlhbmNlQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVXaGVuQ29udGFpbmVyRXF1aXBtZW50QmVjb21lc0RvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlsaWdodE92ZXJkcmFmdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhdGhEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRWYWx1ZURhdGVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRJbmN1cnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjaXNpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25QcmVzZW50YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblJlZmVyZW5jZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVlZE5vdEF2YWlsYWJsZUFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZERpc3RyaWJ1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5pdGlvbk9mRGlzYWJpbGl0eUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxheWVkQmlsbGluZ05vdERlbGF5ZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlck5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QXBwb2ludG1lbnREYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZTFTdFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lQ3VycmVudFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRGVmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRmlyc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVMYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lU2NoZWR1bGVkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlcklzc3VlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRpY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxSZXNjaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50QWRtaXNzaW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudERpc2NoYXJnZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkxhYm9yV2FnZURldGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVGcm9tTGFzdFBvcnRPZkNhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVGcm9tU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsSW5mb3JtYXRpb25SZWNlaXB0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0SW50ZXJjaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5V2FpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZUFuZExvYWRpbmdDb21wbGV0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlLVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2VtYmFya2F0aW9uRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc21pc3NhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlkZW5kQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEV4cGlyeURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdElzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRQcmVzZW50YXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50TWVzc2FnZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2VpdmVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVxdWVzdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RGVsaXZlckFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERlbGl2ZXJCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90U2hpcEJlZm9yZUV4Q291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RTaGlwQmVmb3JlRXhGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEFjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BwZWRUb0xlc3NUaGFuSGFsZlRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVMYXN0Q29tcGxldGVJbnN0YWxsbWVudFBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVPZkZpcnN0UGF5bWVudFRvUHJpbmNpcGFsQW5kSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZVRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZUJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJsaWVzdEZpbGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybGllc3RTYWxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5V2l0aGRyYXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmluZ3NFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlT2ZDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHlCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFya2F0aW9uRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUHJvZmVzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVFZmZlY3RpdmVEYXRlT2ZDb3ZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVMYWlkT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRlbXBvcmFyeUxhaWRPZmZQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGVtcG9yYXJ5TGFpZE9mZlBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlV2FnZXNDZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyS25vd2xlZGdlT2ZUaGVJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyUmVwb3J0ZWRJbmp1cnlUb0NsYWltQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFBvc2l0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50T3JIaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UG9zaXRpb25TdGFydERhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQcm9mZXNzaW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kQXZhaWxhYmlsaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZU9mU3VwcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTGF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZHcmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZMYXN0RmlzY2FsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZWRDZXJ0aWZpY2F0ZUlzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZUxldmVsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsbWVudFNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlEYXRlRXN0aW1hdGVkQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TG9nRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UHJlVHJpcERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlY29uZGl0aW9uaW5nRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlcGFpclJlYWR5RGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmV0dXJuUGVyaW9kRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0b2NrQ2hlY2tEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVDb21tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY2VwdGFuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLUZpcnN0UHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1TZWNvbmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLVRoaXJkUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQmlydGhFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFc2Nyb3dDbG9zaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRJbW1pZ3JhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvaW50T2ZBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb2ludE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb3J0T2ZFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1GaXJzdFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LVNlY29uZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LVRoaXJkUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGlvbkRhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGl0UGxhbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZENvbnRhaW5lckhpcmVGcm9tRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkRnVuZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkUHJvYmxlbVJlc29sdXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFJlcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkT24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlT2ZFeHRlbnNpb25Ub0Fzc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVPZkV4dGVuc2lvbnRvRm9yZWNsb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZVRpbWVPZkN1c3RvbXNEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVUb1N1Ym1pdFRpdGxlRXZpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkV4dGVuc2lvblRvQ29udmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZFeHRlbnNpb25Ub1N1Ym1pdEZpc2NhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkZvcmVjbG9zdXJlVGltZWZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlT2ZFeHBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlT2ZJbXBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBsYW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0YXRpb25EYXRlRm9yVGV4dGlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvc3VyZVNvdXJjZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUR1ZUJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVNb2RlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWFzaWJpbGl0eVNpZ25PZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIaWdod2F5QWRtaW5pc3RyYXRpb25GaHdhSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZUNhcGl0YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZEZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUdlbmVyYXRpb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsSXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjb25jaWxpYXRpb25WYWx1ZUVzdGltYXRlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDb3ZlcmFnZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvblN1Ym1pc3Npb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZU1hbmRhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0RGF0ZU9mT3JkZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW50ZXJlc3RCZWFyaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnRlcmVzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW52b2x2ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0TWFya2V0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UGF5bWVudENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFByb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFB1Ymxpc2hlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U2FsZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTdWJtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFZpc2l0b3JDb25zdWx0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbEFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmlsbERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0NvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvRWFybGllc3REZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9MYXRlc3REZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk5vdGljZVRvUHJvY2VlZFRvQ29tbWVuY2VtZW50T2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZOb3RpY2VUb1Byb2NlZWRUb0NvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9TYW1wbGVSZWFkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZSZWNlaXB0T2ZJdGVtVG9BcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlJlY2VpcHRPZlRvb2xpbmdBaWRzVG9TYW1wbGVSZWFkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlNhbXBsZUFwcHJvdmFsVG9GaXJzdFByb2R1Y3RTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlRvb2xpbmdBdXRob3JpemF0aW9uVG9TYW1wbGVSZWFkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbUxhc3RCb29rZWRPcmRlclRvRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBcHByb3ByaWF0aW9uLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBcHByb3ByaWF0aW9uLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXR1cmVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxvbnNQZXJNaW51dGVUZXN0UGVyZm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNQb3NpdGlvbmluZ0RhdGVUaW1lRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUG9zaXRpb25pbmdEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBDb250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBDb250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRPdmVyRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRPdmVyRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ2FwaXRhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvblJlbGVhc2VBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlZEZyb21EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlZFVudGlsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBc1N0b2NrQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Nlc0Nvbm5lY3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Nlc0Rpc2Nvbm5lY3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEFkbWlzc2lvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzY2hhcmdlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcm90ZXN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzc0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzUmVjb3ZlcnlEYXRlRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWlncmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGFudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvbkRhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWN0aXZpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kTW92ZW1lbnRBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lRG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUluY3JlYXNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uRGlzc29sdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3VtYmVuY3lQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxFZHVjYXRpb25QbGFuSUVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1mb3JjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWxlYXNlQXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDb250YWN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kTGFzdERheVdvcmtlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RSZXR1cm5Ub1dvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGZWVEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGaW5hbmNpYWxBY2NvdW50c0ZpbGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZUluaXRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUHJlbWl1bUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFJlcXVlc3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlPcklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblNlcnZpY2VTdXJ2ZXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNvbHZlbmN5RGlzY2hhcmdlR3JhbnRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25EYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxtZW50UGF5bWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc09yaWdpbmFsRXhlY3V0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50QXNzZXRzSnVkZ2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RDYXBpdGFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQYWlkVGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFJhdGVWYWxpZGl0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRBcHByb3ZhbEZvclB1YmxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJldmlld0N5Y2xlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnJ1cHRpb25FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycnVwdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyU2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50TnVtYmVyQWxsb2NhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludml0YXRpb25Ub1RlbmRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEYXRlUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUNvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2luZWRFbXBsb3llckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW5lZEZ1bmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50Q2FsZW5kYXJZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudEZpc2NhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91cldhZ2VEZXRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEFjdGl2aXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEFubnVhbFJlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXBpdGFsQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaGVja0ZvckJhbGFuY2VTaGVldFVwZGF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaXZpbGlhbkZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVGb3JBR292ZXJubWVudEFnZW5jeVRvRmlsZUFDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVPZkFjY291bnRzRmlsZWRBdFB1YmxpY1JlZ2lzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZU9mT3JkZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlVG9GaWxlQUNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZVRvT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RXBpc29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEZvbGxvdy11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEluc3VyYW5jZU1lZGljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJbnRlcmVzdEJlYXJpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SXRlbURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TG9nZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWFya2V0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVuc3RydWFsQ3ljbGVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZW5zdHJ1YWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNaWxpdGFyeUZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE9mZkhpcmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0T25IaXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBhaWRJbnN0YWxsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQYXltZW50TWFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBoeXNpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJlbWl1bUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByZW1pdW1QYWlkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQdWJsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFB1Ymxpc2hlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTYWxhcnlJbmNyZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNhbGVEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTY3JlZW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTZWVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFZpc2l0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFhSYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RBYnNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEJhbGFuY2VTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0Q2hlY2tJblRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdERlbGl2ZXJ5RGF0ZWF0UGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RGVsaXZlcnlEYXRlQXRSYWlsUmFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RmlsaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RNYXRlcmlhbFNhZmV0eURhdGFTaGVldERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE1ldGVyUmVhZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE9uQm9hcmRDYXJyaWVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0UHJpY2VBZGp1c3RtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0UmVjZWl2aW5nRGF0ZUN1dG9mZkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFZpc2l0b3JDb25zdWx0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheVRpbWVGaXJzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5VGltZUxhc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUNvbW1lbmNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlVGVybUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlVGVybVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdEVtcGxveWVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBY3Rpb25DbG9zZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEFjdGlvblN0YXJ0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU2V0dGxlbWVudFRlcm1zTWV0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdHJ1Y3R1cmVDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJDcmVkaXRDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZBZ3JlZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkxpYWJpbGl0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RQcmljZUNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkb25WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblB1cmNoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuU2VydmljaW5nVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRXhjZXB0aW9uT3JkZXJOdW1iZXJBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXN0QWN0aXZpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFJlY2VpcHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VDb21tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZWdvb2RDb21tZXJjaWFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEF2YWlsYWJsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXJOb3RSZWdpc3RlcmVkQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5T3JUYXJnZXRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeU9yVGFyZ2V0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0U2hpcE5vdGljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk1hcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMZWFzZUFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUNyZWRpdEdyYW50ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0QWdlaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uU2lnbmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25TeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUNvdmVyYWdlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUVsaWdpYmlsaXR5QmVnaW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBRWxpZ2liaWxpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCQ292ZXJhZ2VFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCRWxpZ2liaWxpdHlCZWdpbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJFbGlnaWJpbGl0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkcG9pbnRPZlBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVxdWlyZWREaXN0cmlidXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGVsZkxpZmVSZW1haW5pbmdBdFRpbWVPZkRlc3BhdGNoUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hlbGZMaWZlUmVtYWluaW5nQXRUaW1lT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vb3JpbmdEYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlT2ZmaWNpYWxTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVSZXBvcnRlZEN1cnRhaWxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VOb3RlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUVhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUxhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRIZW1vZ2xvYmluT3JIZW1hdG9jcml0T3JCb3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50UmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFJldmlzaW9ub3JJbml0aWFsVmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFNlcnVtQ3JlYXRpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVkRnJvbUxvY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEV4dGVuc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRpb25zU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRDcmVkaXRTZXJ2aWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V29ydGhEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFubnVhbE1lZXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRJbnN0YWxsbWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRJbnRlcmVzdENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRQYXlJbmNyZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZXZpZXdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1Byb2R1Y3Rpb25TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Qcm9taXNlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9TaGlwcGluZ1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZkRlYXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25UaW1lTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZWdpc3RlcmVkQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW5Gcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhblRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkhpcmVTdXJ2ZXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2lhbFJhaWxDYXJJbnRlcmNoYW5nZUVpdGhlckFjdHVhbG9yQWdyZWVkVXBvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmLU1hcmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRGcm9tQ29vcmRpbmF0ZWRVbml2ZXJzYWxUaW1lVXRjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRlc3RVbnBhaWRJbnN0YWxsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQm9hcmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhpcmVTdXJ2ZXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uc2V0T2ZDdXJyZW50U3ltcHRvbXNPcklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uc2V0T2ZTaW1pbGFyU3ltcHRvbXNPcklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ib3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbnNDZWFzZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGluaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljTGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0xhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJBbWVuZG1lbnRCaW5kaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb21wbGV0aW9uRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyUmVjZWl2ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJUb1Byb2NlZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRXN0aW1hdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbElzc3VlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsbHlTY2hlZHVsZWRTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE1hdHVyaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQb3N0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob2RvbnRpY1RyZWF0bWVudFBlcmlvZFJlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9kb250aWNUcmVhdG1lbnRQZXJpb2RUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVBvY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUF1ZGl0b3JzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyaGF1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZURhdGVGb3JTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyVGFyZ2V0QmFzZWxpbmVNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5TYXR1cmF0aW9uVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUV2YWx1YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkSW5GdWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JBY2NydWVkU2lja1BheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlRm9yTWluaW11bVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JTYWxhcnlDb250aW51YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZUZvclRvdGFsUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvclZhY2F0aW9uUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlcndvcmtNYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxBbm51aXRpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFRpbWVXb3JraW5nQ2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRGaXJzdFZpc2l0Rm9yQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q29tbWVuY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGVUaW1lRGVmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5pdGlhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5zdHJ1Y3Rpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25QcmVzZW50YXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbERlZHVjdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWtBY3Rpdml0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXlUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nQXJjaGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY29sYXRpb25UZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RBbkV2ZW50SXNMYXRlRHVlVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEJldHdlZW5DaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RDb3ZlcmVkQnlTb3VyY2VEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mQ2FyZUVuZERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mQ2FyZVN0YXJ0RGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZJbGxuZXNzRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZJbGxuZXNzU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPdmVyZHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kV29ya2VkRm9yVGhlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0VG9BZG1pdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0xhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQ29sbGVjdGlvbkRhdGVUaW1lT2ZDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwRGF0ZVRpbWVPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlUHJldmlvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5Bbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWREdXJhdGlvbk9mV29ya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuT2ZUcmVhdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QYXJ0aWNpcGF0aW9uU3VzcGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb25CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdWdnZWRBbmRBYmFuZG9uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlT25PckFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmVPbk9yQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lTdXJyZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0RhdGVUaW1lT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nRGF0ZVRpbWVPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdG1hcmtEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25FbmRPZlNlY29uZFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkZpcnN0UmVwb3J0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRmlyc3RTZW1pLWFubnVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uU2Vjb25kU2VtaS1hbm51YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFycmFuZ2VkRGVhbE1hdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQXdhcmRTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNlZGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNlcnRpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmb3JlY2xvc3VyZUFjY2VwdGFuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmb3JlY2xvc3VyZVNhbGVDbG9zaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUR1cmF0aW9uQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1DaGFuZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRGlzcGVuc2luZ0RhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbklzc3VlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkRhdGVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkRhdGVPZkdvb2RzRGVjbGFyYXRpb25DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25Ub0JhbmtydXB0Y3lSZWNlaXZlcnNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50Q29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGVkVG9SZWNlaXZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRMZWdhbFN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGx5UmVzaWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRSZXNpZGVuY2VTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQm9va2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvdXJ0RXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VycmVudEFjY291bnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW52b2ljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXBvcnRlZERhdGVPZkJpcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVzaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZXRlclJlYWRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRMaW1pdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCYXNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlckJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0QW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3RJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JIb3NwaXRhbGl6YXRpb25EYXRlc1JlbGF0ZWRUb0N1cnJlbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3REYXRlT2ZCaXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2aWxlZ2VEZXRhaWxzVmVyaWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRGF0ZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0VuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEF2YWlsYWJpbGl0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RIZWxkVW50aWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25EYXRlTm9TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uTWFudWZhY3R1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGlmZXNwYW5BdFRpbWVPZlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2ZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbW1lZENhbGVuZGFyWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbW1lZEZpc2NhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkQWN0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkRm9yZWNsb3N1cmVTYWxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE92ZXJUYXJnZXRCYXNlbGluZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeVByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudFByaW9ydG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkRhdGVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25GbG9vclN0b2NrUHJvdGVjdC1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkZsb29yU3RvY2tQcm90ZWN0LVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25JbnZvaWNlUGVyZm9ybWFuY2UtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25JbnZvaWNlUGVyZm9ybWFuY2UtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yZGVyLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JkZXItU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblBlcmZvcm1hbmNlLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUGVyZm9ybWFuY2UtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblJlcXVlc3RlZERlbGl2ZXJ5LUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUmVxdWVzdGVkRGVsaXZlcnktU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblNoaXAtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TaGlwLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlBY3F1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlCdWlsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJMYXRlc3RQb3NzaWJsZUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHV0SW50b1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlVG9CZVJlY2VpdmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZU9mRXhjaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVByaWNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWNoZWRUb3RhbERlcHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvckluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVRheFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYnVpbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2FwdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2YWJsZXNDb2xsZWN0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZUF0TG9ja2JveERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkSW5UaGVNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFwcG9pbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzaGlwUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNoaXBSZXN1bHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYXNzaWZpY2F0aW9uRXhpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLWVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1ldmFsdWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVFeHBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkSXRlbUNyZWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JOdW1iZXJBc3NpZ25tZW50RGF0ZU9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25EYXRlT2ZQcmV2aW91c0N1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZCb2FyZE9mRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW1idXJzZW1lbnRDbGFpbUlzc3VlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVJbXBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdGF0ZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUFjY291bnRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQ292ZXJhZ2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VDdXJyZW50QWNjb3VudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlSXNzdWVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUGFpZFVwRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQYXltZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWlzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlT2ZDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVPZlN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlZFJldHVyblRvV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRUb1Zlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU9mSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW9kZWxpbmdDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmV3YWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyVHVybmFyb3VuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGF5bWVudEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBheW1lbnRTY2hlZHVsZVNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGx5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0N5Y2xlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVhbGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZERlcGFydHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRm9yRGVsaXZlcnlXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZvclNoaXBtZW50V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRPZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9uT2ZGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRMaWNlbnNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudExpY2Vuc2VFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZ25hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvbHZlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25SZWxlYXNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblJlbGVhc2VEYXRlVGltZVBhcnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJhbnNtaXNzaW9uVGltZVN0YW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuVG9Xb3JrRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuVG9Xb3JrUGFydFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFkanVzdGVkRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQWRqdXN0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEVzdGltYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldm9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldm9rZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ0Fycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRGdW5kVGF4RXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsYXJ5Q2hhbmdlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsYXJ5RGVmZXJyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVhYmxlU3RvY2tEZW1hbmRDb3ZlclBlcmlvZEV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0RhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUF2YWlsYWJsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUNvbGxlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlUmVxdWlyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZhY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5T25PckFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeU9uT3JCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudEFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudFByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRJbnRlcmNoYW5nZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xSZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEFkbWlzc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERpc2NoYXJnZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5UmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVQcmljZUFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3Rpb25QZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3Rpb25QZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxCeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNMb2NhbFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWlhbm51YWxFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdSb2FkVGltZVN0YW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXB0aWNBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbXBsZXRpb25EYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUludGVycnVwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlclNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldG9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlQXNTcGVjaWZpZWRCeVRoZU9yaWdpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlRnJvbUludGVybGluZVNldHRsZW1lbnRTeXN0ZW1Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRGF0ZU9yaWdpbmFsbHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBEdXJpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUHJvbWlzZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVQcm9taXNlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RMYXRlclRoYW5EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdEJlZm9yZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90QmVmb3JlQW5kTm90QWZ0ZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE9uT3JBYm91dERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nRGF0ZUFuZE9yVGltZUN1cnJlbnRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdEYXRlTm9TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFdlZWtPZkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNodXRJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NCZW5lZml0QWdlTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NJbnN1cmFuY2VFbGltaW5hdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NMaWZldGltZUJlbmVmaXRRdWFsaWZpY2F0aW9uQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRldHJhY2tlZFdlbGxib3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltaWxhcklsbG5lc3NPbnNldERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZUludGVyZXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJpbmdFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJpbmdTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5Q2xhaW1zVmVyaWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZEJvb2tQdWJsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZURpcmVjdG9yc2hpcFJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlRG9jdW1lbnRDYXB0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ09yZGVyVW5pdEFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZVJldGlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVNYW5kYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU5vdEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVOb3RCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0ZWREb2luZ0J1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE5vRWFybGllclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0Tm9MYXRlclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVSZXNpZGVuY3lEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFRpbWVTZXJpZXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0FmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNBc3NpZ25tZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NvbW1lcmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c091dHNpZGVQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1ByaW9yQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wRGlzdHJpYnV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFdvcmtBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JQZXJpb2RPZkhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRJbnRlcmVzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRTdWJtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNBdmVyYWdlQ3JlZGl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlQ2FzaW5nQXV0aG9yaXR5QXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmdlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnJlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvbkVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dvcm5BbmRTdWJzY3JpYmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1wdG9tc09uc2V0UGF0aWVudEFsbGVnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVSYXRpbmdFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhaWxDb3ZlcmFnZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWlsQ292ZXJhZ2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtzQWNjZXB0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua3NJbnNwZWN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UG9pbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5UHJvc3RoZXNpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlclN1Ym1pc3Npb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbk9mRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zRGlzY291bnREdWVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNNZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTmV0RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdENvbXBsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGVyZm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGVyaW9kRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhc0xpbmVUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUVtcGxveWVlQmVnYW5Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5VUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lTm93RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ1JlcXVpcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGVsZkxpZmVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVTdHlsZVJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJOb3RlQWNjZXB0YW5jZURhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNoaXBtZW50RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRUaW1lTGltaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHJpcHBpbmdEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHVmZmluZ0RhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbEJhbGFuY2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFN0YXJ0RGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTdGFydERhdGVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRlZERhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZFVudGlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGF0ZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhDbGFpbXNWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGF0ZU9mSW5kZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmJhbFJlcG9ydE5lZWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxSZWdpc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRhcnlUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm91Y2hlckRhdGVPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZXNFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl0aW5nVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWVrRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTG9nUnVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVDb250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWxsQWR2aXNlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXduRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGhlbGREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRWZmZWN0aXZlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1BlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NDb21wbGV0aW9uRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzQ29tcGxldGlvbkRhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29yc3RUaW1lVG9DYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyQmVnaW5uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyRHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyT2ZPY2N1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyVG9EYXRlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlclBhcnR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCdXllclBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnV5ZXJUYXhJbmZvcm1hdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5VGF4SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlbGxlclBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyVGF4SW5mb3JtYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eVRheEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmlsbFRvUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZW1pdFRvUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwRnJvbVBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iV2FyZWhvdXNlUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTb2xkVG9QYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hbnVmYWN0dXJpbmdUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWF0ZXJpYWxJc3N1ZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyUGFydHkiIHR5cGU9Ik9yZGVyUGFydHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eUlEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ERkJ1c2luZXNzIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJOYW1lQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWNlaXZpbmdDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik90aGVyQ29udGFjdHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcnJlc3BvbmRlbmNlTGFuZ3VhZ2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eSIgdHlwZT0iUGFydHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiIHR5cGU9Ikxpc3RPZklkZW50aWZpZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdElEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udGFjdEZ1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mQ29udGFjdE51bWJlciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgdHlwZT0iQ29udGFjdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdEZ1bmN0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlZCIgdHlwZT0iQ29udGFjdEZ1bmN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdEZ1bmN0aW9uIiB0eXBlPSJDb250YWN0RnVuY3Rpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nY29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEluc3VyYW5jZUluZm9ybWF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpdmVDb250cmFjdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyLUhvdXJzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRTY2hlZHVsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW50aW9uLVRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRGaW5hbmNpYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTmVnb3RpYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkU2lnbmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ2hvdXNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxJbnF1aXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXRNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllck5hbWVvckRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBREFuZENBTVNwZWNpYWxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpcm1hbk9mVGhlQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT3JkZXJBcHByb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZFeGVjdXRpdmVPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkZpbmFuY2lhbE9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmSW5mb3JtYXRpb25PZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZk9wZXJhdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlXb3Jrc0F1dGhvcml0eUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFwcHJvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdob3VzZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrT2ZDb3VydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUludmVzdGlnYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWdlb2ZFZHVjYXRpb25BZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50RW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXB1dGVyU3lzdGVtc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRFbXBsb3llckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZFdpdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVQdXJjaGFzaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbmRTY2hlZHVsZUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRhY3RHcmFudGluZ0FwcG9pbnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUluc3RydWN0aW9uc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbFNjaG9vbEFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckVtcGxveWVlVG9FeGVjdXRlRXhwb3J0UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yRW1wbG95ZWVUb0V4ZWN1dGVJbXBvcnRQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JQZXJzb25SZXNwb25zaWJsZUZvclByb2Nlc3NpbmdQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2ZWxvcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnlBZHZlcnRpc2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY2l0eVN1cHBseUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1N1Ym1pc3Npb25SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LU1pbGl0YXJ5VHJhZmZpY01hbmFnZW1lbnRDb21tYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LVNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURhbmdlcm91c0dvb2RzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRlcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbmluZ1Byb2dyYW1zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVWaWNlLVByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBaWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyQWRtaW5pc3RyYXRpdmVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU3VwcGx5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWl2aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUJ1c2luZXNzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUVuZ2luZWVyaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUZpbmVBcnRzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWlkYW5jZUNvdW5zZWxvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0Rm9ySW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0Rm9ySW5mb3JtYXRpb25Qcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0T3JDb21wdXRlckRhdGFQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh1bWFuUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRXb3JrQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kcmVnaXN0cnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdTY2hvb2xBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEF1ZGl0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsUHVyY2hhc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldGluZ0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldGluZ0RpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxIYW5kbGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VTZW5kZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0J1c2luZXNzUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGV2ZWxvcG1lbnRzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5UHVibGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcmljYWxDb250cm9sRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFkdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudG9yR3VhcmRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDbGFpbU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VFdmFsdWF0aW9uQ29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZDb2xsZWN0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRlbGl2ZXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE9yRXF1aXBtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1NYWludGVuYW5jZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXdhcmRTdXJ2ZXlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFN0dWR5Q29udGFjdG9yQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25vckxlZ2FsT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0VuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25SZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hbmFnZW1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0RGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljUmVsYXRpb25zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udHJhY3RpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvb3JkaW5hdG9yQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUluc3BlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VydmV5b3JDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVTdXBlcnZpc29yT3JDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5S2V5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlT3JDaGFyZ2ViYWNrQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRG9ja0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ29tcGFueUFkbWluaXN0cmF0aXZlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0QXV0aG9yaXplciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0UHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uRm9yQ29tcHV0ZXJEYXRhUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25mb3JJbmZvcm1hdGlvbkRpc3NlbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uRm9ySW5mb3JtYXRpb25Qcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdBbmRSZXByaWNpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcHJlc2VudGF0aXZlT3JEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbENsZXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xvZlRoZW9sb2d5QWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sb2ZWZXRlcmluYXJ5TWVkaWNpbmVBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xQcmluY2lwYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVRheHBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZGVyV3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVRlY2huaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlcnZpY2VzV29ya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZUhvdXNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2dyYW1Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50aW5BYnNlbnRpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHlTdWJtaXR0ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1zQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnRhdGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsTWFya2V0aW5nUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFdyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zTmV0d29ya0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlckRldmVsb3BlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkLVBhcnR5QWRtaW5pc3RyYXRvckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25QbGFubmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWZmaWNBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFmZmljQXV0aG9yaXR5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEluZnJhc3RydWN0dXJlQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmdyYWR1YXRlQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWNlUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyU3VwcGx5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0Jyb2tlck1haW50ZW5hbmNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3Nob3BDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZW1lbnRDb250YWN0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0TnVtYmVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250YWN0TnVtYmVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0TnVtYmVyIiB0eXBlPSJMaXN0T2ZDb250YWN0TnVtYmVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0TnVtYmVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGVkIiB0eXBlPSJDb250YWN0TnVtYmVyVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlciIgdHlwZT0iQ29udGFjdE51bWJlciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZheE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1haWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVBhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldXVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUkxPdGhlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udGFjdCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdCIgdHlwZT0iTGlzdE9mQ29udGFjdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHlUYXhJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhJZGVudGlmaWVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWdpc3RlcmVkTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVnaXN0ZXJlZE9mZmljZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUYXhMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29tcGFueVJlZ2lzdHJhdGlvbk51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlUYXhJbmZvcm1hdGlvbiIgdHlwZT0iUGFydHlUYXhJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFydHlDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFydHlDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFydHlDb2RlZCIgdHlwZT0iTGlzdE9mUGFydHlDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHlDb2RlZCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJQYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5Um9sZUNvZGVkIiB0eXBlPSJQYXJ0eVJvbGVDb2RlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnR5Um9sZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5Q29kZWQiIHR5cGU9IlBhcnR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcmFuc3BvcnQiIHR5cGU9Ikxpc3RPZlRyYW5zcG9ydCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRJRCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJyaWVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FycmllcklEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDdXN0U2hpcHBpbmdDb250cmFjdE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUxldmVsQ29kZWQiIHR5cGU9IlNlcnZpY2VMZXZlbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VMZXZlbENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TGVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNpdERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0IiB0eXBlPSJUcmFuc3BvcnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNb2RlIiB0eXBlPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDaGFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmllZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkRm9yY2VzQ291cmllclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2toYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdFdheS1TaGlwcGVyc09wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va1Bvc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJPclRheGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbklycmVndWxhckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGlja3VwT3JDdXN0b21lcnNFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlYXdheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuT3JQYWNpZmljRGlzdHJpYnV0aW9uU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRUcmFuc3BvcnRJbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZseWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmdPclNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtb2RhbC1QaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJhaWxlckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2FpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SW50cmF0aGVhdGVyQWlybGlmdFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5T2ZmaWNpYWxNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlVW5rbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1Db21tb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1GbGF0YmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1QYWNrYWdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXRpbW9kYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbmZlcmVuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2Vhbk5vbi1Db25mZXJlbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyY2VsUG9zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZEFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFRvUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVQYXJjZWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWlja3RyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFPckFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQWdlbnQtVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3dhd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlck9yUGlwZWxpbmVJbnRlcm1vZGFsTW92ZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRNZWFuc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TWVhbnMiIHR5cGU9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SUxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElMQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEJ1bGtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kVGFua1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmRQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcldpdGhDYXJhdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW1lbnRWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hc3RlckNoZW1pY2FsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsLUNhckNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxDYXJPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1BbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1DbG9zZWRUb3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhpZ2hTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUxvd1NpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPbmx5VmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3Blbi1TaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW5Ub3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1QbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVycmVzdGluZ29uYUNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1TdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0Zvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVXBncmFkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1WZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhCYWdIYW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmxvb3JTZWN1cmluZ1JpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmx1c2hEb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEhhbmdhckJhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhTbW9vdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFdhdnlPclJpcHBsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkVGVtcGVyYXR1cmVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcnVkZU9pbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJEZXRlcm1pbmVkRGVhbnNPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSYWlsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQtSW5IZWxwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZXBTZWFDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQmFja1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlcHRpb25hbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2hpbmdWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2tEb3VibGVEcm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRSYWNrLUZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFJhY2stU2luZ2xlRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFJlZnJpZ2VyYXRlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXR1cmVUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1Db3ZlcmVkSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdmVsVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmSGVpZ2h0RmxhdFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWQtRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZG9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWRQbmV1bWF0aWNEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYW50Q2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrQW5kRnJlZXplclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljdHJ1Y2thbmRyZWZyaWdlcmF0ZWR0cmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1ZWZpZWROYXR1cmFsR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWVmaWVkUGV0cm9sZXVtR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9yVW5sb2FkRGV2aWNlT25FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxQcm9kdWN0c1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1Ub3BPckZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuVG9wVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJQYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0ZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQnVsa0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkTWFpbnRlbmFuY2VPZldheUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFNpbG9UYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXItRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZEZyZWV6ZXJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlU2lkZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWxUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rQW5kQnVsa1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFua0FuZFRhbmtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkUmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkU2lsb1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE9uLVJvbGxPZmZWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyRGV0ZXJtaW5lZE1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUQUstUkFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVlbFByb2R1Y3RzVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXIyNVRvbm5lV2l0aDkwQ3ViaWNNZXRlclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZmFuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlc2NvcGluZ1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWJlck9yTG9nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwQXJ0aWN1bGF0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLURyeUZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRWxlY3RyaWNIZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVBuZXVtYXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1SZWZyaWdlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1Gb29kR3JhZGVMaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGgyME9yTW9yZVdhZ29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoTW9yZVRoYW5PbmVBbmRMZXNzVGhhbjIwV2Fnb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGhPbmVXYWdvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29yc05vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja09yVHJhaWxlcldpdGhUaWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1Z2FuZE9yUHVzaGJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbi1TcGVjaWFsSW5zaWRlTGVuZ3RoV2lkdGhPckhlaWdodFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLUxha2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUNvbnRhaW5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1MYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tUm9sbE9uLVJvbGxPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2RjaGlwY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Zlc3NlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa0NvbW1vZGl0eVRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZWVEYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5QU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFY29ub215Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZE5leHREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRTZWNvbmREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRUaGlyZERheUJ5Q2FydGFnZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvblJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWZpY2F0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5V2l0aFNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlV29ybGR3aWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVdvcmxkd2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpd2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5QWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RmxpZ2h0T3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5SHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dE1vcm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNlcnZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Zlcm5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnkxMDMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5OTMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnlOb29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT0JveFppcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTUwMFBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFTZWNvbmREYXlCeU5vb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnRlcm1vZGFsSGlnaFNwZWVkNzBNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW50ZXJtb2RhbEFuZFN0YWNrU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjBNaWxlc1BlckhvdXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1c1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11dGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJldHVyblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUh1bmRyZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdW5kSHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTW9ybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTcGVlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RTZXJ2aWNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0VGhlU3RhdGlzdGljYWxUZXJyaXRvcnlMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdEJvcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXREZXBhcnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Gb3VydGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlmdGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2l4dGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2V2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FaWdodGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlyc3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlDYXJyaWFnZS1TZWNvbmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVGhpcmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDYXJyaWVyQWxsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRQcmUtQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1BY2NlcHRhbmNlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRPbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLU5pbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1UZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FbGV2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Ud2VsZnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0Q2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMm5kQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM3JkQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNnRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iN3RoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkRlbGl2ZXJ5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZVJpZ2h0c0NhcnJpZXJBbmRKdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3dpdGNoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZU1vdmVtZW50Q2FycmllckFuZEp1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyQWlyTW90b3JPck9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyUnVsZTExU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZVN3aXRjaENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXJyaWVySW5Sb3V0ZU9uUmV0dXJuUm91dGVNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyRm9sbG93aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyUHJlZGVjZXNzb3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiIHR5cGU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZWQiIHR5cGU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGVkIiB0eXBlPSJFcXVpcG1lbnRPd25lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVxdWlwbWVudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGVkIiB0eXBlPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwZW1lbnRTaXplVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGVkIiB0eXBlPSJFcXVpcG1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkZ1bGxJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNlYWxJbmZvIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZFcXVpcG1lbnRNZWFzdXJlbWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50IiB0eXBlPSJUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5U3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlclN1cHBsaWVkRnJvbUFMZWFzaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyU3VwcGxpZWRGcm9tVGhlUmFpbHdheXNQb29sIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcExlYXNlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5T3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWRXaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbC1DYXJDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsQ2FyT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQWx1bWludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1CdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ2xvc2VkVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IaWdoU2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Mb3dTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW4tU2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItUGxhdGZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclJlc3RpbmdPbkFDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItU3RlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUZvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVVwZ3JhZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoQmFnSGFuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsb29yU2VjdXJpbmdSaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsdXNoRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhIYW5nYXJCYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoU21vb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhXYXZ5T3JSaXBwbGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFRlbXBlcmF0dXJlVHJhaWxlci1SZWVmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dC1JbkhlbHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZUNvYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEJhY2tUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsVHJhaWxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVwb3h5Q29hdGVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb1BhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VhYmxlUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLURvdWJsZURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLUZsYXQtQmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1TaW5nbGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItQ292ZXJlZC1JbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZkhlaWdodEZsYXRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkLVBuZXVtYXRpY0Rpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhbnQtQ2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPclVubG9hZERldmljZU9uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuMTAuOTBNQW5kMTMuNzVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuNi4xNU1BbmQ3LjgyTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjcuODJNQW5kOS4xNU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW45LjE1TUFuZDEwLjkwTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtTGVzc1RoYW42LjE1TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ud29ya2luZ1JlZWZlckNvbnRhaW5lcjIwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbndvcmtpbmdSZWVmZXJDb250YWluZXI0MEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nUmVmcmlnZXJhdGVkT3JSZWVmZXJDb250YWluZXIzMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblZlc3NlbC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tVG9wT3JGbGF0YmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblRvcFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzdXJpemVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRNYWludGVuYW5jZU9mV2F5Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkT3JSZWVmZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmszMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbms0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmtJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFua0ljNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVTaWRlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuZGluYXZpYW5QYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWktUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pLVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlubGVzc1N0ZWVsVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rhay1SYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIzMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXI0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVzY29waW5nVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMjBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMzBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyNDBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90ZWJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Cb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1EcnlGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUVsZWN0cmljSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1QbmV1bWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstRm9vZEdyYWRlLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29ycy1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4tU3BlY2lhbEluc2lkZUxlbmd0aC1XaWR0aE9ySGVpZ2h0UmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtTGFrZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tQ29udGFpbmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUxhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Sb2xsb24tUm9sbG9mZiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5PbkJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0bGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVybGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbG9hZGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmcmlnZXJhdGlvbk9uIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVzaWR1ZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkNvbmRpdGlvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZGl0aW9ucyIgdHlwZT0iQ29uZGl0aW9ucyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGltZW5zaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEaW1lbnNpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRpbWVuc2lvbiIgdHlwZT0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaW1lbnNpb25Db2RlZCIgdHlwZT0iRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGltZW5zaW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGltZW5zaW9uIiB0eXBlPSJEaW1lbnNpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudFJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnQiIHR5cGU9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIiB0eXBlPSJNZWFzdXJlbWVudFZhbHVlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWVWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2ZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZSYW5nZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb25kaXRpb25zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlQWlyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVCdXR5bEFjZXRhdGVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUgyT0VxdWFsczFPcldhdGVyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkVG82MERlZ3JlZXNGYWhyZW5oZWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZVRvbHVlbmVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluT3RoZXJUaGFuQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbnNPdGhlclRoYW5TdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRXRoeWxBbGNvaG9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkV0aHlsRXRoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0MUF0bW9zcGhlcmVQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVFdGhlckVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGljdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXItRHJpZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXMtUmVjZWl2ZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlsaWJyaXVtQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlQW5kQXNoLUZyZWVCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3hpZGl6aW5nQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWNpbmdBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGNoZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyYXRlZFZhcG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvbmRpdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydC1UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lLVdlaWdodGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY29ycmVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyR2FsbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZU93bmVkT3JDb3Jwb3JhdGVPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRlZE9yQmxvY2tlZFVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFdoZW5Tb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc1JlcGFpcmVkT3JJbXByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFudGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb0dvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvTW9kZXJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtVG9Hb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1Ub0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jcmVhc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsaW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJNaWQtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lclN1cGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyU3VwZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTWlkLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJTdXBlck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlclN1cGVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay00Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG91bGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uVGltZVJlbGF0ZWREZW1hbmQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiIHR5cGU9Ik1lYXN1cmVtZW50UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbmltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bVZhbHVlIiB0eXBlPSJNaW5pbXVtVmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1heGltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bVZhbHVlIiB0eXBlPSJNYXhpbXVtVmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVuaXRPZk1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVT01Db2RlZCIgdHlwZT0iVU9NQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVU9NQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdE9mTWVhc3VyZW1lbnQiIHR5cGU9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlVPTUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjczIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0QiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0UCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0VCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0WCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1QyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1USIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjgzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkxEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzcyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNDVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNETCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0dNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDS0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ01LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ05QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNXSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDcyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE1RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFBDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFdUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFpQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdGSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdHUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0xEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhCQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEJYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEdNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSExUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE1RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkoyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkszIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0JBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0VMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0dTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0pPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS05TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1VSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktWUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1dIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLV1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEJUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik0wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik00Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik05Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUdNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUhaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1MVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVdIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1aIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik4zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5NUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ITSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9OWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1pBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPWkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNIVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNNSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE5FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldIUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWURLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZRFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlozIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWlAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGltZW5zaW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXROZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNQZXJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdENvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NUb25uYWdlT2ZUaGVWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvbm5hZ2VPZlRoZVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyQ29uc3VtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXREaXNzaXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvY2tJbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGl2ZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcGVyYXRpdmVUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5zaWxlU3RyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyb3NpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9mQ29udmV5YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVN1bW1lckRlYWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QXNjZXJ0YWluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE92ZXJhbGxMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdNZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlV2lkdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVXaWR0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJBY3R1YWxGaWxsaW5nV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJNYXhpbXVtQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nSGVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja2luZ0hlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycml0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFudGhhbmlkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXN0aWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cm9udGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RvcmFnZUxpbWl0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW5kZXhPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkaXR5T2ZKdWljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZXRyb21ldHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWljZVdlaWdodFBlcjEwMEdyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcnVpdFNraW5Db2xvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2xlT2ZCZW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZEluY3JlbWVudGFsTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxENTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2luZ1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NNZWFzdXJlQ3ViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZUZhdENvbnRlbnRJbkRyeU1hdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjY2hhcm9tZXRyaWNDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYXRlQ29udGVudE9mQW5BbGNvaG9saWNQcm9kdWN0QWZ0ZXJCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5oeWRyb3VzQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbHZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVHcmF2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc09ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc1N0YW5kYXJkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTmV0U3RhbmRhcmRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsT24tQm9hcmRRdWFudGl0eS1BZnRlckRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVG90YWxDYWxjdWxhdGVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Ub3RhbE9ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbm5hZ2VHYXVnZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1OZXRTdGFuZGFyZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VkaW1lbnRBbmRXYXRlckluUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZlZFJlZmVyZW5jZUhlaWdodC1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VIZWlnaHQtVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWxsYWdlR2F1Z2VEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbUNvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvd1RvQnJpZGdlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWdodG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWtlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGhXZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVudHNPZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uV2VpZ2h0QWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsdGFWYWx1ZUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RhbmNlQmV0d2VlblBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtQm94Y2FyRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkTmV3V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbG9uZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxhbWVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGluYWxGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zdmVyc2VGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJkbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0LU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0RW5lcmd5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGhEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlU3RyZXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lzdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Nrd2VsbEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvbk9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuLVByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVIZWlnaHQtRmxhdEJlZFdpdGhSZW1vdmFibGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNxdWFyZW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWllbGRTdHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJzZW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpc211dGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY2l1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sdW1iaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNobG9yaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2JhbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9taXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25QbHVzU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VybWFuaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyb2dlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90YXNzaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXNpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmdhbmVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9seWJkZW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTml0cm9nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlvYml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlja2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob3NwaG9ydXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bHBodXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGltb255Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNpdW1PeHlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbnRhbGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsbHVyaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRhbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuYWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1bmdzdGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZUNvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppbmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppcmNvbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29PcGVyYXRpbmdUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5VGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyb2xUZW1wZXJhdHVyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2VhbEluZm8iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNlYWxJbmZvIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTZWFsSW5mbyIgdHlwZT0iTGlzdE9mU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNlYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSW5mbyIgdHlwZT0iU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJc3N1ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJc3N1ZXJDb2RlZCIgdHlwZT0iU2VhbElzc3VlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxJc3N1ZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSXNzdWVyIiB0eXBlPSJTZWFsSXNzdWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlYWxJc3N1ZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkIiB0eXBlPSJTZWFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iIHR5cGU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZWFsU3RhdHVzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5SaWdodENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZUVsZWN0cm9uaWNTZWFsSXNGYXVsdHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZCIgdHlwZT0iVHJhbnNpdERpcmVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGVkIiB0eXBlPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWUiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uIiB0eXBlPSJUcmFuc2l0RGlyZWN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9CdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclRvU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0Ryb3BTaGlwRGVzaWduYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0ZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90aGVyVmVzc2VsVG9MaWdodGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodGVyVG9Nb3RoZXJWZXNzZWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlySG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RGF5V29ya1dlZWsiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlZCIgdHlwZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZWQiIHR5cGU9IlRyYW5zcG9ydFRlcm1zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlZCIgdHlwZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkIiB0eXBlPSJSaXNrT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5IiB0eXBlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWFuZERlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0ZWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4LVdvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlLUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVBbG9uZ3NpZGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFuZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QtSW5zdXJhbmNlQW5kRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmlhZ2VQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpYWdlLUluc3VyYW5jZVBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkQXRGcm9udGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtUXVheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVBhaWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeVNlcnZpY2VDaGFyZ2VQYWlkQnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5U2VydmljZUNoYXJnZVBhaWRCeUNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdEZyZWlnaHRDcmVkaXRlZFRvUGF5bWVudEN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrLVVwT3JCYWNraGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5lZEJ5QnV5ZXJBbmRTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvYlBvcnRPZkNhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvcHktTm9QYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3N0c1BhaWRCeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29zdHNQYWlkQnlDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZXZlbnVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlTdXBwbGllck9yU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlhYmxlRWxzZXdoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQW5kU3VtbWFyeUJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRCdXRDaGFyZ2VkVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEJ5UHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkLUJ5U2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkTG9jYWxDb2xsZWN0T3V0c3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0RnJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodFBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0UGFpZEJ5U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGUxMVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRnJlaWdodC1Ob0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJpc2tPZkxvc3NDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRGVzdGluYXRpb25Jc0J1eWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRnJlaWdodEVxdWFsaXphdGlvblBvaW50SXNTZWxsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9Qb29sUG9pbnRJc1NlbGxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0Rlc3RpbmF0aW9uSXNTZWxsZXJzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQcmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUHJpY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlByaWNlIiB0eXBlPSJMaXN0T2ZQcmljZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZUJhc2lzUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYWxjdWxhdGVkUHJpY2VCYXNpc1F1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZVF1YW50aXR5UmFuZ2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNlTXVsdGlwbGllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2UiIHR5cGU9IlByaWNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VUeXBlQ29kZWQiIHR5cGU9IlByaWNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNpbmdUeXBlIiB0eXBlPSJQcmljaW5nVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcmljZVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZURlcGVuZGVudFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbkdyb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhJbmNsdWRlZEFsbG93YW5jZXNBbmRDaGFyZ2VzTm90SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVNlbGxpbmdQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZVRheEluY2x1ZGVkRXhjbHVkaW5nQWxsb3dhbmNlc09yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZUV4Y2x1ZGluZ0FsbG93YW5jZXNPckNoYXJnZXNBbmRUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpdmVVbml0UHJpY2VDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VHZW5lcmljUHJvZHVjdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVdob2xlc2FsZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvblByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxEaXN0cmlidXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERvbWVzdGljVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWRVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkQ3VzdG9tc1VuaXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyQWRqdXN0ZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50QW1vdW50QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U3RvcmVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcFByb2dyYW1QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNzY1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VPcmlnaW5hbEVxdWlwbWVudE1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW50RGVsaXZlcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHNQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFVwcGVyTGltaXRQcmljZU1heGltdW1BbGxvd2FibGVDb3N0UHJpY2luZ0ZvckRydWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtUHJpY2VEb05vdEFkdmlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJpY2VUaHJvdWdoUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJpYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQmlsbGluZ1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeVRvQWR2aXNlVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQWN0aXZpdHlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcmRlclF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZWxlYXNlUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVByaWNlUmVkdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzU3VnZ2VzdGVkUmV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUmVsZWFzZVF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldEl0ZW1QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFRvQWR2aXNlVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFB1cmNoYXNlT3JkZXJQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJpY2VCZWdpbm5pbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1B1cmNoYXNlT3JkZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckVhY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlSW5FZmZlY3RBdFRpbWVPZlNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJLaWxvZ3JhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyTGl0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRGcmVpZ2h0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2Vyc1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb25uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkRGVhbGVyTmV0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZEZsZWV0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBBbmREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkTGlzdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVByaWNlRmFjdG9yc0VxdWFsaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkUmV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1PZkxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkV2hvbGVzYWxlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvQmVOZWdvdGlhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVkVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRDb3N0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZVByaWNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbml0UHJpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIiB0eXBlPSJVbml0UHJpY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eVJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHkiIHR5cGU9IlF1YW50aXR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eVZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVZhbHVlIiB0eXBlPSJRdWFudGl0eVZhbHVlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1pbmltdW1WYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWF4aW11bVZhbHVlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVJhbmdlIiB0eXBlPSJRdWFudGl0eVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljZU11bHRpcGxpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGVkIiB0eXBlPSJQcmljZU11bHRpcGxpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTXVsdGlwbGllciIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlTXVsdGlwbGllciIgdHlwZT0iUHJpY2VNdWx0aXBsaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1PcmlnaW5hbENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLVJldGFpbENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50TXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItV2hvbGVzYWxlQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudFNvbHV0aW9uTXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ011bHRpcGxpZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRJbnN0cnVjdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBheW1lbnRUZXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRJbnN0cnVjdGlvbnMiIHR5cGU9IlBheW1lbnRJbnN0cnVjdGlvbnMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRUZXJtcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGF5bWVudFRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRpc2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1zTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudFRlcm1zIiB0eXBlPSJQYXltZW50VGVybXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRUZXJtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50VGVybUNvZGVkIiB0eXBlPSJQYXltZW50VGVybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRUZXJtQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1WYWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1EZXRhaWxzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRGlzY291bnRzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRUZXJtIiB0eXBlPSJQYXltZW50VGVybSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXltZW50VGVybUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMERheXNBZnRlckVuZE9mTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeURlZmVycmVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlOZWdvdGlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlOZWdvdGlhdGlvbkJ5TmFtZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeU5lZ290aWF0aW9uV2l0aEFueUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5TmVnb3RpYXRpb25XaXRoQW55QmFua2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeVNpZ2h0UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNDb21taXNzaW9uVGVybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljRGlzY291bnRPZmZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaEFnYWluc3REb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hCeVN0YXRlTGF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoRGlzY291bnRUZXJtc0FwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNob25BZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNob25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBlclZlbmRvclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hXaXRoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZENoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q29udHJvbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0aW5nR2l2ZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkT3JJbnN0YWxsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdFJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnROb3RBcHBsaWNhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudFdpdGhBZHZhbmNlUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRXaXRoUHJvbXB0UGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHNBZ2FpbnN0QWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzQWdhaW5zdFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZk1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFzdFBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZERhdGVMYXRlUGF5bWVudFBlbmFsdHlBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZUFubnVhbGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzQXJlRHVlTW9udGhseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZVF1YXJ0ZXJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZVNlbWlBbm51YWxseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJDb21wYW55QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZXZvY2FibGVMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXRBdFNpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVtcFN1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE1vbnRoRm9sbG93aW5nSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RZZXREZWZpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQWdhaW5zdFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeUluc3RhbG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeWluc3RhbG1lbnRzQWNjb3JkaW5nVG9Qcm9ncmVzc0FBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QnlJbnN0YWxtZW50c0FjY29yZGluZ1RvUHJvZ3Jlc3NUQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdWVVcG9uUmVjZWlwdE9mSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyVGhyb3VnaEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRUZXJtc0RlZmluZWRJbkNvbnNvbGlkYXRlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRVcG9uQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eVRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5QWdyZWVkVXBvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21wdFBheW1lbnRBY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3hpbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsQnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0FkdmlzZUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJveGltbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJGbG9vclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm9yUGF5bWVudFRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc05vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlQWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNGdW5kc1JlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FuY2VCaWxsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjb3VudHMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnRQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnRBbW91bnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF5c0R1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF5T2ZNb250aCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREYXRlVGltZVJlZkNvZGVkIiB0eXBlPSJEYXRlVGltZVJlZkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF0ZVRpbWVSZWZDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXREYXlzRHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXREdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5ldERhdGVUaW1lUmVmQ29kZWQiIHR5cGU9IkRhdGVUaW1lUmVmQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmV0RGF0ZVRpbWVSZWZDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjb3VudHMiIHR5cGU9IkRpc2NvdW50cyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeVZhbHVlIiB0eXBlPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSYXRlT2ZFeGNoYW5nZURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlQ3VycmVuY3kiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGFyZ2V0Q3VycmVuY3kiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9IkRlY2ltYWwxOV85Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbnZlcnNlUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9IkRlY2ltYWwxOV85Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRlT2ZSYXRlT2ZFeGNoYW5nZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZSYXRlT2ZFeGNoYW5nZVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIgdHlwZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDE5XzkiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVmZXJlbmNlIiB0eXBlPSJMaXN0T2ZSZWZlcmVuY2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGF0ZVRpbWVSZWZDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWREZWxpdmVyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT2ZHYWdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPZlNhbXBsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25BbmRBY2NlcHRhbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZURhdGVFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2VEYXRlSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ3JlZGl0Tm90ZVJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRXhXb3JrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUdvb2RzSGFuZGVkT3ZlckZvclNoaXBtZW50QnlTZWxsZXJPckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlR29vZHNSZWNlaXZlZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVHb29kc1JlY2VpdmVkQnlCdXllcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUdvb2RzUmVjZWl2ZWRCeUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVJbnZvaWNlUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjY2VwdGFuY2VPZkZpcnN0U2FtcGxlc1Byb2R1Y2VkVW5kZXJQcm9kdWN0aW9uQ29uZGl0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNjZXB0YW5jZU9mTmVnb3RpYWJsZUluc3RydW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjY2VwdGFuY2VPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFycml2YWxPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQmlsbE9mTGFkaW5nQ29uc2lnbm1lbnROb3RlT3JPdGhlclRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDZXJ0aWZpY2F0ZU9mRmluYWxBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDZXJ0aWZpY2F0ZU9mUHJlbGltaW5hcnlBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNvbmZpcm1hdGlvbk9mT3JkZXJSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlPZkdvb2RzVG9Fc3RhYmxpc2htZW50c0RvbWljaWxlU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0J1eWVyT2ZEb2N1bWVudHNSZXByZXNlbnRpbmdHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0J1eWVyc0FnZW50T2ZEb2N1bWVudHNSZXByZXNlbnRpbmdHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0NhcnJpZXJPZkRvY3VtZW50c1JlcHJlc2VudGluZ0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWxpdmVyeVRvSW50ZXJtZWRpYXJ5QmFua09mRG9jdW1lbnRzUmVwcmVzZW50aW5nR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRW5kT2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaW5hbEFjY2VwdGFuY2VPZldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZklud2FyZEZyb250aWVyQ3Jvc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZklzc3VlT2ZUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTmVnb3RpYWJsZUluc3RydW1lbnREcmFmdFByb21pc3NvcnlOb3RlQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk91dHdhcmRGcm9udGllckNyb3NzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcmVzZW50YXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJlc2VudGF0aW9uT2ZOZWdvdGlhYmxlSW5zdHJ1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJlc2VudERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm92aXNpb25hbFJlY2VwdGlvbk9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVjZWlwdEZvckxvYWRpbmdNYXRlc1JlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlY2VpcHRPZlRvb2xEZXBlbmRlbnRJbml0aWFsU2FtcGxlc1BsdXNVbmxpbWl0ZWRBYnNvbHV0ZUJhbmtHdWFyYW50ZWVQbHVzVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVjZWlwdE9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVzYWxlQnlCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2FsYXJ5UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNoaXBtZW50QXNFdmlkZW5jZWRCeVRoZVRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTaWduYXR1cmVPZkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTdGFydE9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByZXNlbnREb2N1bWVudFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJvY2VlZHNPZlJlc2FsZUNvbGxlY3RlZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QXREYXlzQWZ0ZXJEYXRlT2ZJc3N1YW5jZU9mVHJhbnNwb3J0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QXREYXlzQWZ0ZXJEYXRlT2ZQcmVzZW50YXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRBdERheXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEF0RGF5c1NpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlT2ZOZWdvdGlhYmxlSW5zdHJ1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VSZWNlaXB0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVRyYW5zbWlzc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclJlZmVyZW5jZURhdGVBZ3JlZWRVcG9uQmV0d2VlblRoZVBhcnRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBcHByb3ZhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWREYXRlT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkRHJhZnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGlwdWxhdGVkRGF0ZUZvckFjY2VwdGFuY2VPZkRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGlwdWxhdGVkRGF0ZUZvck5lZ290aWF0aW9uT2ZEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RpcHVsYXRlZERhdGVGb3JQYXltZW50T2ZEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGF5bWVudE1ldGhvZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudE1lYW5Db2RlZCIgdHlwZT0iUGF5bWVudE1lYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50TWVhbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRNZWFuUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRTeXN0ZW1Db2RlZCIgdHlwZT0iUGF5bWVudFN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRTeXN0ZW1Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmlnaW5hdGluZ0ZJQWNjb3VudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkZJQWNjb3VudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWNlaXZpbmdGSUFjY291bnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJGSUFjY291bnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXJkSW5mbyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudE1ldGhvZCIgdHlwZT0iUGF5bWVudE1ldGhvZCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXltZW50TWVhbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMDM1RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGVkQmlsbE9mRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBsdXNDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQbHVzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENvcnBvcmF0ZVRyYWRlRXhjaGFuZ2VDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENvcnBvcmF0ZVRyYWRlRXhjaGFuZ2VEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ29ycG9yYXRlVHJhZGVQYXltZW50Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDb3Jwb3JhdGVUcmFkZVBheW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDcmVkaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZERlYml0UmV2ZXJzYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFByZUFycmFuZ2VkUGF5bWVudEFuZERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFJldmVyc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQUERDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UFBERGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UFBEUGx1c0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQUERQbHVzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UGx1c0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQbHVzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVFeGNoYW5nZURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVQYXltZW50Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVQYXltZW50RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDcmVkaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0RlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzRGViaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQ2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2NoZXF1ZS1Jc3N1ZWRCeUFCYW5raW5nT3JTaW1pbGFyRXN0YWJsaXNobWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5Q3JlZGl0b3JPblRoaXJkUGFydHlBbmRBY2NlcHRlZEFuZEVuZG9yc2VkQnlBQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvckFuZEVuZG9yc2VkQnlBbm90aGVyQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvck9uQUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5VGhlQ3JlZGl0b3JPbkFCYW5rQW5kRW5kb3JzZWRCeUFUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeVRoZUNyZWRpdG9yT25BVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvck9uVGhlRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rRW50cnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoaWVyc0NoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDY2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNjZFBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nQmV0d2VlblBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdFBheW1lbnRCeUNlcnRpZmllZEZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0UGF5bWVudEJ5Q29tcGFueUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25CeUJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0RGViaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3RwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdHgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aW9uRnJvbUZpbG1SZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3REZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlUb090aGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVCSU5BWENsZWFyaW5nTmV0d29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1BheW1lbnRTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZXNlcnZlRnVuZHNPcldpcmVUcmFuc2ZlclJlcGV0aXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZXNlcnZlRnVuZHNPcldpcmVUcmFuc2Zlck5vblJlcGV0aXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRm9ybWF0R2lybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheW1lbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWUtQmFua2luZ0RlYml0VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lQ29udGluZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lU2Vuc2l0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbktpbmRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVtZW50Tm90RGVmaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJCYW5rRGViaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZWRTZXBhcmF0ZWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWwtU3VtQ29uc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NrQm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25leU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbE9yUmVnaW9uYWxDbGVhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUGF5bWVudERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRyYW5zZmVyYWJsZUJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VHJhbnNmZXJhYmxlTG9jYWxDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheUJ5Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeVBvc3RHaXJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VG9CYW5rQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbERlZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQ2xlYXJpbmdob3VzZUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBQRENyZWRpdFRvRGVtYW5kRGVwb3NpdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBQRERlYml0VG9EZW1hbmREZXBvc2l0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFBEUGx1c0FkZGVuZHVtQ3JlZGl0VG9EZW1hbmREZXBvc2l0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFBEUGx1c0FkZGVuZHVtRGViaXRUb0RlbWFuZERlcG9zaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhdXRocm9pemVkQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlDaGFyZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlTmV0dGluZ0FncmVlbWVudFBheUJ5V2lyZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlTmV0dGluZ1BheUJ5Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5QUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlBQmFua0FuZEVuZG9yc2VkQnlBbm90aGVyQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeUFUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5QVRoaXJkUGFydHlBbmRFbmRvcnNlZEJ5QUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlUaGVEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlUaGVEZWJ0b3JBbmRFbmRvcnNlZEJ5QVRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlUaGVEZWJ0b3JBbmRFbmRvcnNlZEJ5QmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcHJpZXRhcnlOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkSG9tZS1CYW5raW5nQ3JlZGl0VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZUdpcm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREZXRhaWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRNZXRob2RGb3JQYXltZW50V2FzTm90VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1hcnlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsZXJzQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyZ2VudEdpcm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJU0FTcGVjaWFsRWxlY3Ryb25pY0Z1bmRzVHJhbnNmZXJOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpcmVUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWDEyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBheW1lbnRTeXN0ZW1Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkaW5hcnlQb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJFbXBsb3llZUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQ29uY2VudHJhdGlvbkRpc2J1cnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaENvbmNlbnRyYXRpb25EaXNidXJzZW1lbnRQbHVzQWRkZW5kYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJJbml0aWF0ZWRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJJbml0aWF0ZWRFbnRyeVBsdXNBZGRlbmRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYXBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVHJhbnNtaXNzaW9uTmV0d29ya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldHdvcmtzTm90RGVmaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkd2lyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWwtRmFjZS1Uby1GYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZFBheW1lbnRBbmREZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZFBheW1lbnRBbmREZXBvc2l0UGx1c0FkZGVuZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWF1dGhvcml6ZWREcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEFpck1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQUNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFDSCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRklBY2NvdW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQWNjb3VudERldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkZJQWNjb3VudCIgdHlwZT0iRklBY2NvdW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY2NvdW50RGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlY29uZGFyeUFjY291bnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSUJBTiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudENvbnRyb2xLZXkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50VHlwZUNvZGVkIiB0eXBlPSJBY2NvdW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnRUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnROYW1lMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudE5hbWUyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50UmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnREZXRhaWwiIHR5cGU9IkFjY291bnREZXRhaWwiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWNjb3VudFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QnVzaW5lc3NBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25leU1hcmtldEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRBY2NvdW50VmVzdGVkSW50ZXJlc3RhdE1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50QWNjb3VudFZlc3RlZEludGVyZXN0TmV0Q2FzaFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsUmV0aXJlbWVudEFjY291bnQtSVJBLVZlc3RlZEludGVyZXN0YXRNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFJldGlyZW1lbnRBY2NvdW50LUlSQS1WZXN0ZWRJbnRlcmVzdE5ldENhc2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlQ29udHJvbGxlZFJldGlyZW1lbnRBY2NvdW50VmVzdGVkSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2luZ0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlRmFjZVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50QWNjb3VudC1WZXN0ZWRJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdEZ1bmRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja3NhbmRCb25kc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VBY2NvdW50LU5ldENhc2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVSZXRpcmVtZW50QWNjb3VudC00MDFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2VBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VCYWNrQWNjb3VudGZvclJldHVybnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hNYW5hZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmREZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0aW5nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuSXRlbXNvbkRlbWFuZERlcG9zaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5JdGVtc29uU2F2aW5nc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdmluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZERpc2J1cnNlbWVudE1hc3RlckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWREaXNidXJzZW1lbnRTdWJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRVbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yaWNoZWRQbGFuQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmctdGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11dHVhbEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGlvbnNoaXBTdW1tYXJ5QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZWtlZXBpbmctQ3VzdG9keUFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilplcm9CYWxhbmNlTWFzdGVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmVyb0JhbGFuY2VBZmZpbGlhdGVBY2NvdW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRmluYW5jaWFsSW5zdGl0dXRpb25JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaFN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hIb3VzZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hTdHJlZXRTdXBwbGVtZW50MSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hTdHJlZXRTdXBwbGVtZW50MiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaENpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoUmVnaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVnaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoQ291bnRyeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvdW50cnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iIHR5cGU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXJkSW5mbyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2FyZE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZEF1dGhDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkUmVmTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkRXhwaXJhdGlvbkRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZFR5cGUiIHR5cGU9IkNhcmRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZFR5cGVPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZEhvbGRlck5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhcmRJbmZvIiB0eXBlPSJDYXJkSW5mbyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDYXJkVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpDQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGluZXJzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxvd09yQ2hhcmdlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIiB0eXBlPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBbGxvd09yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJbmRpY2F0b3JDb2RlZCIgdHlwZT0iSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzaXNDb2RlZCIgdHlwZT0iQmFzaXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNpc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZWQiIHR5cGU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93YW5jZU9yQ2hhcmdlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJBbGxvd09yQ2hnRGVzYyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2lzUXVhbnRpdHlSYW5nZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJCYXNpc01vbmV0YXJ5UmFuZ2UiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUYXgiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNlcU5vIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93T3JDaGFyZ2UiIHR5cGU9IkFsbG93T3JDaGFyZ2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSW5kaWNhdG9yQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFib3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXNPckFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkJhc2lzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUFtb3VudCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxCYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGVja1RvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEN1c3RvbWVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlVG9CZVBhaWRCeVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlVG9CZVBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmR3Jvc3NRdWFudGl0eUludm9pY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VUb0JlSXNzdWVkQnlWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVRvQmVJc3N1ZWRCeVJlc2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VEZW5pZWRCeVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QYXlhYmxlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NydWFsRnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hJbkFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZUFuZEFkZHRvSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWxsb3dPckNoZ0Rlc2MiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZXJ2aWNlQ29kZWQiIHR5cGU9IlNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dPckNoZ0Rlc2MiIHR5cGU9IkFsbG93T3JDaGdEZXNjIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRlc2NyaXB0aW9uIiB0eXBlPSJMaXN0T2ZEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFib3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnNvbHV0ZU1pbmltdW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZS1GZWRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2UtU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnROdW1iZXJDb3JyZWN0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkQmF0dGVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ21lbnRvZkRlbGl2ZXJ5RmVlQU9EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmF0aW9uT2ZDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb21tZXJjaWFsSW52b2ljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb3BpZXNPZkZyZWlnaHRCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxUYXJpZmZDbGFzc2lmaWNhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPbi1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NDb3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRUb01ha2VNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEZvck1heGltdW1DaGFyZ2VzQmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEZvck1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50QmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZFZhbG9yZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VDaGFyZ2VzSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VEZXN0aW5hdGlvbkFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZURlc3RpbmF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlT3JpZ2luQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlT3JpZ2luRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlkYXZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnREaXNidXJzZW1lbnQtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50RGlzYnVyc2VtZW50LU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRPbkdyb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwb3J0Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cHJlc3NDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVPcGVuaW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0VGVybWluYWxIYW5kbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0YXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpY0JldmVyYWdlUmVwb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2hlbnlDb3VudHlQQURlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VBZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VGb3JDb25zaWdubWVudE1lcmNoYW5kaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VOb24tUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGluZ0V4cG9ydERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubmVhbEhlYXRTdGVlbG9yR2xhc3NUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFub2RpemluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aS1kdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmFyeUluQWRkaXRpb25Ub1Rocm91Z2hSYXRlc2FuZENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydFdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRzVG9CaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZERlYnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdEcmFmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlRnJlaWdodEFsbEtpbmRzU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNSZW9yZGVyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRkaW5nRmVlZGluZ0Rpc2luZmVjdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVlZkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV5b25kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXlvbmRGcmVpZ2h0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZERlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQXR0ZW5kYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFja0x1bmdUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NraW5nQW5kQnJhY2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvd2VyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9wU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlYXV4QXJiaXRyYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdGgtRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtidWxrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1N1cmZhY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWRnZVRvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuUGFja2FnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2VPckR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJkZW5PdmVyaGVhZE9yQWxsb3dhbmNlRm9ySW5kaXJlY3RDb3N0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJIYW5kQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVQcmVzc3VyaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVzU2VuZGluZ09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wQXJiaXRyYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGFHcmVhdExha2VzQWRkaXRpb25hbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ1FDdXN0b21zQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1cnJlbmN5RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW1wb3J0VGVybWluYXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUmVjb25zaWdubWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5SZW1hbmlmZXN0RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxlZE9yZGVySGVhdnlEdXR5RmxhdGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwdHVyZUFkZGl0aW9uYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1RheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJDcmVkaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJEZWJpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fycmllck5vdGlmaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ2luZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50c09mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpbkFuZEJpbmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT2ZBaXJiaWxsLVNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNGb3J3YXJkQWR2YW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsTWlsbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpY2Fnb0xvb3BDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZVN0YW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlNYWludGVuYW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlUZXJtaW5hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYW5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTZWFsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nRGlwUnVzdHByb29mRURQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT0RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPRENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5QWx0ZXJhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnlEZWxldGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tbWFudWZhY3R1cmluZ0Rpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluYXRpb25QZXJmb3JtYW5jZUFuZE5vbi1wZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZUFsbFNhbWVEYXlTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbkFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVDYXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXByZXNzb3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlc3Npb25DcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlc3Npb25Nb25leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZ2VzdGlvblN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2VydmF0aW9uUmVzZWFyY2hGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZVNlcnZpY2UtQXJtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFyaXphdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJMZWdhbGl6YXRpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGVwb3NpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRlc3R1ZmZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb3NzRGFtYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXJ2aWNlQ2hhcmdlVUtFVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcnZpY2VDaGFyZ2VVU0FDYW5hZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJUcmFpbGVyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzTWlsZWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RXNjYWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tb3BDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQWR2ZXJ0aXNpbmdNZXJjaGFuZGlzaW5nQWxsb3dhbmNlUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlPZkJpbGxPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU9mRGVsaXZlcnlSZWNlaXB0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UmVjb3ZlcnlBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UmVjb3ZlcnlGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdHRvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRBbmRSZWNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvblJlaW1idXJzZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYWZ0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckFjY291bnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFcXVpcG1lbnRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFeGFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1Db250YWluZXJMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtTGlmdExldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9ybWFsaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZS1BZGRpdGlvbmFsUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1BlbmFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0QW5kUGFyYWxsZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dHRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRNZXJjaGFuZGlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9DYXJyaWVyRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0NhcnJpZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvR292ZXJubWVudEVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YURyYXdpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRoZWFkTWlsZWFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZkFuZERpc2FibGVkU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9yQ2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9ySW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RUb01ha2VNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZWN0aXZlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0RnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtSW5zdGFsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxheUZ1cm5pc2hpbmdEZXN0aW5hdGlvbldlaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtYW5kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZS1BdmVyYWdlQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UtU3BlY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRJbkxpZXVPZk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcnJpY2tDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRTdXBwbGllckluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25Mb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlBvd2VyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mVHJhaWxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbi1TcGVjaWFsVHlwZUZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvblVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZXJtaW5lZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmVsb3BtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWVTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQcm9kdWN0SGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY29ubmVjdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LURyb3BCb3hDb252ZW5pZW5jZUN0ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1NdWx0aXBsZVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TZXJ2aWNlT3B0aW9uRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNlcnZpY2VPcHRpb25QaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BsYXlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JEaXNjb3VudEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQW5kUmVjb25zaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25Ub0FpckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja2FnZS1Cb2F0RGV0ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yLVRvLURvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd2VsUGluQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdBdFBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlYXRQb3J0T2ZEZWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZWF0UG9ydE9mRW1iYXJrYXRpb25SYXRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUxpbmVIYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJBc3Npc3RlZFVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc1dhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wRG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcFlhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1Db3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bVVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnllckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5SWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5uYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RHJhd2JhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5QnV5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVBheW1lbnRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5U2hpcEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVdlaWdoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmNsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3ljaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneVN1cmNoYXJnZUZ1ZWxBZGp1c3RtZW50RmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdTdXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5ncmF2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRlcmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TWFudWZhY3R1cmVyUmVzdG9yYXRpb25BdWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxUHJlc2VudGF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhblBvcnRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlVmFsdWVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc01pbGVhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1BlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1ZhbHVlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQWNjZXNzQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZU9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0aW9uRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRpb25QaWNrdXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGFuZGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkT25lRGF5Q29uc3VsYXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRpbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRpbmdQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDdXN0b21zQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbnMtQXV0b21hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbnMtVVNTaGlwcGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0SW1wb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbnNlQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFNoaXBwaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUNvcGllc2FuZE1haWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxhYm9ySGVscGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYVNlcnZpY2UtQ291bnRlci1Uby1Db3VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlQ2hhcmdlcy1BZGRpdGlvbmFsUGFnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZExhbXBQYW5lbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF4UHJlLWFsZXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVHJhbnNmZXJTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcnRpY2xlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEZsaWdodE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdHJhY2tTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vclN0b2NrUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZExvZGdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25DdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzU3BlY2lhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZUFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRDb3Vwb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nQWdlbnRDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVEb21pY2lsZVNoaXBtZW50UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmFzZWRPbkRvbGxhck1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRDaGFyZ2VzVG9Cb3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRDaGFyZ2VzVG9EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEVxdWFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsTm9uLVVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWxVU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXNzdGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlc2huZXNzTGVha2VyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFRydWNrbG9hZEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJtZW50U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZXdheUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbGRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNDcmVkaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXhDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50V2FyZWhvdXNlRmVlLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50V2FyZWhvdXNlRmVlLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5Eb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5GbG93Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF0dWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVjZWlwdHNTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwYWdlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwZWRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlZEluc3BlY3Rpb25UZWNobmljYWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWxmUG9ydERlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdDaGFyZ2VzT25EaXN0cmlidXRpb25GcmVpZ2h0Rm9yd2FyZGVkQmV5b25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0ZyZWlnaHRBdFBvc2l0aW9uc05vdEltbWVkaWF0ZWx5QWRqYWNlbnRUb1ZlaGljbGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmJvck1haW50ZW5hbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJib3JNYWludGVuYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGluZ0FuZEhvaXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsaW5nQW5kSG9pc3RpbmdUb0JlRGlyZWN0QmlsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29PbkRlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0hhbmRsaW5nRmVlLURvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNIYW5kbGluZ0ZlZS1JbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0SW5UcmFuc2l0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdFRyZWF0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF2eUR1dHlGbGF0Q2FyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF2eUxpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTZWN1cml0eVJlZEluLWJvbmRTZWFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdod2F5SW50ZXJjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvaW50aW5zQW5kSGF1bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUxpbmVGcmVpZ2h0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb25leUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9vay11cGNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZUNoYXJnZVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzUGljay11cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEFBaXJiaWxsUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEFGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRTZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXByb3BlckRvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRGcmVpZ2h0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lRnJlaWdodE1hbnVmYWN0dXJpbmdUb1NoaXBwaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycmVjdEJpbGxpbmdBY2NvdW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVByaWNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZUNhYmxlQ29ubmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZVBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0QXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uQW5kVHJhaW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbldhcnJhbnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1bGF0ZWRUYW5rQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhY2VtZW50Q29zdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJvdmlkZWRCeUxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJvdmlkZWRCeUxlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmRpdmlzaW9uUHJvZml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RPblJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RPblNlY3VyaXR5RGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVVzZVBlcm1pdHRlZEF0U3BlY2lhbFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbkNvbW1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk1hcmt1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENvdXJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxEb29yLXRvLURvb3JIYW5kbGluZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJwbGFudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJzdGF0ZUhpZ2h3YXlUb2xsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXRQcmljZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhLXBsYW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQWRkaXRpb25hbEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBdC1Db3N0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGVsaXZlcnlUZXJtc0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU5vLUNoYXJnZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlV2l0aEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcmlzaEFyYml0cmFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc2xhbmREZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNsYW5kUGljay1VcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRhbGlhblJlbGVhc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtLVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBGcm9tRnJlZXppbmdQZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLb3NoZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckNvc3RPZlJlbW92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yTW9kaWZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck5vVHJvdWJsZUZvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck92ZXJ0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclByZW1pdW1PdmVydGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JSZXBhaXJBbmRSZXR1cm5PcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdHJhaWdodC10aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRlc3RBbmRDYWxpYnJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhZGluZ0FkanVzdG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3ItMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZU9yZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3V0RGVzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha2luZ1VuZGVyZ3JvdW5kU3RvcmFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTaG9ydGZhbGxDb25zaWRlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5UcnVja2xvYWRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUFuZFRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlbGluZVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdEdhdGVUcnVja09yRm9ya2xpZnRTZXJ2aWNlQXRQaWNrLXVwRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxGcm9tUG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxUb1BvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0ZWREYW1hZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkFudGktRHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRheEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Ub3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVG90YWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nTGFib3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkV2VpZ2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsRGVsaXZlcnlEcmF5YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlRGVsYXllZEluU3dpdGNoaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZVVuZGVyT3duUG93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90dGVyeUNoYXJnZUJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdHRlcnlDcm9zc1JlZGVlbWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ctVGllckxvdHRlcnlDYXNoaW5nQm9udXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvdy1UaWVyTG90dGVyeVdpbm5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1bXBTdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZy1Qb3N0YWdlQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZy1TZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEludm9pY2VUb0VhY2hMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldERldmVsb3BtZW50RnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdPclRhZ2dpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcnJpYWdlUnVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtb1JldHVybmFibGVDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW5kaXNlUHJvY2Vzc2luZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbHNTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWQtVGllckxvdHRlcnlDYXNoaW5nQm9udXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZC1UaWVyTG90dGVyeVdpbm5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVhZ2VGZWVGb3JSZXBhaXJBbmRSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVhZ2VPclRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RpZmllZEF0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRobHlSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdW50RGVtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW91bnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVzaHJvb21GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Rpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEaXN0cmlidXRpb25BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0l0ZW1BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1dhcmVob3VzZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmtQaWNrLXVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSERXaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRHV0aWFibGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25HZW5lcmF0ZWRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tcmV0dXJuYWJsZUNvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUmV0dXJuQ3JlZGl0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxQdW1wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3Rhcml6ZWRBZmZpZGF2aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5Q29uc2lnbmVlQmVmb3JlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5venpsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5DaGFyZ2VzLUhhemFyZG91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5GcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTdXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2hvcmUtQWxhc2thSGF3YWlpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkNhcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkRlY2tCcmVha0J1bGtEaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1EYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVUaW1lRW5naW5lZXJpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1UaW1lTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLVRpbWUtT25seUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25ldGltZVRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxTb2Z0d2FyZVN1cHBvcnRGb3JPcGVyYXRpb25hbFN1cHBvcnRTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFNvZnR3YXJlU3VwcG9ydEZvclN3aXRjaGluZ1N5c3RlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbkNoYXJnZUNvbG9yRmFicmljT2ZmaWNlRnVybml0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlci1GbGF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck5vdGlmeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBY2Nlc3NvcmlhbFNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWR2YW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRXhwb3J0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHb3Zlcm5tZW50QWdlbmN5RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR292ZXJubWVudEFnZW5jeUV4YW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW1wb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck1pc2NlbGxhbmVvdXNFYXJuaW5nT3JBZGRpdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJTZWVSZWxhdGVkRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mUm91dGVNaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2Zab25lUGljay11cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVDYWJsZUNvbm5lY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJIZWlnaHRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJydW5DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplZFByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcldpZHRoQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdDcmF0aW5nQW5kSGFuZGxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdDcmF0aW5nSGFuZGxpbmdBbmRUcmFuc3BvcnRhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0ludm9pY2VXaXRoU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaW50aW5nUHJpbWVyT3JGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0RXhjaGFuZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldGl6aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbGxlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyaXNoQ291bnR5U2FsZXNUYXhPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzaW5nU2hpcHBlcnNFeHBvcnRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFkZGl0aXZlc092ZXJ0aW1lTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBZGRpdGl2ZXNTdHJhaWdodFRpbWVMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWNhbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudERpZmZlcmVudGlhbC1MZXNzVGhhbkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mU2hpcG1lbnRWYWx1ZVRoYXRJc1JldHVybmFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlNoaXBwZWRRdWFudGl0eVRoYXRJc1JldHVybmFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUF3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJJdGVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdHNCb25kc0VzY29ydEF0dGVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyT3JkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclBvdW5kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5TWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5U3BvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9zcGhhdGl6aW5nU3RlZWxUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tsZUFuZE9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLXVwQW5kRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cC1PdXRPZkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllckNoYXJnZXNPdGhlclRoYW5XaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllckNoYXJnZXMtV2hhcmZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJQaWNrLXVwQW5kT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRBbmRPclJlbW92YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sZUxhc2hpbmdFcXVpcG1lbnRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVXb29kLVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcmtGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRDaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0SGFuZGxpbmdBbmRVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nQXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3REYW1hZ2VkSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGF0b0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJGYWN0b3JBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jYXJyaWFnZUV4Y2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2lvdXNNZXRhbENvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvZGdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRVc2FnZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uQW5kRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZBaXJXYXliaWxsLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNhbmFkaWFuQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDb21tZXJjaWFsSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkV4cG9ydEVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mSW5zdXJhbmNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZVU0V4cG9ydERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Qb3NpdGlvbmVkSW52ZW50b3J5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFuZE1hcmtldGluZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VEZXZpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCaWxsaW5nQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckRlbGl2ZXJ5T2ZCaWxsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTW9udGhDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVPd25lZFZlaGljbGVQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzSW5UcmFuc2l0UHJpdmlsZWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnRSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mQ29tcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlLUNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlLUhlYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVIb3VzZWhvbGRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlTmFtZUFuZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bGxpbmdFeWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wQWlyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxoZWFkSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUmVkdWN0aW9uQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1CaWxsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJpbGxlZERyYXlhZ2UtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmlsbGVkRHJheWFnZS1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50QWRkcmVzc0NvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVySGFuZGxpbmdDaHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25GZWRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblNoYXJlZFJlc3BvbnNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbmNpbGlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25uZWN0Y2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25Db25zaWduZWVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbkRlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25tZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvb3BlcmluZ0F0T3duZXJzT3JTaGlwcGVyc0V4cGVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyYXRpbmdSZWNvb3BlcmluZy1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmF0aW5nUmVjb29wZXJpbmctT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdIYXJkd2FyZU1haW50ZW5hbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdTb2Z0d2FyZU1haW50ZW5hbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRpc3RyaWJ1dGlvbkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWN0aW9uUHJlcGFsbGV0aXplZENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJDYXJnb1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlck1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsQ2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uTWVjaGFuaWNhbERldGVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1cmJpc2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZFeHBvcnRGb3JSZWVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkV4cG9ydFNoaXBtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVJlcXVpcmVkUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpYWJpbGl0eUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaW5xdWlzaG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25BbnRpLUR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVGF4QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVG90YWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbERlZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudHNBbmRMZWFzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFja0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEJ1eWVyc0V4cGVuc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0Q3VzdG9tZXJFeHBlbnNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEdvdmVybm1lbnRFeHBlbnNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFZpYUNhbmFkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hEZXZlbG9wbWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWxsZXJzRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG90dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdG9ja2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEFydGljbGVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5DYXJnb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZGluZ0F0dGVuZGFudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9ja3lNb3VudGFpbkJ1cmVhdTU4M0l0ZW0xMTAwQXJiaXRyYXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsT3V0QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbFJlYmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lLURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay1VcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrLXVwT3JEZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlQ2hhcmdlVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaWduYXR1cmVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdyZWdhdGluZ1NvcnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZlVubG9hZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJIYW5kQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBc3Npc3RhbmNlUHJvZ3JhbVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZVdpdGhDYXNoRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VVcGdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXQtdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWFyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVlcEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQ2FycmllckNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZENvbnNpZ25lZVVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQW5kSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBzaWRlUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9TdG9ja1F1YWxpdHlBdWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvdGJsYXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmthZ2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rLVdyYXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uUG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3RvclBvcnRPZkVtYmFya2F0aW9uRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUludm9pY2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVNoaXBtZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVldmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0UmFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0VHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFVubG9hZGluZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xvdHRpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsT3JkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlU3VwcG9ydFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDaXJjdXNUcmFpbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERldGVudGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEVxdWlwbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEZpbmlzaENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEZyZWlnaHRTdXBwbGVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWlsZWFnZU1vdmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhY2thZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBlcm1pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQdW1wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU2VhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVGVzdEVxdWlwbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRvb2xpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUb29saW5ncmV3b3JrY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVHJhaW5Nb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFZlaGljbGVSZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uUmV2aWV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrLVVwQXRQaWVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9vbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdHRpbmdPZlRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwcmVhZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTWV0cm9wb2xpdGFuVHJhbnNpdEF1dGhvcml0eVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVNb3RvckZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FsZXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbWluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlbmNpbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcGNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0T3JpZ2luYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXRQaWVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcHBpbmdJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0ZW5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZWV0TGFtcHNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmlwcGluZ1NvcnRpbmdBbmRDb25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVmZmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb0Nvb3BlcmF0aXZlQWR2ZXJ0aXNpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb1RheE9uUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmZXJhbmNlV2FyZWhvdXNlQ2hhcmdlRXhwb3J0T3JJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2FyRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1PZkFkZHNBbmREZWR1Y3RzVG9NYWtlTWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bmRheU9ySG9saWRheVBpY2stdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlckJhZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dlbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1BaXJwb3J0VGF4RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1BaXJwb3J0VGF4T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQmV2ZXJhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1DaXR5U2FsZXNUYXhPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1FeGNpc2VUYXgtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1FeGNpc2VUYXgtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRmVkZXJhbEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUZlZGVyYWxFeGNpc2VUYXhPblRpcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtR292ZXJubWVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtSGFuZGxpbmdDaGFyZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpYWJpbGl0eS1BbW9ydGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpYWJpbGl0eS1PbmVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTG9jYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUxvY2FsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTWV0cm9wb2xpdGFuVHJhbnNpdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T25NaXNjZWxsYW5lb3VzQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T25UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVJlZ3VsYXRvcnlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TYWxlc2FuZFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVNhbGVzVGF4U3RhdGVBbmRMb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN0YXRlSGF6YXJkb3VzU3Vic3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdXBlckZ1bmRFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Vc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1WYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2hub2xvZ3lFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYW1DaGFyZ2ViYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZS1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeVZvbHVudGFyeUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZWRBc1RydWNrbG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsRGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxTZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2VzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UXVhbGlmaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBhbGxldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hwdXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hwdXRDb250YWluZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocnV3YXlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpY2tldGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvYmFjY29Qcm9kdWN0c1JlcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE9GQ1NlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdSZXdvcmtDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xzRm9yUHJpbnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXNzZXNzb3JpYWxDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnROb24tVVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnRVU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTWF0ZXJpYWxJbnZvaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjaW5nSW5ib3VuZFZpYU90aGVyQ2FycmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNpbmdTZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja1N0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJSZW50YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BbmRTZXR1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25DaGFyZ2VNaW5pbXVtUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25EaXJlY3RCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblRoaXJkUGFydHlCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblZlbmRvclByb3ZpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltbWluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tEZXRlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZERpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd28tRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvRG9vclBpY2tVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hYnNvcmJlZFN3aXRjaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nTGFib3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdSZWxvYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2FsZWFibGVNZXJjaGFuZGlzZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zY2hlZHVsZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZVBsYW5EZXRhaWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VGbGF0QXNzaXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlTWF4aW11bUFzc2lzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEQUluc3BlY3RlZFN0YW1waW5nQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlQ2hhcmdlVG9vbGluZ1BlcnNvbm5lbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlLVNwZWNpYWxUeXBlRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5DbGVhbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU9yZGVyZWRCdXROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUHJlcENoYXJnZUNvdXJ0ZXN5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSb2FkQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW50aW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXJnaW5Jc2xhbmRUcmFuc2ZlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGFyeUNvbnRyaWJ1dGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tDcmV3SW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZWRGdXRpbGVUcmlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlcm1lbG9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsQW5kSW52b2ljZURpc3RyaWJ1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VhdGhlclByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFZlcmlmaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQnJlYWtidWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZUhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VVc2FnZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lsbENhbGxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5Qcm9vZk9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtcmF5Q2hhcmdlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNpc01vbmV0YXJ5UmFuZ2UiPgotICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5UmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5TGltaXQiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNpc01vbmV0YXJ5UmFuZ2UiIHR5cGU9IkJhc2lzTW9uZXRhcnlSYW5nZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlSYW5nZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bU1vbmV0YXJ5VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bU1vbmV0YXJ5VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlSYW5nZSIgdHlwZT0iTW9uZXRhcnlSYW5nZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlMaW1pdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlMaW1pdFZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlMaW1pdCIgdHlwZT0iTW9uZXRhcnlMaW1pdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlNb25ldGFyeVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSYXRlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlUGVyVW5pdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRQcmljZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlQmFzaXMiIHR5cGU9IkRlY2ltYWwxOF8zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlIiB0eXBlPSJSYXRlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxOF8zIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxOCIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iMyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBlcmNlbnRRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyY2VudGFnZU1vbmV0YXJ5VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQZXJjZW50UXVhbGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZWQiIHR5cGU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudFF1YWxpZmllciIgdHlwZT0iUGVyY2VudFF1YWxpZmllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1MaXN0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU5ldENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LUdyb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1OZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZXBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlQW1vdW50TGVzc1ByZXZpb3VzRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE1vbnRobHlPbkFsbEludm9pY2VzUGFzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRDaGFyZ2VCYXNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsUmF0ZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW1tdXRhYmxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVMaW5rIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwbGllclNob3BwaW5nQ2FydElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJSb3VuZFRyaXBPcmRlciIgdHlwZT0ieGNibEJvb2xlYW4iIGZpeGVkPSJ0cnVlIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIiB0eXBlPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIgdHlwZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdHVyZWROb3RlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdlbmVyYWxOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RlSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RlVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXh0VHlwZUNvZGVkIiB0eXBlPSJUZXh0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRleHRUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RydWN0dXJlZE5vdGUiIHR5cGU9IlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRleHRUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRsaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUZvckJyZWFjaE9mQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmlkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdHVhbFN0aXB1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb1JlY29yZFBPVGV4dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxQT1RleHQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVNldCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iTmFtZVZhbHVlU2V0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVTZXQiIHR5cGU9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZVZhbHVlU2V0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZXROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mTmFtZVZhbHVlUGFpciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZVZhbHVlU2V0IiB0eXBlPSJOYW1lVmFsdWVTZXQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik5hbWVWYWx1ZVBhaXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiIHR5cGU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVWYWx1ZVBhaXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVWYWx1ZVBhaXIiIHR5cGU9Ik5hbWVWYWx1ZVBhaXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkF0dGFjaG1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkF0dGFjaG1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkF0dGFjaG1lbnQiIHR5cGU9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGVkIiB0eXBlPSJBdHRhY2htZW50QWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50UHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmlsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRUaXRsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNSU1FVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVwbGFjZW1lbnRGaWxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0iQXR0YWNobWVudCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhbmdlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckRldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyRGV0YWlsIiB0eXBlPSJPcmRlckRldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSXRlbURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSXRlbURldGFpbCIgdHlwZT0iTGlzdE9mSXRlbURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJCYXNlSXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljaW5nRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkRlbGl2ZXJ5RGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJvdW5kVHJpcEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaW5lSXRlbU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaW5lSXRlbUF0dGFjaG1lbnRzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQXR0YWNobWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiB0eXBlPSJJdGVtRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNlSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaW5lSXRlbU51bSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaW5lSXRlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcmVudEl0ZW1OdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikl0ZW1JZGVudGlmaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYXhCYWNrT3JkZXJRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUXVhbnRpdHlDb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT2ZmQ2F0YWxvZ0ZsYWciIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGFsb2dSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1Db250cmFjdFJlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250cmFjdEl0ZW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mSXRlbVJlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHJ5T2ZPcmlnaW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50cnlPZkRlc3RpbmF0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ291bnRyeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaW5hbFJlY2lwaWVudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFydHlDb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb25kaXRpb25zT2ZTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNNYXRlcmlhbHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJIYXphcmRvdXMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUl0ZW1EZXRhaWwiIHR5cGU9IkJhc2VJdGVtRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaW5lSXRlbU51bSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQnV5ZXJMaW5lSXRlbU51bSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyTGluZUl0ZW1OdW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtTnVtIiB0eXBlPSJMaW5lSXRlbU51bSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGluZUl0ZW1UeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbVR5cGVDb2RlZCIgdHlwZT0iTGluZUl0ZW1UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGluZUl0ZW1UeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1UeXBlIiB0eXBlPSJMaW5lSXRlbVR5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTGluZUl0ZW1UeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6aW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJMaW5lSXRlbU51bVR5cGVDb2RlZCIgdHlwZT0iTGluZUl0ZW1OdW1UeXBlQ29kZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiIHR5cGU9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxpbmVJdGVtTnVtVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1JZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBhcnROdW1iZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29tbW9kaXR5Q29kZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXRlZ29yeSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbUlkZW50aWZpZXJzIiB0eXBlPSJJdGVtSWRlbnRpZmllcnMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnROdW1iZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlclBhcnROdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0TnVtIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1eWVyUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnROdW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdGFuZGFyZFBhcnROdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YnN0aXR1dGVQYXJ0TnVtYmVycyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3RoZXJJdGVtSWRlbnRpZmllcnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnROdW1iZXJzIiB0eXBlPSJQYXJ0TnVtYmVycyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydE51bSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0SURFeHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldmlzaW9uTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0TnVtIiB0eXBlPSJQYXJ0TnVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBhcnROdW0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hbnVmYWN0dXJlcklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hbnVmYWN0dXJlck5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiIHR5cGU9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJvZHVjdElkZW50aWZpZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyRXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIiB0eXBlPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQcm9kdWN0SWRlbnRpZmljYXRpb25Bc3NpZ25lZEJ5VGhlTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ1BhY2thZ2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnRhdGlvbkFzc29jaWF0aW9uUHJvcHJpZXRhcnlSaWdodHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvY2F0aW9uTWV0aG9kb2xvZ3lJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUlTQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuRGVudGFsQXNzb2NpYXRpb25Db2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9uc0Fzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zUGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9uc1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uQ29tcGxldGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsUHJvZHVjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSTklDUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvcnRhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFBhcnRzTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGljVHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXhpbGlhcnlUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1eGlsbGFyeVRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXItQ29kZWRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQ29tbW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGJvYXJkc0NvbW1lcmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxDcmVkaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsU3ViZ3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5kaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmRPckxhYmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJQcmljZU9waW5pb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNCb2R5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllckdyb3VuZFNoYWRlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29sb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0VuZFByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0VuZ2luZWVyaW5nQ2hhbmdlTGV2ZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0ludGVybmFsUHJvZHVjdEdyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUXVhbGlmaWVyRm9yU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1N0eWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTdWJsaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FHRUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmRpZGF0ZU9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycnktT3ZlclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsQWJzdHJhY3RTZXJ2aWNlUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTEVJQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29nbml6YW5jZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sZFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZE5DQ01BT3JCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVlRm9yVW5pZm9ybVNlY3VyaXR5SWRlbnRpZmljYXRpb25Qcm9jZWR1cmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eUdyb3VwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25MYW5ndWFnZUVxdWlwbWVudElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnktT3duZWRVbml0VHJhaW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXRpYmxlQ3V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25BbGxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlcHRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maWd1cmF0aW9uSXRlbUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RvclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnJlYWtkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENoYW5nZUF1dGhvcml6YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckVzdGFibGlzaG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRyYW5zZmVyUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeUZyb21XaGljaFByb2N1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25GYW1pbHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlUmlza1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbXBhbnlSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQcm92aWRlZEVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0SXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VGYW1pbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc0NvZGVQb2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvbnRpbnVlZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50R3JvdXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVuZFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1VQQ0NvbnN1bWVyUGFja2FnZUNvZGUxLTQtNi0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnVVBDU2hpcHBpbmdDb250YWluZXJDb2RlMS0yLTQtNi0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0U3RhbmRhcmRQcm9kdWN0QW5kU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOMi01LTUtMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOLTk5SW4tU3RvcmVDb3Vwb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kLUl0ZW1EZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lRGlzcGxhY2VtZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29kZVBlckNPUEFTU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudEhpZXJhcmNoaWNhbFNlcXVlbmNlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlZFBhcnRPckFzc2VtYmx5T3JQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbmRhYmxlQ29udGFpbmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuc2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQUFTZXJ2aWNlQnVsbGV0aW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY1BpZWNlc1BlclJvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZFN1YmFzc2VtYmx5TW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZFN1YmFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVBZmZvcmRhYmxlTGVuZGluZ1Byb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVQcm9qZWN0Q29uZG9taW5pdW1DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlmdGhXaGVlbFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxUZXN0TG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxQaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9ySGFuZFN0YW5kYXJkUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJlUHVtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQcmlvcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclB1Ymxpc2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY0FmZm9yZGFibGVMZW5kaW5nUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNQcm9qZWN0Q29uZG9taW5pdW1DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZS1SZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGVEcml2ZW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZU5vbkRyaXZlblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsVGFua1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZEFiYnJldmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRTdWItQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdBU0ZMT1dJbnZvaWNlUG9zdGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdBU0ZMT1dQcm9kdWN0b3JTZXJ2aWNlQ2hhcmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0aGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZWFyUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmljTmFtZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGlkZXJLaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkRpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGhpY3NJbmR1c3RyeUJhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZFNoYWRlU3RhbmRhcmRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1RJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXNlZFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSENQQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJQkMtSGVhbHRoSW5kdXN0cnlCYXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDU3VwcGxpZXJMYWJlbGluZ1N0YW5kYXJkUHJpbWFyeURhdGFNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUVDUHJvZHVjdE9yU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRC05LUNNLVByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWduaXRpb25LZXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHJpbnQtVHJhZGVtYXJrQ29kZU9mU3Vic2lkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlDb21tb2RpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk1lZGlhVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhbkRlc2NyaXB0aW9uQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyc0Z1bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZWFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmlvckNvbG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFydGljbGVOdW1iZXJpbmdBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNELTktQ00tRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsSGFybW9uaXplZENvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEJvb2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRGdW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJTUXVhbGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1NYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVR5cGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50TGlmZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblNwZWNpZmljUHJvY2VkdXJlQW5kU3VwcGx5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbmJhblBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlTYW1wbGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVRlc3RDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlicmFyeU9mQ29uZ3Jlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5UHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTZXJ2aWNlRmVhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRHYXRlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkU2VxdWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsbHlBc3NpZ25lZENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE9JTkNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RQcmljaW5nVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VJbmRleFBhZ2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yUHJvZHVjdE9yTWF0ZXJpYWxPck1hY2hpbmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQcm9ncmFtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc2NoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhc3VyZW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uQnVyZWF1QXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN0b3BMb3NzQ292ZXJhZ2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN0b3BMb3NzTGV2ZWxDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN0b3BMb3NzUHJvZHVjdExpbmVDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1FTUFQcm9kdWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZE9mRGVsaXZlcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlc3RvbmVFdmVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlMU1BFQ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQ3JlZGl0RGF0YU9yZGVyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VQcm9kdWN0Q29kZU9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZVVuZGVyd3JpdGluZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZUlkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGUtTGluZURlc2lnbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVtZW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU0LTQtMkZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTUtMy0yRm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNS00LTFGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU1LTQtMkZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxIZWFsdGhSZWxhdGVkSXRlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsSGVhbHRoUmVsYXRlZEl0ZW1Db2RlSW40LTZGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsSGVhbHRoUmVsYXRlZEl0ZW1Db2RlSW41LTVGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvZHVjdEdyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSZXRhaWxGZWRlcmF0aW9uQ29sb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbEZlZGVyYXRpb25TaXplQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNaWNyb2NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1JlcGxhY2VtZW50UGFydE9yQXNzZW1ibHlEZWZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRIaWdoZXJBc3NlbWJseU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEhpZ2hlclVzZWRBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZm9yZmVpdHVyZU9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2FsZWFibGVJdGVtRXhjbHVkaW5nRGVwb3NpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlNOLU5vcnRoQXRsYW50aWNUcmVhdHlPcmdhbml6YXRpb25TdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVCQ1VCODJDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVCQ1VCOTJDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQb3NpdGlvbnNPbk1hY2hpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ibGlnYXRpb25BdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic29sZXRlUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZE1pY3JvY29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5DYXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5Db25zdW1lclBhY2thZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTk1vZHVsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOTXVsdGlwYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JBc3NpZ25lZFByb3BlcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wcG9zaXRlLUhhbmRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsQ2FibGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsSW5kdXN0cnlQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFcXVpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVQcm9kdWN0aW9uT3BlcmF0aW9uU2hlZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydERyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnROdW1iZXJEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0dGVybk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ0NFQy1Hb29kc0FuZFNlcnZpY2VzVGF4Rm9yd2FyZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDQ0VDLUdvb2RzQW5kU2VydmljZXNUYXhOb3RBcHBsaWNhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDLU5vblR1YnVsYXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDT01DLUdvb2RzQW5kU2VydmljZXNUYXhGb3J3YXJkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NPTUMtR29vZHNBbmRTZXJ2aWNlc1RheE5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUFjY291bnRhbnRzU29jaWV0eU9mQ2FuYWRhVHVidWxhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXNJblJvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZ2d5YmFja0NvbW1lcmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRFcXVpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5Rm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZE1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVJhdGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2FtcGxlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTG9va1VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3JQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludENvbG9yU3RhbmRhcmRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50T3JEcmF3aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0T3JTZXJ2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3REYXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdElkQXR0cmlidXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1EZXNjcmlwdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1MZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxWYXJpYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUFuZENhc3VhbHR5U2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzSXRlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNPcmRlckxpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cnBvc2VPZkluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaWF0b3JTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkLU93bmVkVW5pdFRyYWluTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5kb21XZWlnaHRBZ2dyZWdhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVEZXRhaWxDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlJbmZvcm1hdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlRXh0ZW5kZWRUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlRnJvbnRSZWFyRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZU1pZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVQdXNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlUmVhckRyaXZlblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVSZWFyTm9uRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkS2VlcGluZ09yTW9kZWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VPaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZWRQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkTW9kZWxUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkUG9saWN5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlVmFsdWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWdpb3VzUmV0YWlsTm9uLUJvb2tJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJGcm9tUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckluZHVjdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclRhZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudE5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50UHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRTdWJhc3NlbWJseU1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudFN1YmFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsUExVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJTS051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1ByZXNlbnRhdGlvbklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVtYXRpY0RpYWdyYW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUHJpb3JJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uUHJpbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNEYXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0xvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsSXRlbUFuZENvbnRyaWJ1dGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWVzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvZGVQZXJDT1BBU1N0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJvbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRmVhdHVyZUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVuZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9yUGF5b3V0T3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZi1MaWZlQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGYtTGlmZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0V29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlVXBPclNpZGVEb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhYk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXBlckJveEtleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXBlckJveFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU05PTUVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZVJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRlcG9zaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkxlYWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWF0ZXJpYWxJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTQ0MtMThBbmRBcHBsaWNhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdXBPZlByb2R1Y3RzLU1peGVkQXNzb3J0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxhYmVsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYW1wbGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0eWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJsaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lzdGVuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnRvcGljTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyc2VkZWRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJCcmFuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQ29tcGFueVJlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNTdXBwbGllckFydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bnRoZXRpY0x1YmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQ1RDb21tb2RpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxNYW51YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxQaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zQ2lyY3VpdElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNJbmR1c3RyeVNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tU2VydmljZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUluZHVzdHJ5TWFudWZhY3R1cmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGVkTWF0ZXJpYWxJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFByaW9ySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUNvbXBsaWFudFRlY2huaWNhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcGljTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlSW5JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlckNhc2VTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0R3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlQW5kQmFua1NlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tCb2R5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlU2VsdmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNDT3JFQU4tMTI4Q291cG9uRXh0ZW5kZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOQ0NTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdNZXRob2RPZkRpcmVjdFdyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybVN0b2NrU3ltYm9sU3lzdGVtQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5OdW1iZXJEYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ2FzZUNvZGVOdW1iZXIxLTEtNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb25zdW1lclBhY2thZ2VDb2RlMS01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvbnN1bWVyUGFja2FnZUNvZGUxLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb3Vwb25Db2RlMS01LTUtMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5DYXNlQ29kZTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTkNvbnN1bWVyUGFja2FnZUNvZGUyLTUtNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5Db3Vwb25Db2RlMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOTW9kdWxlQ29kZTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTk11bHRpcGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOU2hpcHBpbmdDb250YWluZXJDb2RlMS0yLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTaGlwcGluZ0NvbnRhaW5lckNvZGUxLTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1N1ZmZpeC1EZWZpbmVzUGFja2luZ1ZhcmlhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXItRGVmaW5lZFNoaXBwaW5nQ29udGFpbmVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVZNUlBNTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVWTVVMaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYWJsZU1lYXN1cmVQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyeUl0ZW1Qcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlTWFpbnRlbmFuY2VSZXBvcnRpbmdTdGFuZGFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckFscGhhbnVtZXJpY1NpemVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb2xvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yR3JvdW5kU2hhZGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzQmFzaWNVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzRW5naW5lZXJpbmdDaGFuZ2VMZXZlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzU3R5bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNTdXBwbGVtZW50YWxJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVR5cGVJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVVzYWdlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWZlckxvdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZWVsQ2hhaXJMaWZ0U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sZW5DdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xlblJ1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Rhc2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JsZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudC1FbmdsaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnQtTWV0cmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnRXb3JzdGVkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIiB0eXBlPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIiB0eXBlPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlZCIgdHlwZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlZCIgdHlwZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljIiB0eXBlPSJJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxTZWN0b3JpYWxDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG95Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmF0b21pY2FsT3JpZ2luT2ZTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlT3V0QXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaXNXZWlnaHRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWhpbmQtdGhlLUNvdW50ZXJEcnVncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQnJhbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQ29udGFpbmVyQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUZsYXZvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlU2VnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dG9taG9sZUxvY2F0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0b21ob2xlUHJlc3N1cmVNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kR3JvdXAtQUdyb3VwaW5nT2ZTaW1pbGFyQnJhbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVvZkFsY29ob2xUb2JhY2NvQW5kRmlyZWFybXNDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdU9mQWxjb2hvbFRvYmFjY29BbmRGaXJlYXJtc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb2xvckRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtU2l6ZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmctTGluZXItVHViaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nT3JMaW5lclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEZhbWlseU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lELUNvbW1lcmNpYWxJdGVtRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdPclBhaW50U3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ09yUGFpbnRTeXN0ZW1OYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yLUxvd2VyQm9keSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3ItVXBwZXJCb2R5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25DaGVtaWNhbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlGaWVsZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25lZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtYWJsZVJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lckluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbEl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3MyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzM05hcmNvdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzM05Ob24tbmFyY290aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3M0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0ZURlc2NyaXB0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJvc2lvblJlc2lzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFydGljbGVTcGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlRmF1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZW5zaW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdGlvbmFsSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NhZ2VGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRWZmaWNhY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFZmZpY2FjeVN0dWR5SW1wbGVtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkZ2VUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY2FsbHlDbGVhbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZHMtU2xpdHRpbmctU3BsaXR0aW5nLUN1dHRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5ld2l0aFRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3dDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhbkNvbW11bml0eVJpc2tDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZUFuYWx5c2lzUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVEU1BFQy1GZWRlcmFsU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVELVNURC1GZWRlcmFsU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyZVRvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRDb2RlLUVJQU9yRE9EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGFtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWx0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoT3JTdXJmYWNlUm91Z2huZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF2b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xkQ29uZmlndXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3REZXZpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm11bGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYWdyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJ0aGVySWRlbnRpZnlpbmdDaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTWVyY2hhbmRpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxQcm9kdWN0Rm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJpY0RydWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5EaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXBlVmFyaWV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFJhdGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQW5kQmVhdXR5QWlkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdFRyZWF0T3JBbm5lYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhdWxpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZ3JlZGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluamVjdGFibGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXktV29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ckRvdWJsZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ck92ZXJ0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkT3JDb3BwZXJTYW1wbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZWRSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRpbmdPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZVJ1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnbmV0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTdGF0dXMtT3V0c2lkZVByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN1cHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbGxvZ3JhcGhpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlMU1BFQy1NaWxpdGFyeVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NU0JMTS1JbmRpYW5MYW5kUHJvcGVydHlPclVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS1NZWRpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVzaWNTdHlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXV0dWFsbHlEZWZpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmVzY3JpcHRpb25EcnVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZWN1cnJpbmdSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnV0cml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNvbGV0ZUFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9kb3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmllbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEaXJlY3RSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQaHlzaWNhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyLXRoZS1Db3VudGVyRHJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZUludGVncml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXR0ZXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlT2ZBbGNvaG9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JhdGlvbkNvbnRpbnVpdHlJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcmF0aW9uSW50ZXJ2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUFlcm9zb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Bc0RpbHV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Db25jZW50cmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUVtdWxzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tTGlxdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tUG93ZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tU2VtaXNvbGlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tU29saWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVDb3VwbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTdHJlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNhdXRpb25hcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRydWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkVmZmVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5R3JhcGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50T3JpZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVMYWJlbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NBY3Rpb25UYWtlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc09yUHJvZHVjdGlvblVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGFCYXNlTWFuYWdlbWVudERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGlmZUN5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U3ViamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxPZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ByaWV0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJlRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHV0LXVwRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBc3N1cmFuY2VTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHktUXVhbGl0eUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRpbmdNZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ1Jlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1cmJpc2hlZEFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlPclN0YXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnktU3RhdGVPckVudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdGF0ZWRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3Rpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2Vydm9pckNvZGUtQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWx0c01ldGhvZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkRGVzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9mQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUdyYXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRPckNvbmZpZGVudGlhbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uUHJvZmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWVzVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VGZWF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmLUxpZmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZlRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdVbml0Q29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9MaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9TdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaG91ZXR0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZVN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWV0eUdvdmVybm1lbnRBbmRPckN1c3RvbWVyU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbHViaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvbnRyb2xsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBbmREaXNwbGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUxvY2F0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZVRyZWF0bWVudC1DaGVtaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZVRyZWF0bWVudC1NZWNoYW5pY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdBbmRJbnNwZWN0aW9uQWdlbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RQYW5lbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTYW1wbGVEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTYW1wbGVGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTYW1wbGVMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxXZWlnaHRGb3JtdWxhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXBldXRpY0NsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXBldXRpY0VxdWl2YWxlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUluc3VyYW5jZUZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2xhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3aXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQW5kT3JQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZUZXN0LUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVTcGlubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29sb3JEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yU2l6ZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXN1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbGF0aWxlT3JnYW5pY0NvbXBvdW5kQ29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5VHlwZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsZHNPclNwbGljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBlcmZvcmF0aW9uQ29udGludWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBlcmZvcmF0aW9uSW50ZXJ2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxUZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUZydWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lR3Jvd2luZ1JlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09mQ2FiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxhdGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2xzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ0hlYWRGbGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ybmVyRGlhZ29uYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGVFbmRPdmVyaGFuZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbVRhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbEZ1ZWxUYW5rUG9zaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlcmlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250U3BhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlTGVmdFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZVJpZ2h0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlbGx5QnVzaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdEZyb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc0NyaXRpY2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9yZUNyaXRpY2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZWxhdGl2ZVBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZVNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Bwb3NpdGVDb3JuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlTGVmdFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVSaWdodFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJTcGFyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb241MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb243Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaHRGcm9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaHRSZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlT25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlVHdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRW5kT3ZlcmhhbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbHVibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYXJlVGlyZVBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFyYm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVjY28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1TZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtCb3R0b20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoQnVjY2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhEaXN0YWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aEZhY2lhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoSW5jaXNhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoTGluZ3VhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoTWVzaWFsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhPY2NsdXNhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyQ2FiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlsYXRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1UYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2QiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGVnb3J5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGVnb3J5SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU3RhbmRhcmRDYXRlZ29yeUlEIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yeSIgdHlwZT0iQ2F0ZWdvcnkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZWNobmljYWxJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeUlEIiB0eXBlPSJTdGFuZGFyZENhdGVnb3J5SUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlF1YW50aXR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiIHR5cGU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGVkIiB0eXBlPSJRdWFudGl0eVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUNvZGVkIiB0eXBlPSJRdWFudGl0eUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVVbnNlcnZpY2VhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUF2ZXJhZ2VPdmVyZHVlRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQbGFjZWRGb3JDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50RG9zZVBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnREb3NlUGVyVW5pdERpc3BlbnNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpc3RpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVNYWludGVuYW5jZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFVuaXRzQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkZWRFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFByb21vdGlvblNhbGVzRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlcGxlbmlzaG1lbnREZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFVzYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29ycmVjdG9yUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFRvSW52ZW50b3J5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUF0RGVhdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRMaW5lSXRlbXNDb21wbGV0ZWQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZExpbmVJdGVtc0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUhpZ2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTG93VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZWFyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU9mRmluYW5jaWFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0UmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lQXR0ZW5kYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90dGVkVXNhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUaW1lQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGlzYXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uQ3VtdWxhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvbk9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRvdGFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkTGVuZ3RoT2ZTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9yT2ZmZXJEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZIb2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNGb3JTYWxlUHJvamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNQcm9qZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYVBlclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U2VpemVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRDb21wbGV0ZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdENvbXBsZXRpb25RdWFudGl0eUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW50LUhhbmRsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXRlbnRpb25MZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja29yZGVyTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVqZWN0SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVBldGl0aW9uc0ZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRyb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdVbml0UGVyUHJpY2luZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua1ZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9vZFJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va09yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9uc0xlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaE9mZmljZUxvY2F0aW9uc0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNEZWNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNMaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Q3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVDbGFzc0luY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlSW5kdXN0cnlJbmNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZU5hdGlvbmFsQXZlcmFnZUluY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eXVwT3JCdXlkb3duUmF0ZVBlckJhc2lzUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ5dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZFJlZ2lzdGVyZWROdXJzZUFuZXN0aGV0aXN0TnVtYmVyT2ZDb25jdXJyZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlc0luQ2FwaXRhbFN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlQ3ViaWNNZWFzdXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mUGFja2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlJhaWxXYWdvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhdGluZ09pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbzJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyZWQtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmVkLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eVNlcnZpY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRlZEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luU2FtZUFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJpc29uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZENvbnRyYWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQcm9qZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWV0ZXJSZWFkaW5nQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRJdGVtT3V0cHV0T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERpc2NvdW50SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclJlc2VydmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnV5ZG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCdXl1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TGluZUl0ZW1RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbE1vYmlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3Rpb25zU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2RFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtVmVyYmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtV3JpdHRlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsZXJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnNlU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZC1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQnVkZ2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlRWFybmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVFZmZlY3RPZlByaW9yUGVyaW9kQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUxpcXVpZEluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZU9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RSZWFjaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVjZWl2ZWRFbmRPZlByaW9yWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlcXVpcmVkUHJpb3JUb1RoZUZpcnN0U2NoZWR1bGVkUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNjaGVkdWxlZFVwVG9BY2N1bXVsYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRMb25nLURpc3Bvc2l0aW9uQ2hhbGxlbmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZExvbmctRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25DaGFsbGVuZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVNjcmFwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVdhdGVyVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGF5c09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RpYmxlQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdE5vdGlmaWNhdGlvblJlc3BvbnNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWdyZWVTZWdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaE11bHRpcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdHJveWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsTGVnYWxGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbExlZ2FsRmlsaW5nc0FnYWluc3REaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVuc2lvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0V29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVldFF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvblVuZGV0ZXJtaW5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljQWZmaWxpYXRlZENvbXBhbmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlLUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbkluQ3VycmVudEpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHdlbGxpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWVDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZUhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXBzZWREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1NpZ25hdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZC1BY2NpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QtU2lja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQXRUaGlzTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQnlUaGlzQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZE9uVGhpc0pvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU5vbm93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOb3RJbmNsdWRpbmdPd25lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc051bWJlck9mRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOdW1iZXJPZkRheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtUGFydFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1TYW1lRHV0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtU2FtZU9jY3VwYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc1NoYXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzVG90YWxOdW1iZXJPZkRheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxGaXJzdE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsU2Vjb25kTW9udGhPZlF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxUaGlyZE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZNb250aEludmVudG9yeVByaW9yVG9TaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJlZFN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdHlTZWN1cml0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBbm51YWxWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFbXBsb3llZXNBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVtYWluaW5nRWNvbm9taWNMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZW1haW5pbmdQaHlzaWNhbExpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFRvdGFsRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFwb3JhdGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0ZW5jZUxpbWl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbmRpdHVyZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZFRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhVW5wbGFubmVkRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVNpemVBZnRlckNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlU2l6ZUJlZm9yZUNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENvdmVyYWdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXJlT3JGbGFzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vcnNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RlZFNjYW5uZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUb0NvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVsYXRlZEVudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlbWVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdC1JbkNhbGVuZGFyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlbGFuY2VEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZWxhbmNlU2FsZXNwZXJzb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUXVhbnRpdHlJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVF1YW50aXR5Tm90SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENvbnN1bWVkT3JCdXJuZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxQdW1wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbEJhdGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pc2hlZEJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZU9yQ2FycG9ydEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzTGlmdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmVjZWlwdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmV0dXJuZWRUb0VhcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZXR1cm5lZFRvUHJvcGVydHlGb3JGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTaHJpbmthZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1NvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JEcmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvckZ1ZWxTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JQbGFudEZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JSZXByZXNzdXJpbmdPclByZXNzdXJlTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRPblByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNWZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVwb3J0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzQW5udWFsSW5jb21lTXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NCdWlsZGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGl2aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaXZpbmdGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1Byb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVudE11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVCdXl1cE1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckFsdGVybmF0ZVBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckJ1eXVwT3JCdXlkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0T3JUeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0VHlwZU9yTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdFR5cGVPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1MaWZldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1UeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhaXJtZW50RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFpcm1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3JlbWVudGFsT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXJlY3RFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QnVzaW5lc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Qcm92aWRlclN0YW5kYXJkaXplZE1vdG9yVmVoaWNsZVBlbmFsdHlQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50RnVuZHNSZXR1cm5lZENoZXF1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVuZGVkQ2hhbmdlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RGb3JPdmVyZHJhd25BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVGVybVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ0YW5rVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1Vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeURpc2NyZXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlPblNoZWxmV29ya0luUHJvZ3Jlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVF1YW50aXR5QXRTdXBwbGllcnNOb3RTdWJqZWN0VG9JbnNwZWN0aW9uQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UXVhbnRpdHlBdFN1cHBsaWVyc1N1YmplY3RUb0luc3BlY3Rpb25CeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlXaXRoZHJhd2FsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvbHZlbWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYWlsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50c1JlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxTdGF5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFnVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEhvbGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEN1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U3VpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aE9mUmVzaWRlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlLVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbHNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxzU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5zUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZXRpbWVDYXBhY2l0eU9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZS1UaW1lUmVzZXJ2ZS1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmV0aW1lUmVzZXJ2ZURheXMtQXBwbGllZFRvVGhpc0NsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlLVRpbWVSZXNlcnZlLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZVRocmVhZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdmVzdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXBheW1lbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yR2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0T2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0V29ya1RpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RXb3JrVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90U2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVkVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UHJpY2VDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGNoaW5nRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbE9uLUJvYXJkUXVhbnRpdHlQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLUFjY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZEFjY2lkZW50VG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLVNpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZFNpY2tuZXNzVG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1EZWxpdmVyeUJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU1hdHVyaXR5RXh0ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZkVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZlB1cmNoYXNlT3JkZXJzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mU2hpcG1lbnRzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1Qcm9kdWN0aW9uQmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1RdWFudGl0eVRvV2hpY2hUYXhSYXRlQXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlcXVlc3RhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TaGlwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2FiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdG9ja0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3VwcGx5UXVhbnRpdHlTdXBwbGllckVuZG9yc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJzSW5Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaW9uRG9sbGFyUm91bmR0YWJsZUNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50VW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Db250cmFjdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1GYWJyaWNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJQYWNrYWdlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUHJvZHVjdGlvbkJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUXVhbnRpdHlUb1doaWNoVGF4UmF0ZUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZXF1ZXN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hpcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU3RvY2tMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVMb2FkaW5nQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxPclRhcmdldFN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VQb29sQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5RGVjcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvUGF5SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9EZWxpdmVyeVJlcXVpcmVtZW50SW5UaGlzSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1CaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb21taXR0ZWRJbnZlbnRvcnlPblNoZWxmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb25mb3JtYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29uc29saWRhdGVkVG90YWwtRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db25zb2xpZGF0ZWRUb3RhbC1Gb3JlaWduU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvdmVyZWQtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRG9tZXN0aWNTdG9ja2hvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1VbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVVyZ2VudERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxSZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Wb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBY2NvdW50c1Bhc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWN0aXZlQWNjb3VudHNUaGlzQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRkZWRMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRqdXN0bWVudFBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXR0YWNrc09yT2NjdXJyZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQmF0Y2hlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZCb3Jyb3dlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2FyZHNOb3RSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDYXJkc091dHN0YW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNoZWNrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDbGFpbWFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2xvc2VkTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNvLUluc3VyYW5jZURheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ29waWVzT2ZCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ3JldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEYXlzQ292ZXJlZEJ5SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVsaW5xdWVudEluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWxpdmVyaWVzUGVyRGVzcGF0Y2hQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVwZW5kZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbmRVc2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbnRpdGxlZEV4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRmFpbGVkQnVzaW5lc3Nlc09mRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZyYW5jaGlzZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZ1bGwtVGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZIb3NwaXRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSWRlbnRpY2FsSGFuZGxpbmdVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJbnN1cmVkTGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSW50ZXJlc3RQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zQXV0aG9yaXplZEF0U3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNBdXRob3JpemVkQXRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNJblN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxhdGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxldmVscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMaW1pdGVkUGFydG5lcnNoaXBTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvc3RDYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNZW1iZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1lc3NhZ2VSZWNpcGllbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vbnRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb3J0Z2Fnb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vdWxkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZOb24tQ292ZXJlZERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTm9uc3VmZmljaWVudEZ1bmRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVuQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlcmF0aW5nUGVyaW9kc0F0RmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVyYXRvckNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3JpZ2luYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhY2thZ2VzSW5IYW5kbGluZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGFzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYXRpZW50QWRtaXNzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQZW9wbGVMaXZpbmdBdFJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQaHlzaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlByb2R1Y2luZ1dlbGxzUmVtYWluaW5nT25Qcm9wZXJ0eU9yRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUHJvZHVjaW5nV2VsbHNSZW1haW5pbmdPblJveWFsdHlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlF1YW50aXRhdGl2ZUluY2VudGl2ZVNjaGVtZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNlcnZpY2VzT3JQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNoZWxmRmFjaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaGVsZlRhZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9sZW5DYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaGVhdHJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lc0RlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRyYW5zcG9ydERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cy1Ib3VzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVEZXB0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVXaWR0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuc2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZXaXRoaG9sZGluZ0V4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcnNPZkNvbnN1bWVyVW5pdHNJblRoZVRyYWRlZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcldlZWtzUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZW1JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkxlYXNlRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUHJlbWlzZVNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlByZW1pc2VzU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbENvbmRlbnNhdGVTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxDb25kZW5zYXRlVXNlZE9uUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsU2VkaW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsVGhlZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZEFuZER1ZS1JbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlU2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlc1NhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0JlZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0RpdmlzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JzV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclF1YW50aXR5TXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvYW5UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFBheW1lbnRJdGVtQ291bnQuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFRlcm1JblllYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTWlzY2VsbGFuZW91c0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck9pbENvbmRlbnNhdGVEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFN0b2NraG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXJSZXNlcnZlTWF0ZXJpYWxSZXF1aXJlbWVudHNQcm90ZWN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlcldhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxpZXJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkludmVudG9yeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LVR1cm5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyZmxvd1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyU2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc0VxdWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duT2NjdXBhdGlvblF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JbkNvbW1vblNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblByZWZlcnJlZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblNlY3VyaXR5U2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJraW5nU3BhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQmF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYW50VG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpb25TaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0VGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzdER1ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhbmNlbGxhdGlvbkl0ZW1Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1cmF0aW9uV2Vla3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFeHBlcmllbmNlc0luVGhlTGFzdDEyTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RXhwZXJpZW5jZXNJblRoZUxhc3QzTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJzRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlT2ZPcmRlcmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljQ2FwYWNpdHlPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mRW1wbG95bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eVJlYWNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNpc3RlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbnNGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNJaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzSXYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXNEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbGZlcmFnZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGl0dGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRVbml0RGV2ZWxvcG1lbnRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhYmxlUmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0ZWRUZWxlcGhvbmVMaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1PcERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYXRlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtT3BEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlOb3RTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUHJvZHVjdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRvc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRWZmZWN0aXZlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudGlhbFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc3VyZUJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmVuZWZpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlBbW9ydGlzZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aHNVc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mQnJhbmNoTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09yZGVyUXVhbnRpdHlUb0JlQ2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1dlZWtRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha0Zyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2luZ1VuaXRQZXJCaWxsaW5nVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU1hbmFnZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TWV0ZXJSZWFkaW5nVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlOZXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0luY2x1ZGVkQXNFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ3VtdWxhdGl2ZUltYmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml0c0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjaW5nV2VsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RFeGNoYW5nZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvblJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbldvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTYWxlc0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRBdmFpbGFibGVJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQaGFzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RzSW5Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0VW5pdHNTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3RlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZXN0ZWRCaWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25UdXJuU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPZlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZnlpbmdXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xGYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdGF0aXZlSW5jZW50aXZlU2NoZW1lQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBZHZpc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUFwcHJvdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF0MTAwUGN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZUZvclJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVGb3JTYWxlLVN0b2NrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlT25TaGVsZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBd2FpdGluZ0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUJ5UG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Q2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUNhcnJpZWRGb3J3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNhcHByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNwZW5zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzcGxheWVkTm90QXZhaWxhYmxlRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5RGVsaXZlcnlWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeUxvZ2lzdGljU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeVJldGFpbE91dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbkZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluSG9sZE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbk1hbnVmYWN0dXJpbmdQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluUGh5c2ljYWxJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5RdWFyYW50aW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlMYW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TG9hZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU1hbmlmZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Tm90QXZhaWxhYmxlRm9yRGVzcGF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T2ZEZWFsZXJMaWNlbnNlUGxhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9mTWF0ZXJpYWxJbk9yZGVyZWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9uSGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPbkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyTmV4dEhpZ2hlckFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJVbml0T2ZJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyZW1lbnRGb3JNYWludGVuYW5jZUFuZFJlcGFpck9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmVtZW50Rm9yU2FtcGxlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJpbmdNYW5pcHVsYXRpb25CZWZvcmVEZXNwYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXR1cm5lZERlZmVjdGl2ZU9yRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U2VydmljZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTb2xkTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1c3BlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlUb0JlRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5V2l0aGRyYXduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVdpdGhoZWxkQnlPd25lck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlUXVhbnRpdHlPbkludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkQW5kQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTm90QWNjZXB0ZWRUb0JlRGVzdHJveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE5vdEFjY2VwdGVkVG9CZVJldHVybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRlZE1haW50ZW5hbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGVkT3ZlcmhhdWxBbmRSZXBhaXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWRlcmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5QWZ0ZXJQb3N0UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaWxsc0F1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCcmFuZHNEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJyYW5kc01hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRSZXR1cm5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZEJ1c2luZXNzRW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRFbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpb25zaGlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlc0VtcGxveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdBdXRob3JpemVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlcmluZ0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyUG9pbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudE92ZXJyaWRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RGlmZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREZWZpY2llbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eVRoYXRXYXNQcmV2aW91c2x5UmVsZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpc2l0aW9uaW5nT2JqZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Q3VzdG9tZXJEaXJlY3REZWxpdmVyeVNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5UmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZS1RdWFudGl0eS1BdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3Rpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEJ5Q29uc3VtZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNSZXBsYWNlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUXVhbnRpdHlOb3RJbmNsdWRlZEluVGhlUmVwbGVuaXNobWVudENhbGN1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1F1YW50aXR5UGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2F0dGVyZWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TmV0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRDaGFyZ2VzUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdGllc1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlcnNIb2xkaW5nUmVtYWluZGVyT2ZTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzQWRkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0RlbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0hlbGRBc1RyZWFzdXJ5U3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mQ29tbW9uU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mUHJlZmVycmVkU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc093bmVkQnlJbi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT3duZWRCeU91dC1PZi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZEJ1dE5vdElzc3VlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RpY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnQtTGFuZGVkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsZW50UGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmNlTGFzdFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lzdGVyc0RlY2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXN0ZXJzTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplT2ZIb3VzZWhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWRXb3JrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3NVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0ZWRRdWFudGl0eVJlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjZU9jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlTW90b3JWZWhpY2xlUGVuYWx0eVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc0luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc091dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvbGVuQ2hlcXVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlSZXR1cm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50RGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRpb25hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRXN0aW1hdGVkTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckVzdGltYXRlZFByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckxhdGVzdE1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJQcmV2aW91c01ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnBsdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5c0luQXZlcmFnZVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YW4tR2FueiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVzQXZhaWxhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWxrUGF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZkxvc3NBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhY2hlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUV4cGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJbkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJblBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VIb3NwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdENpdmlsaWFuRmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0SW5zdXJhbmNlTWVkaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdE1pbGl0YXJ5RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2FsQ29uc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VPbnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlU3VyZ2VyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlVHJpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNLbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzUGVyU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c1NwZW50T25EdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9Db21wbGV0ZVF1YW50aXR5RXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xlcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFkanVzdG1lbnRzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFtb3J0aXNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXV0aG9yaXplZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEJlZ2lubmluZ0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNBc3NvY2lhdGVkV2l0aFJlcGVhdGVkVHJhdW1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEaXNvcmRlcnNEdWVUb1BoeXNpY2FsQWdlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEdXN0RGlzZWFzZXNPZlRoZUx1bmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhvdXREYXlzQXdheUZyb21Xb3JrQW5kV2l0aG91dFJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFBvaXNvbmluZ0lsbG5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoUmVzcGlyYXRvcnlDb25kaXRpb25zRHVlVG9Ub3hpY0FnZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoU2tpbkRpc2Vhc2VzT3JEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRm9yZWlnblN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWRTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c1dpdGhSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhDbGFpbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhzQXNBUmVzdWx0T2ZJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoc0FzQVJlc3VsdE9mSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbWFuZE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRW5kaW5nSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZsb2F0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRoT2NjdXBhdGlvbmFsSWxsbmVzc2VzTm90T3RoZXJ3aXNlQ2xhc3NpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aG91dExvc3RXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzV2l0aExvc3RXb3JrRGF5c09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29ya09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRob3V0TG9zdFdvcmtEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOb24tQ29uc29saWRhdGVkU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mQ29udmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc0luY2x1ZGVkSW5GaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc05vdEluY2x1ZGVkSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZGb3JlaWduU3Vic2lkaWFyaWVzSW5jbHVkZWRJbkZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkZvcmVpZ25TdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mTG9hbkRldGFpbFJlY29yZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZNb3J0Z2FnZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mUGFya2luZ1NwYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlN1YnNpZGlhcmllc05vdEluY2x1ZGVkSW5UaGVGaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlVuaXRzRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25Db21iaW5lZFJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uRmlyc3RSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvblN1YnNlcXVlbnRSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mSXNzdWFibGVBc3NldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyUHJvcGVydGllc093bmVkQW5kRmluYW5jZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUGF5bWVudHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcm9kdWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByb3BlcnRpZXNPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxRdWFudGl0eVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUmVzb3VyY2UtUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUm9vbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2VydmljZUJhY2tvcmRlclF1YW50aXR5SGlnaFByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNlcnZpY2VCYWNrb3JkZXJRdWFudGl0eUxvd1ByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoYXJlc09mU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlIaWdoUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlMb3dQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVHJhbnNhY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFVuaWRlbnRpZmllZFRyYW5zYWN0aW9uc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV2F0ZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2VkQnlBbGxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW1hcmtSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVtYXJrc1VzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZEluUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkT3V0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsbGluZ0VtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVua2VkQ2hhbm5lbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNrbm93bGVkZ2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWRqdXN0ZWRDb3JyZWN0b3JSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvdmVyZWRDaGVxdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c0ZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUGVyVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1JlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRMYXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlcldlZWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zYWxlYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGRRdWFudGl0eUhlbGRCeVdob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudGlsTmV4dFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2FibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2VkQWNjdW11bGF0ZWRTaWNrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW52ZXJpZmllZFJlY2VpcHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnREZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkV4dHJhY29ycG9yZWFsQ2lyY3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwZXJiYXJpY1ByZXNzdXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cGVydGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGhlcm1pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYW5jaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFuY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY3VsYXJSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0YXRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9pY2VTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvaWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lU2hyaW5rYWdlQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90aW5nU2hhcmVzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclJlLUluamVjdGVkT25Qcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZWtzV29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENoYW5nZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0R2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TG9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlclRvV2hvbGVzYWxlclNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VQZXI4MDBTZXJ2aWNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0luUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0c1BlclNoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblRoaXNMaW5lT2ZXb3JrT3JQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc09uSm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc1JlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludmVudG9yeVF1YW50aXR5QXZhaWxhYmxlRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQZXJpb2RJbWJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTZXJ2aWNlTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNoYXJlQmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFc3RpbWF0ZWRMYXRlc3RNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXN0aW1hdGVkUHJldmlvdXNNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUF2ZXJhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlXb3JrU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPcGVyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVzRmlsZWRBZ2FpbnN0RGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2F0YWxvZ1JlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0YWxvZ1VSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0YWxvZ0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRhbG9nSXRlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRhbG9nUmVmZXJlbmNlIiB0eXBlPSJDYXRhbG9nUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250cmFjdEl0ZW0iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRyYWN0SXRlbSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udHJhY3RJdGVtIiB0eXBlPSJMaXN0T2ZDb250cmFjdEl0ZW0iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0SXRlbSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJhY3RJdGVtTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdEl0ZW0iIHR5cGU9IkNvbnRyYWN0SXRlbSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uZGl0aW9uc09mU2FsZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2FsZXNSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25Db2RlZCIgdHlwZT0iU2FsZXNBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbmRpdGlvbnNPZlNhbGUiIHR5cGU9IkNvbmRpdGlvbnNPZlNhbGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZCIgdHlwZT0iU2FsZXNSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTYWxlc1JlcXVpcmVtZW50IiB0eXBlPSJTYWxlc1JlcXVpcmVtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkUXVhbnRpdHlUb01ha2VNaW5pbXVtV2VpZ2h0UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmSXRlbXNBcmVPdXRPZlN0b2NrT3JOb3RZZXRQdWJsaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmT3V0T2ZTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyT25seUlmTmV3SXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkR3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQW5kTGFib3JTdXJwbHVzQXJlYVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90UHJlc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1YWxQcm9kdWN0QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcnlTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3VycGx1c0FyZWFTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhcmdlUHVyY2hhc2VTZXQtQXNpZGVGb3JTbWFsbEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXlQcmVzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS15ZWFyQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQmFja09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1N1YnN0aXR1dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQcmlvclRvU2hpcG1lbnRJZlF1YW50aXR5U3BlY2lmaWVkSXNOb3RBdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkQmlkZGVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkTWFudWZhY3R1cmVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRTYWxlc0NvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbExhYm9yU3VycGx1c0FyZWFTZXRBc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvQXBwcm92ZWRTb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9FZHVjYXRpb25hbEluc3RpdHV0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5T3JNaW5vcml0eUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9JbmR1c3RyaWFsUHJlcGFyZWRuZXNzUHJvZ3JhbVBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvUXVhbGlmaWVkUHJvZHVjdHNMaXN0UHJvZHVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1VTQW5kQ2FuYWRpYW5Tb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9Zb3VuZ0ludmVzdGlnYXRvclByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb244YVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LWFzaWRlRm9yQW1lcmljYW5JbmRpYW4tb3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEFzU29vbkFzUG9zc2libGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZ1bGxUcnVja09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBJbi1QbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWwtQmFsYW5jZUJhY2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxCYWxhbmNlQ2FuY2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEJhbGFuY2VTdWJzdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbENhcmxvYWRMb3RzT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxJdGVtUXR5UHJvcG9ydGlvbmFsVG9Ub3RhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbFRydWNrbG9hZExvdHNPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclJlbGVhc2VvckJ1eWVyQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzV2l0aFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQ29uc2lkZXJhdGlvblNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUHVyY2hhc2VTZXRBc2lkZUZvclNtYWxsQnVzaW5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uTm90QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUl0ZW1BbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnJlc3RyaWN0ZWRQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2FsZXNBY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQmFsYW5jZVRoYXRFeGNlZWRzU2FsZXNBY3Rpb25WYWx1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEVudGlyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENsYXNzQ29kZWQiIHR5cGU9IkhhemFyZENsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVOREdOdW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVNU051bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWZhZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzIiB0eXBlPSJIYXphcmRvdXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNJZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZCIgdHlwZT0iQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlRXh0ZW5zaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlVmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkT2ZmaWNpYWxUZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmVtQ2FyZE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9IkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZENsYXNzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BsYWNhcmRJZGVudGlmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZFRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmxhc2hwb2ludCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVtZXJnZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZUZW1wZXJhdHVyZUNvZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIgdHlwZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZCIgdHlwZT0iSGF6YXJkUGFja2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGVkIiB0eXBlPSJIYXphcmRvdXNTaGlwbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWQiIHR5cGU9IkhhemFyZG91c1pvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRQYWNraW5nQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXREYW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bURhbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JEYW5nZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlc2NyaXB0aXZlSW5mb3JtYXRpb25Ob3RSZXF1aXJlZEJ5UmVndWxhdGlvbkJ1dERlc2lyZWRUb0FjY29tcGFueVRoZU1vdmVtZW50QnlUaGVTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FpcmxpZnRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1QtMTEzRG9Ob3RCdW1wT3JDdXRPZmZDYXJXaGlsZUluTW90aW9uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRDYXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c1doZW5XZXREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1TUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmllc1Byb2R1Y3RzSW5BSGVhdGVkTW9sdGVuU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1N1YnN0YW5jZUNvbnN0aXR1ZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oYWxhdGlvbkhhemFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1GQUdQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3BlcmF0aW5nU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVBvbGx1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uLUluaGFsYXRpb25IYXphcmREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlTWF0ZXJpYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPckNoZW1pY2FsR3JvdXBOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lRCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ0RldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQWxsb3dhbmNlc09yQ2hhcmdlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2luZ0RldGFpbCIgdHlwZT0iUHJpY2luZ0RldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcFRvTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwRnJvbUxvY2F0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTY2hlZHVsZUxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2ltcGxlUGFja2FnZU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRlcm1zT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXJnb0NsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyeURldGFpbCIgdHlwZT0iRGVsaXZlcnlEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNjaGVkdWxlTGluZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2NoZWR1bGVMaW5lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTY2hlZHVsZUxpbmUiIHR5cGU9Ikxpc3RPZlNjaGVkdWxlTGluZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2NoZWR1bGVMaW5lIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjaGVkdWxlTGluZUlEIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZWQiIHR5cGU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRTdGF0dXNSZWFzb25zIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mU3RhdHVzUmVhc29uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWREZWxpdmVyeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mT3RoZXJEZWxpdmVyeURhdGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEYXRlQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NoZWR1bGVMaW5lTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZUxpbmUiIHR5cGU9IlNjaGVkdWxlTGluZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFlldFNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvclBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsbHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsbHlEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RhdHVzUmVhc29uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTdGF0dXNSZWFzb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlN0YXR1c1JlYXNvbiIgdHlwZT0iTGlzdE9mU3RhdHVzUmVhc29uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdGF0dXNSZWFzb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YXR1c1JlYXNvbkNvZGVkIiB0eXBlPSJTdGF0dXNSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdGF0dXNSZWFzb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0dXNSZWFzb24iIHR5cGU9IlN0YXR1c1JlYXNvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdGF0dXNSZWFzb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc0F3YWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVmdXNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlPbkluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uSW5jb3JyZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZXN0cmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFJlc3RyaWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE5vdFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURpZmZlcmVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VG9vTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9TZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvVGhlQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvVGhlQ2FycmllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIgdHlwZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJMb2NhdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YkxvY2F0aW9uSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iIHR5cGU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlUmVmZXJlbmNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIiB0eXBlPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSURSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUGFja2FnZVJlZmVyZW5jZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZVJlZmVyZW5jZSIgdHlwZT0iUGFja2FnZVJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYXR1cmVPZkdvb2RzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlZCIgdHlwZT0iT3BlcmF0aW9uYWxUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHlwZU9mQ2FyZ28iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhcmdvQ2xhc3NpZmljYXRpb24iIHR5cGU9IkNhcmdvQ2xhc3NpZmljYXRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVOb24tRHV0aWFibGVDb25zaWdubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlRHV0aWFibGVDb25zaWdubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hWYWx1ZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb24tQ29udGFpbmVyaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGwtT25Sb2xsLU9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtidWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQb2xsdXRhbnRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90LUhhemFyZG91c0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXBsb21hdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jub3hpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc0FuZFBlcnNvbmFsRWZmZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuQ2FyZ28iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VEZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiIHR5cGU9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFja2FnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOdW1iZXJPZlBhY2thZ2VzIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VEZXRhaWwiIHR5cGU9IlBhY2thZ2VEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlVHlwZUNvZGVkIiB0eXBlPSJQYWNrYWdlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZVR5cGVEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VUeXBlIiB0eXBlPSJQYWNrYWdlVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYWNrYWdlVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZXJvc29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1tb1BhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtcG91bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtcG91bGUtTm9uLVByb3RlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1wb3VsZS1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzU3BlY2lmaWVkQnlUaGVET1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0b21pemVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGUtQ29tcHJlc3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsZS1Ob24tQ29tcHJlc3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsbG9vbi1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxsb29uLVByb3RlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFycmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVlckNyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWx0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmdDaGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYmJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9sdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGVjcmF0ZS1Cb3R0bGVyYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUtTm9uLVByb3RlY3RlZC1CdWxib3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUtTm9uLVByb3RlY3RlZC1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlLVByb3RlY3RlZEJ1bGJvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZS1Qcm90ZWN0ZWRDeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hXaXRoSW5uZXJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1Y2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1HYXMtQXQxMDMxTWJhckFuZDE1RGVnQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1MaXF1ZWZpZWRHYXMtQXRBYm5vcm1hbFRlbXBlcmF0dXJlT3JQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstU29saWQtRmluZVBhcnRpY2xlcy1Qb3dkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLVNvbGlkLUdyYW51bGFyUGFydGljbGVzLUdyYWlucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1Tb2xpZC1MYXJnZVBhcnRpY2xlcy1Ob2R1bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5jaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVuZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJsYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1dHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmluZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbkNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbi1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuaXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbi1SZWN0YW5ndWxhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FudmFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJveS1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib3ktUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJMb2FkLVJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlZXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxseUhhcmRlbmVkRmlicmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3RoT3JGYWJyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3RoVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZmZpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGFwc2libGVUdWJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVzc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUNvbW1lcmNpYWxIaWdod2F5TGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUVuZ2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU1hYy1Jc28tTHQuV2d0OFg4WDIwRm9vdEFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU11bHRpLVdhbGxlZC1TZWN1cmVkVG9XYXJlaG91c2VQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1OYXZ5Q2FyZ29UcmFuc3BvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyc09mQnVsa0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuZXJSZWluZm9yY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JydWdhdGVkT3JTb2xpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYWRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5bGluZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pam9obi1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pam9obi1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1MZW5ndGhSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtTGVuZ3RoU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLUxlbmd0aFRvdGVCaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZVdhbGxDb3JydWdhdGVkQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1XYWxsUGFwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZmZlbGJhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRnZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVnZ0NyYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmVsb3BlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJlcmJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJlcmJvYXJkTWV0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyZS1QYXBlcmJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxtcGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlya2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvLUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9hbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vdGxvY2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZFJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFtZWRDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJ1aXRDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQm90dGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpcmRlcnMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGYtU3RhbmRhcmRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmLVN0YW5kYXJkVG90ZUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFtcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkc09mQmVlZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9nc2hlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc0NvbnRhaW5lci1Xb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5nb3RzLUluQnVuZGxlQnVuY2hUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5Jbm5lckNvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1vZGFsVHJhaWxlck9yQ29udGFpbmVyTG9hZC1SYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uT3JTdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKZXJyaWNhbi1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmVycmljYW4tUmVjdGFuZ3VsYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVtYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dGViYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLbm9ja2Rvd25SYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLbm9ja2Rvd25Ub3RlQmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXBPclRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0Y2hCb3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbENhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGtDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWRDb250YWluZXJUeXBlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmVSZXNpc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbGRlZFBsYXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1zY3ZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUtV2FsbFBhcGVyLTJPck1vcmVXYWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUtV2FsbFBhcGVyM09yTW9yZVdhbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBseUJhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktUm9sbFBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpd2FsbFNhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmdlck9yUmFja0luQm94ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uT3duV2hlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVGhhbkdsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclRoYW5NZXRhbE9yUGxhc3RpY1R1YmVzT3JHbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VkLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbnVtUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWVsUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPVFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0LTJXYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldC00V2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXItVmNpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJjZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpdGlvbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZVJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcm5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXRjaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbmtzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtSW5qZWN0aW9uTW9sZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVJlZ3JpbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtU3RydWN0dXJhbEZvYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtVmFjdXVtRm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVZpcmdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1XcmFwcGVkVHJheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRlcy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9seWV0aHlsZW5lTGluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbHlzdHlyZW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TGlmdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bHBib2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlck9mQmVlZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbC1TZW1pY29uZHVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5mb3JjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2VSZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvZHMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnViYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWJiZXJBbmRGYWJyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhY2hldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhLUNoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF2YW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcGFyYXRvck9yRGl2aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhbGxvd0NyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXRtZXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXRzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob29rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmtXcmFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmt3cmFwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlT2ZCZWVmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVXYWxsQ29ycnVnYXRlZEJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2VsZXRvbkNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWQtRWxldmF0aW5nT3JMaWZ0VHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWV2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcHNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSnVtYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwaW5DeWxpbmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwaW5kbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFpbmxlc3NTdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWVsLVZpbnlsQ29hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJldGNoV3JhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VpdGNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmstQ3lsaW5kcmljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmstUmVjdGFuZ3VsYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhLUNoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWVyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90ZUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJheVBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBsZVdhbGxDb3JydWdhdGVkQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVua0FuZENoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVuay1TYWxlc21lblNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZS1Db2xsYXBzaWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXMtTWV0YWxPclBsYXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWNrZWRPclVucGFja2FnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY3V1bS1QYWNrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhblBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUluT3BlcmF0aW5nQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlZWxlZENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpY2tlcmJvdHRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lyZU1lc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpcmVPckNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyYXBwZWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2UiIHR5cGU9Ikxpc3RPZlBhY2thZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJRCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mSXRlbVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZk9yZGVyUmVmZXJlbmNlcyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VNYXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNQYWNrYWdpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJIYXphcmRvdXMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJBc3NvY2lhdGVkRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0luc3RydWN0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZSIgdHlwZT0iUGFja2FnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mT3JkZXJSZWZlcmVuY2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJPcmRlclJlZmVyZW5jZXMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk9yZGVyUmVmZXJlbmNlcyIgdHlwZT0iTGlzdE9mT3JkZXJSZWZlcmVuY2VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlTWFyayI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZU1hcmsiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VNYXJrIiB0eXBlPSJMaXN0T2ZQYWNrYWdlTWFyayIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZU1hcmsiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VNYXJrQ29kZWQiIHR5cGU9IlBhY2thZ2VNYXJrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZU1hcmtDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlTWFya1ZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlTWFyayIgdHlwZT0iUGFja2FnZU1hcmsiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2FnZU1hcmtDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyLUFzc2lnbmVkUGFja2FnZUlkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RNYXJrU3VwcGxpZXJzQ29tcGFueU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGlyZVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0FkZGl0aW9uYWxseUN1c3RvbWVyc0FydGljbGVEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0FydGljbGVOdW1iZXJDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0JhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0N1c3RvbWVyc0NvbXBhbnlOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQ3VzdG9tZXJzUmVmZXJlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0RhdGVPZlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtFeGNsdXNpdmVseUN1c3RvbWVyc0FydGljbGVEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0V4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtGcmVlVGV4dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0dyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrUGFja2FnZXNEaW1lbnNpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrUnVubmluZ051bWJlck9mUGFja2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtTZXJpYWxTaGlwcGluZ0NvbnRhaW5lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtTdXBwbGllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya1RhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckNhcnRvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRvckFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRDb25maWd1cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZU1hcmtlZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQXNzaWduZWREcm9wWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZi1JZGVudGlmeWluZ0NvbnRhaW5lclZpYVJhZGlvRnJlcXVlbmN5SWREZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlci1Bc3NpZ25lZENhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NpZ25lZFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NpZ25lZFNraWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTQ0MtMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTQ0MtMThBbmRBcHBsaWNhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1NoaXBwaW5nQ29udGFpbmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNDT3JFQU4xMjhBcHBsaWNhdGlvbklkZW50aWZpZXJBbmREYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29kZUNvdW5jaWxGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvbnN1bWVyUGFja2FnZUNvZGUtMS01LTUtMSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZUNoYXJhY3RlcmlzdGljIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIgdHlwZT0iTGlzdE9mUGFja2FnZUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0NvZGVkIiB0eXBlPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIgdHlwZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1BhY2thZ2VMYWJlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdQYWNrYWdlU2VhbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVvZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcnBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtT3JTa2lkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYXJpbmdQaWVjZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRvbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdEaXJlY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdEZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ0VxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hcmtpbmdQYXR0ZXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TWFya2luZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlT3JDb250YWluZXJNYXJrTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZhY2lsaXR5TGltaXRhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhZ2dpbmdPckJhckNvZGVJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWRPclBhbGxldFR5cGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlRGVzY3JpcHRpb24iIHR5cGU9Ikxpc3RPZlBhY2thZ2VEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZURlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhaW5lckNvdW50ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvYWRPcmRlckNvdW50ZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VEZXNjcmlwdGlvbiIgdHlwZT0iUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZUlkZW50aWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VJZGVudGlmaWVyIiB0eXBlPSJMaXN0T2ZQYWNrYWdlSWRlbnRpZmllciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZUlkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyQ29kZWQiIHR5cGU9IlBhY2thZ2VJZGVudGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZUlkZW50aWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlSWRlbnRpZmllclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSWRlbnRpZmllciIgdHlwZT0iUGFja2FnZUlkZW50aWZpZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2FnZUlkZW50aWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOOE9yRUFOMTNCYXJjb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGMTRPcklURjZCYXJjb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNDT3JFQU4xMjhCYXJjb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURSIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTcGVjaWFsSGFuZGxpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNwZWNpYWxIYW5kbGluZ0NvZGVkIiB0eXBlPSJTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTcGVjaWFsSGFuZGxpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTcGVjaWFsSGFuZGxpbmdOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTcGVjaWFsSGFuZGxpbmciIHR5cGU9IlNwZWNpYWxIYW5kbGluZyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTcGVjaWFsSGFuZGxpbmdDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzE1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzI1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzM1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzQ1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0ZhY2lhbEhhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcklzQWlyQnJha2VDb250cm9sbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlcXVpcmVkUGFja2luZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVxdWlyZWRQUk9OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVxdWlyZWRBcHBvaW50bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9uVG9wT2ZSZXNpZHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NlT2ZSZXNpZHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LUF1dG9LZXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50VG9Nb3ZlV2l0aENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50cy1BZHZhbmNlT25seVdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5naG91c2VCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG93YWJsZUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklmQmFkT3JkZXJlZE5vdGlmeVNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxTaGlwcGVyRm9yV2VpZ2hDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckNvbnNvbGlkYXRvckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtQ3VzdG9tZXJzRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyZWRGb3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckZhY3RvcnlMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1Db3R0b25NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9NYXJzaGFsbGluZ1JlcXVpcmVkRm9ySGF6YXJkb3VzTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdXNSYW1wT25seVRPRkNWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxDb25zaWduZWVGb3JXZWlnaENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcExvYWRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uVGhhdFRoaXNTaGlwbWVudElzRm9yUmVjeWNsaW5nQXNEZWZpbmVkSW5BcHBsaWNhYmxlVGFyaWZmc0NvbnRhaW5pbmdTdWNoUHJvdmlzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXV0aG9yaXphdGlvblJlcXVpcmVkRm9yRGl2ZXJzaW9uT3JDb25zaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcFlhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T25seU9uU3VycmVuZGVyT2ZXcml0dGVuT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRJblRvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RVbmNvdXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbldlaWdodHNBcHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlRGltZW5zaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0VxdWlwbWVudFRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsQ29udHJvbExpbWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkVtcHR5VmlhUmV2ZXJzZVJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VzSW5jdXJyZWRJZlNoaXBtZW50RmFpbHNUb01lZXRWZXNzZWxMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NpdmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGxvc2l2ZUZsYW1tYWJsZUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjZUEtRW5kVG9IZWFkT2ZUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjZUItRW5kVG9IZWFkT2ZUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92aW5nVW5kZXJGb3JGdXJ0aGVyYW5jZUluc3RydWN0aW9uc0FuZE1heUJlRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhbW1hYmxlR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFtbWFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYW1tYWJsZVBvaXNvbkdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhZ2lsZS1IYW5kbGVXaXRoQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9udHJhbnNpdEZsYXRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5JbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkRW5kQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VkQXNIYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEZvck9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdGVkUHJpb3JUb0xvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVGb3JSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hWYWx1ZUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hXaWRlTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFRvQmVJbnNwZWN0ZWRBdERlc3RpbmF0aW9uQW5kRGlzcG9zaXRpb25JbnN0cnVjdGlvbnNXaWxsQmVGdXJuaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyb2ZmaWNlTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxJbmNlbnRpdmVSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQnJpZGdlSW1wb3J0T3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclRyaXBMZWFzZWRUb0NvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0RldmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFRvRnVsbFZpc2libGVDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXJDb25zb2xpZGF0b3JMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0TG93ZXN0VGhyb3VnaFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyRmFjdG9yeUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2VydmljZU9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuRnVsbENhcmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbkluQ2hhcmdlT2ZDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyZWRGb3JCb3JkZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljYWxSZWZyaWdlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWVCZWZvcmVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REaXZlcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU3BlY2lhbEVudHJhaW5tZW50UmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90SHVtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RXF1aXBtZW50Rmlyc3RUcmFuc2JvcmRlck1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFBvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVNoaXBwZXJCZWZvcmVSZWNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFRyYW5zZmVyQ29udGVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FzZU9mRmlyZURvTm90VXNlV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TG9hZGVkTGVzc1RoYW5PckVxdWFsVG9UaGVDYXJPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyd2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpc2hhYmxlSW5Cb3hDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVseUNvbnRyb2xsZWRQcml2YXRlRXF1aXBtZW50U3ViamVjdFRvRGVtdXJyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2lzb25vdXNHYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkljZWRQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFByb3RlY3Rpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LVByZXBhaWRXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5BdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5kZXJCaWxsRm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb250cm9sbGVkUHJpdmF0ZUVxdWlwbWVudFN1YmplY3RUb0RlbXVycmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVzaE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyUmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RIb3VybHlJZkNhclN0b3BwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEZvclRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkT3JDYXJyaWVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3ZlVG9SZXN0QW5kQ292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb1NwZWNpYWxEZXRlbnRpb25SdWxlc09yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1TaGlwcGVyc0V4cG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGFibGVMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9Dcm9zc0RvY2tPclBvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzU2hlbGZDb3VwbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1TaGlwcGVyc01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LVNoaXBwZXJzUGFja2luZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRSZXN0cmljdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJldGNoV3JhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fyc1RlbXBvcmFyaWx5QXJ0aWN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJDb25zb2xpZGF0b3JMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyRmFjdG9yeUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5DYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhbVRyYWNrRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVWb2x1bWVSYXRlc09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZEF0QnVtcGVyQ2lyY3VzUmFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZEZyb21MZWZ0U2lkZU9mQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRBc1BsYWNhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wcm90ZWN0ZWRQZXJpc2hhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRGcm9tUmlnaHRTaWRlT2ZDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDZXJ0aWZpZXNHcm9zc1dlaWdodFVuZGVyMjQwMDAwUG91bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25XZWlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVudGlsYXRpb25JbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZGUtQm9keVBpY2t1cFRydWNrQXBwbGllc1RvRmluaXNoZWRWZWhpY2xlTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVkSW5zcGVjdGlvbi1TZXREaXJlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdoRW1wdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRzLUhpZ2hXaWRlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0TXVzdEFjY29tcGFueVdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdoVG9DaGVja0Zvck92ZXJsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZVdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzVG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXJjaGFyZ2VBdXRob3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzaG9yZS1BbGFza2FPckhhd2FpaVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplZFByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZBaXJXYXliaWxsLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNhbmFkaWFuQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZFeHBvcnRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mVS5TLkV4cG9ydERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay1VcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaWduYXR1cmVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGUxMDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGUzMDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGU1MDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRhbnRzQWNjb21wYW55aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ3JhZnRGdXJuaXNoZWRBbmROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGVUZW5kZXJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRHdWFyZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxJbmplY3Rpb25PckJsZW5kaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mQWx0ZXJuYXRlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEuTS5EZWxpdmVyeVJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmNob3JpbmdBbmRVbmFuY2hvcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbENvcHlPZlNoaXBwaW5nUGFwZXJzRm9yUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWFuY2VTZXJ2aWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNvbmRpdGlvbmluZ0Rpc2Nvbm5lY3RBbmRDb25uZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQXJtZWRHdWFyZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVUcmFjdG9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVRydWNrU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlTZXJ2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXhpbGlhcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCeXBhc3NDb25zb2xpZGF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGt5QXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2tpbmdBbmRCcmFjaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGluZFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2xzdGVyTG9hZERvTm90U3dpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hpbmdTZXJ2aWNlLURyeUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlclN1cmNoYXJnZUF1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9lZUNhck9yUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0Q29tbWVyY2lhbEJpbGxPZkxhZGluZ0JvbFRvR292ZXJubWVudEJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJvc2lvbkFkZGl0aXZlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtQ29udGFpbmVyTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUxpZnRMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fycmllckd1YXJkQ2FyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ2Fycmllckd1YXJkQ2FyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29UYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaW5BbmRCaW5kZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZVByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzUmF0ZXNBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iLlJhdGVzT3ZlckRldHJvaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25BbmRMaW5lSGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSYXRlc0FwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uVGhhdFRoZU5ld3NwcmludFdpbmRpbmdDb3Jlc0JlaW5nUmV0dXJuZWRFbXB0eVdlcmVSZWNlaXZlZEZpbGxlZEJ5UmFpbEZyZWlnaHRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJPdmVybmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcGlsb3RTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUGFwZXJzTWFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllclNhbWVEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDYWJvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTW91bnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXRvdXNSb3V0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGVXaWRlU2VwYXJhdGVBbmRSZWFzc2VtYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21CYXJnZVRvUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvZENvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbERyaXZlcldpdGhOYXRpb25hbEFnZW5jeUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsRHJpdmVyUHJvdGVjdGl2ZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZEZWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mQ29udmV5aW5nRXF1aXBtZW50QW5kVGhlUG93ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZkNvbnZleWluZ0VxdWlwbWVudEV4Y2x1ZGluZ1RoZVBvd2VyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRW1iYXJrYXRpb25SYXRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcEZyb21GcmVlemluZ1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQxMERyb21lZGFyeVdpdGhNZWNoYW5pY2FsUmVzdHJhaW5pbmdEZXZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MTBEcm9tZWRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVJhaWxUYW5rQ2FyVG9QaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5U2hpcHBlckltbWVkaWF0ZWx5SWZTaGlwbWVudElzRGVsYXllZEVuUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90Q291cGxlVG9PdGhlckRpYXBocmFnbWVkQ2FycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RGcmVlemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90Q291cGxlVG9UYW5rQ2FycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbi1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVBpcGVsaW5lVG9CYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21QaXBlbGluZVRvUmFpbFRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVBpcGVsaW5lVG9UYW5rVHJ1Y2tPclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbldpdGhQb3dlclVuaXRzMzBNaW51dGVQZXJpb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wLU9mZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtbWluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90Q291cGxlVG9Eb3VibGVTaGVsZkNvdXBsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb21lZGFyeVdpdGhNZWNoYW5pY2FsUmVzdHJhaW5pbmdEZXZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9tZWRhcnlTZXJ2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yU2lkZVZhbm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQXNzb2NpYXRlZFdpdGhEZXRlbnRpb25PZkNvbnZleWluZ0VxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tVGFua1RydWNrT3JUcmFpbGVyVG9QaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uV2l0aFBvd2VyVW5pdHM2ME1pbnV0ZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydE9yQ291cmllclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5UmFpbGNhck9yZGVyZWRCdXROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRIb3NlQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SG9zZUF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGlnaHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eU1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGlzZmFjdG9yeVNlcnZpY2VTdGFuZGFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZVZhbHVhdGlvbkF1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZU9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFEcml2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkUmF0ZXNBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VPZlZlaGljbGVEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbmRSZW1vdmVBbmRJbnN0YWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Fkd2F5RWFzeVJhdGVzQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VGcmVpZ2h0QWxsS2luZHNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJlYXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVybmlzaGluZ0NoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxGaWx0ZXJzRnVybmlzaGVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsRmlsdGVyc0Z1cm5pc2hlZEJ5U2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdHJhY2tTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclByb2Nlc3NpbmdJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGVkQnlDYXJyaWVyQXRPd25lclNSaXNrT2ZGcmVlemluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yU3RvcmFnZUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsdHJhdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtT3duZWRDb250YWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50R3VhcmRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJTZWN1cml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZEJyYWtlc0F0RWFjaEVuZE11c3RCZVJlbGVhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRvdmVyRm9ySG9saWRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJGb3JXZWVrZW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdEluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdC1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0V2l0aFN0ZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NpYmxlSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWNjZXNzaWJsZUhhemFyZG91c01hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW5kYXlPckhvbGlkYXlQaWNrdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNEhvdXJBdmFpbGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVRyYWlsZXJSYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdGVyT3JSZWZyaWdlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXRjaEluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb09uRGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2luZ0luaGliaXRvclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdG9ncmFwaHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybW9kYWxTaGlwbWVudFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhLVBsYW50TW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmxpbmVUcmFuc2ZlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1c3QtSW4tVGltZUppdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaW5lRXhjZXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uVGhhdFRoZUNvbnRhaW5lcnNCZWluZ1JldHVybmVkRW1wdHlXZXJlUmVjZWl2ZWRGaWxsZWRCeVJhaWxGcmVpZ2h0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcE1hdGVyaWFsRHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckRpc3R1cmJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBseUFVQ0NPckVBTlNlcmlhbFNoaXBwaW5nQ29udGFpbmVyTGFiZWxUb1RoZVNoaXBwaW5nQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlnaHRCYXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dCb3lUcmFpbGVyT3JGbGF0QmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnREaWZmZXJlbnRpYWwtTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bEZyb21Qb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlPZkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxQZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFRvUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJ1Y2tsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRTZXJ2aWNlV2l0aE92ZXJuaWdodFN1YnNpc3RlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydFNlcnZpY2VzVGVsZXBob25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yU3VydmVpbGxhbmNlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlUcmFmZmljRXhwZWRpdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNb3RvclN1cnZlaWxsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RIdW1wT3JIdW1wSW50byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RVc2VIZWxwZXJMb2NvbW90aXZlVG9QdXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1BsYWNhcmRzUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vc2VTaWRlVmFubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd0F3YXlGcm9tSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2tTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0Fib2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckxvYWRBbmRDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJIZWlnaHRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpbmdTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25Ob3RSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd1dpdGhEb29yc0ZhY2luZ0lud2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Q29tbW9kaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkZyb250T2ZIb3VzZVN0b3dhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1sZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxGaWVsZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU5vSG9va3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlc3RyaWN0ZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29PbkJvYXJkQ2VydGlmaWNhdGlvblJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkRlY2tTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyTG9hZEFuZENhcnJpZXJVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlzaGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd0JlbG93RGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd0JldHdlZW5EZWNrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lT2ZEZWxpdmVyeUFuZFNpZ25hdHVyZVJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblRvcEluLUhhdGNoU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ub3BPbi1EZWNrU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJDb250YWluZXJPbi1EZWNrU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVsb3dXYXRlckxpbmVTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyZmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcldpZHRoQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVXYXlSYXRlc0FwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBpbmdFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cE9mU2hpcG1lbnRzT25TYXR1cmRheVN1bmRheUFuZE9ySG9saWRheXNSZXF1aXJpbmdBYnNvbHV0ZU5leHREYXlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwQW5kRGVsaXZlcnlGcm9tU3RvcmFnZUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwQW5kRGVsaXZlcnlCZXlvbmRTZXJ2aWNlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBlcm1pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RGcm9tSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVySG91clJhdGVzQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldHNPclNraWRzT3JQbGF0Zm9ybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAuTS5EZWxpdmVyeVJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJNaWxlUmF0ZXNBcHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwT2ZTaGlwbWVudHNSZXF1aXJpbmdTYW1lRGF5RGVsaXZlcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBPZlNoaXBtZW50c1JlcXVpcmluZ1NhbWVEYXlEZWxpdmVyeVNlcnZpY2VBbmRPckRlbGl2ZXJ5QXRBU3BlY2lmaWVkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlhbm9Pck9yZ2FuQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nQXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cEFuZERlbGl2ZXJ5U2VydmljZUZvclBlcmlzaGFibGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2RnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlU2VjdXJpdHlXaXRoQXJtZWRHdWFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZWN1cml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVUYXJwRm9yU2VjdXJpdHlQdXJwb3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBBbmREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0FuZFVucGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFVQVHJhaWxlclJhdGVzQXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRlZFByaXZhdGVseU93bmVkVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZQcml2YXRlbHlPd25lZFZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklub3BlcmFibGVQcml2YXRlbHlPd25lZFZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdPclVubG9hZGluZ09mUHJpdmF0ZWx5T3duZWRWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlT3duZWRWZWhpY2xlUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmZzRm9yUHJpdmF0ZWx5T3duZWRWZWhpY2xlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVseU93bmVkVmVoaWNsZUluVHJ1Y2thd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsaGVhZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG90dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkVmFsdWVDaGFyZ2VJbkV4Y2Vzc09mQ2Fycmllck1heGltdW1MaWFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbG9jYXRpb25PZlZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk9mRW1wdHlDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk1vdmVtZW50T2ZQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxTdXJ2ZWlsbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlckNhcmdvUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91bmRUcmlwU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFNwZWVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXdlaWdodFJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3Zlck9uV2Vla2VuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGlja3VwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ29uc2lnbmVlVW5sb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRHJvbWVkYXJ5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEVxdWlwbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckV4cG9ydERlY2xhcmF0aW9uUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlyc0VsZXZhdG9yRXhjZXNzQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eUVzY29ydFZlaGljbGVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvbk9yRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uT3JQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yUG9ydE9mRW1iYXJrYXRpb25PckRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVHJhaW5Nb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJPbkhvbGlkYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3Zlck9uV2Vla2RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraXJ0aW5nQW5kVW5za2lydGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRBbmRDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdEFTaGlwTm90aWNlT3JNYW5pZmVzdFRyYW5zYWN0aW9uU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRlbGxpdGVTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEZyb21Ob24tVGVtcFN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENhcnJpZXJVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwcmVhZGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdEZvclN0b3JhZ2UtTm9TaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleWluZ1JvdXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyaXBwaW5nU29ydGluZ0FuZENvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVTZXJ2aWNlTm90VG9CZVVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVMYXNoaW5nRXF1aXBtZW50UGxlU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWN0aXZpdHlPckFudGktU3RhdGljQWRkaXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2ZmQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmZBdE9yaWdpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVBbmRUYWxseVJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdEZvclVubG9hZGluZ0Zyb21BRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90Rm9yVW5sb2FkaW5nRnJvbUJCcmFrZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvclJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZU9mVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZC1Eb3VibGVPcGVyYXRvci1Db21tb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWQtRG91YmxlT3BlcmF0b3ItUGFkZGVkVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZWRBc1RydWNrbG9hZFRydWNrbG9hZFNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLVRhbmtTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJpbmdPZk11bHRpcGxlVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJPbkZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tSYXRlc0FwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJQcmVwYXJhdGlvbi1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlUmVwYWlyQW5kUmVwbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVTaG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yQW5kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkLVNpbmdsZU9wZXJhdG9yLUNvbW1vbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZC1TaW5nbGVPcGVyYXRvci1QYWRkZWRWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlckNhcnJpYWdlRnVybmlzaGVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ09yUmVsb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXRpZXNEaXNjb25uZWN0QW5kQ29ubmVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjdXVtU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9lZVZhblR5cGVUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuQ2xlYW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzRnVybmlzaGVkQnV0Tm90VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXNJbm9wZXJhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLU9mZkRlbGl2ZXJ5T2ZQZXJzb25hbFZlaGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlc0luVHJ1Y2thd2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1CcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJmcm9udERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0NyZXdCb251cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWVBdXRob3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRWZXJpZmljYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFzc29jaWF0ZWREb2N1bWVudHMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEb2N1bWVudExvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRvY3VtZW50QXR0YWNoZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFzc29jaWF0ZWREb2N1bWVudHMiIHR5cGU9IkFzc29jaWF0ZWREb2N1bWVudHMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRvY3VtZW50TG9vc2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJEb2N1bWVudExvb3NlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFja2FnZURvYyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEb2N1bWVudExvb3NlIiB0eXBlPSJMaXN0T2ZEb2N1bWVudExvb3NlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlRG9jIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRvY3VtZW50VGl0bGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkRvY3VtZW50VHlwZUNvZGVkIiB0eXBlPSJEb2N1bWVudFR5cGVDb2RlIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkRvY3VtZW50VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZURvYyIgdHlwZT0iUGFja2FnZURvYyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEb2N1bWVudFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQZXJmb3JtYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNwZWNpZmljYXRpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NEYXRhUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFNhbXBsZVRlc3RSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlU2FsZXNDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMYWJlbEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkQ2VydGlmaWNhdGVPZlZhbHVlQW5kT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlbWVudENlcnRpZmljYXRlQVRyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUXVlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0b3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc2NoYXJnZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uQ29udHJpYnV0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlTdXBlcmFubnVhdGlvbkNvbnRyaWJ1dGlvbnNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlUGF5cm9sbERlZHVjdGlvbnNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mU2VhbGluZ09mRXhwb3J0TWVhdExvY2tlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb0FUcmFkZVN0YXRpc3RpY3NNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNjaW5hdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VOYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VJbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vhc29uVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFN0YXR1c1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhLUNvbW11bml0eVRyYWRlU3RhdGlzdGljYWxEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdHRlbkluc3RydWN0aW9uc0luQ29uZm9ybWFuY2VXaXRoQWRyQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGVkUHJpY2VkVGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVNhbGVzQ2F0YWxvZ3VlUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTmVnb3RpYXRpb25SZXN1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEhhemFyZERhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uLUhpcmVSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9mZi1IaXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtTmlsT3V0dHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LVRpbWUtVXBVbmRlcmJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudC1VbmRlcmJvbmRCeVNlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LVBlcnNvbmFsRWZmZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtVGltYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUNyZWRpdEFzc2Vzc21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERpc3B1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoaXBQZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGVmaW5pdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclN0YXRpc3RpY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbC1PZmZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU1vdmVtZW50QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlTdGF0dXNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJlZFNlcnZpY2VzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0ZpbmFuY2lhbEFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVSZWxhdGVkVG9GaW5hbmNpYWxBZGp1c3RtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxVbnBhY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb1N1bW1hcnlNYW5pZmVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRVbnBhY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRBbmRNZWF0QnktUHJvZHVjdHNTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0Rm9vZFByb2R1Y3RzU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG91bHRyeVNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlbWVhdFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWNldXRpY2FsU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lZGlibGVTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBlbmRpbmdBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhOb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERpcmVjdEludGVyY2hhbmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRJbXBlbmRpbmdBcnJpdmFsQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREYW1hZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0VzdGltYXRlQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRFbXB0eVJlbGVhc2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TW92ZW1lbnRHYXRlSW5SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydE1vdmVtZW50R2F0ZU91dFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50VW5wYWNraW5nSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFVucGFja2luZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGljay1VcEF2YWlsYWJpbGl0eVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2stVXBBdmFpbGFiaWxpdHlDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2stVXBSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFNoaWZ0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREaXNjaGFyZ2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGlzY2hhcmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZXNSZXF1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TG9hZGluZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRMb2FkaW5nUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERlcGFydHVyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1wdHlFcXVpcG1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEFjY2VwdGFuY2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3BlY2lhbFNlcnZpY2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RvY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENhcmdvUmVsZWFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEYXRhU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBhY2tpbmdJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RvY3VtZW50c0V4cGlyYXRpb25Ob3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uLUhpcmVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbi1IaXJlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9mZi1IaXJlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleU9yZGVyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdJdGVtc1RvQmVCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmtFc3RpbWF0ZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpck5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJEaXNwb3NpdGlvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1Zlc3NlbERpc2NoYXJnZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1Zlc3NlbExvYWRpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlkcm9wT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFRyYW5zcG9ydE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5SW5kZWZpbml0ZVF1YW50aXR5Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeURlZmluaXRlUXVhbnRpdHlDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhc2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZU9yQnV5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3REYXRhU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQ29zdEFuZFByaWNlRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZHNTdGF0dXNSZXBvcnRDZnNyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRJbnNwZWN0aW9uQW5kVGVzdFJlc3VsdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSW5zcGVjdGlvbkFuZFJlY2VpdmluZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPclBlcmZvcm1hbmNlQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eUFtZXJpY2FDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT2ZmLUhpcmVOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLVVwTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2F0aW9uVG9QbGFuQW5kU3VnZ2VzdE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNhdGlvblRvUGxhbkFuZFNoaXBPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RTY2hlZHVsZVN0YXR1c1JlcG9ydENzc3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzaXZlRGlzY2hhcmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlQ29uZmlybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHJpcHBpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uRGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25Db21iaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFJlY292ZXJ5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb2R1Y3Rpb25QbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbEFuZE90aGVyQWRtaW5pc3RyYXRpdmVJbnRlcm5hbERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hc3RlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRBbHRlcm5hdGVUZW5kZXJCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Q29sbGVjdGlvbkluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZBbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRJc3N1YW5jZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJpbGxPZlF1YW50aXRpZXMtQm9xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRUZW5kZXJCb3EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1BcHBsaWNhdGlvbkZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRmluYW5jaWFsQ2FuY2VsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQXV0aG9yaXNlZERpcmVjdERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZJbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkVW5wcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbkZvclVuc2NoZWR1bGVkSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUGF5bWVudFJlcXVlc3RCYXNlZE9uQ29tcGxldGlvbk9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFJlcXVlc3RGb3JDb21wbGV0ZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXNoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsT2ZmT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhcmVQYXJ0c09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wYWlnblByaWNlU2FsZXNDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Rm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ1NlcnZpY2VzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmUtQXV0aG9yaXNlZERpcmVjdERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWREaXJlY3REZWJpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUp1c3QtSW4tVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdFJlcXVlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdFJlcXVlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPZkFMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RvQmFua0Z1bmRzVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGF5bWVudE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVQYXltZW50T3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3TGlzdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUHJldmlvdXNCYW5raW5nU3RhdHVzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hc3RlclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFubmluZ0F2YWlsYWJsZVJlc291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW5uaW5nQ2FsZW5kYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTW92ZW1lbnRFdmVudExvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmFseXNpc1ZveWFnZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkJpbGxlZENyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZENyZWRpdE5vdGUtR29vZHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5QWRqdXN0bWVudFN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TW92ZW1lbnRJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TW92ZW1lbnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0YXR1c0NoYW5nZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xIZWFsdGhDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3Q29kZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVEYXRhRWxlbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zaXRlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NpdGVEYXRhRWxlbWVudENoYW5nZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWVzc2FnZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VJbkRldmVsb3BtZW50UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpY2F0aW9uT2ZFeGlzdGluZ01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nTnVtYmVyQXNzaWdubWVudFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlckRpcmVjdG9yeURlZmluaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNTdGFuZGFyZE1lc3NhZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRGlyZWN0b3J5RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5iYW5TY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGFNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ2xhaW1Gb3JQYXJ0c0FuZE9yTGFib3VyQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25BY2tub3dsZWRnZW1lbnRBbmRFcnJvclJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VWYXJpYXRpb25JbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlRm9yUHJpY2VWYXJpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uVG9Db2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblJlbmV3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1JlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25HdWlkZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yQW5kQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VxdWVuY2VkRGVsaXZlcnlTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyUXVvdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01vdmVtZW50Vm95YWdlU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JEZXNpZ25hdGlvbk9mQmVydGhpbmdQbGFjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yU2hpZnRpbmdGcm9tVGhlRGVzaWduYXRlZFBsYWNlSW5Qb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5RG9jdW1lbnRGb3JBcHBsaWNhdGlvbkZvckNhcmdvT3BlcmF0aW9uT2ZEYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50T2ZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeURvY3VtZW50Rm9yQXBwbGljYXRpb25Gb3JUcmFuc3BvcnRPZkRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsQ2hhcmFjdGVyUmVhZGluZ09jclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5U2FsZXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtZXJnZW5jeUNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVByb2R1Y3RQbGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJhbmNlQ2VkaW5nQm9yZGVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRGVsaXZlcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlV2hpY2hJbmNsdWRlc0FQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Gb3JDYXJnb0V4YW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Gb3JDYXJnb0V4YW1pbmF0aW9uQWx0ZXJuYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NyZXdBbmRDb252ZXlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1zQm9va2VkVG9BRmluYW5jaWFsQWNjb3VudFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0T2ZUcmFuc2FjdGlvbnNXaGljaE5lZWRGdXJ0aGVySW5mb3JtYXRpb25Gcm9tVGhlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0xldHRlck9mSW5zdHJ1Y3Rpb25zQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRPZlRyYW5zYWN0aW9uc0ZvckluZm9ybWF0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZU9yZGVyTG9jYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaUFzc29jaWF0ZWRPYmplY3RBZG1pbmlzdHJhdGlvbk1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9yRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1hcnlTYWxlc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGF0dXNFbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWdhcmRpbmdUaGVJbndhcmRBbmRPdXR3YXJkTW92ZW1lbnRPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JWZXNzZWxzRW50ZXJpbmdJbnRvUG9ydEFyZWFJbk5pZ2h0LVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mRW1lcmdlbmN5U2hpZnRpbmdGcm9tVGhlRGVzaWduYXRlZFBsYWNlSW5Qb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mRGlzdHJpYnV0aW9uT2ZEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXltZW50SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGYtQmlsbGVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFjY291bnRTdW1tYXJ5UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ0Rlc3BhdGNoQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50RGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2VwdGlvbmFsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRhdGlvbkF2YWlsYWJpbGl0eUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0YXRpb25TY2hlZHVsZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREZWxpdmVyeU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zRm9yQmFua1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBheW1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NlcHRhbmNlQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE5lZ290aWF0aW9uQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TGV0dGVyT2ZJbmRlbW5pdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFkdmljZU9mQUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHNQcmVzZW50YXRpb25Gb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZENyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2FsT2ZEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFRyYW5zZmVyQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRPZkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mQWNjb3VudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQb2xpY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZURlY2xhcmF0aW9uU2hlZXRCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQWR2aWNlVG9JbXBvcnRBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0FkdmljZVRvRXhwb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQ2VydGlmaWNhdGVPZlJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc1dhcmVob3VzZVJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYXJnZXNEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVdhcnJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGVQYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxNdWx0aXB1cnBvc2VUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0Q2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtlckJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXlCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1OZWdvdGlhYmxlTWFyaXRpbWVUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mSW5kZW1uaXR5Rm9yTm9uLVN1cnJlbmRlck9mQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ29uc2lnbm1lbnROb3RlR2VuZXJpY1Rlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRMaXN0LVNtZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydE9mZmljaWFsUmVjb2duaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2hhcmdpbmdEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENvbnNpZ25tZW50Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUFpcldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdzRWZmZWN0c0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGljZVJhaWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVBvc3RQYXJjZWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aW1vZGFsQ29tYmluZWRUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNDZXJ0aWZpY2F0ZU9mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGltb2RhbFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRUcmFuc3BvcnRCaWxsT2ZMYWRpbmdNdWx0aW1vZGFsQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nQ29uZmlybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsaW5nRm9yd2FyZE5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlT2ZDaXJjdW1zdGFuY2VzUHJldmVudGluZ0RlbGl2ZXJ5R29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZU9mQ2lyY3Vtc3RhbmNlc1ByZXZlbnRpbmdUcmFuc3BvcnRHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck1hbmlmZXN0VW5pdFBhY2tpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZlNoaXBDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZSYWRpb0NlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZkVxdWlwbWVudENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0eUZvck9pbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkbGluZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhdERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZURlY2xhcmF0aW9uT2ZIZWFsdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZSZWdpc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHNTdG9yZXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZUFwcGxpY2F0aW9uRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUNvbnRyb2xEZWNsYXJhdGlvbkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sRG9jdW1lbnRUNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtU2VuZGluZ0NvbnNpZ25tZW50Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JFeHBvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29EZWNsYXJhdGlvbkRlcGFydHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb250cm9sQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yUGh5dG9zYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHl0b3Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbkFwcGxpY2F0aW9uRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvbk9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEFwcGVsbGF0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcmVuY2VDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luRm9ybUdzcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERvY3VtZW50RXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYXN0YXREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZUFwcGxpY2F0aW9uRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRob3V0Q29tbWVyY2lhbERldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aENvbW1lcmNpYWxBbmRJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRob3V0SXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JFeGNoYW5nZUFsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZVBlcm1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VDb250cm9sRGVjbGFyYXRpb25JbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JJbXBvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckhvbWVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbW1lZGlhdGVSZWxlYXNlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWxpdmVyeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvRGVjbGFyYXRpb25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uUG9zdFBhcmNlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlY2xhcmF0aW9uVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVjbGFyYXRpb25HZW5lcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29QZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JDdXN0b21zVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlmRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY0Nhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0YUNhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlQWRtaW5pc3RyYXRpdmVEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDYWxjdWxhdGlvbkNvbmZpcm1hdGlvblJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFQcmlvckFsbG9jYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERvY3VtZW50SW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1c3RvbXNEb2N1bWVudE1lc3NhZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRvY3VtZW50QXR0YWNoZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJEb2N1bWVudEF0dGFjaGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFja2FnZURvYyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEb2N1bWVudEF0dGFjaGVkIiB0eXBlPSJMaXN0T2ZEb2N1bWVudEF0dGFjaGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXR1cm5hYmxlQ29udGFpbmVyUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnROdW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFJlc3BvbnNpYmlsaXR5Q29kZWQiIHR5cGU9IlBheW1lbnRSZXNwb25zaWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRSZXNwb25zaWJpbGl0eUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldHVybkxvYWRDb2RlZCIgdHlwZT0iUmV0dXJuTG9hZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldHVybkxvYWRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXR1cm5Ob3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyIgdHlwZT0iUmV0dXJuYWJsZUNvbnRhaW5lckluZm8iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGF5bWVudFJlc3BvbnNpYmlsaXR5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlTdXBwbGllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZXR1cm5Mb2FkQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZEVpdGhFbXB0eTRCbG9ja0ZvckJsb2NraW5nUHVycG9zZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyV2l0aER1bm5hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoUHJvZHVjdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZEVtcHR5QW5kTG9hZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNvbGV0ZU1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoRXhjZXNzUmV0dXJuZWRQcm9kdWN0aW9uTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFdpdGhSZWplY3RlZE1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGFydE9ic29sZXRlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoUmV0dXJuZWRQcm9jZXNzZWRNYXRlcmlhbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJTdW1tYXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik51bWJlck9mTGluZXMiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsVGF4Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbEFtb3VudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRQYWNrYWdpbmdUb3RhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1bW1hcnlOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclN1bW1hcnkiIHR5cGU9Ik9yZGVyU3VtbWFyeSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0UGFja2FnaW5nVG90YWxzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsUGFja2FnZXMiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsUGFja2FnZURlcHRoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFRyYW5zcG9ydCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxHcm9zc1dlaWdodCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsTmV0V2VpZ2h0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxOZXROZXRXZWlnaHQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFRhcmVXZWlnaHQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHcm9zc1ZvbHVtZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFBhY2thZ2luZ1RvdGFscyIgdHlwZT0iVHJhbnNwb3J0UGFja2FnaW5nVG90YWxzIi8+Ci0gICAgPCEtLSBTT1ggZm9ybWF0IGRhdGF0eXBlcyB3aGVyZSB0aGV5IGRpZmVyIGZyb20gc3RhbmRhcmQgWFNETCBkYXRhdHlwZXMtLT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERhdGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XXs0fSgoKDAxfDAzfDA1fDA3fDA4fDEwfDEyKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8KDNbMC0xXSkpKXwoKDA0fDA2fDA5fDExKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8MzApKXwoKDAyKSgoMFsxLTldKXwoWzEtMl1bMC05XSkpKSkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibFRpbWUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoKChbMC0xXVswLTldKXwoMlswLTNdKSkoOihbMC01XVswLTldKSl7Mn0oKFwrfC0pKChbMC0xXVswLTldKXwoMlswLTNdKSk6KFswLTVdWzAtOV0pKT8pIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEYXRldGltZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldezR9KCgoMDF8MDN8MDV8MDd8MDh8MTB8MTIpKCgwWzEtOV0pfChbMS0yXVswLTldKXwoM1swLTFdKSkpfCgoMDR8MDZ8MDl8MTEpKCgwWzEtOV0pfChbMS0yXVswLTldKXwzMCkpfCgoMDIpKCgwWzEtOV0pfChbMS0yXVswLTldKSkpKVQoKChbMC0xXVswLTldKXwoMlswLTNdKSkoOihbMC01XVswLTldKSl7Mn0oKFwrfC0pKChbMC0xXVswLTldKXwoMlswLTNdKSk6KFswLTVdWzAtOV0pKT8pIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxCb29sZWFuIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9InRydWV8ZmFsc2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibEZsb2F0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZmxvYXQiPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoXCt8LSk/WzAtOV0qXC4/WzAtOV0qKEV8ZSk/WzAtOV0qIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEb3VibGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkb3VibGUiPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoXCt8LSk/WzAtOV0qXC4/WzAtOV0qKEV8ZSk/WzAtOV0qIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXJDb25maXJtYXRpb24ueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL09yZGVyQ29uZmlybWF0aW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5Y2QzNi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXJDb25maXJtYXRpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcwNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zPSJwdWJsaWNpZDpvcmcueENCTDpzY2hlbWFzL1hDQkwzNS9PcmRlckNvbmZpcm1hdGlvbi54c2QiIHRhcmdldE5hbWVzcGFjZT0icHVibGljaWQ6b3JnLnhDQkw6c2NoZW1hcy9YQ0JMMzUvT3JkZXJDb25maXJtYXRpb24ueHNkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgIFhNTCBDb21tb24gQnVzaW5lc3MgTGlicmFyeSAzLjUKLSAgICAgICAgICAgIENvcHlyaWdodCAyMDAwIENvbW1lcmNlIE9uZSwgSW5jLgotICAgICAgICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgICAgICAgRFREJ3MsIHNjaGVtYXMgYW5kIG1vZHVsZXMgaW4gdGhlIENvbW1lcmNlIE9uZSBYTUwgQ29tbW9uIEJ1c2luZXNzCi0gICAgICAgICAgICBMaWJyYXJ5IFZlcnNpb24gMy41IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHNwZWNpZmllZAotICAgICAgICAgICAgYXQgaHR0cDovL3d3dy54Y2JsLm9yZy9saWNlbnNlLmh0bWwKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJUExFQVNFIE5PVEU6IFRoaXMgc2NoZW1hLCB3aGlsc3QgaXQgZGVzY3JpYmVzIGluIGVudGlyZXR5IGEgdmFsaWQsIHNpbmdsZSwKLSAgICAgICAgCXhDQkwgMy41IGRvY3VtZW50LCBpcyBkZWZpbmVkIHRvIGJlIGluIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGhlIG1haW4geENCTCAzLjUKLSAgICAgICAgCW5hbWVzcGFjZS4gVGhlcmVmb3JlIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGZ1bGwgeENCTCAzLjUgc2NoZW1hIGlzIHVzZWQKLSAgICAgICAgCWZvciBmdWxsIHByb2R1Y3Rpb24gc2l0dWF0aW9ucy4gUGxlYXNlIHNlZSB0aGUgbm90ZXMgYXQKLSAgICAgICAgCTxhIGhyZWY9Imh0dHA6Ly93d3cueGNibC5vcmcveGNibDM1L3hzZC9zY2hlbWFzLmh0bWwiPnd3dy54Q0JMLm9yZzwvYT4uCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb24iIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VsbGVyT3JkZXJDb25maXJtYXRpb25OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWxsZXJPcmRlck51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSXNzdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyQ29uZmlybWF0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyU2hvcnREZXNjcmlwdGlvbiIgdHlwZT0iQWxwaGFOdW00MCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXJOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlciIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25UeXBlQ29kZWQiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZSIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25UeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuRGVsaXZlcnkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxhbmd1YWdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYW5ndWFnZUNvZGVkIiB0eXBlPSJMYW5ndWFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxhbmd1YWdlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYWxlQ29kZWQiIHR5cGU9IkxvY2FsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2FsZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Ikxhbmd1YWdlRGVwZW5kZW50IiB0eXBlPSJ4Y2JsQm9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYW5ndWFnZSIgdHlwZT0iTGFuZ3VhZ2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTGFuZ3VhZ2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImR6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJodSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iml1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ianciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImthIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImttIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1pIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InhoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InphIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ienUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9jYWxlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJicyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJidyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJncCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJobiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJodSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpcSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iam0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImpvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJraCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImttIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im11Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im14Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJudSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icG0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0eiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1eiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idnUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5dSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iemEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InptIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6dyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VycmVuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5Q29kZWQiIHR5cGU9IkN1cnJlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ3VycmVuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeSIgdHlwZT0iQ3VycmVuY3kiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ3VycmVuY3lDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk9CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1ZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYUEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhSSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREtLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREpGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFR1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVUQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYRVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZLUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0hDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdORiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1dQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhURyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIS0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklEUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklRRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1pUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUtEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVlSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTURMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCT1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFORyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFdEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEhQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT01SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJST0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUldGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0xMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0REIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1pMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEhCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE1NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUdYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVlVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlVWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWldEIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1eWVyUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJQYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5IiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0eSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlJRCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNREZCdXNpbmVzcyIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTmFtZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVjZWl2aW5nQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcHBpbmdDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlckNvbnRhY3RzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3JyZXNwb25kZW5jZUxhbmd1YWdlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHkiIHR5cGU9IlBhcnR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklkZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJZGVudGlmaWVyIiB0eXBlPSJJZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBZ2VuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeUNvZGVkIiB0eXBlPSJBZ2VuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeSIgdHlwZT0iQWdlbmN5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFnZW5jeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQU1WQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJDRC1UaGVNaWNyb2NvbXB1dGVySW5kdXN0cnlBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNHSUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDT1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRUNNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlIQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYWJhbWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWludW1Bc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5BcHBhcmVsTWFudWZhY3R1cmVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkZ1cm5pdHVyZU1hbnVmYWN0dXJlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Jcm9uQW5kU3RlZWxJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTWVkaWNhbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBhcGVySW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBXQUFuZE9DU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuU29jaWV0eUZvckF1dG9tYXRpb25JblBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRleHRpbGVNYW51ZmFjdHVyZXJzSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTlNJQWNjcmVkaXRlZFN0YW5kYXJkc0NvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJpem9uYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJrYW5zYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlCdXllck9yQnV5ZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5RGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYXJrZXRQbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU5hdGlvbmFsVHJhZGVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlPd25lck9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5UGFydHlPcmlnaW5hdGluZ1RoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlTZWxsZXJPclNlbGxlcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVRyYW5zcG9ydENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1HZWxkYXVzZ2FiZWF1dG9tYXRlblNlcnZpY2VHZXNlbGxzY2hhZnRNQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUF1c3RyaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtQXVzdHJpYW5QVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULVZlcmJhbmRPZXN0ZXJyZWljaGlzY2hlckJhbmtlblVuZEJhbmtpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BQ09TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFJSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFQQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFRSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUF1c3RyaWFuQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLURPSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtSElDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1MSUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1OQ0NIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ST0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtVHJhZGVnYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFZU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbk1pbmlzdHJ5T2ZGaW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWxsY29yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0luZHVzdHJ5U3lzdGVtc0Fkdmlzb3J5Q29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUi1CYW5jb0NlbnRyYWxEb0JyYXppbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlItTUFBbmRSQUFBbmRMSU1ORVRBbmRSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtQ1BBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1DU0lPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRnJlaWdodENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJiaWRlTWFudWZhY3R1cmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtUmV2ZW51ZUNhbmFkYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtU0NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYSUlJRDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJMDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJQjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhYSVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFRklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQWRtaW5pc3RyYXRpb25GZWRlcmFsZURlc0NvbnRyaWJ1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUFzc29jaWF0aW9uU3Vpc3NlQ29kZURlc0FydGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DYXJidXJhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DZW50cmFsZVN1aXNzZVBvdXJMSW1wb3J0YXRpb25EdUNoYXJib24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILURpcmVjdGlvbkdlbmVyYWxlRGVzRG91YW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRGl2aXNpb25EZXNJbXBvcnRhdGlvbnNFdEV4cG9ydGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRW50cmVwcmlzZURlc1BUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtTWluaXN0cnlPZlRheGF0aW9uQ2VudHJhbEN1c3RvbXNBbmRUYXhBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtT2ZmaWNlRmlkdWNpYWlyZURlc0ltcG9ydGF0ZXVyc0RlRGVucmVlc0FsaW1lbnRhaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtU3dpc3NTZWN1cml0aWVzQ2xlYXJpbmdDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtVGVsZWt1cnNBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lFQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVBc3NpZ25lZEJ5VGhlT3JnYW5pemF0aW9uVGhhdElzVGhlVWx0aW1hdGVEZXN0aW5hdGlvbk9mVGhlVHJhbnNhY3Rpb25TZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPLURJQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yYWRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tYW5kZXJSb21lQWlyRGV2ZWxvcG1lbnRDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNvcmRFRElHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGljdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25zT25TQURBbmRUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXJBbmRCcmFzc0ZhYnJpY2F0b3JzQ291bmNpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08tU0JEQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1NJRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVU0lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUFSRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQkRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1EVEFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1FRElCQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VMb2dpc3RpY3NBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdEViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR2VybWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HZXJtYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HTUJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxhd2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mQWlyRm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkFybXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhlYWx0aEFuZEh1bWFuU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhvdXNpbmdBbmRVcmJhbkRldmVsb3BtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVGhlTmF2eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtU2llbWVuc0FHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1WREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRGQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0aW9uR2VuZXJhbGVEZXNEb3VhbmVzRXREcm9pdHNJbmRpcmVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZDb2x1bWJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLUVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstTUhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1OQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLVBCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlidWlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpZWxOb3JkaWNGb3J1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJRklDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFSURYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY1V0aWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0luZHVzdHJpZXNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVNEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMtT0RFVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTLVNwYW5pc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1FRElGSUNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtRVRJUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtUk9GRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBU0xJTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1GaW5uaXNoQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktVEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLVRoZUZpbm5pc2hCYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JpZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1BR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUFydkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUJhbnF1ZURlRnJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1DRk9OQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQ05BTVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1EQ1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLURHSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRlJBTkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElUUkFOU1BPUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUdBTElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1HRU5DT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUlOU0VFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1SQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFCSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQUJUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXJ0aWNsZU51bWJlckFzc29jaWF0aW9uTGltaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXNzb2NpYXRpb25Gb3JQYXltZW50Q2xlYXJpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQkFDU0xpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUNIQVBTQW5kVG93bkNsZWFyaW5nQ29tcGFueUxpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUZMRUVUTkVUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1ITUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItVGhlQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcmdpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGhpY3NDb21tdW5pY2F0aW9uc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSLUdyZWVrQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXdhaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLLUhvbmdLb25nQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBUFNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0FPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRhaG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRS1SZXZlbnVlQ29tbWlzc2lvbmVyc0N1c3RvbXNBRVByb2plY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMLUlzcmFlbEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbGlub2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyQ29udGFpbmVySW50ZXJGcmlnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc29jaWF0aW9uT2ZDb3Jwb3JhdGlvbkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzb2NpYXRpb25PZkluZHVzdHJpYWxBY2NpZGVudEJvYXJkc0FuZENvbW1pc3Npb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRzT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJb3dhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkFuZFN0ZWVsU3RhbmRhcmRzQ29tbWl0dGVlSVNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUy1JY2VsYW5kQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VTZXJ2aWNlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUFzc29jaWF6aW9uZUJhbmNhcmlhSXRhbGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUl0YWxpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULVNvY2llYXRhSW50ZXJiYW5jYXJpYVBlckxBdXRvbWF6aW9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFwYW5lc2VTdGFuZGFyZHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtSmFwYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1NT1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU1TQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTkFDQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbnNhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VudHVja3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNpbmdJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUFuZEFubnVpdHlJbmR1c3RyeUNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEktTGllY2h0ZW5zdGVpbkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzUmVnaXN0ZXJPZlNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3Vpc2lhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVS1MdXhlbWJvdXJnQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJ5bGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzc2FjaHVzZXR0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljaGlnYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm5lc290YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2lzc2lwcGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3NvdXJpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250YW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhbmtlcnNBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktRGFnYW5nTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWxjb2hvbEJldmVyYWdlQ29udHJvbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCdXNpbmVzc0FuZEVkdWNhdGlvbmFsUmFkaW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NGb3Jtc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENlbnRlcmZvclN0YXRlQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdHRvbkNvdW5jaWxPZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbE1lcmNoYW50c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFdob2xlc2FsZURydWdnaXN0c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQVRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmFsR2FzVXRpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQ0lDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWJyYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2YWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIYW1wc2hpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0plcnNleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWV4aWNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdzcGFwZXJBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkZQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklDQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRoZXJsYW5kc1JhaWx3YXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1CYW5rR2lyb2NlbnRyYWxlQlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUJFQU5FVEJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1FQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5Q2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5R2lyYWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1OZXRoZXJsYW5kc0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9yd2VpZ2lhblN0YXRlUmFpbHdheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5PUlBSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5JbnRlcmJhbmtSZXNlYXJjaE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhLVRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Rm9ydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aLU5ld1plYWxhbmRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mTWFuYWdlbWVudEFuZEJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVByb2R1Y3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPa2xhaG9tYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbEluZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVnb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9TSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbm5zeWx2YW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVubnN5bHZhbmlhQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULUNCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1Qb3J0dWd1ZXNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtU0lCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZUluZm9ybWF0aW9uSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJob2RlSXNsYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVLUJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUtU0ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBLVNhdWRpQXJhYmlhQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN2ZW5za2FCYW5rZm9lcmVuaW5nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN3ZWRpc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVNBQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFnZW5jeUFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50TG9hbkd1YXJhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlIZWxwSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm5lc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRpbGVEaXN0cmlidXRvcnNBc3NvY2lhdGlvbkluYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVERDQy1FRElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVy1DaGluZXNlVGFpcGVpQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFctVHJhZGUtdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVORUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkNUQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0NvdXJ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzTWFyaW5lQ29ycHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc051Y2xlYXJSZWd1bGF0b3J5Q29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFJQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFpclRyYW5zcG9ydEFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BSVNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQU5TSUFTQ1gxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BU1RNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJBVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJYQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ0hJUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNJRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DT1BBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREFuZEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESEhTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNDVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURMTVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9EQUFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRFNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRUlBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRklQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRk1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUdTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ITDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUlTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTUFSQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5BQkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQUlDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05hdGlvbmFsQ2VudGVyRm9ySGVhbHRoU3RhdGlzdGljc0NvbW1pc3Npb25PZlByb2Zlc3Npb25hbEFuZEhvc3BpdGFsQWN0aXZpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OYXRpb25hbFJldGFpbEZlZGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5DQ01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OSVNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5XREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9EVEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9GQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9NQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1URENDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVOLVNQU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNDZW5zdXNCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1WSUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1XU1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGFoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXR5SW5kdXN0cnlHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVybW9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc2hpbmd0b24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildlc3RWaXJnaW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0hNSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpc2NvbnNpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3lvbWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3JHZW5lcmFsT2ZDYW5hZGEiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VTaXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvcmRFdXJvcGVlblJlbGF0aWZBdVRyYW5zcG9ydEludGVybmF0aW9uYWxEZXNNYXJjaGFuZGlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRBbmFseXNpc0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0luZm9ybWF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJlbGF0aW9uc2hpcFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25NZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbk1ldGhvZFN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXRlUHJpbmNpcGFsZUV4ZXJjZWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRPdXRjb21lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaWRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ29tbW9kaXR5QW5kU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRNaXNzaW9uRGVzaWduU2VyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydE9yQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUZXJtaW5hbElkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBhdGllbnREaWFnbm9zaXNSZWxhdGVkR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQYXRpZW50UmVmaW5lZERpYWdub3Npc1JlbGF0ZWRHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25Mb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnRDb2RlLUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUHN5Y2hpYXRyaWNBc3NvY2lhdGlvbkRpYWdub3N0aWNTdGF0aXN0aWNhbE1hbnVhbE9mTWVudGFsRGlzb3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblNvY2lldHlGb3JUZXN0aW5nQW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hUG9sYXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hU3RydWN0dXJlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Q2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkFja25vd2xlZGdlbWVudEFuZEVycm9yQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblF1ZXN0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aWNsZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFJlY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U3RhdHVzT3JUcmFuc2FjdGlvblJlcG9ydGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHJhbnNmZXJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzRGVwcmVzY3JpcHRpb25EaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNEZXByZXNjcmlwdGlvbkV4Y2VwdGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhdGVFZGlOZXR3b3JrRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZURlc2NyaXB0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZU1hc3RlckRlc2NyaXB0aW9uSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N3aXRjaFJlbGVhc2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdXJlZERlbGl2ZXJ5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkRGF0YVByb2Nlc3NpbmdFcXVpcG1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBZG1pbmlzdHJhdGlvbkluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0JyYW5jaFNvcnRpbmdJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rU2VjdXJpdGllc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzT2ZKdXJpc2RpY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZFJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkT2ZmaWNlSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDbGF1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVBhcnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5UmVzcG9uc2liaWxpdHlMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5U2hpcExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ3JlZGl0UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ0RldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1JlcG9ydFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1NlY3VyaXRpZXNJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaW5hbmNpYWxJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMZWdhbFN0cnVjdHVyZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ25EaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW50ZXJFZGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VEZXNpZ25hdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT3JpZ2luQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaERpc2NvdW50U3RpcHVsYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VpbGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUmVxdWlyZW1lbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlTdWJkaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1QYXltZW50UmVtYXJrQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZlBpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VTdGF0dXNUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VBdXRvbWF0ZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50c0lkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVuaXZlcnNhbElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FzdERlc2lnbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29nbml6YW5jZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1JbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLUxvc3NDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qb2ludHNPZkltcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaXRlcm1zMTk5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFuZEdvdmVybm1lbnRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zQ29tbW9kaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zSGF6YXJkb3VzTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1NhZmV0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zUm91dGluZ0lkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25UeXBlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50UmVxdWVzdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VSZXZpZXdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jbHVzaW9uRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUHJlbWlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkFuZENvbnRhaW5lcml6YXRpb25Qb2ludENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0b3JBbGVydExpc3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbmRSb2xsLU9uT3JSb2xsLU9mZk51bWJlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZW50SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDbG9zZS1PdXRHcm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVsaXZlcnlEYXRlUmV2aXNpb25BZ2VudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZFJlcG9ydGluZ1RyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckFsZXJ0TGlzdFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJldmlld0xpc3RTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudERlZHVjdGlvbk9yQ29sbGVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudExpbmVJdGVtU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTaGlwbWVudEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRJbnZlbnRvcnlJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXREZXNpZ25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGlvbk9mZmVuc2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUxvZ2lzdGljc1Byb2dyYW1TdXBwb3J0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlRmluYW5jaWFsRmlsaW5nQ3JpdGVyaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN0YXRlbWVudEZpbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25PckNoYW5nZUZvclN0b3JhZ2VJdGVtUmVjb3Jkc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlBbmRBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlDb2RlLUZpbmFuY2VBbmRBY3F1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeVN1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkFkanVzdG1lbnRSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEFwcGVhcmFuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRDYXNlU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RG9jdW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRJc3N1ZWRXYXJyYW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdFdmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBhcnR5U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBsZWFkaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlTW9kaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNwYS1DYW5hZGlhblBheW1lbnRzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbENoYXJnZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbGl0eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdWlzaW5lVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBc3NldERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREZW50YWxUZXJtaW5vbG9neUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VMZXZlbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJXaXRoaW5Db3VudHJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9taXplZE5vdGljZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQXJlYU9mVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEb21lc3RpY1BvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9yZWlnblBvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5zcGVjdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NpbXBsaWZpZWRQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTcGVjaWFsQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdGF0dXNPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNpdEd1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVmFsdWF0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1BhY2tpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVTaGlwcGVkT3JSZWNlaXZlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckJ1c2luZXNzVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbmRhbnRQbGVhVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQW5kQWxsb2NhdGlvbnNTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpZW5jeUNhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2llbmN5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpbnF1ZW5jeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRlcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pbGl0YXJpemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlQXZhaWxhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUV2ZW50UHJvYmxlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZU9wZXJhdG9yVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVVzYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNFbmNvdW50ZXJlZER1cmluZ0V4YW1pbmF0aW9uQW5kSW52ZXN0aWdhdGlvbk9mSW5kaXZpZHVhbHNBbmRQb3B1bGF0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY0FuZFN0YXRpc3RpY2FsTWFudWFsT2ZNZW50YWxEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdE51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lTdGF0dXNPckRpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxBdXRob3JpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZEJ5Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9kYWFjLURlcGFydG1lbnRPZkRlZmVuc2VBY3Rpdml0eUFkZHJlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0xpbmVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zZUZvcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRHVlUHJvY2Vzc1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRXh0ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnU3RhdHVzQWR2ZXJzZUV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bXBpbmdPckNvdW50ZXJ2YWlsaW5nQXNzZXNzbWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVtcGluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5zLUR1bkFuZEJyYWRzdHJlZXRQbHVzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuc1N0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uMlBsdXMyRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVRheE9yRmVlUGF5bWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHluYW1pY0dlbmVyYXRvclNldENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5bmFtaWNMb2NvbW90aXZlVGFnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpcmEtSWQtRWRpUmVnaXN0cmF0aW9uQXV0aG9yaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRFcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbFN0dWR5QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb21hZ25ldGljVHJhbnNtaXR0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5oYW5jZWRQYXJ0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVsYXRpb25zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdGF0dXNMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3NlbnRpYWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRUaW1lT2ZBcnJpdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVUeXBlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0aW5nTWV0aG9kU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRobmljaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0ZVdvcmtDYW5kaWRhdGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRlV29ya0NhbmRpZGF0ZVJlYXNvbkxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRBYmF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudE9yRXhwb3N1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlYXBwZWFyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2F2YXRpb25JbmZvcm1hdGlvbkNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNYXRlcmlhbERpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q29tbW9kaXR5Q2xhc3NpZmljYXRpb24tVVNTY2hlZHVsZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5zaW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5U2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVUb0F3YXJkUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlUGxhbkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVBvb2xGZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tUmVtaXR0YW5jZVByb2dyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1TcGVjaWFsRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVJlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRmluYW5jZUNvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhlYWx0aENhcmVDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMb2dpc3RpY3NDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQcm9jdXJlbWVudENvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zcG9ydGF0aW9uQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBbmFseXNpc0NhdGVnb3JpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbUFsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1BdHRyaWJ1dGVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbVJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRTZXJ2aWNlQ2FzaC1MaW5rQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSZWdpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudEZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93T2ZUaGVHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sbG93LVVwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGluZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0NvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdSZXN0cmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1SZW1pdHRhbmNlUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1TcGVjaWFsQ2hhcmFjdGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1JlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZFNpdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3lCYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFB1cnBvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5Pckxvc3NJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvbkN1c3RvbWVyU3VwcGx5Q2VudGVyTnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFRlcnJpdG9yeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldE1vdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGFzc0FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlT2ZEaWZmaWN1bHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhaXJDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pemVkU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0NyZWRlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1Jlc3BvbnNlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVDbGFpbVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW1QcmluY2lwYWxQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkR1cmFibGVNZWRpY2FsRXF1aXBtZW50UmVnaW9uYWxDYXJyaWVyQ2VydGlmaWNhdGVPZk1lZGljYWxOZWNlc3NpdHlGb3JtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb3ZpZGVyQ2hhcmFjdGVyaXN0aWNzQW5kUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvdmlkZXJUYXhvbm9teSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5T3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvYmJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2QxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmeWluZ0NoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlEaXNjbG9zdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tdW5pemF0aW9uSW5qZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0QXhpc09yQW5hbG9nUG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdFJlY29yZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudENvbnNlcXVlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50UmVsYXRlZEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY290ZXJtczE5ODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxJbnN1cmFuY2VGaW5hbmNpYWxEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxQYXJ0aWNpcGF0aW9uSW5Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZXF1ZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVNlbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvdmVyYWdlRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbmZvcm1hdGlvbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhbkRlc2NyaXB0aW9uQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJRdWFudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvblByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uUHJpbmNpcGFsUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb24tSWNkLTktQ21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmREZXNpZ25hdGlvblN5c3RlbUZvclRlZXRoQW5kQXJlYXNPZlRoZU9yYWxDYXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25TdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50RnVuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnNRdWFsaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU291cmNpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYkNoYXJhY3RlcmlzdGljc0xvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JpZ2luYXRvckxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaWZlSW5zdXJhbmNlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbEhlYXJpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxPcmRlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbFNlbnRlbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaW5kT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpbmRPZk1vZGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZXN1bHRzSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5VGVzdENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQ2FzZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsRXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZSZWNvbW1lbmRhdGlvblJhdGluZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5UHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTZXJ2aWNlRmVhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTdGF0dXNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZVJlaW5zdXJhbmNlTWVzc2FnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGVPZkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbnNGb3JUYXJpZmZDYWxjdWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc0FuZENvZGVzQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc0NvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzRGVzY3JpcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzU2V2ZXJpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JGb3JjZVByb2dyYW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEluZGljYXRvckNvZGUtUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZUJlcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVXaGFyZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VPcmdhbml6YXRpb25JRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VUcmFkaW5nUGFydG5lcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZDb21tdW5pY2F0aW9uc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaXphdGlvbk9mQ29udHJhY3RBZG1pbmlzdHJhdGlvblNlcnZpY2VzU3lzdGVtRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpYUFuZFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxCZW5lZml0c1NjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1PZlRyYW5zbWlzc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck9yZ2FuaXphdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RzT2ZQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFuZENpdmlsaWFuR3JhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFzc2lzdGFuY2VQcm9ncmFtQWRkcmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaW9uSW1wYWN0U3RhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlGdW5jdGlvbkRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbmRleFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLU1lZGlhT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYWNoYS1OYXRpb25hbEF1dG9tYXRlZENsZWFyaW5nSG91c2VBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsRm9yUHJlc2NyaXB0aW9uRHJ1Z1Byb2dyYW1zUmVqZWN0T3JQYXltZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVBhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RhbmRhcmRUb290aE51bWJlcmluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRGVidENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mU3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZTdWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Mb25nZXJDb25zaWRlcmVkRm9yQXdhcmRSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWVuY2xhdHVyZUFjdGl2aXR5Q2xhc3NpZmljYXRpb25FY29ub215Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVBvc3RhbFRvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1lQWN0aXZpdGVGcmFuY2Fpc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmxpZ2F0aW9uVmFyaWFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvbk5hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25QYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25Tb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNhcnJpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckFuZFJlbGVhc2VPcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc05hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNQYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNTb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVPck92ZXJ3ZWlnaHRDcmVkZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBSaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VGYWlsdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0FuZE9yVW5wYWNraW5nRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRPZkJvZHlBZmZlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RXZlbnRQcm9ibGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJlaGF2aW91clJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRlc3RyaWFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eUFuZENvbnRlbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQmlsbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUxhbmRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTGVhc2VTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3REaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFBvaW50LU9mLVNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RTZWxsaW5nQXJyYW5nZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RWYWx1ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJlZ3VsYXRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5Q2FsY3VsYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVW5pdGVkU3RhdGVzR2VvbG9naWNhbFN1cnZleUZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxDbGFzc2lmaWNhdGlvblN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsU2h1dC1JblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbFRlc3RJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudENsZWFyYW5jZU9mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5T25DbGFpbUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5UmVzZXJ2ZVZhbHVhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhbElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsU2VydmljZUNhcnJpZXJSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGNvZGVEaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RNYXJrZXRTdHVkeVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aW9uRGF0YUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGlvbk1hdGVyaWFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmVudGl2ZU1lYXN1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbERpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUGFydHlDaXRpemVuc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlckZpbmFuY2lhbEhpc3RvcnlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RRdWFsaXR5RGVmaWNpZW5jeVJlcG9ydFN1bW1hcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3VwcGx5Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxEZXNpZ25hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtT3JpZ2luYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1ZZWFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU93bmVyc2hpcEV4dGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPd25lcnNoaXBUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlSZWNvcmRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlVbmRlcndyaXRpbmdDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0T2ZmaWNlckluc3RydWN0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cnBvc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QWxlcnRMaXN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlU2l0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclVuaXRQYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnlPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9GcmVxdWVuY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1NlcnZpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1N5c3RlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxBZGRpdGlvbmFsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGNhckxldHRlck1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxEb2N1bWVudE5hbWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFuZGxpbmdSZXN0cmljdGlvbnNBbmRJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYXJtb25pemVkQ29kaWZpY2F0aW9uT2ZUYXJpZmZzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFybW9uaXplZEVxdWlwbWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxVbmlmaWVkTm9tZW5jbGF0dXJlT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbXBhbnlOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlGcm9udGllckFuZFRyYW5zaXRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUxvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVNlcnZpY2VzSGFybW9uaXplZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nU3VtbWFyeVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JDb250cmFjdERlbGl2ZXJ5RGF0ZVJldmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRGVsYXllZENsb3NpbmdPZkNvbnRyYWN0RmlsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckRpc3Bvc2FsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRmluYW5jaWFsSXRlbURldGFpbENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yUHVibGljUmVjb3JkRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JSZXF1aXNpdGlvbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQmlsbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGF0aW9uc1JlZ2FyZGluZ0RlbGF5ZWREZWxpdmVyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkUHJlY2VkZW5jZUJhc2VkT25JdHNDdXJyZW5jeUluVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlQW5kU3RhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb25Vbml0T3BlcmF0aW5nTW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlTW9uZXRhcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBvbGljeUF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREZXZpY2VBcHBsaWNhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWdpb3VzQWZmaWxpYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1lZGlhbEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZUFjY2Vzc29yaWVzQW5kU3BlY2lhbEVxdWlwbWVudE9uUmFpbGNhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydERpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlQnV5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY3lJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsQW5kQ29tbWVyY2lhbFJvb21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0aW9uc0FuZFByb2hpYml0aW9uc1BsYWNlZE9uVGhlUmUtVXNlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VsdEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDaGFyYWN0ZXJpc3RpY0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1blR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEZpdG5lc3NFbGVjdHJvbmljUmVjb3JkU3lzdGVtc0Vycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kRml0bmVzc0VsZWN0cm9uaWNSZWNvcmRTeXN0ZW1zU3Vic2NyaXB0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlIYXphcmRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eVJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJpY2VDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlRGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVFeHRyYWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXZhbk93bmVyc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeURpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U291cmNlT2ZJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQW5kQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T3BlcmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9yUGF5b3V0T3B0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRBY2NlcHRhbmNlRGlzY3JlcGFuY3lFeHBsYW5hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVsZWFzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVN0YXRlUmVnaXN0cmF0aW9uU3lzdGVtQW5kT3BlcmF0aW5nQXV0aG9yaXR5Q3JlZGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVXNlTGFiZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplQW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpblRvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEFybXNFcnJvclRyYW5zYWN0aW9uUmVqZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxBcm1zVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb25DYW5jZWxsYXRpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU1haW50ZW5hbmNlQW5kUmVjb3ZlcmFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRlcG9zaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRpc2Nsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMZWFkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnRyYWN0UHJvdmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWFya2V0aW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXJraW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hdGVyaWFsSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvZ3JhbVJlcXVpcmVtZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlaW1idXJzYWJsZVByb3Zpc2lvbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVxdWlyZW1lbnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZXF1aXJlbWVudHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRBY2NvcmRpbmdVU0VtYmFyZ29SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Q2xhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Rm9yRXhwb3J0QWNjb3JkaW5nTmF0aW9uYWxQcmVzY3JpcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvbkNsYXNzaWZpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxBZG1pbmlzdHJhdGl2ZUluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxOYXR1cmVPZlRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbE9iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNCdW5kZXNBbXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tGdW5kT3JOb24tU3RvY2tGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50QWN0aXZpdHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudEF3YXJkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25BY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblBheW1lbnRPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblJlcXVlc3RDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25SZXNwb25zZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZVR5cGVPZlBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhPckxpbWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbW9uc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5QWNjb3VudGluZ0NsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzU3RvY2tUdXJub3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5Q29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURlc2NyaXB0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ludGF4Tm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZU9mSHVtYW5BbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFzc2Vzc21lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9yRmVlRXhlbXB0aW9uUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGFydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQXNzZXNzbWVudENoZWNrbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lRGlyZWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZUNoYXJhY3RlcmlzdGljTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZU93bmVyTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVR5cGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcnRpYXJ5RGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nRGVtb2dyYXBoaWNDYXRlZ29yeUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZVF1ZXN0aW9uQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTdGF0aXN0aWNhbENhdGVnb3J5Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXN1bHRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVEb2N1bWVudENvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUV4Y2VwdGlvbkFuZFJlcXVpcmVtZW50Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TdGF0dXNJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkhvbGRpbmdEZWxheUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uTW9kZU9yTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Nb2RlUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Qcmlvcml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGVBbmRCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5U3ltYm9sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZW5kUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQWRqdXN0bWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBbmRDYXVzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVEdWUtSW5JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJZGVudGl0eUNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJbnNwZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZBc3NldHNBbmRMaWFiaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQXNzaXN0YW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNhcmdvQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb250cmFjdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRGVsYXlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaXJtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5kdXN0cmlhbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbnF1aXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSXNzdWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMb2NhdGlvblJlY29uY2lsaWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTWVkaWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU3RvcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlN1cnZleVF1ZXN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlUGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVQaHlzaWNhbEludmVudG9yeU9yVHJhbnNhY3Rpb25IaXN0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNpcGllbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNsYWltZWRQcm9wZXJ0eUFkZGl0aW9uc0RlbGV0aW9uc0FuZERlZHVjdGlvbnNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jbGFpbWVkUHJvcGVydHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNpZGVudGlhbEFwcHJhaXNhbEF0dHJpYnV0ZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0NvbW1vbkNvZGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc1N0YW5kYXJkUHJvZHVjdHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzRGVwYXJ0bWVudE9mSGVhbHRoQW5kSHVtYW5TZXJ2aWNlc09mZmljZU9mVml0YWxTdGF0aXN0aWNzRS1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGljaXRlZFByb3Bvc2FsUmVqZWN0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uSW5ub2N1bGF0aW9uT3JJc29sYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlT2NjdXBhbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3RhdHVzQW5kVGVybXNPZkNhcnJpYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3Rvd2FnZUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3VzdGFpbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZXdQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW9sYXRpb25UeXBlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZURvY3VtZW50TnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTWFuaWZlc3RSZWZlcmVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJlc2VydmVNYXRlcmlhbFJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb21tb2RpdHlBbmRTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclRlcm1pbmFsSWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9yRnJhZ2lsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlbkRpc2NvdmVyZWRMb29rdXAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiIHR5cGU9Ikxpc3RPZklkZW50aWZpZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVBZGRyZXNzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4dGVybmFsQWRkcmVzc0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hbWUyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYW1lMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBPQm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhvdXNlTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdHJlZXRTdXBwbGVtZW50MSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RyZWV0U3VwcGxlbWVudDIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1aWxkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGbG9vciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUm9vbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5ob3VzZU1haWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlcGFydG1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc3RyaWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVGltZXpvbmUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkFkZHJlc3NUeXBlQ29kZWQiIHR5cGU9IkFkZHJlc3NUeXBlQ29kZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iTm90QXBwbGljYWJsZSIvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJBZGRyZXNzVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZUFkZHJlc3MiIHR5cGU9Ik5hbWVBZGRyZXNzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQT0JveCI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlBPQm94UG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQT0JveCIgdHlwZT0iUE9Cb3giLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVnaW9uQ29kZWQiIHR5cGU9IlJlZ2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZ2lvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZ2lvbiIgdHlwZT0iUmVnaW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlZ2lvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVUFDVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVOU1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVUUxEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVWSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSR08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBWVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCS0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCS0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCT00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCT1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUR0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUR08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUR1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUSU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTS1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTS1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTT0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTT0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV1kiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvdW50cnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvdW50cnlDb2RlZCIgdHlwZT0iQ291bnRyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50cnlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiB0eXBlPSJDb3VudHJ5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvdW50cnlDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpXIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUaW1lem9uZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGltZXpvbmVDb2RlZCIgdHlwZT0iVGltZXpvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUaW1lem9uZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRpbWV6b25lIiB0eXBlPSJUaW1lem9uZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUaW1lem9uZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEyLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEyLjAwIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFkZHJlc3NUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUGlja1VwQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUmV0dXJuQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVBZGRyZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudFdhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbmluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZHlBbmRDb25mZWN0aW9uc0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QXNzaWduZWRXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vckNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRhbnRzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU1lc3NhZ2VUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uTWFpbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWZmZXJlbnRQcmVtaXNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE9yTWVzc2FnZUlzc3Vlck9yU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3AtT2ZmTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25EaXNjbG9zdXJlSW5mb3JtYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25SZWdpc3RyYXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZW9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FyYWdlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25FbmRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblN0YXJ0aW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlZEZyb21Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVN0b3JlQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHNGb3JDdXN0b21zRXhhbWluYXRpb25CZWZvcmVDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZMb2FkRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZTcG90Rm9yU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzcG9zaXRpb25BdXRob3JpemF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXREZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yaG9vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVRlbXBvcmFyeVN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3VibG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duaW5nSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Qm91bmRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNlcnZpY2VzQW5kUmVwYWlyc0NlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvb3JkaW5hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0NvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUG9pbnRGb3JDdXN0b21lclNhbXBsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1N1Yi1Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZC1LZWVwaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpcmluZ091dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JSZWZ1cmJpc2hMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY2VPckRvbWljaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUxvY2F0aW9uQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsdGVyZWRXb3Jrc2hvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCYXNlU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbENvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0FuZFNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvSWZEaWZmZXJlbnRGcm9tQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5YXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5QXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0T3JDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5RGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyT3JNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0xhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYXRpb25Ib21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZGVvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3RJRCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRhY3RGdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHR5cGU9IkNvbnRhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3RGdW5jdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZWQiIHR5cGU9IkNvbnRhY3RGdW5jdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RGdW5jdGlvbiIgdHlwZT0iQ29udGFjdEZ1bmN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ2NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxJbnN1cmFuY2VJbmZvcm1hdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aXZlQ29udHJhY3RpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZnRlci1Ib3Vyc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50U2NoZWR1bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVudGlvbi1Ub1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRmluYW5jaWFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE5lZ290aWF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdob3VzZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsSW5xdWlyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NVbml0TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJOYW1lb3JEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQURBbmRDQU1TcGVjaWFsaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaXJtYW5PZlRoZUJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9yZGVyQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRXhlY3V0aXZlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZGaW5hbmNpYWxPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkluZm9ybWF0aW9uT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZPcGVyYXRpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5V29ya3NBdXRob3JpdHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BcHByb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5naG91c2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUJvcnJvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnZlc3RpZ2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVnZW9mRWR1Y2F0aW9uQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudEVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wdXRlclN5c3RlbXNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlUHVyY2hhc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QW5kU2NoZWR1bGVDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250YWN0R3JhbnRpbmdBcHBvaW50bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlJbnN0cnVjdGlvbnNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxTY2hvb2xBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JFbXBsb3llZVRvRXhlY3V0ZUV4cG9ydFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckVtcGxveWVlVG9FeGVjdXRlSW1wb3J0UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yUGVyc29uUmVzcG9uc2libGVGb3JQcm9jZXNzaW5nUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmVsb3BtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3J5QWR2ZXJ0aXNpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbkRpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbk1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25Db29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNpdHlTdXBwbHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNTdWJtaXNzaW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1NaWxpdGFyeVRyYWZmaWNNYW5hZ2VtZW50Q29tbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1TaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEYW5nZXJvdXNHb29kc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50ZXJlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW5pbmdQcm9ncmFtc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlVmljZS1QcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQWlkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ0xlbmRlckFkbWluaXN0cmF0aXZlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1N1cHBseUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpdmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVCdXNpbmVzc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVFbmdpbmVlcmluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVGaW5lQXJ0c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VpZGFuY2VDb3Vuc2Vsb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdEZvckluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdEZvckluZm9ybWF0aW9uUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdE9yQ29tcHV0ZXJEYXRhUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIdW1hblJlc291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50V29ya0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZHJlZ2lzdHJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U2Nob29sQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBdWRpdGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFB1cmNoYXNpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRpbmdEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRpbmdEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSGFuZGxpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlU2VuZGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlVmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdCdXNpbmVzc1Byb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RldmVsb3BtZW50c0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeVB1YmxpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJpY2FsQ29udHJvbEVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBZHVsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRvckd1YXJkaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nTGFib3JhdG9yeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzQ2xhaW1PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlRXZhbHVhdGlvbkNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQ29sbGVjdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRPckVxdWlwbWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtTWFpbnRlbmFuY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0RW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWF3YXJkU3VydmV5TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVRheHBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxTdHVkeUNvbnRhY3RvckF1dGhvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvYmF0aW9ub3JMZWdhbE9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RNYW5hZ2VtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbURpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdERpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1JlbGF0aW9uc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb29yZGluYXRvckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnNwZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1cnZleW9yQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlU3VwZXJ2aXNvck9yQ2xlcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eUtleUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5T2NjdXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZU9yQ2hhcmdlYmFja0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0RvY2tDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENvbXBhbnlBZG1pbmlzdHJhdGl2ZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydEF1dGhvcml6ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFByZXBhcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbkZvckNvbXB1dGVyRGF0YVByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uZm9ySW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbkZvckluZm9ybWF0aW9uUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3QW5kUmVwcmljaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXByZXNlbnRhdGl2ZU9yRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sb2ZUaGVvbG9neUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbG9mVmV0ZXJpbmFyeU1lZGljaW5lQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlUYXhwYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmRlcldyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVRlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VUZWNobmljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZXJ2aWNlc1dvcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVIb3VzZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9ncmFtQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudGluQWJzZW50aWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtc0FkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50YXRpb25SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE1hcmtldGluZ1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc05ldHdvcmtDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVBbnN3ZXJpbmdTZXJ2aWNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJEZXZlbG9wZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZC1QYXJ0eUFkbWluaXN0cmF0b3JDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duUGxhbm5pbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFmZmljQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZmZpY0F1dGhvcml0eUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRJbmZyYXN0cnVjdHVyZUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJncmFkdWF0ZUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvblByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmljZVByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN1cHBseUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtCcm9rZXJNYWludGVuYW5jZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaG9wQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NNYW5hZ2VtZW50Q29udGFjdCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdE51bWJlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udGFjdE51bWJlciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdE51bWJlciIgdHlwZT0iTGlzdE9mQ29udGFjdE51bWJlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdE51bWJlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlZCIgdHlwZT0iQ29udGFjdE51bWJlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXIiIHR5cGU9IkNvbnRhY3ROdW1iZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9iaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVQYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXV1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVJMT3RoZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3QiIHR5cGU9Ikxpc3RPZkNvbnRhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhcnR5Q29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhcnR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcnR5Q29kZWQiIHR5cGU9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5Q29kZWQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVJvbGVDb2RlZCIgdHlwZT0iUGFydHlSb2xlQ29kZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0eVJvbGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eUNvZGVkIiB0eXBlPSJQYXJ0eUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhcnR5Um9sZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZkRlc3RpbmF0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZi1PcmlnaW5QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXJzU2VydmljaW5nQmFua09uVGhlUmVjZWl2aW5nU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyc1NlcnZpY2luZ0JhbmtPblRoZVNlbmRpbmdTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3JvbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUHVyY2hhc2Vyc0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZEJ5T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZUNhcmVIb3NwaXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQaWNrVXBBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpb25DZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ1N1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdWx0RGF5Q2FyZVByb2dyYW1GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlVGhyb3VnaEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGVkQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUdyYW50aW5nU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlEU09yQVJDVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQW1idWxhbmNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRm9yY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGlzbUFuZE90aGVyQ2hlbWljYWxEZXBlbmRlbmN5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeUlucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeU91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaWVuQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2VkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsaWVkSGVhbHRoUHJvZmVzc2lvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVSZXR1cm5BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUFkZHJlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsemhlaW1lcnNEaWFnbm9zdGljT3JBc3Nlc3NtZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkluZGlhbi1Pd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWljdXNDdXJpYWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaW9sb2d5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2lvcGxhc3R5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbEJlaW5nSW52ZXN0aWdhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlbGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVsbGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudENvbWFrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudEZvckpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNDb3NpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZENvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyY2hpdGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJjaGl0ZWN0LURlc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm15RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGhyaXRpc1RyZWF0bWVudENlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRBY2NvdW50SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRVU1RydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZUdlbmVyYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yRGVmZW5kYW50UHJpdmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JEZWZlbmRhbnRQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leU9mUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWN0aW9uZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkFzc2lnbmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRBY2NlcHRpbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEltcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTWFya2V0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkVHJhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWREYXRhUHJvY2Vzc2luZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVdpdGhCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlTaGlwVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UmVmZXJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQZXJpb2RFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0dGVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhbE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsLVRvUGFydHlGb3JEaXZlcnNpb25DaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aGluZ1Jvb21PckxEUlBSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRocGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb29kQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZlJlYWx0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsU2VydmljZVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kc21hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29ra2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcnJvd2Vyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFrZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa0JlcnRoT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9hZGNhc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9waW5pb25PckFuYWx5c2lzUmVxdWVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPclNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJzQXNzaXN0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGVyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdJbnNwZWN0b3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZUVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZVB1cmNoYXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1T2ZMYW5kTWFuYWdlbWVudFByb3BlcnR5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybkNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Fzc29jaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyQXNPZmZpY2lhbGx5UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNRdWFsaXR5UmV2aWV3Qm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZ0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5kaWRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmR5QW5kQ29uZmVjdGlvbnNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjQ2F0aGVyaXphdGlvbkxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNJbnRlbnNpdmVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY1JlaGFiaWxpdGF0aW9uUHJvZ3JhbUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjUmVoYWJpbGl0YXRpb25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0SXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbExldmVsQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbFN1Yi1BY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sVG9wQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQmFua09yUmVndWxhdG9yeUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbENhdGFsb2d1ZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZ5aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWlycGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNQYXllckF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlRHJhd25CYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZEZXB1dHlDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNDaHJvbmljRGlzZWFzZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNEYXlDYXJlQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0dlbmVyYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNPcnRob3BlZGljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc090aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1BzeWNoaWF0cmljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1JlaGFiaWxpdGF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1R1YmVyY3Vsb3Npc0FuZE90aGVyUmVzcGlyYXRvcnlEaXNlYXNlc0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlyb3ByYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNEaXNlYXNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNPYnN0cnVjdGl2ZVB1bG1vbmFyeURpc2Vhc2VTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNodXJjaE9wZXJhdGVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZXNBbmRUb2JhY2NvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdExvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRBdXRob3JpemVkUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZERvb3JQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ291bnNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1EZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbmFibGVBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvblByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QXNzaWduZWRXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SW50ZXJ2aWV3ZXJXb3Jrc0ZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUluV2hpY2hJbnRlcmVzdEhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlNZXJnZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlXaGljaEhvbGRzRmluYW5jaWFsSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVJlbnRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGluZ1Byb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbmFudHNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVoZW5zaXZlR2VyaWF0cmljQXNzZXNzbWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdG9yUGlsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZU9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVRvQmVTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZS1Ub1JlY2VpdmVMYXJnZVBhcmNlbHNBbmRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUtVG9SZWNlaXZlTWFpbEFuZFNtYWxsUGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25Db250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25GaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0YW50c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJDcmVkaXRBY2NvdW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJSZWZlcnJhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlckN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RCYW5rMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JPckxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUmV0dXJuQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3VydmV5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkbWluaXN0cmF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdGVkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RpbmdPZmZpY2VyUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItR2VuZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLUxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItTWFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeU1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbFJlY2VpcHRNZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlclF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udm95aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1PcGVyYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQnV5aW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Pd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tUGFydGljaXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLVByb2R1Y2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5TWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGlvbkZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VuY2lsT2ZHb3Zlcm5tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0QXBwb2ludGVkQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmF0aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvcnRpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1lVmljdGltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0NsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zcy1Ub3duU3dpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVFNjYW5uZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RW1wbG95ZXItUHJpbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEVtcGxveWVyLVNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b2RpYWxQYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRk9yV2hvbVNhbWVPclNpbWlsYXJXT3JrV2FzUGVyRm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcklkZW50aWZpY2F0aW9uRmlsZUN1c3RvbWVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFQcm9jZXNzaW5nU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvci1Jbi1Qb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRQYXltZW50QXV0aG9yaXNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNpc2lvbk1ha2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0T3JGb3JlY2xvc3VyZVNwZWNpYWxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaWNhdGVzc2VuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkp1c3RpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRIYXphcmRvdXNXYXN0ZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY1JhZGlvaXNvdG9wZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFseXNpc0NlbnRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZmZlcmVudFByZW1pc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzaW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NpcGxpbmFyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RpbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEp1c3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N0b3JPZk9wdG9tZXRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdG9yT2ZPc3Rlb3BhdGh5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY291bnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NvdW50UGFydHlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRSZWltYnVyc2luZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0U2Vjb25kQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Q3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE9yTWVzc2FnZUlzc3Vlck9yU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9pbmdCdXNpbmVzc0FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtRmlyc3RTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmlsbGluZ0NvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5R3JvY2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmFibGVNZWRpY2FsRXF1aXBtZW50U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjb25vbWljYWxseURpc2FkdmFudGFnZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3JQb2ludEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblV0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNSZXR1cm5PcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVtZW50YXJ5U2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJsZVBhcnR5VG9UaGVDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2libGVQYXJ0eVRvVGhlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudFNvY2lhbFdvcmtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5TWVkaWNhbFRlY2huaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lSZXNwb25zZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnaW5nU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJSZXR1cm5BZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlFcXVpcG1lbnREZXNwYXRjaFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUVxdWlwbWVudFJldHVyblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lJbmZvcm1hdGlvbkFkbWluaXN0cmF0aW9uLU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1Db25zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLUNvbnN1bHRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlck1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlclBpbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1SZXNpZGVudENvbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eUhvbGRpbmdUaGVJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5SW5XaGljaEFGaW5hbmNpYWxJbnRlcmVzdElzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UHJvdmlkaW5nVGhlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVzcG9uc2libGVGb3JGb2xsb3ctVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRUZWNobmljYWxBc3Nlc3NtZW50R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudERyb3AtT2ZmUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlQ29tbWl0dGVlTWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRvck9mRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVydFdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeC1TcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWNvcnBvcmVhbFNob2NrLVdhdmVMaXRob3RyaXB0ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3Rvci1Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbGx5Q2hhcnRlcmVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdGF0ZUNvdW50eU9yQ2l0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWxsb3dzaGlwSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRvckJyYW5jaE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbEN1c3RvbWVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlUGVyaW9kRGVzaWduYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBsYW5uZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcHByYWlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXRuZXNzQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZENlcnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REZXRlcm1pbmF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RTZXJ2aWNlT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRGlzY2xvc3VyZUluZm9ybWF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGFuZ3VhZ2VTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVnaXN0cmF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25TdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJseURvaW5nQnVzaW5lc3NBcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVybHlLbm93bkFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclJlZ2lzdGVyZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlb25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0TWFuYWdlbWVudEZhY2lsaXRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0T3JDaGFyZ2VzUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1dHVyZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5pbmdJbnZlbnRvcnlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm5pc2hlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uRW5kaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25TdGFydGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRld2F5UHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxJbnBhdGllbnRDYXJlRm9yQUlEU09yQVJDRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZWRpY2FsQW5kU3VyZ2ljYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lcmNoYW5kaXNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXRpY0NvdW5zZWxpbmdPclNjcmVlbmluZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNBY3V0ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNDbGluaWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaWZ0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVsZWFzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtQ29tYmluZWRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtTWlsaXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1PdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLVZldGVyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHlGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudExvYW5BZ2VuY3lTcG9uc29yT3JBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Mb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbmRwYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZEFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBZmZpbGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWZmaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwaW5nQ2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFByYWN0aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFB1cmNoYXNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZUdlbmVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQW5kQmVhdXR5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb2Zlc3Npb25hbFNob3J0YWdlQXJlYUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWlzY2VsbGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoU2NpZW5jZXNMaWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZW1vZGlhbHlzaXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzb3BhdGhvbG9neUxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc3BhbmljU2VydmljZUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aENvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTdGF0ZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEF1eGlsaWFyeVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzdHJpY3RPckF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbFVuaXRXaXRoaW5Bbkluc3RpdHV0aW9uRm9yVGhlTWVudGFsbHlSZXRhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zdGlsZVdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVkRnJvbUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRMYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50UGh5c2ljaWFuc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lbGlnaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkRpc3NlbWluYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uTWFpbnRlbmFuY2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVmZXJlbmNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbE1lZGljYWxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluamVjdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1QYXRpZW50UGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU2VydmljZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uT25TaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkZvck1lbnRhbFJldGFyZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TdG9yZUJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDbGFpbUFkanVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZE9yU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hdGVyaWFsTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWxsZWN0dWFsUHJvcGVydHlPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybGluZVNlcnZpY2VDb21taXRtZW50Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJhbmsyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlPckJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVMZXZlbFBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5zaGlwRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnByZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9sdmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmV2b2NhYmxlQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZEZWJpdE9yQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludEFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRBbm51aXRhbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50RGVidG9yQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckpvaW50QW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lclBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5pb3JIaWdoU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZVZpY3RpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpZG5leURpYWx5c2lzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdXJwbHVzQXJlYUZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRsb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXJnZUJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0S25vd25Tb3VyY2VPZlN1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdFbmZvcmNlbWVudEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxUaXRsZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2Vlc1N1cnZleW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRMaWFiaWxpdHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0TWFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdGVyYWxseVRyYW5zbGF0ZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5BcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Ccm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuSG9sZGVyRm9yUmVhbEVzdGF0ZUFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEdvdmVybm1lbnRTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kc0ZvckN1c3RvbXNFeGFtaW5hdGlvbkJlZm9yZUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkxvYWRFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlByaW5jaXBhbEFzc2V0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlNwb3RGb3JTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybUNhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZy1UZXJtRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc2luZ0ludmVudG9yeU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NQYXllZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWdpc3RyYXRlSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25ldGljUmVzb25hbmNlSW1hZ2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlkZW5OYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlubGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Vc2VkRm9yRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5U2NyZWVuaW5nQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRDb250cm9sQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnROb24tT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdHZW5lcmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFRpbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrLUZvclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyR2VuZXJhbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkF1dGhvcml6YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0Q2hhcnRlcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbERvY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxOdXJzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN1cmdpY2FsT3JPdGhlckludGVuc2l2ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50RXhlY3V0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50UHJlc2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWdhdm9sdGFnZVJhZGlhdGlvblRoZXJhcHlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50QmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55V2l0aFJldGFpbmVkSWRlbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1leGljYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRkbGVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnRIZWFsdGhDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHktT3duZWRCdXNpbmVzc0xhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eS1Pd25lZEJ1c2luZXNzU21hbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNIZWFsdGhDYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbml0b3JpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlUmVwb3J0UHJvdmlkZXJDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVDaGFuZ2VkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVOb3RUb0JlQ29uZnVzZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lb25DcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVW5kZXJXaGljaEZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVmFyaWF0aW9uU3lub255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGl2ZUhhd2FpaWFuT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXZ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ2xlY3RlZE9yRGVsaW5xdWVudEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvcmhvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lb25hdGFsSW50ZW5zaXZlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldHdvcmtOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1NlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3c3BhcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdXBwbHlTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWNrbmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9IZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRGcmVpZ2h0Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLURvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmVtcGxveW1lbnRJbmNvbWVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1IZWFsdGhDYXJlTWlzY2VsbGFuZW91c0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUludmFzaXZlQ2FyZGlhY0Fzc2Vzc21lbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU9jY3VwYW50Q28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9kdWN0aW9uU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbnByb2ZpdEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmFpbHJvYWRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJlZ2lzdGVyZWRCdXNpbmVzc05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRHcm91cENvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbEFjY291bnRJcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50SW5zdHJ1Y3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50VGhpcmRQYXJ0eUNvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVRlbXBvcmFyeVN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnlQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGVDby1TaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Rm9yU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlObzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Tm8yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2YXRpb25Sb29tU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NBbmRHeW5lY29sb2d5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5UYXJpZmZDb25mZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQW5kR2FzQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxBbmRHYXNSZWd1bGF0b3J5QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQmVoYWxmT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uLUNhbGxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25jb2xvZ3lDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tSGVhcnRTdXJnZXJ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3ItQ29tbXVuaWNhdGlvbkNoYW5uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yLUVzc2VudGlhbFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mUHJvcGVydHlPckVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlU291cmNlVHJhbnNmZXJQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT2ZTaGlwcGVyc09yZGVycy1UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPZlRoZVNoaXBwZXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQ29tcGxldGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25IYXZpbmdTb3VyY2VDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZWRPdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplZFNvY2lhbFdvcmtTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5PclRpc3N1ZVRyYW5zcGxhbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yT2ZBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN1YmxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9wZWRpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob3BlZGljU3VyZ2VyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmRpdmlkdWFsRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb3QtRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBlcnNvbk9yRW50aXR5QXNzb2NpYXRlZFdpdGhTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJSZWxhdGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRUeXBlT2ZPcmdhbml6YXRpb25hbEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTb2NpYWxXb3JrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnZXJ5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnaWNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUluc3BlY3Rpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVUZXN0QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZk1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPckxlc3NvcnNTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnNoaXBGb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZW1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHNEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBY2NvcmRpbmdUb0RvY3VtZW50YXJ5Q3JlZGl0VHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXNzaWduaW5nQVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdEZpbmFsUGxhY2VPZlBvc2l0aW9uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF0UGljay1VcExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6ZWR0b0RlZmluaXRpemVDb250cmFjdEFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemVkVG9NYWtlRGVmaW5pdGVBQ29udHJhY3RBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXppbmdEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemluZ1JlbGVhc2VPZlNlY3VyaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGF0YVJlc3BvbnNpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVjbGFyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9FeGVjdXRlUmUtSWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvRXhlY3V0ZVNhbml0YXJ5UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9Qcm92aWRlTGl2aW5nQW5pbWFsQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlFeGVjdXRpbmdBbmRWZXJpZnlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RmlsbGluZ1NoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Rm9yV2hvbUl0ZW1Jc1VsdGltYXRlbHlJbnRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGcm9tV2hvbUN1c3RvbXNEb2N1bWVudHNBcmVUb0JlUGlja2VkVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnJvbVdob21Ob24tQ3VzdG9tc0RvY3VtZW50c0FyZVRvQmVQaWNrZWRVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGdWxmaWxsaW5nQWxsT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJblBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SXNzdWluZ011dHVhbGx5QWdyZWVkQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVDb2Rlc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVJZGVudGlmaWVyc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFuZGF0ZWRUb0xpcXVpZGF0ZUFuRW50ZXJwcmlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYW51ZmFjdHVyZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Tm90VG9CZUNvbmZ1c2VkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQYXNzaW5nVGhlVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdUYXNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdWZXJpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UHJvdmlkaW5nRmluYW5jaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVByb3ZpZGluZ0dvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZWNvdmVyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckRpc2luZmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckZpbmFuY2lhbFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JSZWZ1ZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U3VibWl0dGluZ1F1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRoYXRSZWNlaXZlZERpc2Nsb3N1cmVTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VGhhdFJlbWl0c1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9BcHBlYXJCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9BcHByb3ZlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b2JlYWR2aXNlZC1Xcml0dGVuT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQmVCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9CZUJpbGxlZEZvck90aGVyVGhhbkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0ZpbGVQZXJzb25hbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvTGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9QZXJmb3JtUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUHJpbnRTb21lRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Qcm92aWRlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQWxsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWVkSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpZWRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb21tZXJjaWFsSW52b2ljZVJlbWl0dGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvcnJlc3BvbmRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVsZWN0cm9uaWNNZW1vT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVGcmVpZ2h0QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnNwZWN0aW9uUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUludml0YXRpb25Ub09mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUludm9pY2VGT3JHb29kc09yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW52b2ljZUZvckxlYXNlUGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTGltaXRhdGlvbnNPZkhlYXZ5RWxlbWVudHNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTWF0ZXJpYWxSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU5vbi1DdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU9yZGVyVG9TdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUGFja2luZ0NyYXRpbmdBbmRIYW5kbGluZ0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQYXBlck1lbW9PZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlUHJvcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNjYWxlVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNoaXBwaW5nTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU2hpcHBpbmdOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVN0YXRlbWVudE9mQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTdGF0ZW1lbnRPZkZlZXNEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVRlY2huaWNhbERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVUcmFuc3BvcnRhdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1dob21BY2tub3dsZWRnbWVudFNob3VsZEJlU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1dob21Eb2N1bWVudHNBcmVUb0JlUHJlc2VudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvV2hvbVByb3Rlc3RTdWJtaXR0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2FpdmluZ1JlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaERlbGl2ZXJzQ29uc2lnbm1lbnRzVG9UaGVUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaFBpY2tzVXBDb25zaWdubWVudHNGcm9tVGhlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hvU2lnbmVkVGhlRGVsaXZlcnlSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdpdGhLbm93bGVkZ2VPZkFmZmFpcnNPZlRoZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2l0aFBvd2VyVG9Wb3RlU2VjdXJpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Q29tcGFuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RWR1Y2F0aW9uVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50UmVwcmVzZW50YXRpdmVTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0NvbXBhbnlOYW1lT3JJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyT2ZMYXN0UmVzb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDb21wYW55TmFtZU9ySWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5LVRvUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGVzdHJpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGlhdHJpY0FjdXRlSW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uRm9yV2hvc2VCZW5lZml0UHJvcGVydHl3YXNTZWl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT25DbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFDaGlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFuZFdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eVdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5DbGluaWNPckdyb3VwUHJhY3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbkhvc3BpdGFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4tU3BlY2lhbGlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnRCb3VuZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJvdHRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEaXN0aWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZlBlcmZvcm1hbmNlQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWludGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nT3JNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1NjaGVkdWxlT3JNYXRlcmlhbFJlbGVhc2VJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5TcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRDbGVhcmFuY2VPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2RpYXRyaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2ludE9mU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGxpbmdTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1TZWNvbmRhcnlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90ZW50aWFsU291cmNlT2ZTdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyT2ZBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1LRGF5Q2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlDdXN0b21lck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VQZXJpb2REZXNpZ25hdGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0J1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRHcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlYnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOYW1lT2ZGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c093bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RpdGxlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUcmFkZVVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2hlY2tTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUluc3VyZWRPclN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRlcmV4Y2hhbmdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludGVybmF0aW9uYWxUZWxlY29tQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludHJhLUxBVEFDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW52ZW50b3J5Q29udHJvbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVN1cHBvcnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxCb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsRXhlY3V0aXZlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFzZUp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGl0bGVFdmlkZW5jZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9Cb25vQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRSZXNwb25zaWJpbGl0eUZvck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UG9zaXRpb25Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTZXJ2aWNlc0FuZFJlcGFpcnNDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvb3JkaW5hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPckJ1aWxkaW5nTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvU2VDb3Vuc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljQ2hpbGRPckFkb2xlc2NlbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNDb25zdWx0YXRpb24tTGlhaXNvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VkdWNhdGlvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VtZXJnZW5jeVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0dlcmlhdHJpY1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0hlYWx0aEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0lucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljT3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY1BhcnRpYWxIb3NwaXRhbGl6YXRpb25Qcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNob2xvZ2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljQWx0ZXJuYXRpdmVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aFNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoU2VydmljZUluZGlhblNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljb3JQcml2YXRlT3JnYW5pemF0aW9uRm9yVGhlRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1ByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzRGVwYXJ0bWVudEJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmeWluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YXRpb25SZXF1ZXN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW1wbGFudHNVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0NvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRNZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Wm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0NvcnJlc3BvbmRlbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc1N1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZhY2lsaXR5U2NoZWR1bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BvaW50Rm9yQ3VzdG9tZXJTYW1wbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdTdWItTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQ2l2aWxvckxlZ2FsTGlhYmlsaXR5UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZC1LZWVwaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyZWF0aW9uYWxUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnlPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnVzaW5lc3NOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdOb25wYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25UcmlidW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhckRlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVN0YXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlTdGF0ZUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25JbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbk91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbWJ1cnNpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUludGVybWVkaWFyeU9yQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRHJheW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZVRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmRlcmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyaW5nT3V0bGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPclJlZnVyYmlzaExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyc05vbWluYXRlZEFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByb2R1Y3RpdmVIZWFsdGhTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGVEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZvaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZU9yRG9taWNpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jeUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEluc3RydWN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BpcmF0b3J5VGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwaXRlQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUV4aGliaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVHb3Zlcm5tZW50QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJvY2Vzc2lvbmFpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0eU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXJhbEhlYWx0aENsaW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBc3Npc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sLUJhc2VkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JlZW5pbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUludmVudG9yeUNvbnRyb2xBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TG9jYXRpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVdhcnJhbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTGV2ZWxQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbjhBUHJvZ3JhbVBhcnRpY2lwYW50RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJBc09mZmljaWFsbHlSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJPZkZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzQ29ycmVzcG9uZGVudEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmlvck1lbWJlcnNoaXBQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWFuY2VTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsdGVyZWRXb3Jrc2hvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGluZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nU2NoZWR1bGVJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWJsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmlmaWNhbnRPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUGhvdG9uRW1pc3Npb25Db21wdXRlcml6ZWRUb21vZ3JhcGh5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZU9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ29yT3RoZXJMb25nLVRlcm1DYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3RDaGFydGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQmFzZVN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxDb250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5RGlzYWR2YW50YWdlZEluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5SW5zdXJlZFBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdGllc0NvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlPZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNBbmRBbmFseXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9BbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0lmRGlmZmVyZW50RnJvbUJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZVByb3ByaWV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlUGFydHlPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvdW5zZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkTW9iaWxlUmFkaW9TZXJ2aWNlTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkT3V0cGF0aWVudFByb2dyYW1Gb3JBSURTT3JBUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVjaFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvcnRzTWVkaWNpbmVDbGluaWNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZUluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWRDb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyZWRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlhdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlS2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yLU5vbWluYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvcldpdGhEaXJlY3RQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJncm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdE9mSW5xdWlyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlck9mU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc1NjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnlEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzZnVsSm9iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc2luZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyT3JNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nUGVyc29ubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Rm9yQWRkaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlGb3JBbnRpZHVtcGluZ09yQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGlzY2hhcmdlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlTWFuYWdlbWVudEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycGx1c0RlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3ItUG9mZXNzaW9uYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JUb3BvZ3JhcGhpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJ0aWFyeVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyQ2lyY3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNSYWRpb2lzb3RvcGVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU1hcmtldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlSW5zdXJhbmNlU2VydmljZXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0Rlc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0ZhYnJpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BQYXJlbnRDb21wYW55SW5TYW1lQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZVN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlVW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Q2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRlck9mSGF6YXJkb3VzV2FzdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdW1hQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWVzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0T2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RPckVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXJjdWxvc2lzQW5kT1RoZXJSZXNwaXJhdG9yeURpc2Vhc2VzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlU2FtZUNvdW50cnlQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRyYXNvdW5kVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hc3NpZ25lZEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5leHBlY3RlZEhhbmRsaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNDdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNPdmVyc2Vhc1NlY3VyaXR5QWRtaW5pc3RyYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2l0eS1Db2xsZWdlT3JTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNlcnZpY2VhYmxlTWF0ZXJpYWxDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbk1hbmFnZW1lbnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkTmV0d29ya1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlU2FsdmFnZUFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTWFzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkxvYW5BdXRob3JpemVkU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25Mb2FuR3VhcmFudHlBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcmlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyeUhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWN0aW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZGVvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50ZWVyU2VydmljZXNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVhcm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUtlZXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDYXNpbmdEZXB0aEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBhZENvbnN0cnVjdGlvbkNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xseS1Pd25lZFN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpbm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUHJvc2VjdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3NMYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzc1NtYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21lbnNIZWFsdGhDZW50ZXJPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtUmF5UmFkaWF0aW9uVGhlcmFweVVuaXQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbkNvZGVkIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWxwaGFOdW00MCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iNDAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiIHR5cGU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3R1cmVkTm90ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHZW5lcmFsTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90ZUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90ZVVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGV4dFR5cGVDb2RlZCIgdHlwZT0iVGV4dFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXh0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlN0cnVjdHVyZWROb3RlIiB0eXBlPSJTdHJ1Y3R1cmVkTm90ZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXh0VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkbGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlGb3JCcmVhY2hPZkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJpZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQ29udHJhY3R1YWxTdGlwdWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9SZWNvcmRQT1RleHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsUE9UZXh0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVTZXQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik5hbWVWYWx1ZVNldCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTmFtZVZhbHVlU2V0IiB0eXBlPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVWYWx1ZVNldCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2V0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2V0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVWYWx1ZVNldCIgdHlwZT0iTmFtZVZhbHVlU2V0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJOYW1lVmFsdWVQYWlyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIiB0eXBlPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lVmFsdWVQYWlyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGF0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lVmFsdWVQYWlyIiB0eXBlPSJOYW1lVmFsdWVQYWlyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBdHRhY2htZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBdHRhY2htZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBdHRhY2htZW50IiB0eXBlPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBdHRhY2htZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlZCIgdHlwZT0iQXR0YWNobWVudEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudFB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpbGVOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50VGl0bGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTUlNRVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcGxhY2VtZW50RmlsZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50TG9jYXRpb24iIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9IkF0dGFjaG1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYW5nZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbCIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiIHR5cGU9Ikxpc3RPZk9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1OdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsU2hvcnREZXNjcmlwdGlvbiIgdHlwZT0iQWxwaGFOdW00MCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxSZWZlcmVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZWxpdmVyeUNvbXBsZXRlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZBY2NvdW50QXNzaWdubWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsUmVmZXJlbmNlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQdXJjaGFzZU9yZGVyUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGFsb2dSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udHJhY3RBbmRTeXN0ZW1SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsUmVmZXJlbmNlcyIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxSZWZlcmVuY2VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQdXJjaGFzZU9yZGVyUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJjaGFzZU9yZGVyTnVtYmVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cmNoYXNlT3JkZXJEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cmNoYXNlT3JkZXJMaW5lSXRlbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydGlhbE9yZGVyQ29kZWQiIHR5cGU9IkFTTlBhcnRpYWxPcmRlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRpYWxPcmRlckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cmNoYXNlT3JkZXJSZWZlcmVuY2UiIHR5cGU9IlB1cmNoYXNlT3JkZXJSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFTTlBhcnRpYWxPcmRlckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsT3JkZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGVnb3J5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGVnb3J5SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU3RhbmRhcmRDYXRlZ29yeUlEIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yeSIgdHlwZT0iQ2F0ZWdvcnkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZWNobmljYWxJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeUlEIiB0eXBlPSJTdGFuZGFyZENhdGVnb3J5SUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGFsb2dSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGFsb2dVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGFsb2dJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0YWxvZ0l0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0YWxvZ1JlZmVyZW5jZSIgdHlwZT0iQ2F0YWxvZ1JlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdElEIiB0eXBlPSJDb250cmFjdElEIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdEFuZFN5c3RlbVJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250cmFjdElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5c3RlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdEFuZFN5c3RlbVJlZmVyZW5jZSIgdHlwZT0iQ29udHJhY3RBbmRTeXN0ZW1SZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJSZWZlcmVuY2VDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiIHR5cGU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGVkIiB0eXBlPSJSZWZlcmVuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5UmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBvcnRpbmdSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcG9ydGluZ1N1YlJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlQ29kZWQiIHR5cGU9IlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJicmV2aWF0ZWROZXdEcnVnQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VEVU5TTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlUHVyY2hhc2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VTdXBwbGllcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NvcmlhbFJhaWxEaXZlcnNpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc29yaWFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdFcXVpcG1lbnRMb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0ZpbGVSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRNYW5hZ2Vyc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXJ0eXNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGFydHlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGF5YWJsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFNlcnZpY2luZ0JhbmtzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVDdXN0b21lckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlT3Blbkl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZVN0YXRlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE9mT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzZWVSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUmVwcmljZWRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRSZXByaWNlZExpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Q29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudE1lbW9DaGFyZ2VCYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzYXJ5Q2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZDb2xsZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VUaHJvdWdoQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFlcm9uYXV0aWNhbEVxdWlwbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZlY3RlZFN1YnN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lBc3NpZ25lZEVtcGxveWVlSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUFzc2lnbmVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSURBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5SGllcmFyY2hpY2FsTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5c1N0dWRlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Q2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Q29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1NoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBR0VSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ29UcmFuc2Zlck1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEaW1lbnNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVzRmxpZ2h0SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZWNpcGllbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQ2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWJ1bGF0b3J5UGF0aWVudEdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGVkVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5CYW5rZXJzQXNzb2NpYXRpb25UcmFuc2l0T3JSb3V0aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkdhc0Fzc29jaWF0aW9uRXF1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuT3N0ZW9wYXRoaWNBc3NvY2lhdGlvbkNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlRGVkdWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmFseXNpc051bWJlck9yVGVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpYUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFNwZWNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFN0cmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aUR1bXBpbmdDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FibGVDb2VmZmljaWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhYmxlSW5zdHJ1Y3Rpb25zT3JTdGFuZGFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ByaWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseUxpbmVGZWVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Nlc3NtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5VHJhbnNhY3Rpb25TZXRTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnRSZWNvcmRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRDYXNlQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZEludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9ySm9pbmVkVW5pdE5vdFJlc3ViZGl2aWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvckxpbWl0ZWRDb21tb25FbGVtZW50UGFya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvclVuaXRQYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHVyY2hhc2VPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhaWx3YXlBY2NvdW50aW5nUnVsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc3VtaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRhQ2FybmV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdG9taWNTYWZldHlhbmRMaWNlbnNpbmdCb2FyZFBhbmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2hlZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzYXRpb25Gb3JSZXBhaXJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml0eUlzc3VlZEVxdWlwbWVudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uTnVtYmVyRm9yRXhjZXB0aW9uVG9EYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblRvTWVldENvbXBldGl0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvTG9zc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFJldHVybk9yTm90aWZpY2F0aW9uT2ZDaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hFbnRyeURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTdGFuZGFyZEVudHJ5Q2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFRyYWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVSYXRpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja291dFByb2NlZHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZGdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlRHVlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQXNzaWduZWRCYW5rZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQXNzaWduZWRTZWN1cml0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UHJvY2VkdXJlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rc0NvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rc0luZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RlbGVncmFwaGljTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVG9CYW5rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhckNvZGVkTGFiZWxTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhckNvZGVkU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZVBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaE51bWJlck9yTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtQXNzZW1ibHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbk1pbGVNYXJrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0pvYlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdLYW5iYW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ01ldGVyUmVhZGluZ0FjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTWV0ZXJSZWFkaW5nRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxhdGVyYWxDYXJTZXJ2aWNlQWdyZWVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZEhvbGRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0NlbnRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsb2ZNYXRlcmlhbFJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZRdWFudGl0aWVzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5hcnlPYmplY3RJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5Mb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGVuZGVkV2l0aEJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGVuZGVkV2l0aE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVDcm9zc1Byb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlU2hpZWxkUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRlZENhcnJpZXJJbnRlcm5hbFJldmVudWVTZXJ2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlcmVhdU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9yU2FsZXNPZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcnNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRDaGFwdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVvZkxhYm9yYW5kU3RhdGlzdGljc1NjaGVkdWxlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1U2lnbmluZ09SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVTaWduaW5nU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVGF4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNBcHByb3ZhbE1hcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhdGFsb2d1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NyZWRpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RlYml0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRGVidG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU2hpcG1lbnRNYXJrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWRGaWxlTGF5ZXJDb252ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRXhjaXNlRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRmluYW5jaWFsSW5zdGl0dXRpb25CcmFuY2hBbmRJbnN0aXR1dGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Hb29kc0FuZFNlcnZpY2Vzb3JRdWViZWNTYWxlc1RheFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Qcm92aW5jZU9wZXJhdGluZ0F1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Tb2NpYWxJbnN1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuV2hlYXRCb2FyZFBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsZWRSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRSZXBvcnRpbmdJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFJlcG9ydGluZ0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRCaWxsaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRJc3N1ZXJUcmFuc2FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0NvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTWFuaWZlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcm5ldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkQ29uc2lnbmVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRQYWNrYWdlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkU2hpcHBlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNBZ2VudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNDdXN0b21zQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPZk5lZWRQYXJ0eXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc3VhbHR5UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXN1YWx0eVJlcG9ydFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ3VlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFzdHJvcGhlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRlZ29yeU9mV29ya1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkZW50c0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWlsaW5nRm9ybXVsYVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQXV0b21hdGVkRmlsZXNJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQmxvY2tHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU3RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3RTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyQ2hpbGREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlclBhcmVudERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZW9mSW5jb3Jwb3JhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVvZlRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRNYWlsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUk5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU1QVVNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT3JkZXJBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZVZlcmlmaWNhdGlvblByb2NlZHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VOb3RlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNraW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja0xpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEFic3RyYWN0U2VydmljZVJlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhclB1YmxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25PZk9waW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uT2ZTdGF0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuc2hpcERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbEFjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxMaWFiaWxpdGllc29mT2lsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU9mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50c1N5c3RlbVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVzZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyVGV4dENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50Q29tcGFueUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50UmVwb3J0aW5nQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY2FsTGFib3JhdG9yeUltcHJvdmVtZW50QW1lbmRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYWxBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVPZkZlZGVyYWxSZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sZFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdG9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxvY2F0aW9uSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsT3JQcml2YXRlUGFzc2VuZ2VyVmVoaWNsZVF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFjY291bnRTdW1tYXJ5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsYW5kR292ZXJubWVudEVudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlU2FmZXR5QXNzdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWVPblVuaWZvcm1TZWN1cml0eUlkZW50aWZpY2F0aW9uUHJvY2VkdXJlc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25BY2Nlc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kUGxhY2VSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRTeW5kaWNhdGVSZWZlcmVuY2UxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kU3luZGljYXRlUmVmZXJlbmNlMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUlzc3VlZEVxdWlwbWVudElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5UGVuZGluZ1NhbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVNhbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVZlcmlmaWNhdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0ZW50QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFVuaXRzUGF5bWVudFJlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbk9mUHVyY2hhc2VEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uT2ZTYWxlRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRvbWluaXVtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmdyZXNzaW9uYWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGluZ0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0Z1cnRoZXJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1JlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNTaGlwbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRDbGFzc2lmaWNhdGlvbklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzRnVydGhlck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uU2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvcnNSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJhaW50Tm90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtcHRpb25EYXRhUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3JFcXVpcG1lbnRSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPclBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc3Bvc2l0aW9uT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9wZXJhdG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyb3JFcXVpcG1lbnRSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJQcmVmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXb3JrT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbkZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzTW92ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c1RyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkZGVuZHVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF1ZGl0b3JJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCcmVha2Rvd25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29vcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RIb2xkZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0T3B0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRGF0YVJlcXVpcmVtZW50c0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JFc3RhYmxpc2htZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGFydHlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGlvbkNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuYm9yZUNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QWxsb2NhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdGFSaWNhbkp1ZGljaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Q2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0RWxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5QnVzaW5lc3NSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUxlZ2lzbGF0aXZlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkRpc3RyaWJ1dGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uUmVkZW1wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDb3Vuc2VsaW5nSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE1lbW9OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvckRlYml0QWRqdXN0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSYXRpbmdBZ2VuY3lzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3NpdG9yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsaXR5RGVzaWduYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JvcFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzTGlzdGVkQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1M1NEtleVRyYWluSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1M1NEtleVRyYWluSW5kaWNhdG9yR3JvdXBOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Q2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50b3JMYXRlc3RDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZVBlcmlvZFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1hdGVyaWFsU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQcm9jZXNzU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyQXNzaWduZWRUb1ByZXZpb3VzQmFsYW5jZU9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1JlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1VuaXRJbnZlbnRvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyVHJhY2tpbmdOdW1iZXJGb3JMb2FuZWRNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCYXJDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjaXNpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEcmF3YmFja0VudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zR3VhcmFudGVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zaG91c2VCcm9rZXJMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ByZWZlcmVuY2VJbnF1aXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNWYWx1YXRpb25EZWNpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1NlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1RyYW5zcG9ydExpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFBdXRoZW50aWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUl0ZW1EZXNjcmlwdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVF1YWxpdHlSZWplY3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFSZWxpYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdHJ1Y3R1cmVUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJwdXJjaGFzZW9yZGVybnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJUeXBlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c0N1c3RvbXNJZGVudGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZWN0Q29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZUZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlUHJpb3JpdGllc0FsbG9jYXRpb25TeXN0ZW1Qcmlvcml0eVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJtZW50QXBwcm92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGF5bWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUcmFpbGVyTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbFJlYXNvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHlPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsSW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50aXN0TGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yQWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZBZ3JpY3VsdHVyZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mQ29tbWVyY2VBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VGb3JtMjUwUmVxdWlyZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERFRTQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkVkdWNhdGlvbkFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mRW5lcmd5QWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISFNBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVEQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkludGVyaW9yQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZKdXN0aWNlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZMYWJvckFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mU3RhdGVBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZnRoZVRyZWFzdXJ5QWNxdWlzaXRpb25PclByb2N1cmVtZW50UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVHJhbnNwb3J0YXRpb25BY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZlRyYW5zcG9ydGF0aW9uQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVHJhbnNwb3J0YXRpb25IYXphcmRvdXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlZldGVyYW5zQWZmYWlyc0FjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRXaGVyZUluanVyeU9jY3VycmVkSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50c0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3J5VHJ1c3RDb21wYW55SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYXRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzY3JpcHRpb25PZkNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQWR2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVQb3N0UGFyY2Vsc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbm9mU2hpcG1lbnRIYXJtb25pemVkQmFzZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlYml0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5SW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eUluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRlclJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGVuc2F0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbFR1cm5JbkRvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwdXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25DZW50ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblN0YXRlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQXNzaWduZWRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JBc3NpZ25lZFRyYW5zYWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRPckludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc0FjY291bnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzUmVwcmVzZW50YXRpdmVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzU3BsaXRBZ2VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5UGF5bWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbkFmZmVjdGVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Vm9sdW1lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZsaWdodE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNJbnZlbnRvcnlNYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taWNpbGVCcmFuY2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWluaW9uT2ZDYW5hZGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtU2hpcHBlckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5ob2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3ZWVzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk9yZGVyQmxhbmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdGb3JtdWxhcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0VVM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVTlNOdW1iZXJ3aXRoRm91ckNoYXJhY3RlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFVOU051bWJlckR1bkFuZEJyYWRzdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZUJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZVdheWJpbGxpblJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVXYXliaWxsTm90SW5Sb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUZyZWVQcm9kdWN0c1JlY2VpcHRBdXRob3Jpc2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RnJlZVByb2R1Y3RzU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlNZW1vTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Rpb25EaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY2RldmljZXBpbm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0Z1bmRzVHJhbnNmZXJJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1BheW1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZXZhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb1Blcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtaXNzaW9uRGVzaWduYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVPck5vbkVtcGxveWVlQ2xhc3NpZmljYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGF4RmlsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJJZGVudGlmaWNhdGlvbk51bWJlck9mU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyc1NvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50VmlzYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVJlcG9zaXRpb25pbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0pvYlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdLYW5iYW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ01ldGVyUmVhZGluZ0FjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTWV0ZXJSZWFkaW5nRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE1pbGVNYXJrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZXJzUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VQcm9wb3NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnF1aXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXJDaGlsZERtciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXJQYXJlbnREbXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5QWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeVRlc3RUeXBlUHVycG9zZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5VHJhbnNwb3J0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SW5pdGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRPd25lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFRyYW5zcG9ydENoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXZhbGVudENvdXJzZU51bWJlcmF0UmVxdWVzdGluZ0luc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvcklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93RmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV0ZXJtc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzVHJhbnNwb3J0YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXREaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwYW5zaW9ub25FZmZlY3RvZkNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q2xlYXJhbmNlSW5zdHJ1Y3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEVzdGFibGlzaG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZE9yRXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5TWVhc3VyZW1lbnRQb2ludE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlOZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVBbmFseXNpc1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZW1lY2hhbmlzbW51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5TWVtYmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseVVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVNlbGxlclNlcnZpY2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEJ1cmVhdU9mSW52ZXN0aWdhdGlvbkluZGl2aWR1YWxJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvbkNvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uVHJhZGVPckJyYW5kSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEVuZXJneVJlZ3VsYXRvcnlDb21taXNzaW9uQ2VydGlmaWNhdGVPZlB1YmxpY0NvbnZlbmllbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSExNQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0FkbWluaXN0cmF0aW9uQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hVTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQWRtaW5pc3RyYXRpb25PcmlnaW5hdG9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblJlc291cmNlc01hbmFnZW1lbnRSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWFyaXRpbWVDb21taXNzaW9uRm9yd2FyZGVyc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1hcml0aW1lQ29tbWlzc2lvblRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5U2NoZWR1bGVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUYXhwYXllcnNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFdpcmVUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVEV0lSRUNvbmZpcm1hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlU2NoZWR1bGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUNvbnZlcnNpb25Kb3VybmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlTGluZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyQ29kZUlzc3VlZGJ5QnVyZWF1T2ZDZW5zdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyQ29kZUlzc3VlZEJ5Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyUHJvdG9jb2xMb2NhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxXb3JrQ2FuZGlkYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbERldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBoYXNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTZXR0bGVtZW50UGFydHlzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5lTGluZUNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0VHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZXhpYmxlU3BlbmRpbmdBY2NvdW50SW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxleGlibGVTcGVuZGluZ0FjY291bnRJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kRGF0YUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yUGxhbkFwcHJvdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25BY2Nlc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Qcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvblByb2R1Y3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3N1cmVBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZUNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblRyYWRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZXN0cnlQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hbFN0YXRlbWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JQaWNrdXBMaW1pdGVkRnJlaWdodFRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc09yQWdlbnRzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VUYXhBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjU2VsbGVyU2VydmljZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVab25lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5b3JSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxUaW1lT3JQYXJ0VGltZUVtcGxveWVlQ2xhc3NpZmljYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFdvcmtHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZE1hbmFnZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0F1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0FuYWx5c2lzU291cmNlTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0N1c3RvZGlhbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxEZWNsYXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbExlZGdlckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFB1cnBvc2VNZXNzYWdlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljRGVzdGluYXRpb25ab25lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljSW5kZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNLZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNTY29yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lubmllTWFlUG9vbFBhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNhbmRTZXJ2aWNlVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5pbmdDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBY2NvdW50aW5nQ2xhc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZHZhbmNlUHJvZ3Jlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsb2ZMYWRpbmdPZmZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Q29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRQcmlvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFF1YWxpdHlBc3N1cmFuY2VBbmRDb250cm9sTGV2ZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRUcmFuc3BvcnRhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluQmxvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXZpdHlTb3VyY2VNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlZW5DYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFjY291bnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE9yUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvd3RoRmFjdG9yUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbmlzZWRTeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbml6ZWRDb2RlU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXN0ZW5pbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0V4ZW1wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVNYW5pZmVzdERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25OYXRpb25hbFBheWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbk5hdGlvbmFsUHJvdmlkZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlTWFucG93ZXJTaG9ydGFnZUFyZWFGYWNpbGl0eUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQ0NMYWJlbGVySWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUmF0aW5nQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUmF0aW5nU3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Db2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaE9yV2lkZUZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdEJsb2NrTnVtYmVyQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdENvdW50eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RNZXRyb3BvbGl0YW5TdGF0aXN0aWNhbEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b250YWxDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3JzZXBvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3RSb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZUJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhQ2FyZ29BZ2VudENhc3NBZGRyZXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhQ2FyZ29BZ2VudENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRDlDTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25DYXJkU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltYWdlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tZWRpYXRlRXhwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1lZGlhdGVUcmFuc3BvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Q2xlYXJhbmNlSW5zdHJ1Y3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlcnNSZWZlcmVuY2VOdW1iZXJUb0xldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHV0YXRpb25BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkJvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRUb09yT3V0Ym91bmRGcm9tUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRUb1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTGVnYWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmFpbHVyZUNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU2FtcGxlSW5zcGVjdGlvblJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyb3VibGVJbmRpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25hbmRTdXJ2ZXlTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0ZU9mU2VjdXJpdHlBbmRGdXR1cmVNYXJrZXREZXZlbG9wbWVudFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbk5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29udHJhY3RSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZFBhcmNlbFBvc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRzTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlckFzc2lnbmVkUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cm9yUG9vbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTG9naXN0aWNTdXBwb3J0Q3Jvc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXN0ZXJQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWFzdGVyU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZU51bWJlck5ldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VOdW1iZXJPbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJnb3Zlcm5tZW50YWxNYXJpdGltZU9yZ2FuaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUZ1bmRpbmdPcmdhbml6YXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxDdXN0b21lck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxEYXRhUHJvY2Vzc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxQdXJjaGFzZU9yZGVySXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxQdXJjaGFzZU9yZGVyUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxWZW5kb3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlckNoaWxkRGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlclBhcmVudERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZsaWdodE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZ1ZWxUYXhBZ3JlZW1lbnRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmVnaXN0cmF0aW9uUGxhbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZWdpc3RyYXRpb25QbGFuU3RpY2tlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uRG9taW5pb25PZkNhbmFkYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEluZHVzdHJ5Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnN0YXRlQ29tbWVyY2VDb21taXNzaW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmFQbGFudFJvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yaWFsTmV3RHJ1Z051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yQXNzaWduZWRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3Rvck5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTnVtYmVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEYXRhU2hlZXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25DaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTRk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yUHJvamVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludENyZWRpdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50bHlBZG1pbmlzdGVyZWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbmFsQ29tbXVuaXR5TmFtZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbmFsQ29tbXVuaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck9wZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JvckFmZmlsaWF0aW9uSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGVFeHByZXNzZWRpbkRlZ3JlZXNNaW51dGVzYW5kU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGVFeHByZXNzZWRpblNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUFncmVlbWVudEFtZW5kbWVudE51bWJlck1hc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VDb250cmFjdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJCbGFua2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyUHJpb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJSZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyRW50aXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZUJpbGxDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyb2ZDcmVkaXREcmFmdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcm9mQ3JlZGl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJzb3JOb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2eWluZ09mZmljZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVBsYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlQmlsbGluZ0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VCaWxsaW5nU3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFBhcnRuZXJzaGlwSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZW9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkNyZWRpdENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5rU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T2ZNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxsb3lkc0NsYWltc09mZmljZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRMaW5lQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRQbGFubmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkFjcXVpc2l0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Qcm9zcGVjdG9yS2V5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGx5QXNzaWduZWRDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE1lZGlhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTY2hvb2xDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2Nob29sRGlzdHJpY3RDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU3R1ZGVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkV4Y2VwdGlvbk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25vblByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvblNwZWNpZmljU2VydmljZXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uV2l0aGluRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NrYm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc2FuZENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpc3RpY3NTdXBwb3J0RG9jdW1lbnRhdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGVFeHByZXNzZWRJbkRlZ3JlZXNNaW51dGVzYW5kU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRlRXhwcmVzc2VkaW5TZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NPckV2ZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyQXJ0aWNsZU51bWJlck9mUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ2F6aW5lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGJveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFNsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQXZhaWxhYmlsaXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckZvcmNlUHJvZ3JhbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JTeXN0ZW1BZmZlY3RlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2Vnb29kQ29tbWVyY2lhbExpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5Q2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEtleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsUHJvY2Vzc2luZ0F1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyRGVmaW5lZFJlcGFpclJhdGVzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNNYXRlcmlhbFNhZmV0eURhdGFTaGVldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdEaXJlY3RpdmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdPcGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lRGVjbGFyYXRpb25vZkhlYWx0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZ09yTGFiZWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFpcldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxhYmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMZWFzZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJTb2xpY2l0YXRpb25Qcm9jZWR1cmVzVGVybXNBbmRDb25kaXRpb25zTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTdG9yYWdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyZWRDZXJ0aWZpY2F0ZU9mRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdFByb2Nlc3NpbmdFc3RhYmxpc2htZW50UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFJlY2lwaWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQXNzaXN0YW5jZUNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsUmVjb3JkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlVmVyc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW5kaXNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQWRkcmVzc29ySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZURlc2lnbkdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJQcm92aW5nUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmdBdFRoZUJlZ2lubmluZ09mVGhlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZ0F0VGhlRW5kT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlDUk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljcm9maWxtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWdyYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5Q2FsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJbnRlcmRlcGFydG1lbnRhbFB1cmNoYXNlUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlPcmRuYW5jZVNlY3VyaXR5Umlza051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlSYW5rT3JDaXZpbGlhblBheUdyYWRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxpbmdpblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJveWFsdHlQYXlvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlcmlhbENlcnRpZmljYXRlT2ZIb21vbG9nYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWx5ZWFybnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c0luc3RpdHV0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzVXNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhY2tlZFNlY3VyaXR5TG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYWNrZWRTZWN1cml0eVBvb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblN5c3RlbU9yZ2FuaXphdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZUxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlQ29tcGFueU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VJbmRpY2F0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckNhcnJpZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JGdWVsQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZUlETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aWZhbWlseVByb2plY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZUFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VCb29rVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZU1hcFhDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlTWFwWUNvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VTdWJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBPT2ZBbkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlWm9uZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHlBc3NpZ25lZEJ1c2luZXNzUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZWRCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBZXJvbmF1dGljc2FuZFNwYWNlQWRtaW5pc3RyYXRpb25GQVJTdXBwbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCb2FyZHNPZlBoYXJtYWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZJbnN1cmFuY2VDb21taXNzaW9uZXJzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENyaW1pbmFsSW5mb3JtYXRpb25DZW50ZXJPcmlnaW5hdGluZ0FnZW5jeUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvbW11bml0eU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ29tbXVuaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1NYXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsR292ZXJubWVudEJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyYWxHYXNQb2xpY3lBY3RDYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RydWdBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SGVhbHRoSW5zdXJhbmNlQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZW50YWxBZ3JlZW1lbnRSZWFzb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTaGlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyQ29udGludW91c01vdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uQW1lcmljYW5JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uQ29uZm9ybWFuY2VSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk5lZ290aWFibGVNYXJpdGltZVRyYW5zcG9ydERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcmlnaW5hdGluZ1RoaXJkUGFydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblBpY2t1cExpbWl0ZWRUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblByb3Zpc2lvbmFsUGF0ZW50QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblNwb3VzZVRpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9PVDVBdXRob3JpdHlaZXJvTWlsZWFnZVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5EYXR1bVN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuRnJlZVRyYWRlQWdyZWVtZW50Q29tcGxpYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkhhemFyZG91c0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSGF6YXJkb3VzR29vZHNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkluZHVzdHJpYWxDbGFzc2lmaWNhdGlvblN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PVElDT0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGVtcG9yYXJ5SW1wb3J0YXRpb25Eb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJvZGVDZWR1bGFkZUlkZW50aWRhZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJvZGVJZGVudGlmaWNhY2lvblRyaWJ1dGFyaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9iamVjdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eWFuZEhlYWx0aEFkbWluaXN0cmF0aW9uQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkJpbGxvZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Db250YWluZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVuZGVyVHJhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVuc2VUcmFja2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlckxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZUNhbGxBZ2VuY3lUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ubGluZVByb2N1cmVtZW50YW5kQWNjb3VudGluZ0NvbnRyb2xUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBhaWRTdGF0aW9uTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckFzc2lnbmVkVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JMZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9yUGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXJzU2Vjb25kUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkJyZWFrZG93blN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGZG9UcmFuc2FjdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmV0dXJuUmVxdWVzdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTaGlwcGVyc0JpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJDaGlsZERhdGFNYWludGVuYW5jZVJlcXVlc3RMb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyTG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlclBhcmVudERhdGFNYWludGVuYW5jZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFZvdWNoZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdEZXBvc2l0b3J5RmluYW5jaWFsSW5zdGl0dXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk9mU2hpcG1lbnRIYXJtb25pemVkQmFzZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVDVBdXRob3JpdHlDb25kaXRpb25PclJlc3RyaWN0aW9ub25DYXJIaXJlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFR5cGVPZlJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0Ym91bmRGcm9tUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZCbG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJwYWNrYWdpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0b2ZTZXJ2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdCdXJlYXVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0FuZEhvbGRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0dyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0xpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWdyYXBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsSUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudEZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRDYXVzaW5nUmVwYWlyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0Q29uc2lnbm1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxQYXltZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydEludGVyY2hhbmdlYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlZmVyZW5jZUluZGljYXRvckluQURyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5mb3JtYXRpb25NZXNzYWdlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudENvb3BlcmF0aW9uVHJlYXR5QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNGaW5hbmNpYWxJbnN0aXR1dGlvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0ZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNpdFJvdXRpbmdObyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllckFzc2lnbmVkUmVzdWJtaXNzaW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllckNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNpdFJvdXRpbmdObyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SGlzdG9yeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluQWR2YW5jZVJlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbnN0YWxtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBsYW5SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW9yc0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGNzQ2F0YXN0cm9waGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25BcHByb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZGluZ0Nhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbnNpb25Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSWRlbnRpdHlDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qb29sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lQcmVzY3JpcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob25lQ2FsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsSW52ZW50b3J5UmVjb3VudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlT2ZBY3R1YWxQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlT2ZBR2VuZXJpY1Byb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZ2d5YmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsb3RGaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lMaW5rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGx1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbENvbnRyYWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0RW50cnlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZUF3YXJkU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW5jdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGVjZXNzb3JBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkZXRlcm1pbmF0aW9ub2ZCZW5lZml0c0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRDYWxsU2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25TaXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVdvcmtDYW5kaWRhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1hcmtldEFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtYXJrZXROb3RpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFByaW9yaXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0UHVycG9zZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFR5cGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUmF0ZVRhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlcnNWZXJpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3NGb3JtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3NJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JpbGxvZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDYXJnb0NvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2xhaW1IaXN0b3J5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0T3JEZWJpdEFkanVzdG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0QWR2aWNlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlbGl2ZXJ5SW5zdHJ1Y3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVsaXZlcnlTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEaXN0cmlidXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNIaWdoZXN0U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlcG9ydGVkU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWVtYmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1BvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcXVlc3RGb3JNZXRlcmVkUmVhZGluZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTY2hlbWVPclBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2VxdWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2hpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlckNvbnRpbnVvdXNNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RheENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZU9yU2FsZXNDYXRhbG9ndWVSZXNwb25zZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBcmVhTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3RDaGFuZ2Vvcklzc3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdFZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlUXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlVmFyaWF0aW9uRm9ybXVsYVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckRhdGFVbml2ZXJzYWxOdW1iZXJTeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySWRlbnRpZmllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQaG9uZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUG9zdGFsWmlwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcnB1cmNoYXNlb3JkZXJudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVHJhZGluZ1BhcnRuZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml2ZXJzYWxQcm92aWRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZWVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ1BsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yc0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50QnVkZ2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudFJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmluZ0FnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZUF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZUluZm9ybWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGljZW5zaW5nQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBlcmlvZEZvcldoaWNoTGFib3JDb3N0c0FyZUZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RSZXNlcnZhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNvdXJjaW5nQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3BlY2lmaWNhdGlvbkRvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yRGVhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUNvbXBvbmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5TG9zc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2FsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NhbFBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRHcm91cFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvY29sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90cmFjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDb21tZXJjaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyT3JkZXJUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyUGxhbk5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJTaXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclVQSU5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpbmNpYWxDYW5hZGlhblNhbGVzVGF4RXhlbXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aW5jaWFsVGF4SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUGF0ZW50QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uSXNzdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0RlZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0ZpbGluZ1JlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljVXRpbGl0aWVzQ29tbWlzc2lvbkNlcnRpZmljYXRlT2ZQdWJsaWNDb252ZW5pZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcHRpb25BZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJMaW5lSXRlbUlkZW50aWZpZXJCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlckluY2x1ZGVkaW5Pbk9yZGVyUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJPZk9yZGVyUmVjZWl2ZWRTaW5jZUxhc3RSZXBvcnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyT2ZTaGlwbWVudFJlY2VpdmVkU2luY2VMYXN0UmVwb3J0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlc3BvbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlUmVxdWlzaXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQWN0aXZpdHlDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmllZE1hdGVyaWFsc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmllZFByb2R1Y3RzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eURpc3Bvc2l0aW9uQXJlYUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnNwZWN0aW9uQXJlYUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSZXZpZXdNYXRlcmlhbENyaWJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lT3JUcmVhdG1lbnRTdGF0dXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU2VjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTcG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVzdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlT3JTaG9wcGluZ0NhcnRJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFja1R5cGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxPclJvYWRSb3V0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb21taXNzaW9uT2lsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbW1pc3Npb25SZWNvcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFdheUJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDb25zaWdubWVudE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlXYWdvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvbmZlcmVuY2VJRENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhd21hdGVyaWFsU3VwcGxpZXJEdW5BbmRCcmFkc3RyZWV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlT3duZWRQcm9wZXJ0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uTm90TG93ZXN0Q29zdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjYWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBc3NpZ25lZERyb3Bab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcklEUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNGaWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclN1YklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdBZHZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmtzQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29tcGFueUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0RlcG9zaXRvcnlGaW5hbmNpYWxJbnN0aXR1dGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUGFydHlzTWVtYmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uY2lsaWF0aW9uUmVwb3J0U2VjdGlvbklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y2VkRWFybmluZ1dlZWtJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRQYXR0ZXJuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZURyYXdpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlckFzc2lnbmVkQnlUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJPZkFSZXF1ZXN0Rm9yTWV0ZXJlZFJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlclF1b3RlZE9uU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJUb1ByZXZpb3VzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkUHJvZHVjdEZvckNoZW1pY2FsQW5hbHlzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkUHJvZHVjdEZvck1lY2hhbmljYWxBbmFseXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXJpc3RvRmVkZXJhbERlQ29udHJpYnV5ZW50ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lyaXN0b0ZlZGVyYWxkZUNvbnRyaWJ1eWVudGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ2FwaXRhbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRNYWlsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk51bWJlck9mUHJldmlvdXNDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvSW5mb3JtYWNpb25GaXNjYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvTmFjaW9uYWxkZUNvbnRyaWJ1eWVudGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvVW5pY29kZUNvbnRyaWJ1eWVudGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRpb25QcmltYXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0aW9uU2Vjb25kYXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5R3VpZGVsaW5lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJlcnNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpc3N1ZUNlc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWROb25jb25mb3JtYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE9iamVjdElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRWZW5kb3JPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUludm9pY2VOdW1iZXJGb3JQcmlvckJpbGxBbmRIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlQWR2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50UGF5b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJDYXRlZ29yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRGF0YVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckVzdGltYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZWF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVCb29raW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlQ2FyZ29TaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZVBhdHRlcm5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlV2F5YmlsbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50QXNzZW1ibHlNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRBc3NlbWJseVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnREcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjaW5nUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyUmFuZ2VFbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyUmFuZ2VTdGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmljZWRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmljZWRMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckNhbmNlbGxhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGZvclF1b3RhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZUFzc2VtYmx5TGluZUZlZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VTY3JlZW5pbmdSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlVXRpbGl6YXRpb25Hcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2V0b2FSZXF1ZXN0Zm9yUXVvdGF0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXZhaWxhYmlsaXR5QXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEF2YWlsYWJpbGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb25SZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pdG51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsTWVyY2hhbnRzQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudFBsYW5BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50UGxhblBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lclNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRHb29kc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkdvb2RzQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5NYXRlcmlhbEF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVudWVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3ZXJGaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENvbnNpZ25tZW50Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckVtZXJnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ0luc3RydWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGVTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmVrZWVwaW5nQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5RXF1aXBtZW50Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eW9mUmFkaW9DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5b2ZTaGlwQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT3JUZXJyaXRvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FsbG93YW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNEZXBhcnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0ZvcmVjYXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQZXJzb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJvZ3JhbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZWdpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcHJlc2VudGF0aXZlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVzcG9uc2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F2aW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbkxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlbWVPclBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbExvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE9mZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFyY2hLZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNvdmVyYWdlQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNvdmVyYWdlQ29tcGFueU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q3VzdG9tc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5RW1wbG95ZWVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5SGVhbHRoSW5zdXJhbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVN1ZmZpeENvZGVJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEJlbmVmaWNpYXJ5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpYWRlQ29tZXJjaWF5RmFtZW50YUluZHVzdHJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyeW9mU3RhdGVBc3NpZ25lZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uT2ZUaGVOYXRpb25hbEhvdXNpbmdBY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eUluc3RydW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyYW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlckF1dGhvcml6YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZXJPcmdhbml6YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQ2F0YWxvZ3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0RlYml0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNTYWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nQXJyYW5nZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlckRlZmluZWRDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNGaWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzUmVmZXJlbmNlVG9UaGVPcmlnaW5hbE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdCYW5rUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nQ29tcGFueUF1ZGl0TnVtYmVyQXV0b21hdGVkQ2xlYXJpbmdob3VzZVRyYW5zZmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdWxsZXRpbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRXN0aW1hdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VHcm91cElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlSW50ZXJydXB0VHJhY2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1lZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERlc3RpbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRPcmlnaW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdGljZU9yTWFuaWZlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBvd25lcnNBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ2FyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNIYXphcmRvdXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGFiZWxTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRUZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVHJhbnNhY3Rpb25TZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lSRU5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJUkVUTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlU3BlY2lmaWNQcm9jZWR1cmVzVGVybXNBbmRDb25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXR1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlclBsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxJbnN1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5b2ZQcm9wZXJ0eUluZm9ybWF0aW9uQ29tcGlsZXJzYW5kQW5hbHlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydEFuZFNlZ3JlZ2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlRG9jdW1lbnRJbnRlcm5hbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ1VuaXRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQnVkZ2V0QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENoYXJnZU9yQWxsb3dhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEdvdmVybm1lbnRBY2NvdW50aW5nQ2xhc3NpZmljYXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxJbnN0cnVjdGlvbnNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNb3ZlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFja2FnaW5nSW5zdHJ1Y3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYXltZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvY2Vzc2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbHR5TGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbkNsYXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uUmV2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpbWVuSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRCb29raW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFByZW1pdW1BdWRpdENoYW5nZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VUaWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkTnVtYmVyT2ZJbnNwZWN0aW9uRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUG9pbnRMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc0NvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVCcmlkZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlUmVwbGFjZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGluZ1BhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQXNzZW1ibHlEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvbnRyb2xsZWRTdWJzdGFuY2VMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNyaW1pbmFsSGlzdG9yeVJlcG9zaXRvcnlJbmRpdmlkdWFsSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGVwYXJ0bWVudEkyMEZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGVwYXJ0bWVudElBUDY2Rm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVIYXphcmRvdXNXYXN0ZUVudGl0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlSW5kdXN0cmlhbEFjY2lkZW50UHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGVnaXNsYXRpdmVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMaWNlbnNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnRPZldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTm9uUmVzaWRlbnRWaW9sYXRvckNvbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jZUFzc2lnbmVkQnVzaW5lc3NSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlQXNzaWduZWRFbnRpdHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYWxlc1RheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNlbmF0ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVN0dWRlbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGV3aWRlQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb21wYW55SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tLZWVwaW5nVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJhc3NlbWJseU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JEYXRhUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJkYXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmRpdmlzaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJGaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJob3VzZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Tm9uU2FsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlWZXJpZmljYXRpb25Tb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmxpbmVvZkluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXJ2aWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViU2VydmljZXJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGFudGl2ZWx5Q29uc29saWRhdGVkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUFpcldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZU5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJTdWJob3VzZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2Vzc29yQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcmludGVuZGVuY2lhZGVJbnZlcnNpb25lc0V4dHJhbmplcmFzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yeUFwcHJhaXNlckNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEFncmVlbWVudEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckRvY3VtZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NyZWRpdENsYWltUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUJvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVE1UMTAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVE1UMjAyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVENvbmZpcm1hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltYm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1ib2xOdW1iZXJGb3JNaWxlc3RvbmVPckxPQlJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZW9mSHVtYW5hbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWVJbmZvcm1hdGlxdWVQb3VyTGVSZXBlcnRvaXJlRGVzRW50cmVwcmlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWVJbmZvcm1hdGlxdWVQb3VyTGVSZXBlcnRvaXJlRGVzRXRhYmxpc3NlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlBhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlJ1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlNlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlN1ZmZpeE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU3VwcGxlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFza09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0aW9uTGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEZvcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpbmdBdXRob3JpdHlJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGljZW5zZUV4ZW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGllbkp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhTY2hlZHVsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFNoZWx0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFdvcmtzaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVENOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtQXNzaWdubWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnRhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxJbmZvcm1hdGlvblBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxQaGFzZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25DaXJjdWl0U3VwcGxlbWVudGFsSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4TWVzc2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxSZWxlYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRFbGVtZW50SWRlbnRpZmllckRlbGV0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyU2NyZWVuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZEJhbmtzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZEJhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWRtaW5pc3RyYXRvckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5Tm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5T3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU9yaWdpbmF0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVySXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVyUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaEJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSVJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlQ29tcGFueUNvZGVCb29rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZURvY3VtZW50U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVYSVhJZGVudGlmaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2t5b1Nob2tvUmVzZWFyY2hCdXNpbmVzc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbGxCaWxsaW5nVGVsZXBob25lUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEN5Y2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9yZGVyQ3ljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25zaGlwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3hpY29sb2d5SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNlckFjdGlvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVyQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGluZ1BhcnRuZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclR5cGVRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJVc2VBZ3JlZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0ZsaWdodE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25DYXRlZ29yeU9yVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0R3VhcmFudGVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvbmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BY2NvdW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uRXhwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblByaW9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250cmFjdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29zdHNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRSZXR1cm5SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0cmlwcGluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHVmZmluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U2VjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBsZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrZXJzQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU1JCdXNpbmVzc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkVzY3Jvd051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSG91c2Vob2xkR29vZHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMYXdTdWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZPdXRzdGFuZGluZ0p1ZGdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTY2llbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkRlZmVuc2VGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9uU3VwcGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkRlcGFydG1lbnRPZlZldGVyYW5zQWZmYWlyc0FjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkdvdmVybm1lbnRUcmFuc3BvcnRhdGlvbkNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlRFVOU051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlUHVyY2hhc2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZVN1cHBsaWVySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ0FsZXJ0UmVmZXJlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5lbXBsb3ltZW50SW5zdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdDb2xsYXRlcmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ2xhaW1zUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNvbnNpZ25tZW50SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUN1cnJhY1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVNYXJrZXRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZVJlaW5hY1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVTdXBwbGllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zSGF6YXJkb3VzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0dvdmVybm1lbnRWaXNhTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNTdGFuZGFyZE1ldHJvcG9saXRhblN0YXRpc3RpY2FsQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlbGllZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlcG9ydFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlcG9ydFBlcmlvZElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0VHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFJhaWxyb2FkUmV2ZW51ZVdheWJpbGxJZGVudGlmaWVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JFYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JOb3J0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWlkSW5zdGFsbG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwcGVyU2VyaWFsTnVtYmVyT2ZSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1TaGlwcGVyQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ0ZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQW50aUR1bXBpbmdEdXR5Q2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUJpbmRpbmdSdWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VDb21tZXJjaWFsRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VDb3VudGVydmFpbGluZ0R1dHlDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VFbnRyeVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlUHJlQXBwcm92YWxSdWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VQcmVDbGFzc2lmaWNhdGlvblJ1bGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVN0YXRlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNET0VBbmROQ0VTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RPVEJvbmRTdXJldHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGQ0NJbXBvcnRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGZWRlcmFsSW5mb3JtYXRpb25SZXNvdXJjZXNNYW5hZ2VtZW50UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uRXN0YWJsaXNobWVudEluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR292ZXJubWVudEFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmF0UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQnVzaW5lc3NVc2VRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUmFkaXVzb2ZPcGVyYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSZWxhdGVkU2VydmljZXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVTaXplQ2xhc3NRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckFiYnJldmlhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoYW5nZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hhbmdlUHJvY2VkdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcklETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JPcmRlck51bWJlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1ByZXZpb3VzSm9iTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JUZXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uU291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbkNvZGVMb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbkNvZGVOYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVydGljYWxDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbEFnZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbk9yaWdpbmF0b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZmZhaXJzQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNhVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVQdXJjaGFzZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm91Y2hlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlUGlja1RpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU3RvcmFnZUxvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eUNvdmVyYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlYXBvblN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sVGF4UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdTaGlmdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0l0ZW1RdWFudGl0eURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtTaGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NpdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUYXNrQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFyZFBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkJhc2VJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNpbmdEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iRGVsaXZlcnlEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUm91bmRUcmlwSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxpbmVJdGVtTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxpbmVJdGVtQXR0YWNobWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiIHR5cGU9Ikl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2VJdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxpbmVJdGVtTnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkxpbmVJdGVtVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFyZW50SXRlbU51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSXRlbUlkZW50aWZpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1heEJhY2tPcmRlclF1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZRdWFudGl0eUNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPZmZDYXRhbG9nRmxhZyIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2F0YWxvZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUNvbnRyYWN0UmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkNvbnRyYWN0SXRlbSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZJdGVtUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50cnlPZk9yaWdpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvdW50cnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnRyeU9mRGVzdGluYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpbmFsUmVjaXBpZW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbmRpdGlvbnNPZlNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c01hdGVyaWFscyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkhhemFyZG91cyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlSXRlbURldGFpbCIgdHlwZT0iQmFzZUl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxpbmVJdGVtTnVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCdXllckxpbmVJdGVtTnVtIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJMaW5lSXRlbU51bSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1OdW0iIHR5cGU9IkxpbmVJdGVtTnVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaW5lSXRlbVR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtVHlwZUNvZGVkIiB0eXBlPSJMaW5lSXRlbVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaW5lSXRlbVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbVR5cGUiIHR5cGU9IkxpbmVJdGVtVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMaW5lSXRlbVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dEl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDppbnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkxpbmVJdGVtTnVtVHlwZUNvZGVkIiB0eXBlPSJMaW5lSXRlbU51bVR5cGVDb2RlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJCdXllciIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSIgdHlwZT0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTGluZUl0ZW1OdW1UeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbUlkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUGFydE51bWJlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2UiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb21tb2RpdHlDb2RlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGVnb3J5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtSWRlbnRpZmllcnMiIHR5cGU9Ikl0ZW1JZGVudGlmaWVycyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydE51bWJlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnROdW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnV5ZXJQYXJ0TnVtYmVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydE51bSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0YW5kYXJkUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3Vic3RpdHV0ZVBhcnROdW1iZXJzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlckl0ZW1JZGVudGlmaWVycyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydE51bWJlcnMiIHR5cGU9IlBhcnROdW1iZXJzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0TnVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRJREV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmV2aXNpb25OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnROdW0iIHR5cGU9IlBhcnROdW0iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUGFydE51bSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFudWZhY3R1cmVySUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyUGFydE51bWJlciIgdHlwZT0iTWFudWZhY3R1cmVyUGFydE51bWJlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9kdWN0SWRlbnRpZmllciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJFeHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFByb2R1Y3RJZGVudGlmaWNhdGlvbkFzc2lnbmVkQnlUaGVNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nUGFja2FnZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydGF0aW9uQXNzb2NpYXRpb25Qcm9wcmlldGFyeVJpZ2h0c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRpb25NZXRob2RvbG9neUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlSVNCTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5EZW50YWxBc3NvY2lhdGlvbkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnNQYXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Db21wbGV0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxQcm9kdWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJOSUNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29ydGFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUGFydHNMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0aWNUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1eGlsaWFyeVRyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV4aWxsYXJ5VHJhbnNtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhci1Db2RlZFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VDb21tb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYm9hcmRzQ29tbWVyY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbENyZWRpdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxTdWJncm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZE9yTGFiZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclByaWNlT3BpbmlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c0JvZHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyR3JvdW5kU2hhZGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXRhbG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb2xvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRW5kUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRW5naW5lZXJpbmdDaGFuZ2VMZXZlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSW50ZXJuYWxQcm9kdWN0R3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNRdWFsaWZpZXJGb3JTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTaXplQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU3R5bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1N1YmxpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUdFQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZGlkYXRlT2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyeS1PdmVyUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbm5lbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxBYnN0cmFjdFNlcnZpY2VSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMRUlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2duaXphbmNlU3ltYm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xkUm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkTkNDTUFPckJhbmtTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25ZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWVGb3JVbmlmb3JtU2VjdXJpdHlJZGVudGlmaWNhdGlvblByb2NlZHVyZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5R3JvdXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkxhbmd1YWdlRXF1aXBtZW50SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueS1Pd25lZFVuaXRUcmFpbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueVBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhdGlibGVDdXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvbkFsbG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2VwdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpZ3VyYXRpb25JdGVtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdG9yVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFjdGl2aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCcmVha2Rvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q2hhbmdlQXV0aG9yaXphdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRXN0YWJsaXNobWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VHJhbnNmZXJSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25ZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5RnJvbVdoaWNoUHJvY3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkZhbWlseUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VSaXNrVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29tcGFueVJlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclByb3ZpZGVkRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUZhbWlseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzQ29kZVBvaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY29udGludWVkUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRHcm91cGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlkZW5kVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnVVBDQ29uc3VtZXJQYWNrYWdlQ29kZTEtNC02LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdVUENTaGlwcGluZ0NvbnRhaW5lckNvZGUxLTItNC02LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRTdGFuZGFyZFByb2R1Y3RBbmRTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU4yLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU4tOTlJbi1TdG9yZUNvdXBvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmQtSXRlbURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVEaXNwbGFjZW1lbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2RlUGVyQ09QQVNTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SGllcmFyY2hpY2FsU2VxdWVuY2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VkUGFydE9yQXNzZW1ibHlPclByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuZGFibGVDb250YWluZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5zZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBQVNlcnZpY2VCdWxsZXRpbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljUGllY2VzUGVyUm9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkU3ViYXNzZW1ibHlNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkU3ViYXNzZW1ibHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZUFmZm9yZGFibGVMZW5kaW5nUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVByb2plY3RDb25kb21pbml1bUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseUNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWZ0aFdoZWVsU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFRlc3RMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoT3JIYW5kU3RhbmRhcmRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcmVQdW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFByaW9ySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUHVibGlzaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjQWZmb3JkYWJsZUxlbmRpbmdQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1Byb2plY3RDb25kb21pbml1bUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlLVJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZURyaXZlblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlTm9uRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGVTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxUYW5rU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQWJicmV2aWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFN1Yi1BZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0FTRkxPV0ludm9pY2VQb3N0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0FTRkxPV1Byb2R1Y3RvclNlcnZpY2VDaGFyZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRoZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlYXJSYXRpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyaWNOYW1lRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsaWRlcktpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwaGljc0luZHVzdHJ5QmFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdW5kU2hhZGVTdGFuZGFyZFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pc2VkU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQ1BDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQy1IZWFsdGhJbmR1c3RyeUJhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJQkNTdXBwbGllckxhYmVsaW5nU3RhbmRhcmRQcmltYXJ5RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJRUNQcm9kdWN0T3JTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG90Um9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNELTktQ00tUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZ25pdGlvbktleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wcmludC1UcmFkZW1hcmtDb2RlT2ZTdWJzaWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUNvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uTWVkaWFUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQbGFuRGVzY3JpcHRpb25DaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJzRnVuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW9yQ29sb3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXJ0aWNsZU51bWJlcmluZ0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0QtOS1DTS1EaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxIYXJtb25pemVkQ29tbW9kaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkQm9va051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudEZ1bmRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUlNRdWFsaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNCTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtVHlwZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaWZlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uU3BlY2lmaWNQcm9jZWR1cmVBbmRTdXBwbHlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2FuYmFuUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVNhbXBsZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5VGVzdENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWJyYXJ5T2ZDb25ncmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVNlcnZpY2VGZWF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdEdhdGVTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRTZXF1ZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxseUFzc2lnbmVkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMT0lOQ0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdFByaWNpbmdVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUluZGV4UGFnZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JQcm9kdWN0T3JNYXRlcmlhbE9yTWFjaGluZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVhbFRyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFByb2dyYW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29udHJvbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzY2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFzdXJlbWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25CdXJlYXVBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3RvcExvc3NDb3ZlcmFnZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3RvcExvc3NMZXZlbENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3RvcExvc3NQcm9kdWN0TGluZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUVNQVByb2R1Y3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0aG9kT2ZEZWxpdmVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzdG9uZUV2ZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUxTUEVDTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VDcmVkaXREYXRhT3JkZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZVByb2R1Y3RDb2RlT3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlVW5kZXJ3cml0aW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlSWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZS1MaW5lRGVzaWduYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92ZW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTQtNC0yRm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNS0zLTJGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU1LTQtMUZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTUtNC0yRm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEhlYWx0aFJlbGF0ZWRJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxIZWFsdGhSZWxhdGVkSXRlbUNvZGVJbjQtNkZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxIZWFsdGhSZWxhdGVkSXRlbUNvZGVJbjUtNUZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9kdWN0R3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbEZlZGVyYXRpb25Db2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmV0YWlsRmVkZXJhdGlvblNpemVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld01pY3JvY29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3UmVwbGFjZW1lbnRQYXJ0T3JBc3NlbWJseURlZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEhpZ2hlckFzc2VtYmx5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SGlnaGVyVXNlZEFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25mb3JmZWl0dXJlT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzYWxlYWJsZUl0ZW1FeGNsdWRpbmdEZXBvc2l0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOU04tTm9ydGhBdGxhbnRpY1RyZWF0eU9yZ2FuaXphdGlvblN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUJDVUI4MkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUJDVUI5MkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBvc2l0aW9uc09uTWFjaGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JsaWdhdGlvbkF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jzb2xldGVQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkTWljcm9jb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTkNhc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTkNvbnN1bWVyUGFja2FnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOTW9kdWxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5NdWx0aXBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckFzc2lnbmVkUHJvcGVydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Bwb3NpdGUtSGFuZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxDYWJsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxJbmR1c3RyeVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVxdWlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVByb2R1Y3Rpb25PcGVyYXRpb25TaGVldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdEcmF3aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0RHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlckRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXR0ZXJuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDQ0VDLUdvb2RzQW5kU2VydmljZXNUYXhGb3J3YXJkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NDRUMtR29vZHNBbmRTZXJ2aWNlc1RheE5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0MtTm9uVHVidWxhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NPTUMtR29vZHNBbmRTZXJ2aWNlc1RheEZvcndhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ09NQy1Hb29kc0FuZFNlcnZpY2VzVGF4Tm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQWNjb3VudGFudHNTb2NpZXR5T2ZDYW5hZGFUdWJ1bGFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZWNlc0luUm9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlnZ3liYWNrQ29tbWVyY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVUcmFuc2FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudEVxdWlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWROYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUmF0ZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1Vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTYW1wbGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMb29rVXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50Q29sb3JTdGFuZGFyZFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRPckRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RPclNlcnZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZU5vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0SWRBdHRyaWJ1dGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbURlc2NyaXB0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbFZhcmlhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QW5kQ2FzdWFsdHlTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc09yZGVyTGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVycG9zZU9mSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpYXRvclNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWQtT3duZWRVbml0VHJhaW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmRvbVdlaWdodEFnZ3JlZ2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZURldGFpbENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eUluZm9ybWF0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVFeHRlbmRlZFRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVGcm9udFJlYXJEcml2ZW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlTWlkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVB1c2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVSZWFyRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVJlYXJOb25Ecml2ZW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRLZWVwaW5nT3JNb2RlbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlclNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lZFByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkTW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRNb2RlbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRQb2xpY3lJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVWYWx1ZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpZ2lvdXNSZXRhaWxOb24tQm9va0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckZyb21Qcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlySW5kdWN0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyVGFnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50TmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudFN1YmFzc2VtYmx5TW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50U3ViYXNzZW1ibHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxQTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlNLTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJlc2VudGF0aW9uSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZW1hdGljRGlhZ3JhbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRQcmlvcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25QcmludE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpYWxJdGVtQW5kQ29udHJpYnV0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpZXNJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29kZVBlckNPUEFTU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cm9sSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VGZWF0dXJlSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZW5kZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50T3JQYXlvdXRPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmLUxpZmVBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZi1MaWZlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVVcE9yU2lkZURvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGFiTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVlcGVyQm94S2V5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVlcGVyQm94U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTk9NRUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mRGVwb3NpdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mTGVhZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXRlcmlhbElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1NDQy0xOEFuZEFwcGxpY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91cE9mUHJvZHVjdHMtTWl4ZWRBc3NvcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGFiZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbXBsZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R5bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmxpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VidG9waWNMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyc2VkZWRQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckJyYW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJDb21wYW55UmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc1N1cHBsaWVyQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ludGhldGljTHViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFDVENvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE1hbnVhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFBoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNDaXJjdWl0SWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5U2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21TZXJ2aWNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lSW5kdXN0cnlNYW51ZmFjdHVyZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0ZWRNYXRlcmlhbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUHJpb3JJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lQ29tcGxpYW50VGVjaG5pY2FsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9waWNMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVJbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyQ2FzZVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGVBbmRCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0JvZHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVTZWx2YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ0NPckVBTi0xMjhDb3Vwb25FeHRlbmRlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5DQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ01ldGhvZE9mRGlyZWN0V3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtU3RvY2tTeW1ib2xTeXN0ZW1Db2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTk51bWJlckRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDYXNlQ29kZU51bWJlcjEtMS01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvbnN1bWVyUGFja2FnZUNvZGUxLTUtNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ29uc3VtZXJQYWNrYWdlQ29kZTEtNS01LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvdXBvbkNvZGUxLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTkNhc2VDb2RlMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOQ29uc3VtZXJQYWNrYWdlQ29kZTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTkNvdXBvbkNvZGUyLTUtNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5Nb2R1bGVDb2RlMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOTXVsdGlwYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5TaGlwcGluZ0NvbnRhaW5lckNvZGUxLTItNS01LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1NoaXBwaW5nQ29udGFpbmVyQ29kZTEtMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1N1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU3VmZml4LURlZmluZXNQYWNraW5nVmFyaWF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlci1EZWZpbmVkU2hpcHBpbmdDb250YWluZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVVk1SUE1MaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVZNVUxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlTWVhc3VyZVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJ5SXRlbVByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVNYWludGVuYW5jZVJlcG9ydGluZ1N0YW5kYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQWxwaGFudW1lcmljU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNvbG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JHcm91bmRTaGFkZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNDYXRhbG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNCYXNpY1VuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNFbmdpbmVlcmluZ0NoYW5nZUxldmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNTdHlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1N1cHBsZW1lbnRhbEl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVHlwZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVXNhZ2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZmVyTG90SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlZWxDaGFpckxpZnRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xlbkN1dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbGVuUnVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGFza051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1VuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmxkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50LUVuZ2xpc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudC1NZXRyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudFdvcnN0ZWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSXRlbUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiIHR5cGU9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGVkIiB0eXBlPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGVkIiB0eXBlPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY1ZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWMiIHR5cGU9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFNlY3RvcmlhbENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYXRvbWljYWxPcmlnaW5PZlNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseVJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VPdXRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpc1dlaWdodFNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlaGluZC10aGUtQ291bnRlckRydWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VCcmFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VDb250YWluZXJDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlRmxhdm91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0b21ob2xlTG9jYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRvbWhvbGVQcmVzc3VyZU1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmRHcm91cC1BR3JvdXBpbmdPZlNpbWlsYXJCcmFuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdW9mQWxjb2hvbFRvYmFjY29BbmRGaXJlYXJtc0NsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1T2ZBbGNvaG9sVG9iYWNjb0FuZEZpcmVhcm1zVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvbG9yRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1TaXplRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZy1MaW5lci1UdWJpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdPckxpbmVyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsRmFtaWx5TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWlzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSUQtQ29tbWVyY2lhbEl0ZW1EZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ09yUGFpbnRTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN5c3RlbU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25NZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3ItTG93ZXJCb2R5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvci1VcHBlckJvZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkNoZW1pY2FsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUZpZWxkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZU1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbmVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1hYmxlUmVzb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVySW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3MzTmFyY290aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3MzTk5vbi1uYXJjb3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3M1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRlRGVzY3JpcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycm9zaW9uUmVzaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXJ0aWNsZVNwYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NwZWNpZmljYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VGYXVsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5zaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW1lbnNpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0aW9uYWxJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvc2FnZUZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFZmZpY2FjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VmZmljYWN5U3R1ZHlJbXBsZW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3REZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRnZVRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljYWxseUNsZWFuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kcy1TbGl0dGluZy1TcGxpdHRpbmctQ3V0dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmV3aXRoVHJhbnNtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3Jvd0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuQ29tbXVuaXR5Umlza0NsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlQW5hbHlzaXNQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRURTUEVDLUZlZGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRUQtU1RELUZlZGVyYWxTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJlVG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZENvZGUtRUlBT3JET0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsYW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hPclN1cmZhY2VSb3VnaG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmx1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGRDb25maWd1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdERldmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhZ3JhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cnRoZXJJZGVudGlmeWluZ0NoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZXJjaGFuZGlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFByb2R1Y3RGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmljRHJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkRpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGVWYXJpZXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkUmF0aW5nU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhBbmRCZWF1dHlBaWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0VHJlYXRPckFubmVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmF1bGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qZWN0YWJsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleS1Xb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyRG91YmxlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyT3ZlcnRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRPckNvcHBlclNhbXBsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlZFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGluZ09wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5lUnVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ01ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1Byb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFNlZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFN0YXR1cy1PdXRzaWRlUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3VwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsbG9ncmFwaGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUxTUEVDLU1pbGl0YXJ5U3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1TQkxNLUluZGlhbkxhbmRQcm9wZXJ0eU9yVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLU1lZGlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXNpY1N0eWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXR1YWxseURlZmluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0FydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1IYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZXNjcmlwdGlvbkRydWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJlY3VycmluZ1Jlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXRyaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic29sZXRlQXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Rvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRpcmVjdFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBoeXNpY2FsRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXItdGhlLUNvdW50ZXJEcnVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlSW50ZWdyaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHRlcm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRhZ2VPZkFsY29ob2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcmF0aW9uQ29udGludWl0eUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9yYXRpb25JbnRlcnZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9yYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tQWVyb3NvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUFzRGlsdXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUNvbmNlbnRyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tRW11bHNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Qb3dkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1TZW1pc29saWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Tb2xpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZUNvdXBsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVN0cmVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2F1dGlvbmFyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRHJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uRWZmZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZXJ2YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlHcmFwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRPcmllbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZUxhYmVsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0FjdGlvblRha2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzT3JQcm9kdWN0aW9uVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0YUJhc2VNYW5hZ2VtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWZlQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTdWJqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbE9mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcHJpZXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmVGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXQtdXBEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eS1RdWFsaXR5TGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGluZ01lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nUmVzb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVyYmlzaGVkQXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeU9yU3RhdGVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeS1TdGF0ZU9yRW50aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN0YXRlZEFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2b2lyQ29kZS1Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1bHRzTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWREZXNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT2ZBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5R3JhcGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldE9yQ29uZmlkZW50aWFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpZXNUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUZlYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGYtTGlmZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1VuaXRDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb0xpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb1N0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxob3VldHRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5R292ZXJubWVudEFuZE9yQ3VzdG9tZXJTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sdWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29udHJvbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUFuZERpc3BsYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0UmVzb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1Qcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlTG9jYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlVHJlYXRtZW50LUNoZW1pY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlVHJlYXRtZW50LU1lY2hhbmljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0FuZEluc3BlY3Rpb25BZ2VuY2llcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBhbmVsVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNhbXBsZURpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNhbXBsZUZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNhbXBsZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFdlaWdodEZvcm11bGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcGV1dGljQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcGV1dGljRXF1aXZhbGVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVzaG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlSW5zdXJhbmNlRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBbmRPclByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlRlc3QtSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVNwaW5uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb2xvckRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JTaXplRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc3VhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sYXRpbGVPcmdhbmljQ29tcG91bmRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlUeXBlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxkc09yU3BsaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsUGVyZm9yYXRpb25Db250aW51aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsUGVyZm9yYXRpb25JbnRlcnZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFRlc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5kaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lRnJ1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmVHcm93aW5nUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT2ZDYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGF0ZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbHN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dG9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmljayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nSGVhZEZsYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuZXJEaWFnb25hbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZUVuZE92ZXJoYW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtVGFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsRnVlbFRhbmtQb3NpdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVyaW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRTcGFyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVMZWZ0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlUmlnaHRSZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VsbHlCdXNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0RnJvbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRSZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzQ3JpdGljYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3JlQ3JpdGljYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbGF0aXZlUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25TdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHBvc2l0ZUNvcm5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVMZWZ0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVJpZ2h0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmFsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhclNwYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb244Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdodEZyb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdodFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVPbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVUd28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVFbmRPdmVyaGFuZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sdWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhcmVUaXJlUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJib2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWNjbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLVNlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0JvdHRvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhCdWNjYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aERpc3RhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoRmFjaWFsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhJbmNpc2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhMaW5ndWFsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhNZXNpYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aE9jY2x1c2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd29TaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJDYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWxhdGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVRhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVW5pdE9mTWVhc3VyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVPTUNvZGVkIiB0eXBlPSJVT01Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJVT01Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0T2ZNZWFzdXJlbWVudCIgdHlwZT0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVU9NQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0QyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0USIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0VSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1QSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTcwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjcwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjczIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0RMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNLRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ01UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNXQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1dJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRQUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFBUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEV1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFpOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkcyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0dSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0lJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0xMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1dIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQlgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhUWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IksxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iks1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0dNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktIWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS05JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktTSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktWQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLV0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkwyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxFRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1MRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1QQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNV0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik4xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5NSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk1QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0hNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT05aIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9aIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPWkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9aSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU01JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0hSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZREsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllEUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IloxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGltZW5zaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEaW1lbnNpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRpbWVuc2lvbiIgdHlwZT0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaW1lbnNpb25Db2RlZCIgdHlwZT0iRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGltZW5zaW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGltZW5zaW9uIiB0eXBlPSJEaW1lbnNpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudFJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnQiIHR5cGU9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIiB0eXBlPSJNZWFzdXJlbWVudFZhbHVlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWVWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2ZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZSYW5nZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb25kaXRpb25zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlQWlyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVCdXR5bEFjZXRhdGVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUgyT0VxdWFsczFPcldhdGVyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkVG82MERlZ3JlZXNGYWhyZW5oZWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZVRvbHVlbmVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluT3RoZXJUaGFuQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbnNPdGhlclRoYW5TdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRXRoeWxBbGNvaG9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkV0aHlsRXRoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0MUF0bW9zcGhlcmVQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVFdGhlckVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGljdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXItRHJpZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXMtUmVjZWl2ZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlsaWJyaXVtQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlQW5kQXNoLUZyZWVCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3hpZGl6aW5nQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWNpbmdBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGNoZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyYXRlZFZhcG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvbmRpdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydC1UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lLVdlaWdodGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY29ycmVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyR2FsbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZU93bmVkT3JDb3Jwb3JhdGVPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRlZE9yQmxvY2tlZFVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFdoZW5Tb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc1JlcGFpcmVkT3JJbXByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFudGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb0dvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvTW9kZXJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtVG9Hb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1Ub0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jcmVhc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsaW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJNaWQtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lclN1cGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyU3VwZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTWlkLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJTdXBlck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlclN1cGVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay00Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG91bGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uVGltZVJlbGF0ZWREZW1hbmQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiIHR5cGU9Ik1lYXN1cmVtZW50UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbmltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bVZhbHVlIiB0eXBlPSJNaW5pbXVtVmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1heGltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bVZhbHVlIiB0eXBlPSJNYXhpbXVtVmFsdWUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGltZW5zaW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXROZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNQZXJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdENvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NUb25uYWdlT2ZUaGVWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvbm5hZ2VPZlRoZVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyQ29uc3VtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXREaXNzaXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvY2tJbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGl2ZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcGVyYXRpdmVUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5zaWxlU3RyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyb3NpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9mQ29udmV5YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVN1bW1lckRlYWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QXNjZXJ0YWluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE92ZXJhbGxMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdNZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlV2lkdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVXaWR0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJBY3R1YWxGaWxsaW5nV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJNYXhpbXVtQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nSGVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja2luZ0hlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycml0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFudGhhbmlkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXN0aWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cm9udGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RvcmFnZUxpbWl0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW5kZXhPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkaXR5T2ZKdWljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZXRyb21ldHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWljZVdlaWdodFBlcjEwMEdyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcnVpdFNraW5Db2xvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2xlT2ZCZW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZEluY3JlbWVudGFsTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxENTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2luZ1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NNZWFzdXJlQ3ViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZUZhdENvbnRlbnRJbkRyeU1hdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjY2hhcm9tZXRyaWNDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYXRlQ29udGVudE9mQW5BbGNvaG9saWNQcm9kdWN0QWZ0ZXJCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5oeWRyb3VzQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbHZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVHcmF2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc09ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc1N0YW5kYXJkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTmV0U3RhbmRhcmRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsT24tQm9hcmRRdWFudGl0eS1BZnRlckRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVG90YWxDYWxjdWxhdGVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Ub3RhbE9ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbm5hZ2VHYXVnZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1OZXRTdGFuZGFyZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VkaW1lbnRBbmRXYXRlckluUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZlZFJlZmVyZW5jZUhlaWdodC1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VIZWlnaHQtVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWxsYWdlR2F1Z2VEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbUNvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvd1RvQnJpZGdlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWdodG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWtlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGhXZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVudHNPZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uV2VpZ2h0QWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsdGFWYWx1ZUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RhbmNlQmV0d2VlblBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtQm94Y2FyRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkTmV3V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbG9uZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxhbWVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGluYWxGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zdmVyc2VGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJkbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0LU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0RW5lcmd5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGhEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlU3RyZXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lzdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Nrd2VsbEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvbk9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuLVByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVIZWlnaHQtRmxhdEJlZFdpdGhSZW1vdmFibGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNxdWFyZW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWllbGRTdHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJzZW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpc211dGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY2l1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sdW1iaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNobG9yaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2JhbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9taXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25QbHVzU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VybWFuaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyb2dlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90YXNzaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXNpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmdhbmVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9seWJkZW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTml0cm9nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlvYml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlja2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob3NwaG9ydXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bHBodXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGltb255Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNpdW1PeHlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbnRhbGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsbHVyaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRhbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuYWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1bmdzdGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZUNvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppbmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppcmNvbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29PcGVyYXRpbmdUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5VGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyb2xUZW1wZXJhdHVyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlWYWx1ZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5UmFuZ2UiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eSIgdHlwZT0iUXVhbnRpdHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5VmFsdWUiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5VmFsdWUiIHR5cGU9IlF1YW50aXR5VmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5UmFuZ2UiIHR5cGU9IlF1YW50aXR5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlF1YW50aXR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiIHR5cGU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGVkIiB0eXBlPSJRdWFudGl0eVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUNvZGVkIiB0eXBlPSJRdWFudGl0eUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVVbnNlcnZpY2VhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUF2ZXJhZ2VPdmVyZHVlRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQbGFjZWRGb3JDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50RG9zZVBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnREb3NlUGVyVW5pdERpc3BlbnNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpc3RpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVNYWludGVuYW5jZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFVuaXRzQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkZWRFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFByb21vdGlvblNhbGVzRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlcGxlbmlzaG1lbnREZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFVzYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29ycmVjdG9yUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFRvSW52ZW50b3J5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUF0RGVhdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRMaW5lSXRlbXNDb21wbGV0ZWQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZExpbmVJdGVtc0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUhpZ2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTG93VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZWFyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU9mRmluYW5jaWFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0UmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lQXR0ZW5kYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90dGVkVXNhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUaW1lQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGlzYXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uQ3VtdWxhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvbk9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRvdGFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkTGVuZ3RoT2ZTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9yT2ZmZXJEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZIb2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNGb3JTYWxlUHJvamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNQcm9qZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYVBlclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U2VpemVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRDb21wbGV0ZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdENvbXBsZXRpb25RdWFudGl0eUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW50LUhhbmRsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXRlbnRpb25MZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja29yZGVyTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVqZWN0SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVBldGl0aW9uc0ZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRyb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdVbml0UGVyUHJpY2luZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua1ZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9vZFJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va09yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9uc0xlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaE9mZmljZUxvY2F0aW9uc0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNEZWNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNMaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Q3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVDbGFzc0luY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlSW5kdXN0cnlJbmNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZU5hdGlvbmFsQXZlcmFnZUluY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eXVwT3JCdXlkb3duUmF0ZVBlckJhc2lzUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ5dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZFJlZ2lzdGVyZWROdXJzZUFuZXN0aGV0aXN0TnVtYmVyT2ZDb25jdXJyZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlc0luQ2FwaXRhbFN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlQ3ViaWNNZWFzdXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mUGFja2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlJhaWxXYWdvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhdGluZ09pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbzJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyZWQtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmVkLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eVNlcnZpY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRlZEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luU2FtZUFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJpc29uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZENvbnRyYWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQcm9qZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWV0ZXJSZWFkaW5nQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRJdGVtT3V0cHV0T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERpc2NvdW50SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclJlc2VydmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnV5ZG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCdXl1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TGluZUl0ZW1RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbE1vYmlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3Rpb25zU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2RFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtVmVyYmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtV3JpdHRlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsZXJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnNlU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZC1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQnVkZ2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlRWFybmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVFZmZlY3RPZlByaW9yUGVyaW9kQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUxpcXVpZEluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZU9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RSZWFjaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVjZWl2ZWRFbmRPZlByaW9yWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlcXVpcmVkUHJpb3JUb1RoZUZpcnN0U2NoZWR1bGVkUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNjaGVkdWxlZFVwVG9BY2N1bXVsYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRMb25nLURpc3Bvc2l0aW9uQ2hhbGxlbmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZExvbmctRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25DaGFsbGVuZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVNjcmFwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVdhdGVyVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGF5c09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RpYmxlQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdE5vdGlmaWNhdGlvblJlc3BvbnNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWdyZWVTZWdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaE11bHRpcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdHJveWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsTGVnYWxGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbExlZ2FsRmlsaW5nc0FnYWluc3REaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVuc2lvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0V29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVldFF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvblVuZGV0ZXJtaW5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljQWZmaWxpYXRlZENvbXBhbmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlLUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbkluQ3VycmVudEpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHdlbGxpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWVDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZUhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXBzZWREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1NpZ25hdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZC1BY2NpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QtU2lja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQXRUaGlzTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQnlUaGlzQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZE9uVGhpc0pvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU5vbm93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOb3RJbmNsdWRpbmdPd25lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc051bWJlck9mRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOdW1iZXJPZkRheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtUGFydFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1TYW1lRHV0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtU2FtZU9jY3VwYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc1NoYXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzVG90YWxOdW1iZXJPZkRheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxGaXJzdE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsU2Vjb25kTW9udGhPZlF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxUaGlyZE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZNb250aEludmVudG9yeVByaW9yVG9TaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJlZFN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdHlTZWN1cml0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBbm51YWxWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFbXBsb3llZXNBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVtYWluaW5nRWNvbm9taWNMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZW1haW5pbmdQaHlzaWNhbExpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFRvdGFsRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFwb3JhdGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0ZW5jZUxpbWl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbmRpdHVyZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZFRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhVW5wbGFubmVkRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVNpemVBZnRlckNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlU2l6ZUJlZm9yZUNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENvdmVyYWdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXJlT3JGbGFzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vcnNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RlZFNjYW5uZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUb0NvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVsYXRlZEVudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlbWVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdC1JbkNhbGVuZGFyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlbGFuY2VEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZWxhbmNlU2FsZXNwZXJzb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUXVhbnRpdHlJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVF1YW50aXR5Tm90SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENvbnN1bWVkT3JCdXJuZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxQdW1wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbEJhdGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pc2hlZEJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZU9yQ2FycG9ydEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzTGlmdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmVjZWlwdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmV0dXJuZWRUb0VhcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZXR1cm5lZFRvUHJvcGVydHlGb3JGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTaHJpbmthZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1NvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JEcmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvckZ1ZWxTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JQbGFudEZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JSZXByZXNzdXJpbmdPclByZXNzdXJlTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRPblByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNWZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVwb3J0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzQW5udWFsSW5jb21lTXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NCdWlsZGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGl2aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaXZpbmdGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1Byb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVudE11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVCdXl1cE1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckFsdGVybmF0ZVBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckJ1eXVwT3JCdXlkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0T3JUeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0VHlwZU9yTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdFR5cGVPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1MaWZldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1UeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhaXJtZW50RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFpcm1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3JlbWVudGFsT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXJlY3RFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QnVzaW5lc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Qcm92aWRlclN0YW5kYXJkaXplZE1vdG9yVmVoaWNsZVBlbmFsdHlQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50RnVuZHNSZXR1cm5lZENoZXF1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVuZGVkQ2hhbmdlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RGb3JPdmVyZHJhd25BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVGVybVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ0YW5rVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1Vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeURpc2NyZXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlPblNoZWxmV29ya0luUHJvZ3Jlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVF1YW50aXR5QXRTdXBwbGllcnNOb3RTdWJqZWN0VG9JbnNwZWN0aW9uQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UXVhbnRpdHlBdFN1cHBsaWVyc1N1YmplY3RUb0luc3BlY3Rpb25CeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlXaXRoZHJhd2FsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvbHZlbWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYWlsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50c1JlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxTdGF5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFnVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEhvbGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEN1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U3VpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aE9mUmVzaWRlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlLVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbHNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxzU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5zUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZXRpbWVDYXBhY2l0eU9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZS1UaW1lUmVzZXJ2ZS1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmV0aW1lUmVzZXJ2ZURheXMtQXBwbGllZFRvVGhpc0NsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlLVRpbWVSZXNlcnZlLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZVRocmVhZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdmVzdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXBheW1lbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yR2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0T2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0V29ya1RpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RXb3JrVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90U2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVkVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UHJpY2VDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGNoaW5nRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbE9uLUJvYXJkUXVhbnRpdHlQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLUFjY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZEFjY2lkZW50VG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLVNpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZFNpY2tuZXNzVG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1EZWxpdmVyeUJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU1hdHVyaXR5RXh0ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZkVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZlB1cmNoYXNlT3JkZXJzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mU2hpcG1lbnRzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1Qcm9kdWN0aW9uQmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1RdWFudGl0eVRvV2hpY2hUYXhSYXRlQXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlcXVlc3RhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TaGlwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2FiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdG9ja0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3VwcGx5UXVhbnRpdHlTdXBwbGllckVuZG9yc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJzSW5Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaW9uRG9sbGFyUm91bmR0YWJsZUNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50VW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Db250cmFjdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1GYWJyaWNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJQYWNrYWdlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUHJvZHVjdGlvbkJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUXVhbnRpdHlUb1doaWNoVGF4UmF0ZUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZXF1ZXN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hpcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU3RvY2tMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVMb2FkaW5nQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxPclRhcmdldFN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VQb29sQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5RGVjcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvUGF5SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9EZWxpdmVyeVJlcXVpcmVtZW50SW5UaGlzSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1CaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb21taXR0ZWRJbnZlbnRvcnlPblNoZWxmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb25mb3JtYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29uc29saWRhdGVkVG90YWwtRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db25zb2xpZGF0ZWRUb3RhbC1Gb3JlaWduU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvdmVyZWQtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRG9tZXN0aWNTdG9ja2hvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1VbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVVyZ2VudERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxSZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Wb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBY2NvdW50c1Bhc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWN0aXZlQWNjb3VudHNUaGlzQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRkZWRMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRqdXN0bWVudFBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXR0YWNrc09yT2NjdXJyZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQmF0Y2hlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZCb3Jyb3dlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2FyZHNOb3RSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDYXJkc091dHN0YW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNoZWNrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDbGFpbWFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2xvc2VkTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNvLUluc3VyYW5jZURheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ29waWVzT2ZCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ3JldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEYXlzQ292ZXJlZEJ5SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVsaW5xdWVudEluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWxpdmVyaWVzUGVyRGVzcGF0Y2hQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVwZW5kZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbmRVc2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbnRpdGxlZEV4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRmFpbGVkQnVzaW5lc3Nlc09mRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZyYW5jaGlzZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZ1bGwtVGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZIb3NwaXRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSWRlbnRpY2FsSGFuZGxpbmdVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJbnN1cmVkTGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSW50ZXJlc3RQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zQXV0aG9yaXplZEF0U3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNBdXRob3JpemVkQXRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNJblN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxhdGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxldmVscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMaW1pdGVkUGFydG5lcnNoaXBTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvc3RDYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNZW1iZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1lc3NhZ2VSZWNpcGllbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vbnRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb3J0Z2Fnb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vdWxkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZOb24tQ292ZXJlZERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTm9uc3VmZmljaWVudEZ1bmRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVuQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlcmF0aW5nUGVyaW9kc0F0RmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVyYXRvckNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3JpZ2luYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhY2thZ2VzSW5IYW5kbGluZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGFzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYXRpZW50QWRtaXNzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQZW9wbGVMaXZpbmdBdFJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQaHlzaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlByb2R1Y2luZ1dlbGxzUmVtYWluaW5nT25Qcm9wZXJ0eU9yRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUHJvZHVjaW5nV2VsbHNSZW1haW5pbmdPblJveWFsdHlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlF1YW50aXRhdGl2ZUluY2VudGl2ZVNjaGVtZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNlcnZpY2VzT3JQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNoZWxmRmFjaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaGVsZlRhZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9sZW5DYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaGVhdHJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lc0RlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRyYW5zcG9ydERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cy1Ib3VzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVEZXB0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVXaWR0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuc2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZXaXRoaG9sZGluZ0V4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcnNPZkNvbnN1bWVyVW5pdHNJblRoZVRyYWRlZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcldlZWtzUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZW1JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkxlYXNlRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUHJlbWlzZVNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlByZW1pc2VzU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbENvbmRlbnNhdGVTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxDb25kZW5zYXRlVXNlZE9uUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsU2VkaW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsVGhlZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZEFuZER1ZS1JbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlU2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlc1NhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0JlZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0RpdmlzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JzV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclF1YW50aXR5TXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvYW5UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFBheW1lbnRJdGVtQ291bnQuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFRlcm1JblllYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTWlzY2VsbGFuZW91c0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck9pbENvbmRlbnNhdGVEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFN0b2NraG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXJSZXNlcnZlTWF0ZXJpYWxSZXF1aXJlbWVudHNQcm90ZWN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlcldhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxpZXJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkludmVudG9yeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LVR1cm5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyZmxvd1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyU2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc0VxdWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duT2NjdXBhdGlvblF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JbkNvbW1vblNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblByZWZlcnJlZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblNlY3VyaXR5U2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJraW5nU3BhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQmF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYW50VG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpb25TaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0VGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzdER1ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhbmNlbGxhdGlvbkl0ZW1Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1cmF0aW9uV2Vla3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFeHBlcmllbmNlc0luVGhlTGFzdDEyTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RXhwZXJpZW5jZXNJblRoZUxhc3QzTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJzRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlT2ZPcmRlcmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljQ2FwYWNpdHlPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mRW1wbG95bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eVJlYWNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNpc3RlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbnNGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNJaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzSXYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXNEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbGZlcmFnZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGl0dGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRVbml0RGV2ZWxvcG1lbnRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhYmxlUmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0ZWRUZWxlcGhvbmVMaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1PcERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYXRlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtT3BEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlOb3RTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUHJvZHVjdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRvc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRWZmZWN0aXZlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudGlhbFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc3VyZUJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmVuZWZpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlBbW9ydGlzZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aHNVc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mQnJhbmNoTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09yZGVyUXVhbnRpdHlUb0JlQ2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1dlZWtRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha0Zyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2luZ1VuaXRQZXJCaWxsaW5nVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU1hbmFnZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TWV0ZXJSZWFkaW5nVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlOZXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0luY2x1ZGVkQXNFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ3VtdWxhdGl2ZUltYmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml0c0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjaW5nV2VsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RFeGNoYW5nZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvblJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbldvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTYWxlc0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRBdmFpbGFibGVJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQaGFzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RzSW5Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0VW5pdHNTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3RlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZXN0ZWRCaWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25UdXJuU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPZlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZnlpbmdXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xGYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdGF0aXZlSW5jZW50aXZlU2NoZW1lQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBZHZpc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUFwcHJvdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF0MTAwUGN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZUZvclJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVGb3JTYWxlLVN0b2NrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlT25TaGVsZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBd2FpdGluZ0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUJ5UG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Q2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUNhcnJpZWRGb3J3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNhcHByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNwZW5zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzcGxheWVkTm90QXZhaWxhYmxlRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5RGVsaXZlcnlWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeUxvZ2lzdGljU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeVJldGFpbE91dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbkZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluSG9sZE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbk1hbnVmYWN0dXJpbmdQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluUGh5c2ljYWxJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5RdWFyYW50aW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlMYW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TG9hZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU1hbmlmZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Tm90QXZhaWxhYmxlRm9yRGVzcGF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T2ZEZWFsZXJMaWNlbnNlUGxhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9mTWF0ZXJpYWxJbk9yZGVyZWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9uSGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPbkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyTmV4dEhpZ2hlckFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJVbml0T2ZJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyZW1lbnRGb3JNYWludGVuYW5jZUFuZFJlcGFpck9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmVtZW50Rm9yU2FtcGxlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJpbmdNYW5pcHVsYXRpb25CZWZvcmVEZXNwYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXR1cm5lZERlZmVjdGl2ZU9yRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U2VydmljZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTb2xkTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1c3BlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlUb0JlRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5V2l0aGRyYXduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVdpdGhoZWxkQnlPd25lck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlUXVhbnRpdHlPbkludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkQW5kQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTm90QWNjZXB0ZWRUb0JlRGVzdHJveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE5vdEFjY2VwdGVkVG9CZVJldHVybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRlZE1haW50ZW5hbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGVkT3ZlcmhhdWxBbmRSZXBhaXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWRlcmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5QWZ0ZXJQb3N0UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaWxsc0F1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCcmFuZHNEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJyYW5kc01hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRSZXR1cm5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZEJ1c2luZXNzRW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRFbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpb25zaGlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlc0VtcGxveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdBdXRob3JpemVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlcmluZ0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyUG9pbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudE92ZXJyaWRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RGlmZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREZWZpY2llbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eVRoYXRXYXNQcmV2aW91c2x5UmVsZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpc2l0aW9uaW5nT2JqZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Q3VzdG9tZXJEaXJlY3REZWxpdmVyeVNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5UmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZS1RdWFudGl0eS1BdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3Rpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEJ5Q29uc3VtZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNSZXBsYWNlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUXVhbnRpdHlOb3RJbmNsdWRlZEluVGhlUmVwbGVuaXNobWVudENhbGN1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1F1YW50aXR5UGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2F0dGVyZWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TmV0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRDaGFyZ2VzUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdGllc1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlcnNIb2xkaW5nUmVtYWluZGVyT2ZTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzQWRkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0RlbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0hlbGRBc1RyZWFzdXJ5U3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mQ29tbW9uU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mUHJlZmVycmVkU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc093bmVkQnlJbi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT3duZWRCeU91dC1PZi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZEJ1dE5vdElzc3VlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RpY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnQtTGFuZGVkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsZW50UGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmNlTGFzdFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lzdGVyc0RlY2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXN0ZXJzTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplT2ZIb3VzZWhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWRXb3JrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3NVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0ZWRRdWFudGl0eVJlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjZU9jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlTW90b3JWZWhpY2xlUGVuYWx0eVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc0luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc091dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvbGVuQ2hlcXVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlSZXR1cm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50RGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRpb25hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRXN0aW1hdGVkTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckVzdGltYXRlZFByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckxhdGVzdE1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJQcmV2aW91c01ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnBsdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5c0luQXZlcmFnZVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YW4tR2FueiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVzQXZhaWxhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWxrUGF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZkxvc3NBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhY2hlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUV4cGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJbkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJblBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VIb3NwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdENpdmlsaWFuRmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0SW5zdXJhbmNlTWVkaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdE1pbGl0YXJ5RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2FsQ29uc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VPbnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlU3VyZ2VyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlVHJpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNLbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzUGVyU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c1NwZW50T25EdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9Db21wbGV0ZVF1YW50aXR5RXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xlcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFkanVzdG1lbnRzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFtb3J0aXNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXV0aG9yaXplZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEJlZ2lubmluZ0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNBc3NvY2lhdGVkV2l0aFJlcGVhdGVkVHJhdW1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEaXNvcmRlcnNEdWVUb1BoeXNpY2FsQWdlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEdXN0RGlzZWFzZXNPZlRoZUx1bmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhvdXREYXlzQXdheUZyb21Xb3JrQW5kV2l0aG91dFJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFBvaXNvbmluZ0lsbG5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoUmVzcGlyYXRvcnlDb25kaXRpb25zRHVlVG9Ub3hpY0FnZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoU2tpbkRpc2Vhc2VzT3JEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRm9yZWlnblN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWRTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c1dpdGhSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhDbGFpbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhzQXNBUmVzdWx0T2ZJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoc0FzQVJlc3VsdE9mSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbWFuZE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRW5kaW5nSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZsb2F0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRoT2NjdXBhdGlvbmFsSWxsbmVzc2VzTm90T3RoZXJ3aXNlQ2xhc3NpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aG91dExvc3RXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzV2l0aExvc3RXb3JrRGF5c09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29ya09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRob3V0TG9zdFdvcmtEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOb24tQ29uc29saWRhdGVkU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mQ29udmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc0luY2x1ZGVkSW5GaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc05vdEluY2x1ZGVkSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZGb3JlaWduU3Vic2lkaWFyaWVzSW5jbHVkZWRJbkZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkZvcmVpZ25TdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mTG9hbkRldGFpbFJlY29yZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZNb3J0Z2FnZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mUGFya2luZ1NwYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlN1YnNpZGlhcmllc05vdEluY2x1ZGVkSW5UaGVGaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlVuaXRzRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25Db21iaW5lZFJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uRmlyc3RSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvblN1YnNlcXVlbnRSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mSXNzdWFibGVBc3NldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyUHJvcGVydGllc093bmVkQW5kRmluYW5jZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUGF5bWVudHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcm9kdWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByb3BlcnRpZXNPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxRdWFudGl0eVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUmVzb3VyY2UtUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUm9vbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2VydmljZUJhY2tvcmRlclF1YW50aXR5SGlnaFByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNlcnZpY2VCYWNrb3JkZXJRdWFudGl0eUxvd1ByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoYXJlc09mU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlIaWdoUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlMb3dQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVHJhbnNhY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFVuaWRlbnRpZmllZFRyYW5zYWN0aW9uc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV2F0ZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2VkQnlBbGxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW1hcmtSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVtYXJrc1VzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZEluUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkT3V0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsbGluZ0VtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVua2VkQ2hhbm5lbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNrbm93bGVkZ2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWRqdXN0ZWRDb3JyZWN0b3JSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvdmVyZWRDaGVxdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c0ZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUGVyVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1JlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRMYXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlcldlZWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zYWxlYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGRRdWFudGl0eUhlbGRCeVdob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudGlsTmV4dFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2FibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2VkQWNjdW11bGF0ZWRTaWNrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW52ZXJpZmllZFJlY2VpcHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnREZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkV4dHJhY29ycG9yZWFsQ2lyY3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwZXJiYXJpY1ByZXNzdXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cGVydGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGhlcm1pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYW5jaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFuY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY3VsYXJSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0YXRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9pY2VTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvaWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lU2hyaW5rYWdlQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90aW5nU2hhcmVzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclJlLUluamVjdGVkT25Qcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZWtzV29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENoYW5nZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0R2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TG9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlclRvV2hvbGVzYWxlclNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VQZXI4MDBTZXJ2aWNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0luUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0c1BlclNoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblRoaXNMaW5lT2ZXb3JrT3JQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc09uSm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc1JlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludmVudG9yeVF1YW50aXR5QXZhaWxhYmxlRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQZXJpb2RJbWJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTZXJ2aWNlTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNoYXJlQmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFc3RpbWF0ZWRMYXRlc3RNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXN0aW1hdGVkUHJldmlvdXNNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUF2ZXJhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlXb3JrU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPcGVyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVzRmlsZWRBZ2FpbnN0RGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udHJhY3RJdGVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250cmFjdEl0ZW0iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRyYWN0SXRlbSIgdHlwZT0iTGlzdE9mQ29udHJhY3RJdGVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdEl0ZW0iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0SXRlbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtIiB0eXBlPSJDb250cmFjdEl0ZW0iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRyYWN0SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udHJhY3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5c3RlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdCIgdHlwZT0iQ29udHJhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RUeXBlQ29kZWQiIHR5cGU9IkNvbnRyYWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0VHlwZSIgdHlwZT0iQ29udHJhY3RUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckRpZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlUGVyRGllbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkR3Jvd2luZ0VxdWl0eU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eUFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5VmV0ZXJhbnNBZmZhaXJzRml4ZWRSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbFNlY29uZE1vcnRnYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsRml4ZWRSYXRlTW9ydGdhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eVZldGVyYW5zQWZmYWlyc0dyYWR1YXRlZFBheW1lbnRNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZENvbnZlbnRpb25hbEdyYWR1YXRlZFBheW1lbnRPclN0ZXBSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbEFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzSW5jZW50aXZlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0U2hhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzQXdhcmRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzRml4ZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVJpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtb3JBY3R1YWxDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZUZpcm1UYXJnZXRXaXRoUGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVGaXJtVGFyZ2V0V2l0aG91dFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlUmVkZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVTdWNjZXNzaXZlVGFyZ2V0V2l0aFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlU3VjY2Vzc2l2ZVRhcmdldFdpdGhvdXRQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUF3YXJkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Db3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyb2FjdGl2ZUZpeGVkUHJpY2VSZWRldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1GaXhlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVjb25vbWljUHJpY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3NwZWN0UmVzZXJ2YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVQZXJjZW50YWdlYXNGaWxtUmVudGFsRWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lYW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eURhdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFydERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVuZERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRpdHlEYXRlcyIgdHlwZT0iVmFsaWRpdHlEYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uZGl0aW9uc09mU2FsZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2FsZXNSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25Db2RlZCIgdHlwZT0iU2FsZXNBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbmRpdGlvbnNPZlNhbGUiIHR5cGU9IkNvbmRpdGlvbnNPZlNhbGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZCIgdHlwZT0iU2FsZXNSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTYWxlc1JlcXVpcmVtZW50IiB0eXBlPSJTYWxlc1JlcXVpcmVtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkUXVhbnRpdHlUb01ha2VNaW5pbXVtV2VpZ2h0UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmSXRlbXNBcmVPdXRPZlN0b2NrT3JOb3RZZXRQdWJsaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmT3V0T2ZTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyT25seUlmTmV3SXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkR3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQW5kTGFib3JTdXJwbHVzQXJlYVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90UHJlc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1YWxQcm9kdWN0QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcnlTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3VycGx1c0FyZWFTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhcmdlUHVyY2hhc2VTZXQtQXNpZGVGb3JTbWFsbEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXlQcmVzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS15ZWFyQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQmFja09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1N1YnN0aXR1dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQcmlvclRvU2hpcG1lbnRJZlF1YW50aXR5U3BlY2lmaWVkSXNOb3RBdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkQmlkZGVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkTWFudWZhY3R1cmVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRTYWxlc0NvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbExhYm9yU3VycGx1c0FyZWFTZXRBc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvQXBwcm92ZWRTb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9FZHVjYXRpb25hbEluc3RpdHV0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5T3JNaW5vcml0eUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9JbmR1c3RyaWFsUHJlcGFyZWRuZXNzUHJvZ3JhbVBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvUXVhbGlmaWVkUHJvZHVjdHNMaXN0UHJvZHVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1VTQW5kQ2FuYWRpYW5Tb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9Zb3VuZ0ludmVzdGlnYXRvclByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb244YVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LWFzaWRlRm9yQW1lcmljYW5JbmRpYW4tb3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEFzU29vbkFzUG9zc2libGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZ1bGxUcnVja09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBJbi1QbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWwtQmFsYW5jZUJhY2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxCYWxhbmNlQ2FuY2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEJhbGFuY2VTdWJzdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbENhcmxvYWRMb3RzT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxJdGVtUXR5UHJvcG9ydGlvbmFsVG9Ub3RhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbFRydWNrbG9hZExvdHNPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclJlbGVhc2VvckJ1eWVyQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzV2l0aFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQ29uc2lkZXJhdGlvblNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUHVyY2hhc2VTZXRBc2lkZUZvclNtYWxsQnVzaW5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uTm90QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUl0ZW1BbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnJlc3RyaWN0ZWRQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2FsZXNBY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQmFsYW5jZVRoYXRFeGNlZWRzU2FsZXNBY3Rpb25WYWx1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEVudGlyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENsYXNzQ29kZWQiIHR5cGU9IkhhemFyZENsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVOREdOdW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVNU051bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWZhZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzIiB0eXBlPSJIYXphcmRvdXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNJZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZCIgdHlwZT0iQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlRXh0ZW5zaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlVmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkT2ZmaWNpYWxUZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmVtQ2FyZE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9IkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZENsYXNzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BsYWNhcmRJZGVudGlmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZFRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmxhc2hwb2ludCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVtZXJnZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZUZW1wZXJhdHVyZUNvZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIgdHlwZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZCIgdHlwZT0iSGF6YXJkUGFja2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGVkIiB0eXBlPSJIYXphcmRvdXNTaGlwbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWQiIHR5cGU9IkhhemFyZG91c1pvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRQYWNraW5nQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXREYW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bURhbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JEYW5nZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlc2NyaXB0aXZlSW5mb3JtYXRpb25Ob3RSZXF1aXJlZEJ5UmVndWxhdGlvbkJ1dERlc2lyZWRUb0FjY29tcGFueVRoZU1vdmVtZW50QnlUaGVTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FpcmxpZnRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1QtMTEzRG9Ob3RCdW1wT3JDdXRPZmZDYXJXaGlsZUluTW90aW9uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRDYXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c1doZW5XZXREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1TUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmllc1Byb2R1Y3RzSW5BSGVhdGVkTW9sdGVuU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1N1YnN0YW5jZUNvbnN0aXR1ZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oYWxhdGlvbkhhemFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1GQUdQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3BlcmF0aW5nU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVBvbGx1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uLUluaGFsYXRpb25IYXphcmREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlTWF0ZXJpYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPckNoZW1pY2FsR3JvdXBOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lRCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ0RldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQWxsb3dhbmNlc09yQ2hhcmdlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2luZ0RldGFpbCIgdHlwZT0iUHJpY2luZ0RldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHJpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlByaWNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQcmljZSIgdHlwZT0iTGlzdE9mUHJpY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2luZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VCYXNpc1F1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FsY3VsYXRlZFByaWNlQmFzaXNRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljZU11bHRpcGxpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlIiB0eXBlPSJQcmljZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ1R5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlVHlwZUNvZGVkIiB0eXBlPSJQcmljZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljaW5nVHlwZSIgdHlwZT0iUHJpY2luZ1R5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJpY2VUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VEZXBlbmRlbnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbk5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25Hcm9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4SW5jbHVkZWRBbGxvd2FuY2VzQW5kQ2hhcmdlc05vdEluY2x1ZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VTZWxsaW5nUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2VUYXhJbmNsdWRlZEV4Y2x1ZGluZ0FsbG93YW5jZXNPckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2VFeGNsdWRpbmdBbGxvd2FuY2VzT3JDaGFyZ2VzQW5kVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aXZlVW5pdFByaWNlQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlR2VuZXJpY1Byb2R1Y3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VXaG9sZXNhbGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsRGlzdHJpYnV0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREb21lc3RpY1ZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZEN1c3RvbXNVbml0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlckFkanVzdGVkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudEFtb3VudEFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFN0b3JlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXBQcm9ncmFtUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjc2NQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlT3JpZ2luYWxFcXVpcG1lbnRNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZVdhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVudERlbGl2ZXJ5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxVcHBlckxpbWl0UHJpY2VNYXhpbXVtQWxsb3dhYmxlQ29zdFByaWNpbmdGb3JEcnVncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybVByaWNlRG9Ob3RBZHZpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByaWNlVGhyb3VnaFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyaWFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUJpbGxpbmdQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlUb0FkdmlzZVVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUFjdGl2aXR5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3JkZXJRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVsZWFzZVF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1QcmljZVJlZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1N1Z2dlc3RlZFJldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlbGVhc2VRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRJdGVtUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxUb0FkdmlzZVVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQdXJjaGFzZU9yZGVyUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByaWNlQmVnaW5uaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtQdXJjaGFzZU9yZGVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2F0YWxvZ3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJFYWNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUluRWZmZWN0QXRUaW1lT2ZTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyS2lsb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckxpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkRnJlaWdodENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcnNQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZERlYWxlck5ldFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRGbGVldFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQW5kRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZExpc3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQcmljZUZhY3RvcnNFcXVhbGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZFJldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtT2ZMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZFdob2xlc2FsZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb0JlTmVnb3RpYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29zdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmVQcmljZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVW5pdFByaWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2VWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZSIgdHlwZT0iVW5pdFByaWNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwyMV82Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIyMSIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iNiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2VNdWx0aXBsaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlZCIgdHlwZT0iUHJpY2VNdWx0aXBsaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik11bHRpcGxpZXIiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZU11bHRpcGxpZXIiIHR5cGU9IlByaWNlTXVsdGlwbGllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItT3JpZ2luYWxDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1SZXRhaWxDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudE11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLVdob2xlc2FsZUNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRTb2x1dGlvbk11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdNdWx0aXBsaWVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXgiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlZCIgdHlwZT0iVGF4Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhDYXRlZ29yeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGVkIiB0eXBlPSJSZWFzb25UYXhFeGVtcHRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4VHlwZUNvZGVkIiB0eXBlPSJUYXhUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4VHlwZUNvZGVkT3RoZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZWQiIHR5cGU9IlRheFBheW1lbnRNZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4YWJsZUFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheGFibGVBbW91bnRJblRheEFjY291bnRpbmdDdXJyZW5jeSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhBbW91bnRJblRheEFjY291bnRpbmdDdXJyZW5jeSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheExvY2F0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4IiB0eXBlPSJUYXgiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbER1dHlUYXhPckZlZUN1c3RvbXNJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mQWxsRHV0aWVzVGF4ZXNBbmRGZWVzQ3VzdG9tc0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZFYWNoRHV0eVRheE9yRmVlVHlwZUN1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkFsbER1dGllc1RheGVzQW5kRmVlVHlwZXNDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UmVsYXRlZEluZm9ybWF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheENhdGVnb3J5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkVmV0ZXJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVBhaWRCeVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGb3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbUNvdW50eVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tTG9jYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbVNjaG9vbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tU3RhdGVQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0R29vZHNhbmRTZXJ2aWNlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TGV0dGVyT25GaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMb2NhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdE5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVBlclN0YXRlTGF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRQcm92aW5jaWFsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFNhbGVUb1VTR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0VG9sbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVFeHBvcnRJdGVtVGF4Tm90Q2hhcmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaGVyUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRheGFibGVNYXRlcmlhbEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheGFibGVMYWJvckV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWRUYXhSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOby1Ob3RUYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Tm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUYXhhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuU3BhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUHJvcGVydHlUYXhFeGVtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXI2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlc091dHNpZGVTY29wZU9mVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsbHlFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheER1ZUZyb21BUHJldmlvdXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Tm90Tm93RHVlRm9yUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlcy1UYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilplcm9SYXRlZEdvb2RzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtRm9yRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXMtVGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOby1Ob3RUYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Gb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE9yRm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtTm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHROb3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheUlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtU2FsZVRvVVNHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUGVyU3RhdGVMYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGF4YWJsZU1hdGVyaWFsRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheGFibGVMYWJvckV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VGF4YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFRvbGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtR29vZHNBbmRTZXJ2aWNlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVByb3ZpbmNpYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5TcGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TG9jYWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZFZldGVyYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Ib21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXI2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVNjaG9vbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tTG9jYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tQ291bnR5UHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsbHlFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tU3RhdGVQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQcm9wZXJ0eVRheEV4ZW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUxldHRlck9uRmlsZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUNpdHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUNvdW50eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFTdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvbW1vZGF0aW9uc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRWYWxvcmVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxFeHBvcnRSZWJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbGxldnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpY0JldmVyYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sTWFya1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGktRHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2Vzc21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NQcml2aWxlZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVJlbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2ZmZWVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaW5PcGVyYXRlZERldmljZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5U3BlY2lmaWNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUluY29tZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlSZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHRMYWJvclRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmhhbmNlZDkxMVN0YXRlRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluY29tZVRheFdpdGhob2xkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVmFsdWVBZGRlZFRheE9uR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWYWx1ZUFkZGVkVGF4T25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlSW5MaWV1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBTWVkaWNhcmVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FTb2NpYWxTZWN1cml0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsTFVTVFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFNwaWxsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VwZXJGdW5kVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYW1pbmdUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDb25zdHJ1Y3Rpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpZnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVjZWlwdHNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRpY2FwVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaHdheVVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsdW1pbmFudHNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEluY29tZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oZXJpdGFuY2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGdWVsVGF4QWdyZWVtZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckJ5VHJhZGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWt5VW5kZXJncm91bmRTdG9yYWdlVGFua1RheEZlZGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWt5VW5kZXJncm91bmRTdG9yYWdlVGFua1RheFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodER1ZXNQYXlhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENvbnN0cnVjdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1c3RUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRyb3BvbGl0YW5UcmFuc2l0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQ2FzaERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNTdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlDb21wZW5zYXRvcnlBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yRnVlbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyQ29uc29ydGl1bVRheC1JdGFseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0VGhyZXNob2xkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJlbmNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlVGhyZXNob2xkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbGNvdW50ZXJ2YWlsaW5nRHV0eUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsQ291bnRlcnZhaWxpbmdEdXR5Q2FzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxEdXR5Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxEdXR5Q2FzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoQW5kRWR1Y2F0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQW5kVXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBlcmNlbnRhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldmVyYW5jZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlZFNvY2lhbFNlY3VyaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZWRXYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpZFdhc3RlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ29uc3RydWN0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFkaXVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcER1dHktSW1wb3N0YWRpQm9sbG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlYW5kTG9jYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBbmRMb2NhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBbmRQcm92aW5jaWFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxGdWVsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2lhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbFRheE9uR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsVGF4T25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVSZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGF4b25TcGVjaWZpY0xhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcmZ1bmRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1clRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zRGV2aWNlRm9yVGhlRGVhZlNlcnZpY2VFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2JhY2NvVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb25uYWdlVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3VyaXNtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuT3ZlclRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5lbXBsb3ltZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpdHlVc2Vyc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhob2xkaW5nVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrZXJzQ29tcGVuc2F0aW9uVGF4Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxMF80Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxMCIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iNCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmQXNzZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlWZW5kb3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxBZGRyZXNzSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJOYW1lQWRkcmVzcyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJMb2NhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25Ub1JlY2VpdmVDcmVkaXRGb3JVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGluZ1V0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUJhc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtYW5lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aHBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JsZHdpZGVHZW9ncmFwaGljTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWFyZXN0Q3Jvc3NTdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNyb3NzU3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlcklkZW50aWZpZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlU3ViZGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGUtTG9uZ2l0dWRlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpZFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpcXVvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vdGFnZUNhbGxEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBRdWFkcmFuZ2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxNZXJpZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljaWFsUHJvdHJhY3Rpb25EaWFncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclF1YXJ0ZXJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnN0cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWd1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yUXVhZHJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJzZURpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFN0YXRlbWVudHNNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eWFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRWNvbm9taWNBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcG9saXRpY2FsTmFtZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VzdG9tc09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlc3BvbmRlbmNlTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmF0ZUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaEFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuU1BMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb24tU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0RXF1YWxpemF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25GcmVpZ2h0Rm9yd2FyZGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblByb2Nlc3NpbmdTdGFuZGFyZHM1NS1OYW1lZFBvcHVsYXRlZFBsYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkN1c3RvbXNGYWNpbGl0aWVzSW5mb3JtYXRpb25hbmRSZXNvdXJjZU1hbmFnZW1lbnRTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3RhdGlvbkFjY291bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlQWxvbmdzaWRlVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdGF0aW9uR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Mb2NhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE1vdmVtZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eUZPQlBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm9wb2xpdGFuU2FtcGxpbmdBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV4aWNhblBvc3RhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlRnJvbVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLUFmdGVyTG9hZGluZ09uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkRnJlZU9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBheVN0YXRpb25MaXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZEFjY2VwdGFuY2VQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLVNoaXBwaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudHNBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsU2VydmljaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdFVTWklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RGlnaXRVU1pJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNURpZ2l0VVNaSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdENhbmFkaWFuUG9zdGFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNkRpZ2l0Q2FuYWRpYW5Qb3N0YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxFZHVjYXRpb25TZXJ2aWNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1cmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlQWRtaW5pc3RyYXRpdmVNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VidXJiYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlQW5kUG9pbnRzV2l0aGluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDYW1wdXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1TUExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU3RvcmFnZVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0Rpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2NvbnRpbmVudGFsRnJlaWdodEJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDYXJnb0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRlcnJpdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aW5nRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyYmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWxsYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdG93YWdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzZWFzQW5kUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RDaGFyZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mTWFuaWZlc3RPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZk1hbmlmZXN0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblJhaWxJbnRlcm1vZGFsVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uUmFpbEludGVybW9kYWxUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kT3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNvbGlkYXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtQ29uc29saWRhdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWFibGVBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkV4aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwYXRjaGluZ1Bvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Qb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50UG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZENoYXJnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWxlYXNlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxheVBvcnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jSUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciIgdHlwZT0iTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHUFNDb29yaWRpbmF0ZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkdQU1N5c3RlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxhdGl0dWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9uZ2l0dWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJHUFNDb29yaWRpbmF0ZXMiIHR5cGU9IkdQU0Nvb3JpZGluYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWxsb3dPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQWxsb3dPckNoYXJnZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWxsb3dPckNoYXJnZSIgdHlwZT0iTGlzdE9mQWxsb3dPckNoYXJnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWxsb3dPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkluZGljYXRvckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2lzQ29kZWQiIHR5cGU9IkJhc2lzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzaXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGVkIiB0eXBlPSJNZXRob2RPZkhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd2FuY2VPckNoYXJnZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQWxsb3dPckNoZ0Rlc2MiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNpc1F1YW50aXR5UmFuZ2UiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQmFzaXNNb25ldGFyeVJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTZXFObyIgdHlwZT0ieHNkOmludCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd09yQ2hhcmdlIiB0eXBlPSJBbGxvd09yQ2hhcmdlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkluZGljYXRvckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYm91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzT3JBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJCYXNpc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlBbW91bnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hlY2tUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDdXN0b21lckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVRvQmVQYWlkQnlWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVRvQmVQYWlkQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkdyb3NzUXVhbnRpdHlJbnZvaWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlVG9CZUlzc3VlZEJ5VmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VUb0JlSXNzdWVkQnlSZXNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlRGVuaWVkQnlWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUGF5YWJsZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjcnVhbEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRGdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoSW5BZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVBbmRBZGR0b0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFsbG93T3JDaGdEZXNjIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VydmljZUNvZGVkIiB0eXBlPSJTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93T3JDaGdEZXNjIiB0eXBlPSJBbGxvd09yQ2hnRGVzYyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEZXNjcmlwdGlvbiIgdHlwZT0iTGlzdE9mRGVzY3JpcHRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvblRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0iRGVzY3JpcHRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VydmljZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYm91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJzb2x1dGVNaW5pbXVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2UtRmVkZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlLVN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TnVtYmVyQ29ycmVjdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNpZEJhdHRlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdtZW50b2ZEZWxpdmVyeUZlZUFPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZhdGlvbk9mQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29tbWVyY2lhbEludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29waWVzT2ZGcmVpZ2h0QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbE1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsVGFyaWZmQ2xhc3NpZmljYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPbi1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT24tT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkVG9NYWtlTWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRGb3JNYXhpbXVtQ2hhcmdlc0JpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRGb3JNaW5pbXVtQXZlcmFnZVRpbWVSZXF1aXJlbWVudEJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRWYWxvcmVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlQ2hhcmdlc0hhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRGVzdGluYXRpb25BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VEZXN0aW5hdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZU9yaWdpbkFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZU9yaWdpbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpZGF2aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50RGlzYnVyc2VtZW50LURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudERpc2J1cnNlbWVudC1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0T25Hcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cG9ydENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lT3BlbmluZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsSGFuZGxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saWNCZXZlcmFnZVJlcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdoZW55Q291bnR5UEFEZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlRm9yQ29uc2lnbm1lbnRNZXJjaGFuZGlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTm9uLVBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRpbmdFeHBvcnREb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5lYWxIZWF0U3RlZWxvckdsYXNzVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm9kaXppbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGktZHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmJpdHJhcnlJbkFkZGl0aW9uVG9UaHJvdWdoUmF0ZXNhbmRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50c1RvQmlsbE9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWREZWJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nRHJhZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZUZyZWlnaHRBbGxLaW5kc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljUmVvcmRlckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbWluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkZGluZ0ZlZWRpbmdEaXNpbmZlY3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZWZGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJleW9uZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV5b25kRnJlaWdodENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWREZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0F0dGVuZGFuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhY2tMdW5nVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9ja2luZ0FuZEJyYWNpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb3dlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9idGFpbENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcFNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZWF1eEFyYml0cmFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3RoLUZsYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrYnVsa1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtTdXJmYWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmlkZ2VUb2xsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW5Mb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlblBhY2thZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlT3JEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlclN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZGVuT3ZlcmhlYWRPckFsbG93YW5jZUZvckluZGlyZWN0Q29zdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVySGFuZENhcnJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlUHJlc3N1cml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlc1NlbmRpbmdPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FtcEFyYml0cmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRhR3JlYXRMYWtlc0FkZGl0aW9uYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkNRQ3VzdG9tc0NsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXJyZW5jeUV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkltcG9ydFRlcm1pbmF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblJlY29uc2lnbm1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUmVtYW5pZmVzdEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRPcmRlckhlYXZ5RHV0eUZsYXRjYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHR1cmVBZGRpdGlvbmFsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29UYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQ3JlZGl0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyRGViaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJOb3RpZmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbEJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHNPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaW5BbmRCaW5kZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9mQWlyYmlsbC1TZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzRm9yd2FyZEFkdmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbE1pbGxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWNhZ29Mb29wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaWdhcmV0dGVTdGFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5TWFpbnRlbmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VGVybWluYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFuaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU2VhbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ0RpcFJ1c3Rwcm9vZkVEUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09EQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT0RDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeUFsdGVyYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5RGVsZXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLW1hbnVmYWN0dXJpbmdEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmF0aW9uUGVyZm9ybWFuY2VBbmROb24tcGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVBbGxTYW1lRGF5U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2FyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVzc29yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXNzaW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXNzaW9uTW9uZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmdlc3Rpb25TdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNlcnZhdGlvblJlc2VhcmNoRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlLUFybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhcml6YXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFyTGVnYWxpemF0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRlcG9zaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEZXN0dWZmaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGl2ZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGVhc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9zc0RhbWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VydmljZUNoYXJnZVVLRVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXJ2aWNlQ2hhcmdlVVNBQ2FuYWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyVHJhaWxlckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c01pbGVhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZEF0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLW9wQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUFkdmVydGlzaW5nTWVyY2hhbmRpc2luZ0FsbG93YW5jZVBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5T2ZCaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlPZkRlbGl2ZXJ5UmVjZWlwdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFJlY292ZXJ5QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFJlY292ZXJ5RmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3R0b25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50QW5kUmVjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25SZWltYnVyc2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmFmdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJBY2NvdW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXF1aXBtZW50QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRXhhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtQ29udGFpbmVyTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUxpZnRMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Zvcm1hbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UtQWRkaXRpb25hbFBhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQZW5hbHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dEFuZFBhcmFsbGVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXR0aW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkTWVyY2hhbmRpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvQ2FycmllckVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9DYXJyaWVyVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0dvdmVybm1lbnRFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFEcmF3aW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkaGVhZE1pbGVhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWZBbmREaXNhYmxlZFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckNhcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9yQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0VG9NYWtlTWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVjdGl2ZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpdEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlLUluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXlGdXJuaXNoaW5nRGVzdGluYXRpb25XZWlnaHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWFuZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UtQXZlcmFnZUFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlLVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0SW5MaWV1T2ZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJyaWNrQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25hdGVkU3VwcGxpZXJJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZQb3dlclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlRyYWlsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb24tU3BlY2lhbFR5cGVGbGF0Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25VbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVybWluZWRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZlbG9wbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGllU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UHJvZHVjdEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2Nvbm5lY3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1Ecm9wQm94Q29udmVuaWVuY2VDdHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtTXVsdGlwbGVTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU2VydmljZU9wdGlvbkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TZXJ2aWNlT3B0aW9uUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwbGF5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yRGlzY291bnRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkFuZFJlY29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uVG9BaXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2thZ2UtQm9hdERldGVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vci1Uby1Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3dlbFBpbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZWF0UG9ydE9mRGViYXJrYXRpb25SYXRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VhdFBvcnRPZkVtYmFya2F0aW9uUmF0ZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VMaW5lSGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyQXNzaXN0ZWRVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNXYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcERvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BZYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bURlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1VcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5ZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVubmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eURyYXdiYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseUJ1eUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlQYXltZW50QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVNoaXBBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlXZWlnaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5jbG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5Y2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lTdXJjaGFyZ2VGdWVsQWRqdXN0bWVudEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nU3VwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ3JhdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50ZXJlZFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE1hbnVmYWN0dXJlclJlc3RvcmF0aW9uQXVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3JvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMVByZXNlbnRhdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5Qb3J0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZVZhbHVlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNaWxlYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NQZXJpb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NWYWx1ZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUFjY2Vzc0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdGlvbkRlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0aW9uUGlja3VwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbmRlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZE9uZURheUNvbnN1bGFyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2hpcG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0aW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0aW5nUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q3VzdG9tc0NsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb25zLUF1dG9tYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb25zLVVTU2hpcHBlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEltcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5zZUFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRTaGlwcGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFDb3BpZXNhbmRNYWlsaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMYWJvckhlbHBlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxlbmd0aFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFTZXJ2aWNlLUNvdW50ZXItVG8tQ291bnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUNoYXJnZXMtQWRkaXRpb25hbFBhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRMYW1wUGFuZWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZheFByZS1hbGVydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zZmVyU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QXJ0aWNsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RGbGlnaHRPdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRyYWNrU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0UmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JTdG9ja1Byb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmRMb2RnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc1NwZWNpYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2VBZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkQ291cG9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0FnZW50Q29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRG9taWNpbGVTaGlwbWVudFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJhc2VkT25Eb2xsYXJNaW5pbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Q2hhcmdlc1RvQm9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Q2hhcmdlc1RvRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRFcXVhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbE5vbi1VU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsVVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGFzc3Rocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXNobmVzc0xlYWtlckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxUcnVja2xvYWRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnREaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGV3YXlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsYXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb2xkRmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzQ3JlZGl0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50SW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFdhcmVob3VzZUZlZS1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFdhcmVob3VzZUZlZS1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRmxvd0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdHVpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlY2VpcHRzU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGFnZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGVkSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZWRJbnNwZWN0aW9uVGVjaG5pY2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VsZlBvcnREZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQ2hhcmdlc09uRGlzdHJpYnV0aW9uRnJlaWdodEZvcndhcmRlZEJleW9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdGcmVpZ2h0QXRQb3NpdGlvbnNOb3RJbW1lZGlhdGVseUFkamFjZW50VG9WZWhpY2xlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJib3JNYWludGVuYW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyYm9yTWFpbnRlbmFuY2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxpbmdBbmRIb2lzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGluZ0FuZEhvaXN0aW5nVG9CZURpcmVjdEJpbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvT25EZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNIYW5kbGluZ0ZlZS1Eb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzSGFuZGxpbmdGZWUtSW50ZXJuYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdEluVHJhbnNpdENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRUcmVhdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdnlEdXR5RmxhdENhckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdnlMaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU2VjdXJpdHlSZWRJbi1ib25kU2VhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaHdheUludGVyY2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2ludGluc0FuZEhhdWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVMaW5lRnJlaWdodENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9uZXlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvb2stdXBjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VDaGFyZ2VTcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc1BpY2stdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBQWlyYmlsbFByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0U2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wcm9wZXJEb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kRnJlaWdodENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUZyZWlnaHRNYW51ZmFjdHVyaW5nVG9TaGlwcGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnJlY3RCaWxsaW5nQWNjb3VudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlQcmljZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbExpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVDYWJsZUNvbm5lY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0QXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdEF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbkFuZFRyYWluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25XYXJyYW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWxhdGVkVGFua0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYWNlbWVudENvc3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByb3ZpZGVkQnlMZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByb3ZpZGVkQnlMZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJkaXZpc2lvblByb2ZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0T25SZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0T25TZWN1cml0eURlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Vc2VQZXJtaXR0ZWRBdFNwZWNpYWxSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Db21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25NYXJrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDb3VyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRG9vci10by1Eb29ySGFuZGxpbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycGxhbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyc3RhdGVIaWdod2F5VG9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0UHJpY2VQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYS1wbGFudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUFkZGl0aW9uYWxBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQXQtQ29zdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURlbGl2ZXJ5VGVybXNBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOby1DaGFyZ2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVdpdGhHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJpc2hBcmJpdHJhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNsYW5kRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZFBpY2stVXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0YWxpYW5SZWxlYXNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbS1Vbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwRnJvbUZyZWV6aW5nUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS29zaGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JDb3N0T2ZSZW1vdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck1vZGlmeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JOb1Ryb3VibGVGb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JPdmVydGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JQcmVtaXVtT3ZlcnRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yUmVwYWlyQW5kUmV0dXJuT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3RyYWlnaHQtdGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUZXN0QW5kQ2FsaWJyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWRpbmdBZGp1c3RtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudEZhY3Rvci00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc2hpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVPcmRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW91dERlc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3ZlckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWtpbmdVbmRlcmdyb3VuZFN0b3JhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2hvcnRmYWxsQ29uc2lkZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJ1Y2tsb2FkQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VBbmRUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZWxpbmVTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRHYXRlVHJ1Y2tPckZvcmtsaWZ0U2VydmljZUF0UGljay11cERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1lRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsRnJvbVBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFBlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsVG9Qb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGVkRGFtYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25BbnRpLUR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25UYXhBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRvdGFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0xhYm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFdlaWdoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbERlbGl2ZXJ5RHJheWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZURlbGF5ZWRJblN3aXRjaGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmVVbmRlck93blBvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdHRlcnlDaGFyZ2VCYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3R0ZXJ5Q3Jvc3NSZWRlZW1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93LVRpZXJMb3R0ZXJ5Q2FzaGluZ0JvbnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ctVGllckxvdHRlcnlXaW5uZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdW1wU3VtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmctUG9zdGFnZUNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmctU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxJbnZvaWNlVG9FYWNoTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXREZXZlbG9wbWVudEZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nT3JUYWdnaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJyaWFnZVJ1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbW9SZXR1cm5hYmxlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFuZGlzZVByb2Nlc3NpbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxzU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkLVRpZXJMb3R0ZXJ5Q2FzaGluZ0JvbnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWQtVGllckxvdHRlcnlXaW5uZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlYWdlRmVlRm9yUmVwYWlyQW5kUmV0dXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlYWdlT3JUcmF2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aGx5UmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3VudERlbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdW50aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11c2hyb29tRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGlzdHJpYnV0aW9uQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdJdGVtQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3RvcmVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3V2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdXYXJlaG91c2VEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9ya0RlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrUGljay11cENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkhEV2hhcmZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUR1dGlhYmxlQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uR2VuZXJhdGVkRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLXJldHVybmFibGVDb250YWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1JldHVybkNyZWRpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsUHVtcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJpemVkQWZmaWRhdml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZUJlZm9yZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3p6bGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ2hhcmdlcy1IYXphcmRvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3VwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNob3JlLUFsYXNrYUhhd2FpaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25DYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25EZWNrQnJlYWtCdWxrRGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lVGltZUVuZ2luZWVyaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtVGltZUxpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1UaW1lLU9ubHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZXRpbWVUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsU29mdHdhcmVTdXBwb3J0Rm9yT3BlcmF0aW9uYWxTdXBwb3J0U3lzdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxTb2Z0d2FyZVN1cHBvcnRGb3JTd2l0Y2hpbmdTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25DaGFyZ2VDb2xvckZhYnJpY09mZmljZUZ1cm5pdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXItRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJOb3RpZnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWNjZXNzb3JpYWxTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFkdmFuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckV4cG9ydENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR292ZXJubWVudEFnZW5jeURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdvdmVybm1lbnRBZ2VuY3lFeGFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckltcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJNaXNjZWxsYW5lb3VzRWFybmluZ09yQWRkaXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU2VlUmVsYXRlZERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlJvdXRlTWlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mWm9uZVBpY2stdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlQ2FibGVDb25uZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVySGVpZ2h0Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycnVuQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2l6ZWRQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZUxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJXaWR0aENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQ3JhdGluZ0FuZEhhbmRsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQ3JhdGluZ0hhbmRsaW5nQW5kVHJhbnNwb3J0YXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tJbnZvaWNlV2l0aFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWludGluZ1ByaW1lck9yRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldEV4Y2hhbmdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRpemluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWxsZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmlzaENvdW50eVNhbGVzVGF4T25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2luZ1NoaXBwZXJzRXhwb3J0RW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBZGRpdGl2ZXNPdmVydGltZUxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWRkaXRpdmVzU3RyYWlnaHRUaW1lTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVjYW5GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnREaWZmZXJlbnRpYWwtTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlNoaXBtZW50VmFsdWVUaGF0SXNSZXR1cm5hYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZTaGlwcGVkUXVhbnRpdHlUaGF0SXNSZXR1cm5hYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VBd2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVySXRlbUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRzQm9uZHNFc2NvcnRBdHRlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlck9yZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJQb3VuZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eU1lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eVNwb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvc3BoYXRpemluZ1N0ZWVsVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrbGVBbmRPaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay11cEFuZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXAtT3V0T2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJDaGFyZ2VzT3RoZXJUaGFuV2hhcmZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJDaGFyZ2VzLVdoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyUGljay11cEFuZE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90SW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50QW5kT3JSZW1vdmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVMYXNoaW5nRXF1aXBtZW50U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xlV29vZC1TZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3JrRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEhhbmRsaW5nQW5kVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0F0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0RGFtYWdlZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RhdG9GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyRmFjdG9yQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNhcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2FycmlhZ2VFeGNlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2FkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2RnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkVXNhZ2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbkFuZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQWlyV2F5YmlsbC1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDYW5hZGlhbkN1c3RvbXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQ29tbWVyY2lhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZFeHBvcnRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mVVNFeHBvcnREb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUG9zaXRpb25lZEludmVudG9yeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50UGVyY2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBbmRNYXJrZXRpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlRGV2aWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmlsbGluZ0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JEZWxpdmVyeU9mQmlsbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvck1vbnRoQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlT3duZWRWZWhpY2xlUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0luVHJhbnNpdFByaXZpbGVnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbERpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZkNvbXBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZS1Db2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZS1IZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlSG91c2Vob2xkSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZU5hbWVBbmRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWxsaW5nRXllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcEFpckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsaGVhZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVJlZHVjdGlvbkJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtQmlsbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViaWxsZWREcmF5YWdlLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJpbGxlZERyYXlhZ2UtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudEFkZHJlc3NDb3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlckhhbmRsaW5nQ2h1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uRmVkZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25TaGFyZWRSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25jaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29ubmVjdGNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWduQ29uc2lnbmVlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25EZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWdubWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb29wZXJpbmdBdE93bmVyc09yU2hpcHBlcnNFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmF0aW5nUmVjb29wZXJpbmctRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JhdGluZ1JlY29vcGVyaW5nLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nSGFyZHdhcmVNYWludGVuYW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nU29mdHdhcmVNYWludGVuYW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkaXN0cmlidXRpb25BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvblByZXBhbGxldGl6ZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyQ2FyZ29QZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbENhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvbk1lY2hhbmljYWxEZXRlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXJiaXNoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mRXhwb3J0Rm9yUmVlbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZFeHBvcnRTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlSZXF1aXJlZFJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWFiaWxpdHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlucXVpc2htZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uQW50aS1EdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvbkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRheEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRvdGFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxEZWR1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRzQW5kTGVhc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhY2tDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRCdXllcnNFeHBlbnNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEN1c3RvbWVyRXhwZW5zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRHb3Zlcm5tZW50RXhwZW5zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RWaWFDYW5hZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoRGV2ZWxvcG1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VsbGVyc0Rpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbFBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvdHRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RvY2tpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBcnRpY2xlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ2FyZ29DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWRpbmdBdHRlbmRhbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvY2t5TW91bnRhaW5CdXJlYXU1ODNJdGVtMTEwMEFyYml0cmFyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE91dEFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxSZWJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZS1EYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2stVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay11cE9yRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZUNoYXJnZVVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2lnbmF0dXJlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VncmVnYXRpbmdTb3J0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZVbmxvYWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVySGFuZENhcnJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQXNzaXN0YW5jZVByb2dyYW1TdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VXaXRoQ2FzaERpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVXBncmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXBGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZENhcnJpZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0FuZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwc2lkZVBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvU3RvY2tRdWFsaXR5QXVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3RibGFzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rYWdlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmtBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmluay1XcmFwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvblBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JQb3J0T2ZFbWJhcmthdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVJbnZvaWNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVTaGlwbWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRVbmxvYWRpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3R0aW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbE9yZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZVN1cHBvcnRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2lyY3VzVHJhaW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEZXRlbnRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxFcXVpcG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxGaW5pc2hDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxGcmVpZ2h0U3VwcGxlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1pbGVhZ2VNb3ZlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYWNrYWdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQZXJtaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHVtcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNlYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRlc3RFcXVpcG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUb29saW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVG9vbGluZ3Jld29ya2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRyYWluTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxWZWhpY2xlUmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvblJldmlldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGljay1VcEF0UGllckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Bvb2xDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3R0aW5nT2ZUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHJlYWRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU1ldHJvcG9saXRhblRyYW5zaXRBdXRob3JpdHlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTW90b3JGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbGVzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZW5jaWxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdE9yaWdpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0UGllckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BwaW5nSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaWdodGVuaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmVldExhbXBzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpcHBpbmdTb3J0aW5nQW5kQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWZmaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9Db29wZXJhdGl2ZUFkdmVydGlzaW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9UYXhPblJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZmVyYW5jZVdhcmVob3VzZUNoYXJnZUV4cG9ydE9ySW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdhckZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtT2ZBZGRzQW5kRGVkdWN0c1RvTWFrZU1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW5kYXlPckhvbGlkYXlQaWNrLXVwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJCYWdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbER1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3ZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua1JlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFycGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQWlycG9ydFRheERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQWlycG9ydFRheE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUJldmVyYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQ2l0eVNhbGVzVGF4T25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRXhjaXNlVGF4LURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRXhjaXNlVGF4LU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUZlZGVyYWxFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1GZWRlcmFsRXhjaXNlVGF4T25UaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUdvdmVybm1lbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUhhbmRsaW5nQ2hhcmdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWFiaWxpdHktQW1vcnRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWFiaWxpdHktT25lVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUxvY2FsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Mb2NhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LU1ldHJvcG9saXRhblRyYW5zaXRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9uTWlzY2VsbGFuZW91c0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9uVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1SZWd1bGF0b3J5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU2FsZXNhbmRVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TYWxlc1RheFN0YXRlQW5kTG9jYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdGF0ZUhhemFyZG91c1N1YnN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3VwZXJGdW5kRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtVXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobm9sb2d5RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVncmFtQ2hhcmdlYmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmUtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZS1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlWb2x1bnRhcnlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmVkQXNUcnVja2xvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxIYW5kbGluZ0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFF1YWxpZmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQYWxsZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdocHV0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdocHV0Q29udGFpbmVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJ1d2F5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWNrZXRpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2JhY2NvUHJvZHVjdHNSZXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPRkNTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nUmV3b3JrQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sc0ZvclByaW50aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFzc2Vzc29yaWFsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50Tm9uLVVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50VVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE1hdGVyaWFsSW52b2ljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2luZ0luYm91bmRWaWFPdGhlckNhcnJpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjaW5nU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyUmVudGFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQW5kU2V0dXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQ2hhcmdlTWluaW11bVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uRGlyZWN0QmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25UaGlyZFBhcnR5QmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25WZW5kb3JQcm92aWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbW1pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrRGV0ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWREaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVybmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvLURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3b0Rvb3JQaWNrVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWJzb3JiZWRTd2l0Y2hpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ0xhYm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nUmVsb2FkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNhbGVhYmxlTWVyY2hhbmRpc2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2NoZWR1bGVkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VQbGFuRGV0YWlsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRmxhdEFzc2lzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZU1heGltdW1Bc3Npc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREFJbnNwZWN0ZWRTdGFtcGluZ0NlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZUNoYXJnZVRvb2xpbmdQZXJzb25uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZS1TcGVjaWFsVHlwZUZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuQ2xlYW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVPcmRlcmVkQnV0Tm90VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVByZXBDaGFyZ2VDb3VydGVzeURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUm9hZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVudGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luSXNsYW5kVHJhbnNmZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRhcnlDb250cmlidXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXRpbmdUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrQ3Jld0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVkRnV0aWxlVHJpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJtZWxvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbEFuZEludm9pY2VEaXN0cmlidXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlYXRoZXJQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRWZXJpZmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUJyZWFrYnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2VIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkZUFyZWFUZWxlcGhvbmVTZXJ2aWNlVXNhZ2VDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbGxDYWxsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYLXJheUNoYXJnZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzaXNNb25ldGFyeVJhbmdlIj4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeUxpbWl0Ii8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzaXNNb25ldGFyeVJhbmdlIiB0eXBlPSJCYXNpc01vbmV0YXJ5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1pbmltdW1Nb25ldGFyeVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1heGltdW1Nb25ldGFyeVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5UmFuZ2UiIHR5cGU9Ik1vbmV0YXJ5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5TGltaXQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5TGltaXRWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5TGltaXQiIHR5cGU9Ik1vbmV0YXJ5TGltaXQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlF1YW50aXR5TW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmF0ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZVBlclVuaXQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0UHJpY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZUJhc2lzIiB0eXBlPSJEZWNpbWFsMThfMyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZSIgdHlwZT0iUmF0ZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMThfMyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5VmFsdWUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5QW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlWYWx1ZSIgdHlwZT0iTW9uZXRhcnlWYWx1ZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZUN1cnJlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRhcmdldEN1cnJlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJEZWNpbWFsMTlfOSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW52ZXJzZVJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJEZWNpbWFsMTlfOSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0ZU9mUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mUmF0ZU9mRXhjaGFuZ2VSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiIHR5cGU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxOV85Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxOSIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iOSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlJlZmVyZW5jZSIgdHlwZT0iTGlzdE9mUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGVyY2VudFF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJjZW50YWdlTW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUGVyY2VudFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50UXVhbGlmaWVyIiB0eXBlPSJQZXJjZW50UXVhbGlmaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUxpc3RDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTmV0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtR3Jvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LU5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlcGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VBbW91bnRMZXNzUHJldmlvdXNEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TW9udGhseU9uQWxsSW52b2ljZXNQYXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudENoYXJnZUJhc2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxSYXRlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwVG9Mb2NhdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBGcm9tTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNjaGVkdWxlTGluZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaW1wbGVQYWNrYWdlTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGVybXNPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhcmdvQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJ5RGV0YWlsIiB0eXBlPSJEZWxpdmVyeURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2NoZWR1bGVMaW5lIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTY2hlZHVsZUxpbmUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNjaGVkdWxlTGluZSIgdHlwZT0iTGlzdE9mU2NoZWR1bGVMaW5lIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTY2hlZHVsZUxpbmUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NoZWR1bGVMaW5lSUQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlZCIgdHlwZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudFN0YXR1c1JlYXNvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZTdGF0dXNSZWFzb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcXVlc3RlZERlbGl2ZXJ5RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZPdGhlckRlbGl2ZXJ5RGF0ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRhdGVDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY2hlZHVsZUxpbmVOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNjaGVkdWxlTGluZSIgdHlwZT0iU2NoZWR1bGVMaW5lIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90WWV0U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlclNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9yUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxseVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxseURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdGF0dXNSZWFzb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlN0YXR1c1JlYXNvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3RhdHVzUmVhc29uIiB0eXBlPSJMaXN0T2ZTdGF0dXNSZWFzb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0YXR1c1JlYXNvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhdHVzUmVhc29uQ29kZWQiIHR5cGU9IlN0YXR1c1JlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0YXR1c1JlYXNvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YXR1c1JlYXNvbiIgdHlwZT0iU3RhdHVzUmVhc29uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN0YXR1c1JlYXNvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zQXdhaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWZ1c2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eU9uSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25JbmNvcnJlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlc3RyaWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0UmVzdHJpY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Tm90UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGlmZmVyZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUb29MYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudEF0dHJpYnV0ZWRUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9UaGVCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9UaGVDYXJyaWVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEYXRlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRhdGVDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGF0ZUNvZGVkIiB0eXBlPSJMaXN0T2ZEYXRlQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJEYXRlUXVhbGlmaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlQ29kZWQiIHR5cGU9IkRhdGVDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGF0ZVF1YWxpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGVkIiB0eXBlPSJEYXRlUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVRdWFsaWZpZXIiIHR5cGU9IkRhdGVRdWFsaWZpZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjAzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1MzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTYzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYwMjgzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1MjgzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1NjI4MzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdFNjaGVkdWxlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdFNjaGVkdWxlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZWxlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlT2ZHb29kc0RlY2xhcmF0aW9uQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVUaW1lT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRCZW5lZml0QWdlTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50QmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnREYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEluc3VyYW5jZUVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudExpZmV0aW1lQmVuZWZpdFF1YWxpZmljYXRpb25BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRhbnRzT3BpbmlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDbG9zZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nTWV0aG9kb2xvZ3lDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1RyYW5zYWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1ZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1llYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPcGVuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZS1TdGF0ZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eVJlcG9ydGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5UGVyaW9kRGF0ZVJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEFyY2hpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsQ29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJldHVyblRvV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZU1hbmlmZXN0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZU1hbmlmZXN0YXRpb25PZkFDaHJvbmljQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqb3Vybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZENvbnRlc3RhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZERlYXRoQmVuZWZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkSGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFByb2Nlc3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFByb21pc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50VG9CaWxsRGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JPcmRlcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXNzaW9uRGF0ZUFuZE9yVGltZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG9wdGlvbkRhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUFmdGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUJlZm9yZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VDb21wbGV0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlT25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2VkUmVuZXdhbER1cmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVCYXNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVQcm9ibGVtUmVzb2x1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmFseXNpc01vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lhQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnREZWxpbnF1ZW50T25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnRGaWxpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnRNYWlsaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0aXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0eUNvbW1lbmNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkQ2xvc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGlhbmNlUGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkxvZ2dlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVBdEluaXRpYWxQb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lT2ZUcmFuc3BvcnRMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbEluQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0ZXJpYWxCbG9vZEdhc1Rlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldEFuZExpYWJpbGl0eVNjaGVkdWxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50UmVjb3JkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGFuY2VEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGllbmNlRGVmaWNpZW5jeVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRQZXJpb2RBZnRlclNwbGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRQZXJpb2RQcmlvclRvU3BsaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpb25WYWxpZGF0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0aWNQcmVtaXVtTG9hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlRGVsaXZlcnlEZWxheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlckRlbGl2ZXJ5RGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VEYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZVNoZWV0RGF0ZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lQ29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZm9yZUludmVudG9yeUlzUmVwbGVuaXNoZWRCYXNlZE9uU3RvY2tDaGVja0xlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdMYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpblRoZXJhcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmtzRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QXBwbGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RGViaXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXREZWJpdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGF5bWVudHNUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRSZWxlYXNlQXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRzUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlclN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHlwZUdyb3NzV2Vla2x5QW1vdW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHlwZU5ldFdlZWtseUFtb3VudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RCZWZvcmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0VGltZVRvQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlhbm51YWxUZXJtaW5hbEluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5EYXRlQmlkc1dpbGxCZU9wZW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkUHJpY2VFeGNlcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZFRocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rc1ZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZXByaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzSW5jb21wbGV0ZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNOb3RBdXRob3JpemVkQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc05vdENvbXBsZXRlQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc1JlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaXRpc2hUaGVybWFsVW5pdFRlc3RQZXJmb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldExpbmVBcHBsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ29udHJvbENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzT3BlbmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0xvY2FsVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhckFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlckV4Q291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXJFeEZhY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90RGVsaXZlcmVkQnlUaGlzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3RQdWJsaXNoZWRCeVRoaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdFNoaXBwZWRCeVRoaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25EYXRlVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbGl6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0aW9uUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0aW9uUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQm9va2luZ0NvbmZpcm1lZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1JlbGVhc2VEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlQ29udmVydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlUmVvcGVuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hDYWxsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0ZWdvcnlDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vhc2VkT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25PZldlaWdodERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25SZXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFjY291bnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQmFja0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRPZkFjY291bnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRiaXJ0aERhdGVBbmRPclRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkYmlydGhEYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJpc3RlbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5zaGlwQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yS25vd2xlZGdlT2ZUaGVJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvck5vdGlmaWVkT2ZFbXBsb3llZUxlZ2FsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltSW5jdXJyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU1hZGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU5vdGlmaWNhdGlvblJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbXNNYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVN0YXRlbWVudFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1TdGF0ZW1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmFuY2VEYXRlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljYWxFeGFtaW5hdGlvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVW50aWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nRGF0ZU9mRmlyc3RCYWxhbmNlU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc3VyZURhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25EYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uRGF0ZVRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lbmNlZFB1bXBpbmdCYWxsYXN0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lbmNlZFRhbmtDbGVhbmluZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55VGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmlzb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBpbGF0aW9uRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkUHVtcGluZ0JhbGxhc3REYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkVGFua0NsZWFuaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZU5vdEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZU5vdEJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbkluaXRpYWxUcmVhdG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbkRhdGVMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQVF1YWxpZnlpbmdFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkRhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTYWZldHlDb252ZW50aW9uQ3NjSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNhZmV0eUNvbnZlbnRpb25Dc2NQbGF0ZUV4cGlyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHJpcHBpbmdEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlc3RhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VuY3lFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25PZlBheVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWluZ0VkdWNhdGlvblJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzQ292ZXJhZ2VEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c1Bhc3NpdmVNb3Rpb25DUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXVkaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF3YXJkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QmluZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29tcGxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29zdHNUaHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TWFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmZvcm1hbmNlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyZm9ybWFuY2VTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmUtT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uUGVyaW9kRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblBlcmlvZFN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvbnNDZWFzaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvblByaXZpbGVnZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvblRvUmVwYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uSW50b0hvbGRpbmdDb21wYW55RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGVkVG9FbGVjdHJvbmljRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3RlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHNCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0c0VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkRGF0ZU9mQmlydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyU2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERpc21pc3NhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Tm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlSXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkSW5jb21lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdERvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc1JlcXVlc3RlZFZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3Nib3JkZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEF1dGhvcml0eUNvbnRyb2xTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZExhc3REYXlXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbmNvbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMZWdhbFN0cnVjdHVyZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnROYW1lRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTY2hlZHVsZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2NoZWR1bGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJ0YWlsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnRhaWxtZW50RGF0ZWZyb21BZHZpY2VPZlBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NhcmdvUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0VudHJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFjY291bnRNYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQWNxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBbmRPclRpbWVPZkhhbmRsaW5nRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQXNBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFzc2lnbm1lbnRGaWxlZEZvclJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeUZpbGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUJlY2FtZUF3YXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ2xhaW1QYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ291cnNlT2ZPcnRob2RvbnRpY3NUcmVhdG1lbnRCZWdhbk9ySXNFeHBlY3RlZFRvQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEZWVkRmlsZWRGb3JSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEZWZhdWx0V2FzQ3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEb2N1bWVudGF0aW9uT3JQYXBlcndvcmtPckJvdGhXYXNTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZUhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZVByb2NlZWRpbmdzSW5zdGl0dXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlU2FsZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvclRoZUxhc3RVcGRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVIYXphcmRJbnN1cmFuY2VQb2xpY3lDYW5jZWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVIYXphcmRJbnN1cmFuY2VQb2xpY3lSZWZ1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlTWF0ZXJpYWxVc2FnZVN1c3BlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWJhbmRvbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjcXVpc2l0aW9uT2ZUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBcHByYWlzYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFzc2lnbm1lbnRBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXNzaWdubWVudFJlamVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNsb3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRhbWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjZWFzZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlZWRJbkxpZXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRpdm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkV4dGVuc2lvblRvQ29udmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJtQ29tbWl0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RNb3J0Z2FnZVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0UmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdFVuY3VyZWREZWZhdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGb3JlY2xvc3VyZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3REcmF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0SW5zdGFsbG1lbnRSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdFBheW1lbnRSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdFVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VBcHByb3ZhbE9mQ29udmV5YW5jZU9mRGFtYWdlZFJlYWxFc3RhdGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VBcHByb3ZhbE9mQ29udmV5YW5jZU9mT2NjdXBpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQ2VydGlmaWNhdGlvbk9mQ29udmV5YW5jZU9mRGFtYWdlZFJlYWxFc3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk1heGltdW1NZWRpY2FsSW1wcm92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZU9mUHJvYmFibGVJbmVsaWdpYmlsaXR5Rm9yQXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlT2ZSZWZlcnJhbEZvckFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZVRvQ29udmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9yZGVyTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb2R1Y3RGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm9wZXJ0eUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VGcm9tQmFua3J1cHRjeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlcGFpck9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2VpenVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2VwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU291cmNlRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT25XaGljaEFzc2V0c0p1ZGdlZEluc3VmZmljaWVudFRvUGF5Q3JlZGl0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT3V0c3RhbmRpbmdMb2FuQmFsYW5jZVJlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBsYWNlZEluRGlzZmF2b3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUG9zc2Vzc29yeUFjdGlvbkluaXRpYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByYWN0aWNlQ2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJhY3RpY2VFc3RhYmxpc2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByb3BlcnR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlYWR5Rm9yQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlZGVtcHRpb25QZXJpb2RFbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVmZXJyZWRUb0F0dG9ybmV5Rm9yRm9yZWNsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGhyb3VnaFdoaWNoUHJvcGVydHlUYXhlc0hhdmVCZWVuUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkRpc2NvdW50VGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZJbnRlcmVzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkxhdGVzdEFjY291bnRzRmlsaW5nQXRQdWJsaWNSZWdpc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRvdGFsQW1vdW50T2ZEZWxpbnF1ZW5jeVJlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVm9sdW50YXJ5Q29udmV5YW5jZUFjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlV2hlbkNvbnRhaW5lckVxdWlwbWVudEJlY29tZXNEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5bGlnaHRPdmVyZHJhZnRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYXRoRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0VmFsdWVEYXRlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0SW5jdXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2lzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUHJlc2VudGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWZlcmVuY2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdGlibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZWROb3RBdmFpbGFibGVBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWREaXN0cmlidXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmluaXRpb25PZkRpc2FiaWxpdHlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXllZEJpbGxpbmdOb3REZWxheWVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJOb3RCZWZvcmVBbmROb3RBZnRlckRhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFwcG9pbnRtZW50RGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWUxU3RTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUN1cnJlbnRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUZpcnN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lTGFzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVNjaGVkdWxlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXJJc3N1ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUaWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsUmVzY2lzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudEFkbWlzc2lvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnREaXNjaGFyZ2VEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvcldhZ2VEZXRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRnJvbUxhc3RQb3J0T2ZDYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRnJvbVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbEluZm9ybWF0aW9uUmVjZWlwdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdEludGVyY2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eVdhaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VBbmRMb2FkaW5nQ29tcGxldGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZS1QbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNlbWJhcmthdGlvbkRhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNtaXNzYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvclRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVuZEFwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRFeHBpcnlEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UHJlc2VudGF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE1lc3NhZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNlaXZlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERlbGl2ZXJBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REZWxpdmVyQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFNoaXBCZWZvcmVFeENvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90U2hpcEJlZm9yZUV4RmFjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BBY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wcGVkVG9MZXNzVGhhbkhhbGZUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlTGFzdENvbXBsZXRlSW5zdGFsbG1lbnRQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlT2ZGaXJzdFBheW1lbnRUb1ByaW5jaXBhbEFuZEludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybGllc3RGaWxpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmxpZXN0U2FsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVdpdGhkcmF3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5pbmdzRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZU9mQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmthdGlvbkRhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Byb2Zlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlRWZmZWN0aXZlRGF0ZU9mQ292ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTGFpZE9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUZW1wb3JhcnlMYWlkT2ZmUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRlbXBvcmFyeUxhaWRPZmZQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVdhZ2VzQ2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcktub3dsZWRnZU9mVGhlSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llclJlcG9ydGVkSW5qdXJ5VG9DbGFpbUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQb3NpdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudE9ySGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFBvc2l0aW9uU3RhcnREYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UHJvZmVzc2lvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEF2YWlsYWJpbGl0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVPZlN1cHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0xheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mR3JhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mTGFzdEZpc2NhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VkQ2VydGlmaWNhdGVJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VMZXZlbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbG1lbnRTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5RGF0ZUVzdGltYXRlZEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudExvZ0VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFByZVRyaXBEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZWNvbmRpdGlvbmluZ0RhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJSZWFkeURhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJldHVyblBlcmlvZEV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdG9ja0NoZWNrRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlQ29tbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBY2NlcHRhbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1GaXJzdFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tU2Vjb25kUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1UaGlyZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkRhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkJpcnRoRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRXNjcm93Q2xvc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkSW1taWdyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb2ludE9mQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9pbnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtRmlyc3RQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1TZWNvbmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1UaGlyZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpb25EYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhpdFBsYW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRDb250YWluZXJIaXJlRnJvbURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZEZ1bmRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFByb2JsZW1SZXNvbHV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRSZXBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZE9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZU9mRXh0ZW5zaW9uVG9Bc3NpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlT2ZFeHRlbnNpb250b0ZvcmVjbG9zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVUaW1lT2ZDdXN0b21zRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlVG9TdWJtaXRUaXRsZUV2aWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZFeHRlbnNpb25Ub0NvbnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRXh0ZW5zaW9uVG9TdWJtaXRGaXNjYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZGb3JlY2xvc3VyZVRpbWVmcmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZU9mRXhwb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZU9mSW1wb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwbGFudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGF0aW9uRGF0ZUZvclRleHRpbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3N1cmVTb3VyY2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVEdWVCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlTW9kZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVhc2liaWxpdHlTaWduT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uRmh3YUluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVDYXBpdGFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVHZW5lcmF0aW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY29uY2lsaWF0aW9uVmFsdWVFc3RpbWF0ZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ292ZXJhZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25TdWJtaXNzaW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVNYW5kYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdERhdGVPZk9yZGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludGVyZXN0QmVhcmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW50ZXJlc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludm9sdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdE1hcmtldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFBheW1lbnRDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQcm9kdWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQdWJsaXNoZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFNhbGVEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U3VibWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RWaXNpdG9yQ29uc3VsdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJpbGxEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9Db21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0VhcmxpZXN0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvTGF0ZXN0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZOb3RpY2VUb1Byb2NlZWRUb0NvbW1lbmNlbWVudE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mTm90aWNlVG9Qcm9jZWVkVG9Db21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvU2FtcGxlUmVhZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb1NoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mUmVjZWlwdE9mSXRlbVRvQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZSZWNlaXB0T2ZUb29saW5nQWlkc1RvU2FtcGxlUmVhZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZTYW1wbGVBcHByb3ZhbFRvRmlyc3RQcm9kdWN0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZUb29saW5nQXV0aG9yaXphdGlvblRvU2FtcGxlUmVhZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21MYXN0Qm9va2VkT3JkZXJUb0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXBwcm9wcmlhdGlvbi1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXBwcm9wcmlhdGlvbi1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnV0dXJlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWxsb25zUGVyTWludXRlVGVzdFBlcmZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUG9zaXRpb25pbmdEYXRlVGltZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1Bvc2l0aW9uaW5nRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvclJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kT3ZlckRhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kT3ZlckRhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaENhcGl0YWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25SZWxlYXNlQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZWRGcm9tRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZWRVbnRpbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkQXNTdG9ja0FzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZXNDb25uZWN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZXNEaXNjb25uZWN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxBZG1pc3Npb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbERpc2NoYXJnZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJvdGVzdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3NCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzc1JlY292ZXJ5RGF0ZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1pZ3JhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxhbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25EYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjdGl2aXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5hY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZE1vdmVtZW50QXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZURvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVJbmNyZWFzZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkRpc3NvbHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmN1bWJlbmN5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRWR1Y2F0aW9uUGxhbklFUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tZm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVsZWFzZUF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDb21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ29udGFjdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZExhc3REYXlXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kUmV0dXJuVG9Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmVlRHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmluYW5jaWFsQWNjb3VudHNGaWxlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGVJbml0aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFByZW1pdW1FZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxSZXF1ZXN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5T3JJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TZXJ2aWNlU3VydmV5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zb2x2ZW5jeURpc2NoYXJnZUdyYW50ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbWVudFBheW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNPcmlnaW5hbEV4ZWN1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VmZmljaWVudEFzc2V0c0p1ZGdlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0Q2FwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGFpZFRocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGFpZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RSYXRlVmFsaWRpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50QXBwcm92YWxGb3JQdWJsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZXZpZXdDeWNsZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJydXB0aW9uRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnJ1cHRpb25TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlclNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudE51bWJlckFsbG9jYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZpdGF0aW9uVG9UZW5kZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZVJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZWd1bGFySW50ZXJlc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Db250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUNvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbmVkRW1wbG95ZXJEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2luZWRGdW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudENhbGVuZGFyWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRGaXNjYWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJXYWdlRGV0ZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RBY3Rpdml0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RBbm51YWxSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2FwaXRhbENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2hlY2tGb3JCYWxhbmNlU2hlZXRVcGRhdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2l2aWxpYW5GbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlRm9yQUdvdmVybm1lbnRBZ2VuY3lUb0ZpbGVBQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlT2ZBY2NvdW50c0ZpbGVkQXRQdWJsaWNSZWdpc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVPZk9yZGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZVRvRmlsZUFDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVUb09iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVwaXNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RGbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RGb2xsb3ctdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJbnN1cmFuY2VNZWRpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SW50ZXJlc3RCZWFyaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEl0ZW1EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdExvZ2dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1hcmtldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lbnN0cnVhbEN5Y2xlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVuc3RydWFsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWlsaXRhcnlGbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3ROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RPZmZIaXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE9uSGlyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQYWlkSW5zdGFsbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGF5bWVudE1hZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQaHlzaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByZW1pdW1FZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcmVtaXVtUGFpZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHVibGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQdWJsaXNoZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2FsYXJ5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTYWxlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2NyZWVuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2VlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RWaXNpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RYUmF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0QWJzZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RCYWxhbmNlU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdENoZWNrSW5UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3REZWxpdmVyeURhdGVhdFBpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdERlbGl2ZXJ5RGF0ZUF0UmFpbFJhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEZpbGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0TWF0ZXJpYWxTYWZldHlEYXRhU2hlZXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RNZXRlclJlYWRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RPbkJvYXJkQ2FycmllckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFByaWNlQWRqdXN0bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFJlY2VpdmluZ0RhdGVDdXRvZmZEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RWaXNpdG9yQ29uc3VsdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlUaW1lRmlyc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheVRpbWVMYXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VDb21tZW5jZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVRlcm1FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVRlcm1TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRFbXBsb3llckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQWN0aW9uQ2xvc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBY3Rpb25TdGFydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFNldHRsZW1lbnRUZXJtc01ldERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQ3JlZGl0Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQWdyZWVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZMaWFiaWxpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVJlbmV3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0UHJpY2VDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZG9uVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5QdXJjaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2luZ1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkV4Y2VwdGlvbk9yZGVyTnVtYmVyQXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlckV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VzdEFjdGl2aXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxSZWNlaXB0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQ29tbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2Vnb29kQ29tbWVyY2lhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRBdmFpbGFibGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyTm90UmVnaXN0ZXJlZEFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeU9yVGFyZ2V0RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlPclRhcmdldFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdFNoaXBOb3RpY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZNYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGVhc2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cml0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmVkaXRHcmFudGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEFnZWluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvblNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFDb3ZlcmFnZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFFbGlnaWJpbGl0eUJlZ2luRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUVsaWdpYmlsaXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QVRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkNvdmVyYWdlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkVsaWdpYmlsaXR5QmVnaW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCRWxpZ2liaWxpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZHBvaW50T2ZQZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlcXVpcmVkRGlzdHJpYnV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hlbGZMaWZlUmVtYWluaW5nQXRUaW1lT2ZEZXNwYXRjaFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoZWxmTGlmZVJlbWFpbmluZ0F0VGltZU9mUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb29yaW5nRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZU9mZmljaWFsU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlUmVwb3J0ZWRDdXJ0YWlsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTm90ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUVhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5TGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50SGVtb2dsb2Jpbk9ySGVtYXRvY3JpdE9yQm90aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFJlbmV3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRSZXZpc2lvbm9ySW5pdGlhbFZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRTZXJ1bUNyZWF0aW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlZEZyb21Mb2NhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRFeHRlbnNpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0aW9uc1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Q3JlZGl0U2VydmljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdvcnRoRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBbm51YWxNZWV0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SW5zdGFsbG1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SW50ZXJlc3RDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UGF5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmV2aWV3RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uV29ya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Qcm9kdWN0aW9uU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUHJvbWlzZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU2hpcHBpbmdTY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZEZWF0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uVGltZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVnaXN0ZXJlZEFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW5UbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZIaXJlU3VydmV5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNpYWxSYWlsQ2FySW50ZXJjaGFuZ2VFaXRoZXJBY3R1YWxvckFncmVlZFVwb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZi1NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0RnJvbUNvb3JkaW5hdGVkVW5pdmVyc2FsVGltZVV0YyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkZXN0VW5wYWlkSW5zdGFsbG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkJvYXJkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IaXJlU3VydmV5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbnNldE9mQ3VycmVudFN5bXB0b21zT3JJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbnNldE9mU2ltaWxhclN5bXB0b21zT3JJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25zQ2Vhc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BpbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0Vhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0xhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQW1lbmRtZW50QmluZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ29tcGxldGlvbkRhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclJlY2VpdmVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyVG9Qcm9jZWVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVzdGltYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJc3N1ZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbGx5U2NoZWR1bGVkU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxNYXR1cml0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTmFtZUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUG9zdGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9kb250aWNUcmVhdG1lbnRQZXJpb2RSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvZG9udGljVHJlYXRtZW50UGVyaW9kVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1Qb2NrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVBdWRpdG9yc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmhhdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJpZGVEYXRlRm9yU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlclRhcmdldEJhc2VsaW5lTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuU2F0dXJhdGlvblRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlFdmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEluRnVsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yQWNjcnVlZFNpY2tQYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZUZvck1pbmltdW1QYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yU2FsYXJ5Q29udGludWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGVGb3JUb3RhbFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JWYWNhdGlvblBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXJ3b3JrTWFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQW5udWl0aXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRUaW1lV29ya2luZ0NoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Rmlyc3RWaXNpdEZvckNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENvbW1lbmNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlVGltZURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluaXRpYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluc3RydWN0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uUHJlc2VudGF0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxEZWR1Y3Rpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrQWN0aXZpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXlGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZGluZ0FyY2hpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNvbGF0aW9uVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQW5FdmVudElzTGF0ZUR1ZVRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RCZXR3ZWVuQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQ292ZXJlZEJ5U291cmNlRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEV4dGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY0luc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkNhcmVFbmREYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkNhcmVTdGFydERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mSWxsbmVzc0VuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mSWxsbmVzc1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT3ZlcmR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFdvcmtlZEZvclRoZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdFRvQWRtaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0Vhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0Vhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljTGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcENvbGxlY3Rpb25EYXRlVGltZU9mQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcERhdGVUaW1lT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZVByZXZpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRQZXJpb2RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkRHVyYXRpb25PZldvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk9mVHJlYXRtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGFydGljaXBhdGlvblN1c3BlbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVnZ2VkQW5kQWJhbmRvbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZU9uT3JBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlT25PckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5U3VycmVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdEYXRlVGltZU9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0RhdGVUaW1lT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RtYXJrRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRW5kT2ZTZWNvbmRZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25GaXJzdFJlcG9ydENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkZpcnN0U2VtaS1hbm51YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvblNlY29uZFNlbWktYW5udWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZERlYWxNYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUF3YXJkU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjZWRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jZXJ0aWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZm9yZWNsb3N1cmVBY2NlcHRhbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZm9yZWNsb3N1cmVTYWxlQ2xvc2luZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lEdXJhdGlvbkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQ2hhbmdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGVCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGVFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRpc3BlbnNpbmdEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Gcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Jc3N1ZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvblRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25EYXRlTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25EYXRlT2ZHb29kc0RlY2xhcmF0aW9uQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uVG9CYW5rcnVwdGN5UmVjZWl2ZXJzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudENvbnRyb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRlZFRvUmVjZWl2ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50TGVnYWxTdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRseVJlc2lkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50UmVzaWRlbmNlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Jvb2tpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb3VydEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1cnJlbnRBY2NvdW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0ludm9pY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVwb3J0ZWREYXRlT2ZCaXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlc2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWV0ZXJSZWFkaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Rlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50TGltaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQmFzZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXJCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlckVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdEFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0SXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySG9zcGl0YWxpemF0aW9uRGF0ZXNSZWxhdGVkVG9DdXJyZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0RGF0ZU9mQmlydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmlsZWdlRGV0YWlsc1ZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0RhdGVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdFbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ1N0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RBdmFpbGFiaWxpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0SGVsZFVudGlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uRGF0ZU5vU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25JbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbk1hbnVmYWN0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpZmVzcGFuQXRUaW1lT2ZQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9maXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1tZWRDYWxlbmRhclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1tZWRGaXNjYWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEFjdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEZvcmVjbG9zdXJlU2FsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RPdmVyVGFyZ2V0QmFzZWxpbmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5QWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50QWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRQcmlvcnRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25EYXRlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25FbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRmxvb3JTdG9ja1Byb3RlY3QtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25GbG9vclN0b2NrUHJvdGVjdC1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uSW52b2ljZVBlcmZvcm1hbmNlLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uSW52b2ljZVBlcmZvcm1hbmNlLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PcmRlci1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yZGVyLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25QZXJmb3JtYW5jZS1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblBlcmZvcm1hbmNlLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25SZXF1ZXN0ZWREZWxpdmVyeS1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblJlcXVlc3RlZERlbGl2ZXJ5LVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TaGlwLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU2hpcC1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QWNxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QnVpbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZVRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTGF0ZXN0UG9zc2libGVDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1dEludG9TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVRvQmVSZWNlaXZlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVPZkV4Y2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVQcmljZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFjaGVkVG90YWxEZXB0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVUYXhZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJ1aWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNhcHR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmFibGVzQ29sbGVjdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVBdExvY2tib3hEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEluVGhlTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBcHBvaW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc2hpcFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzaGlwUmVzdWx0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFzc2lmaWNhdGlvbkV4aXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtZXZhbHVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlRXhwb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZEl0ZW1DcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzYWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yTnVtYmVyQXNzaWdubWVudERhdGVPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRGF0ZU9mUHJldmlvdXNDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mQm9hcmRPZkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWltYnVyc2VtZW50Q2xhaW1Jc3N1ZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlSW1wb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3RhdGVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VBY2NvdW50aW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUNvdmVyYWdlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQ3VycmVudEFjY291bnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUlzc3VlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBhaWRVcERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUGF5bWVudEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZU9mQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlT2ZTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRSZXR1cm5Ub1dvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkVG9WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vZGVsaW5nQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5ld2FsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclR1cm5hcm91bmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBheW1lbnRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYXltZW50U2NoZWR1bGVTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBseURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDeWNsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1YWxpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWREZXBhcnR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZvckRlbGl2ZXJ5V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGb3JTaGlwbWVudFdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkT2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbk9mRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50TGljZW5zZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRMaWNlbnNlRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWduYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb2x2ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUmVsZWFzZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25SZWxlYXNlRGF0ZVRpbWVQYXJ0aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyYW5zbWlzc2lvblRpbWVTdGFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblRvV29ya0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblRvV29ya1BhcnRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBZGp1c3RlZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFkanVzdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRFc3RpbWF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZva2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkRnVuZFRheEV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGFyeUNoYW5nZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGFyeURlZmVycmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlYWJsZVN0b2NrRGVtYW5kQ292ZXJQZXJpb2RFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVBdmFpbGFibGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVDb2xsZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZVJlcXVpcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmYWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeU9uT3JBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlPbk9yQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudFdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkSW50ZXJjaGFuZ2VEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRBZG1pc3Npb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREaXNjaGFyZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNoYXJlUHJpY2VBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0aW9uUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0aW9uUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsQnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzTG9jYWxUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pYW5udWFsRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nUm9hZFRpbWVTdGFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VwdGljQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb21wbGV0aW9uRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VJbnRlcnJ1cHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXJTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXRvZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZUFzU3BlY2lmaWVkQnlUaGVPcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZUZyb21JbnRlcmxpbmVTZXR0bGVtZW50U3lzdGVtT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcERhdGVPcmlnaW5hbGx5U2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRHVyaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVByb21pc2VkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUHJvbWlzZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90TGF0ZXJUaGFuRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RCZWZvcmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBPbk9yQWJvdXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0RhdGVBbmRPclRpbWVDdXJyZW50U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nRGF0ZU5vU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBXZWVrT2ZEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHV0SW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzQmVuZWZpdEFnZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0JlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzSW5zdXJhbmNlRWxpbWluYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzTGlmZXRpbWVCZW5lZml0UXVhbGlmaWNhdGlvbkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZXRyYWNrZWRXZWxsYm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbWlsYXJJbGxuZXNzT25zZXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVJbnRlcmVzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyaW5nRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyaW5nU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUNsYWltc1ZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRCb29rUHVibGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGVEaXJlY3RvcnNoaXBSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZURvY3VtZW50Q2FwdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdPcmRlclVuaXRBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VSZXRpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTWFuZGF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVOb3RBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTm90QmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkRG9pbmdCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnROb0VhcmxpZXJUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE5vTGF0ZXJUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlUmVzaWRlbmN5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxUaW1lU2VyaWVzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQXNzaWdubWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb21tZXJjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNPdXRzaWRlUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNQcmlvckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcERpc3RyaWJ1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BXb3JrQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50U2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yUGVyaW9kT2ZIaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50SW50ZXJlc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50U3VibWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQXZlcmFnZUNyZWRpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUNhc2luZ0F1dGhvcml0eUFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJnZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJyZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleVllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25FZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3b3JuQW5kU3Vic2NyaWJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltcHRvbXNPbnNldFBhdGllbnRBbGxlZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1TdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhYmxlUmF0aW5nRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWlsQ292ZXJhZ2VCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFpbENvdmVyYWdlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rc0FjY2VwdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtzSW5zcGVjdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBvaW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeVByb3N0aGVzaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJTdWJtaXNzaW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb25PZkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc0Rpc2NvdW50RHVlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc05ldER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RDb21wbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBlcmZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBlcmlvZEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXNMaW5lVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVFbXBsb3llZUJlZ2FuV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZU5vd0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdSZXF1aXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2hlbGZMaWZlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlU3R5bGVSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25DcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyTm90ZUFjY2VwdGFuY2VEYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaGlwbWVudERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0VGltZUxpbWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RyaXBwaW5nRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3R1ZmZpbmdEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxCYWxhbmNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTdGFydERhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU3RhcnREYXRlU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkZWREYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGl0eVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRVbnRpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRhdGVDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Q2xhaW1zVmVyaWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURhdGVPZkluZGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJiYWxSZXBvcnROZWVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25TZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsUmVnaXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50YXJ5VGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdWNoZXJEYXRlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VzRWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZVBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2Vla0VuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbExvZ1J1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZUNvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lsbEFkdmlzZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3bkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhoZWxkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0VmZmVjdGl2ZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1BlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzQ29tcGxldGlvbkRhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc0NvbXBsZXRpb25EYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcnN0VGltZVRvQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckJlZ2lubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhck9mT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhclRvRGF0ZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRJRCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJyaWVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FycmllcklEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDdXN0U2hpcHBpbmdDb250cmFjdE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUxldmVsQ29kZWQiIHR5cGU9IlNlcnZpY2VMZXZlbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VMZXZlbENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TGVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNpdERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0IiB0eXBlPSJUcmFuc3BvcnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNb2RlIiB0eXBlPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDaGFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmllZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkRm9yY2VzQ291cmllclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2toYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdFdheS1TaGlwcGVyc09wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va1Bvc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJPclRheGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbklycmVndWxhckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGlja3VwT3JDdXN0b21lcnNFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlYXdheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuT3JQYWNpZmljRGlzdHJpYnV0aW9uU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRUcmFuc3BvcnRJbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZseWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmdPclNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtb2RhbC1QaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJhaWxlckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2FpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SW50cmF0aGVhdGVyQWlybGlmdFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5T2ZmaWNpYWxNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlVW5rbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1Db21tb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1GbGF0YmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1QYWNrYWdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXRpbW9kYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbmZlcmVuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2Vhbk5vbi1Db25mZXJlbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyY2VsUG9zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZEFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFRvUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVQYXJjZWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWlja3RyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFPckFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQWdlbnQtVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3dhd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlck9yUGlwZWxpbmVJbnRlcm1vZGFsTW92ZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRNZWFuc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TWVhbnMiIHR5cGU9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SUxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElMQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEJ1bGtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kVGFua1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmRQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcldpdGhDYXJhdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW1lbnRWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hc3RlckNoZW1pY2FsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsLUNhckNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxDYXJPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1BbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1DbG9zZWRUb3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhpZ2hTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUxvd1NpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPbmx5VmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3Blbi1TaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW5Ub3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1QbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVycmVzdGluZ29uYUNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1TdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0Zvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVXBncmFkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1WZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhCYWdIYW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmxvb3JTZWN1cmluZ1JpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmx1c2hEb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEhhbmdhckJhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhTbW9vdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFdhdnlPclJpcHBsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkVGVtcGVyYXR1cmVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcnVkZU9pbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJEZXRlcm1pbmVkRGVhbnNPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSYWlsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQtSW5IZWxwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZXBTZWFDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQmFja1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlcHRpb25hbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2hpbmdWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2tEb3VibGVEcm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRSYWNrLUZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFJhY2stU2luZ2xlRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFJlZnJpZ2VyYXRlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXR1cmVUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1Db3ZlcmVkSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdmVsVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmSGVpZ2h0RmxhdFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWQtRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZG9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWRQbmV1bWF0aWNEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYW50Q2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrQW5kRnJlZXplclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljdHJ1Y2thbmRyZWZyaWdlcmF0ZWR0cmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1ZWZpZWROYXR1cmFsR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWVmaWVkUGV0cm9sZXVtR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9yVW5sb2FkRGV2aWNlT25FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxQcm9kdWN0c1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1Ub3BPckZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuVG9wVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJQYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0ZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQnVsa0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkTWFpbnRlbmFuY2VPZldheUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFNpbG9UYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXItRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZEZyZWV6ZXJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlU2lkZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWxUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rQW5kQnVsa1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFua0FuZFRhbmtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkUmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkU2lsb1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE9uLVJvbGxPZmZWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyRGV0ZXJtaW5lZE1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUQUstUkFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVlbFByb2R1Y3RzVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXIyNVRvbm5lV2l0aDkwQ3ViaWNNZXRlclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZmFuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlc2NvcGluZ1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWJlck9yTG9nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwQXJ0aWN1bGF0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLURyeUZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRWxlY3RyaWNIZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVBuZXVtYXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1SZWZyaWdlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1Gb29kR3JhZGVMaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGgyME9yTW9yZVdhZ29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoTW9yZVRoYW5PbmVBbmRMZXNzVGhhbjIwV2Fnb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGhPbmVXYWdvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29yc05vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja09yVHJhaWxlcldpdGhUaWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1Z2FuZE9yUHVzaGJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbi1TcGVjaWFsSW5zaWRlTGVuZ3RoV2lkdGhPckhlaWdodFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLUxha2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUNvbnRhaW5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1MYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tUm9sbE9uLVJvbGxPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2RjaGlwY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Zlc3NlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa0NvbW1vZGl0eVRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZWVEYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5QU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFY29ub215Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZE5leHREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRTZWNvbmREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRUaGlyZERheUJ5Q2FydGFnZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvblJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWZpY2F0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5V2l0aFNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlV29ybGR3aWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVdvcmxkd2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpd2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5QWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RmxpZ2h0T3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5SHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dE1vcm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNlcnZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Zlcm5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnkxMDMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5OTMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnlOb29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT0JveFppcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTUwMFBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFTZWNvbmREYXlCeU5vb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnRlcm1vZGFsSGlnaFNwZWVkNzBNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW50ZXJtb2RhbEFuZFN0YWNrU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjBNaWxlc1BlckhvdXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1c1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11dGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJldHVyblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUh1bmRyZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdW5kSHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTW9ybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTcGVlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RTZXJ2aWNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0VGhlU3RhdGlzdGljYWxUZXJyaXRvcnlMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdEJvcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXREZXBhcnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Gb3VydGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlmdGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2l4dGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2V2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FaWdodGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlyc3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlDYXJyaWFnZS1TZWNvbmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVGhpcmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDYXJyaWVyQWxsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRQcmUtQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1BY2NlcHRhbmNlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRPbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLU5pbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1UZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FbGV2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Ud2VsZnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0Q2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMm5kQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM3JkQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNnRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iN3RoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkRlbGl2ZXJ5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZVJpZ2h0c0NhcnJpZXJBbmRKdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3dpdGNoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZU1vdmVtZW50Q2FycmllckFuZEp1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyQWlyTW90b3JPck9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyUnVsZTExU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZVN3aXRjaENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXJyaWVySW5Sb3V0ZU9uUmV0dXJuUm91dGVNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyRm9sbG93aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyUHJlZGVjZXNzb3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiIHR5cGU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZWQiIHR5cGU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGVkIiB0eXBlPSJFcXVpcG1lbnRPd25lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVxdWlwbWVudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGVkIiB0eXBlPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwZW1lbnRTaXplVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGVkIiB0eXBlPSJFcXVpcG1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkZ1bGxJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNlYWxJbmZvIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZFcXVpcG1lbnRNZWFzdXJlbWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50IiB0eXBlPSJUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5U3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlclN1cHBsaWVkRnJvbUFMZWFzaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyU3VwcGxpZWRGcm9tVGhlUmFpbHdheXNQb29sIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcExlYXNlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5T3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWRXaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbC1DYXJDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsQ2FyT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQWx1bWludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1CdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ2xvc2VkVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IaWdoU2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Mb3dTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW4tU2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItUGxhdGZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclJlc3RpbmdPbkFDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItU3RlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUZvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVVwZ3JhZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoQmFnSGFuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsb29yU2VjdXJpbmdSaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsdXNoRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhIYW5nYXJCYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoU21vb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhXYXZ5T3JSaXBwbGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFRlbXBlcmF0dXJlVHJhaWxlci1SZWVmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dC1JbkhlbHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZUNvYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEJhY2tUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsVHJhaWxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVwb3h5Q29hdGVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb1BhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VhYmxlUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLURvdWJsZURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLUZsYXQtQmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1TaW5nbGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItQ292ZXJlZC1JbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZkhlaWdodEZsYXRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkLVBuZXVtYXRpY0Rpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhbnQtQ2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPclVubG9hZERldmljZU9uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuMTAuOTBNQW5kMTMuNzVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuNi4xNU1BbmQ3LjgyTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjcuODJNQW5kOS4xNU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW45LjE1TUFuZDEwLjkwTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtTGVzc1RoYW42LjE1TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ud29ya2luZ1JlZWZlckNvbnRhaW5lcjIwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbndvcmtpbmdSZWVmZXJDb250YWluZXI0MEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nUmVmcmlnZXJhdGVkT3JSZWVmZXJDb250YWluZXIzMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblZlc3NlbC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tVG9wT3JGbGF0YmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblRvcFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzdXJpemVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRNYWludGVuYW5jZU9mV2F5Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkT3JSZWVmZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmszMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbms0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmtJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFua0ljNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVTaWRlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuZGluYXZpYW5QYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWktUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pLVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlubGVzc1N0ZWVsVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rhay1SYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIzMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXI0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVzY29waW5nVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMjBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMzBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyNDBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90ZWJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Cb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1EcnlGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUVsZWN0cmljSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1QbmV1bWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstRm9vZEdyYWRlLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29ycy1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4tU3BlY2lhbEluc2lkZUxlbmd0aC1XaWR0aE9ySGVpZ2h0UmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtTGFrZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tQ29udGFpbmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUxhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Sb2xsb24tUm9sbG9mZiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5PbkJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0bGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVybGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbG9hZGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmcmlnZXJhdGlvbk9uIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVzaWR1ZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkNvbmRpdGlvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZGl0aW9ucyIgdHlwZT0iQ29uZGl0aW9ucyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2VhbEluZm8iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNlYWxJbmZvIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTZWFsSW5mbyIgdHlwZT0iTGlzdE9mU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNlYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSW5mbyIgdHlwZT0iU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJc3N1ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJc3N1ZXJDb2RlZCIgdHlwZT0iU2VhbElzc3VlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxJc3N1ZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSXNzdWVyIiB0eXBlPSJTZWFsSXNzdWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlYWxJc3N1ZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkIiB0eXBlPSJTZWFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iIHR5cGU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZWFsU3RhdHVzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5SaWdodENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZUVsZWN0cm9uaWNTZWFsSXNGYXVsdHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZCIgdHlwZT0iVHJhbnNpdERpcmVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGVkIiB0eXBlPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWUiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uIiB0eXBlPSJUcmFuc2l0RGlyZWN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9CdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclRvU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0Ryb3BTaGlwRGVzaWduYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0ZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90aGVyVmVzc2VsVG9MaWdodGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodGVyVG9Nb3RoZXJWZXNzZWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlySG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RGF5V29ya1dlZWsiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iIHR5cGU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJMb2NhdGlvbkl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIiB0eXBlPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZVJlZmVyZW5jZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIgdHlwZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZVJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUlEUmVmZXJlbmNlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBhY2thZ2VSZWZlcmVuY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VSZWZlcmVuY2UiIHR5cGU9IlBhY2thZ2VSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlZCIgdHlwZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZWQiIHR5cGU9IlRyYW5zcG9ydFRlcm1zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlZCIgdHlwZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkIiB0eXBlPSJSaXNrT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5IiB0eXBlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWFuZERlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0ZWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4LVdvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlLUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVBbG9uZ3NpZGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFuZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QtSW5zdXJhbmNlQW5kRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmlhZ2VQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpYWdlLUluc3VyYW5jZVBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkQXRGcm9udGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtUXVheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVBhaWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeVNlcnZpY2VDaGFyZ2VQYWlkQnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5U2VydmljZUNoYXJnZVBhaWRCeUNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdEZyZWlnaHRDcmVkaXRlZFRvUGF5bWVudEN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrLVVwT3JCYWNraGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5lZEJ5QnV5ZXJBbmRTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvYlBvcnRPZkNhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvcHktTm9QYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3N0c1BhaWRCeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29zdHNQYWlkQnlDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZXZlbnVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlTdXBwbGllck9yU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlhYmxlRWxzZXdoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQW5kU3VtbWFyeUJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRCdXRDaGFyZ2VkVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEJ5UHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkLUJ5U2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkTG9jYWxDb2xsZWN0T3V0c3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0RnJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodFBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0UGFpZEJ5U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGUxMVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRnJlaWdodC1Ob0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJpc2tPZkxvc3NDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRGVzdGluYXRpb25Jc0J1eWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRnJlaWdodEVxdWFsaXphdGlvblBvaW50SXNTZWxsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9Qb29sUG9pbnRJc1NlbGxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0Rlc3RpbmF0aW9uSXNTZWxsZXJzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXJnb0NsYXNzaWZpY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hdHVyZU9mR29vZHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGVkIiB0eXBlPSJPcGVyYXRpb25hbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUeXBlT2ZDYXJnbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIgdHlwZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZU5vbi1EdXRpYWJsZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVEdXRpYWJsZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFZhbHVlQ29uc2lnbm1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck5vbi1Db250YWluZXJpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbC1PblJvbGwtT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFBvbGx1dGFudENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3QtSGF6YXJkb3VzQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcGxvbWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYm5veGlvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mR2F1Z2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzQW5kUGVyc29uYWxFZmZlY3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5DYXJnbyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW1tdXRhYmxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVMaW5rIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwbGllclNob3BwaW5nQ2FydElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJSb3VuZFRyaXBPcmRlciIgdHlwZT0ieGNibEJvb2xlYW4iIGZpeGVkPSJ0cnVlIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIiB0eXBlPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWNjb3VudEFzc2lnbm1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkFjY291bnRBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50QXNzaWdubWVudCIgdHlwZT0iTGlzdE9mQWNjb3VudEFzc2lnbm1lbnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRBc3NpZ25tZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50QXNzaWdubWVudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGlzdHJpYnV0aW9uUGVyY2VudGFnZSIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdMQWNjb3VudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29zdENlbnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudEFzc2lnbm1lbnRPcmRlck51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc09yZGVyUmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdXNpbmVzc0FyZWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyb2xsaW5nQXJlYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvZml0Q2VudGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXR3b3JrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaXhlZEFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaXhlZEFzc2V0U3ViIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdW5kc0NlbnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVuZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29tbWl0bWVudEl0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bmN0aW9uYWxBcmVhIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHZW5lcmljQWNjb3VudGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRBc3NpZ25tZW50IiB0eXBlPSJBY2NvdW50QXNzaWdubWVudCIvPgotICAgIDwhLS0gU09YIGZvcm1hdCBkYXRhdHlwZXMgd2hlcmUgdGhleSBkaWZlciBmcm9tIHN0YW5kYXJkIFhTREwgZGF0YXR5cGVzLS0+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEYXRlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV17NH0oKCgwMXwwM3wwNXwwN3wwOHwxMHwxMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMV0pKSl8KCgwNHwwNnwwOXwxMSkoKDBbMS05XSl8KFsxLTJdWzAtOV0pfDMwKSl8KCgwMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pKSkpIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxUaW1lIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKCgoWzAtMV1bMC05XSl8KDJbMC0zXSkpKDooWzAtNV1bMC05XSkpezJ9KChcK3wtKSgoWzAtMV1bMC05XSl8KDJbMC0zXSkpOihbMC01XVswLTldKSk/KSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRGF0ZXRpbWUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XXs0fSgoKDAxfDAzfDA1fDA3fDA4fDEwfDEyKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8KDNbMC0xXSkpKXwoKDA0fDA2fDA5fDExKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8MzApKXwoKDAyKSgoMFsxLTldKXwoWzEtMl1bMC05XSkpKSlUKCgoWzAtMV1bMC05XSl8KDJbMC0zXSkpKDooWzAtNV1bMC05XSkpezJ9KChcK3wtKSgoWzAtMV1bMC05XSl8KDJbMC0zXSkpOihbMC01XVswLTldKSk/KSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsQm9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJ0cnVlfGZhbHNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxGbG9hdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmZsb2F0Ij4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKFwrfC0pP1swLTldKlwuP1swLTldKihFfGUpP1swLTldKiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRG91YmxlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZG91YmxlIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKFwrfC0pP1swLTldKlwuP1swLTldKihFfGUpP1swLTldKiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2FubnVpdHluZXRfbmV3LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9hbm51aXR5bmV0X25ldy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjk5YjcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2FubnVpdHluZXRfbmV3LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmFubnVpdHluZXQuY29tL25hbWVzcGFjZS9wcm9maWxlcyIKLQotICB4bWxucz0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiCi0gIHhtbG5zOmN2b2U9Imh0dHA6Ly93d3cuY29udGl2by5jb20veG1sbnMvMjAwMi9lbnJpY2htZW50IgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPREUiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bGVuZ3RoIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJFR0lOX0RBVEUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFTkRfREFURSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRFUk1fREFURSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUxIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iRU5WRUxPUEUiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSEVBREVSIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fQ09VTlQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJURVNUIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIRUFERVIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRUZGRUNUSVZFX0RBVEUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFTX09GX0RBVEVUSU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZJVFkiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT0RJRlkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fSUQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUlRZX0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJST1VUSU5HIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNURVAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORElOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1JERVIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUk9VVElOR19ISVNUT1JZIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNURVAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORElOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORF9EQVRFVElNRSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSRUNFSVZFX0RBVEVUSU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVU0lORVNTX1VOSVRfREVGSU5JVElPTiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUkVRVUVTVCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDTEFTUyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVElOIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBQ0NPVU5UX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNDT1VOVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05UQUNUX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09OVEFDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFU1BPTlNJQklMSVRZIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTRVJTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSURTIiB0eXBlPSJUeXBlMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUSU4iIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9MT0dPTl9JRCIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVNTV09SRCIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMQVNUX05BTUUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklSU1RfTkFNRSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNSURETEVfSU5JVElBTCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNBTFVUQVRJT05fQ0QiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXJzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dHkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVUZGSVhfQ0QiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3IiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUlJIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRU1BSUwiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkVfTlVNQkVSIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxJQ0VOU0VTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTElDRU5TRSIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRZUEUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEVTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBUFBPSU5UTUVOVFMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBUFBPSU5UTUVOVCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVFVTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRU5ESU5HIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQUE9JTlRFRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURVJNSU5BVEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTkVXX0JVU0lORVNTIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTlMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJXUklUSU5HX0NPTVBBTlkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMSU5FU19PRl9CVVNJTkVTUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxJTkVfT0ZfQlVTSU5FU1MiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkRJVklEVUFMX0xJRkUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkFSSUFCTEVfQU5OVUlUSUVTIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEX0FOTlVJVElFUyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk9VUF9MSUZFIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFX0xJRkUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTRVJfUk9MRVMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU0VSX1JPTEUiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRFU0NSSVBUSU9OIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBQ0NPVU5UUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFDQ09VTlQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFDQ09VTlRfTkFNRSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPV05FUl9OQU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFCQV9OVU1CRVIiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNDT1VOVF9OVU1CRVIiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFVSUE9TRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUkVNSVVNIENPTExFQ1RJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiBSRUNJRVBUUyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05UQUNUUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTlRBQ1QiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkVfTlVNQkVSIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVNQUlMIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0FWQUlMQUJJTElUWSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFWQUlMQUJJTElUWSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX1BMQU5TIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURVMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUklERVJTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJJREVSX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUklERVJfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJPUFRJT05BTCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfUklERVJTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQTEFOX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUklERVJfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEVTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRVhDRVBUSU9OIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0iVHlwZTIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Ik9QVElPTkFMIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05BTCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURVMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BUSU9OQUxJVFkiIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iT1BUSU9OQUwiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJUkVEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElPTkFMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX1BMQU5TX1NFUlZJQ0VfUFJPR1JBTVMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BUSU9OX19MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJPUFRJT05BTCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX0lOVkVTVE1FTlRfT1BUSU9OUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklOVkVTVE1FTlRfT1BUSU9OU19MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklOVkVTVE1FTlRfT1BUSU9OU19MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJORVRUSU5HX09QVElPTiIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTl9PUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT01NSVNTSU9OX09QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9UWVBFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRZUEUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQUExJQ0FUSU9OIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSVRJQUxfUFJFTUlVTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVUJTRVFVRU5UX1BSRU1JVU0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRURVTEVEX0FDSF9QUk9HUkFNIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldJVEhEUkFXQUwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1VSUkVOREVSIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRkVSIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQkFMQU5DRSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVNURU1BVElDX1dJVEhEUkFXQUxfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUkRfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUkQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRURVTEVEX1JFQkFMQU5DRV9QUk9HUkFNIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRDQSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQ0FfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVNURU1BVElDX1dJVEhEUkFXQUxfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRU5FV0FMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOTlVJVElaQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFZT1VUIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFQVRIX0NMQUlNX1BFTkRJTkciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVBVEhfQ0xBSU0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9BQ0giLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNT05FWV9GT1JNUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1PTkVZX0ZPUk0iIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9ST1VUSU5HX0xJTksiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ldyBDaGFyYWN0ZXIgSXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGT1JNQVQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOU0kiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlNDQyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTk5VSVRZTkVUX1BST0ZJTEVfVjEuMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYTUxJRkUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFhNTElGRSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9UT19CVVNJTkVTU19VTklUX01BUFBJTkdTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9UT19CVVNJTkVTU19VTklUX01BUFBJTkciIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOSyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9MSU5LIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU0VSX1JPTEVfTElOSyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfUkVMQVRJT05TSElQUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfUkVMQVRJT05TSElQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJFTlRfQlVTSU5FU1NfVU5JVF9MSU5LIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDSElMRF9CVVNJTkVTU19VTklUX0xJTksiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX09QRVJBVElOR19QUk9GSUxFX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUEVSQVRJTkdfUFJPRklMRV9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVJUTkVSX1hNTF9JTlRFUkZBQ0VfVjEuMTAiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODNkMjIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2N4bWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLVczQyBTY2hlbWEgZ2VuZXJhdGVkIGJ5IFhNTCBTcHkgdjQuNCBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlZ21lbnQiIHJlZj0iU2VnbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmdTZWdtZW50IiByZWY9IkFjY291bnRpbmdTZWdtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmdTZWdtZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyIgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYWlsIiByZWY9IkVtYWlsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlBob25lIiByZWY9IlBob25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZheCIgcmVmPSJGYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Imlzb0NvdW50cnlDb2RlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYWRkcmVzc0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQXJlYU9yQ2l0eUNvZGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQmlsbFRvIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiIHJlZj0iQWRkcmVzcyIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlckZvcm1Qb3N0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkJ1eWVyQ29va2llIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIi8+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNJRkNvbnRlbnQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNoYW5nZXRpbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNoYXJnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ2l0eSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiByZWY9IkF0dGFjaG1lbnQiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIiByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCIgcmVmPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlBob25lIiByZWY9IlBob25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRmF4IiByZWY9IkZheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJvbGUiIHR5cGU9InhzOk5NVE9LRU4iLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29udHJhY3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbVNlZ21lbnQiIHJlZj0iSXRlbVNlZ21lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVmZmVjdGl2ZURhdGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBpcmF0aW9uRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNvbnRyYWN0SXRlbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIiByZWY9IlVuaXRQcmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRyaW5zaWMiIHJlZj0iRXh0cmluc2ljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9Imlzb0NvdW50cnlDb2RlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ291bnRyeUNvZGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXNvQ291bnRyeUNvZGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDcmVkZW50aWFsIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IklkZW50aXR5IiByZWY9IklkZW50aXR5Ii8+Ci0JCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9IlNoYXJlZFNlY3JldCIgcmVmPSJTaGFyZWRTZWNyZXQiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGlnaXRhbFNpZ25hdHVyZSIgcmVmPSJEaWdpdGFsU2lnbmF0dXJlIi8+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYXJrZXRwbGFjZSIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZWxpdmVyVG8iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hvcnROYW1lIiByZWY9IlNob3J0TmFtZSIvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEaWdpdGFsU2lnbmF0dXJlIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJQSzcgc2VsZi1jb250YWluZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iQmFzZTY0Ii8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRpc3RyaWJ1dGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBY2NvdW50aW5nIiByZWY9IkFjY291bnRpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDaGFyZ2UiIHJlZj0iQ2hhcmdlIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFJlZmVyZW5jZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGF5bG9hZElEIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRWZmZWN0aXZlRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkV4cGlyYXRpb25EYXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRlbnNpb24iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGYXgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlbGVwaG9uZU51bWJlciIgcmVmPSJUZWxlcGhvbmVOdW1iZXIiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiIHJlZj0iRW1haWwiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRm9sbG93dXAiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRm9ybWF0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGcm9tIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiIHJlZj0iQ3JlZGVudGlhbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1JlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWVzc2FnZVR5cGUiIHJlZj0iTWVzc2FnZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heE1lc3NhZ2VzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFzdFJlY2VpdmVkVGltZXN0YW1wIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNYTUwiIHJlZj0iY1hNTCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSGVhZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZyb20iIHJlZj0iRnJvbSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRvIiByZWY9IlRvIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VuZGVyIiByZWY9IlNlbmRlciIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpdHkiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXN0Q2hhbmdlZFRpbWVzdGFtcCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkluZGV4Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwIiByZWY9IlNlYXJjaEdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtIiByZWY9IkluZGV4SXRlbSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1BZGQiIHJlZj0iSW5kZXhJdGVtQWRkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtRGVsZXRlIiByZWY9IkluZGV4SXRlbURlbGV0ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbVB1bmNob3V0IiByZWY9IkluZGV4SXRlbVB1bmNob3V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtQWRkIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiByZWY9Ikl0ZW1EZXRhaWwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1EZXRhaWwiIHJlZj0iSW5kZXhJdGVtRGV0YWlsIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1EZWxldGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtRGV0YWlsIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkxlYWRUaW1lIiByZWY9IkxlYWRUaW1lIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXhwaXJhdGlvbkRhdGUiIHJlZj0iRXhwaXJhdGlvbkRhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRWZmZWN0aXZlRGF0ZSIgcmVmPSJFZmZlY3RpdmVEYXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwRGF0YSIgcmVmPSJTZWFyY2hHcm91cERhdGEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUZXJyaXRvcnlBdmFpbGFibGUiIHJlZj0iVGVycml0b3J5QXZhaWxhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1QdW5jaG91dCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hvdXREZXRhaWwiIHJlZj0iUHVuY2hvdXREZXRhaWwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkludGVybmFsSUQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiIHJlZj0iVW5pdFByaWNlIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVbml0T2ZNZWFzdXJlIiByZWY9IlVuaXRPZk1lYXN1cmUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbiIgcmVmPSJDbGFzc2lmaWNhdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlclBhcnRJRCIgcmVmPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSIgcmVmPSJNYW51ZmFjdHVyZXJOYW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIiByZWY9IkV4dHJpbnNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyUGFydElEIiByZWY9IlN1cHBsaWVyUGFydElEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0QXV4aWxpYXJ5SUQiIHJlZj0iU3VwcGxpZXJQYXJ0QXV4aWxpYXJ5SUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiIHJlZj0iSXRlbURldGFpbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxpbmVOdW1iZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtT3V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiByZWY9Ikl0ZW1EZXRhaWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcHBpbmciIHJlZj0iU2hpcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGF4IiByZWY9IlRheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEaXN0cmlidXRpb24iIHJlZj0iRGlzdHJpYnV0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxpbmVOdW1iZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXNpdGlvbklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdGVkRGVsaXZlcnlEYXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSXRlbVNlZ21lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtIiByZWY9IkNvbnRyYWN0SXRlbSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2VnbWVudEtleSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkxlYWRUaW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzIiByZWY9IlN0YXR1cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dE9yZGVyTWVzc2FnZSIgcmVmPSJQdW5jaE91dE9yZGVyTWVzc2FnZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25DaGFuZ2VNZXNzYWdlIiByZWY9IlN1YnNjcmlwdGlvbkNoYW5nZU1lc3NhZ2UiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJDaGFuZ2VNZXNzYWdlIiByZWY9IlN1cHBsaWVyQ2hhbmdlTWVzc2FnZSIvPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGVwbG95bWVudE1vZGUiIGRlZmF1bHQ9InByb2R1Y3Rpb24iPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb2R1Y3Rpb24iLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGVzdCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpblJlcGx5VG8iIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlVHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY3VycmVuY3kiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFsdGVybmF0ZUFtb3VudCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYWx0ZXJuYXRlQ3VycmVuY3kiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOdW1iZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9wdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhLWR0eXBlIiB0eXBlPSJ4czpOTVRPS0VOUyIgZml4ZWQ9Im5hbWUgc3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyTWV0aG9kIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyVGFyZ2V0IiByZWY9Ik9yZGVyVGFyZ2V0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJQcm90b2NvbCIgcmVmPSJPcmRlclByb3RvY29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJNZXRob2RzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyTWV0aG9kIiByZWY9Ik9yZGVyTWV0aG9kIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJQcm90b2NvbCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUmVxdWVzdEhlYWRlciIgcmVmPSJPcmRlclJlcXVlc3RIZWFkZXIiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtT3V0IiByZWY9Ikl0ZW1PdXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUmVxdWVzdEhlYWRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUb3RhbCIgcmVmPSJUb3RhbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQmlsbFRvIiByZWY9IkJpbGxUbyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGF5bWVudCIgcmVmPSJQYXltZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHJlZj0iQ29udGFjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZvbGxvd3VwIiByZWY9IkZvbGxvd3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRvY3VtZW50UmVmZXJlbmNlIiByZWY9IkRvY3VtZW50UmVmZXJlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyIgcmVmPSJFeHRyaW5zaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9yZGVySUQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlckRhdGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBkZWZhdWx0PSJuZXciPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5ldyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpc2l0aW9uSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaGlwQ29tcGxldGUiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclRhcmdldCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGhvbmUiIHJlZj0iUGhvbmUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCIgcmVmPSJFbWFpbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZheCIgcmVmPSJGYXgiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3RoZXJPcmRlclRhcmdldCIgcmVmPSJPdGhlck9yZGVyVGFyZ2V0Ii8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3RoZXJPcmRlclRhcmdldCI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQ2FyZCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIiByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJudW1iZXIiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBpcmF0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBheW1lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUENhcmQiIHJlZj0iUENhcmQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBob25lIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlbGVwaG9uZU51bWJlciIgcmVmPSJUZWxlcGhvbmVOdW1iZXIiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlbGl2ZXJUbyIgcmVmPSJEZWxpdmVyVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdHJlZXQiIHJlZj0iU3RyZWV0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2l0eSIgcmVmPSJDaXR5Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdGUiIHJlZj0iU3RhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQ29kZSIgcmVmPSJQb3N0YWxDb2RlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvdW50cnkiIHJlZj0iQ291bnRyeSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlByb2ZpbGVSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHJvZmlsZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9wdGlvbiIgcmVmPSJPcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUcmFuc2FjdGlvbiIgcmVmPSJUcmFuc2FjdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZWZmZWN0aXZlRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImEtZHR5cGUiIHR5cGU9InhzOk5NVE9LRU5TIiBmaXhlZD0iZWZmZWN0aXZlRGF0ZSBkYXRlVGltZSIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dE9yZGVyTWVzc2FnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCdXllckNvb2tpZSIgcmVmPSJCdXllckNvb2tpZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0T3JkZXJNZXNzYWdlSGVhZGVyIiByZWY9IlB1bmNoT3V0T3JkZXJNZXNzYWdlSGVhZGVyIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUluIiByZWY9Ikl0ZW1JbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRPcmRlck1lc3NhZ2VIZWFkZXIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVG90YWwiIHJlZj0iVG90YWwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25BbGxvd2VkIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjcmVhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5zcGVjdCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlZGl0Ii8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0U2V0dXBSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkJ1eWVyQ29va2llIiByZWY9IkJ1eWVyQ29va2llIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIiByZWY9IkV4dHJpbnNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkJyb3dzZXJGb3JtUG9zdCIgcmVmPSJCcm93c2VyRm9ybVBvc3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJTZXR1cCIgcmVmPSJTdXBwbGllclNldHVwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VsZWN0ZWRJdGVtIiByZWY9IlNlbGVjdGVkSXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtT3V0IiByZWY9Ikl0ZW1PdXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY3JlYXRlIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imluc3BlY3QiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZWRpdCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dFNldHVwUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhcnRQYWdlIiByZWY9IlN0YXJ0UGFnZSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hvdXREZXRhaWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb24iIHJlZj0iQ2xhc3NpZmljYXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIiByZWY9Ik1hbnVmYWN0dXJlck5hbWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyUGFydElEIiByZWY9Ik1hbnVmYWN0dXJlclBhcnRJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHBpcmF0aW9uRGF0ZSIgcmVmPSJFeHBpcmF0aW9uRGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFZmZlY3RpdmVEYXRlIiByZWY9IkVmZmVjdGl2ZURhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoR3JvdXBEYXRhIiByZWY9IlNlYXJjaEdyb3VwRGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlcnJpdG9yeUF2YWlsYWJsZSIgcmVmPSJUZXJyaXRvcnlBdmFpbGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlByb2ZpbGVSZXF1ZXN0IiByZWY9IlByb2ZpbGVSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJSZXF1ZXN0IiByZWY9Ik9yZGVyUmVxdWVzdCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0U2V0dXBSZXF1ZXN0IiByZWY9IlB1bmNoT3V0U2V0dXBSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzVXBkYXRlUmVxdWVzdCIgcmVmPSJTdGF0dXNVcGRhdGVSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1JlcXVlc3QiIHJlZj0iR2V0UGVuZGluZ1JlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVxdWVzdCIgcmVmPSJTdWJzY3JpcHRpb25MaXN0UmVxdWVzdCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXF1ZXN0IiByZWY9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMaXN0UmVxdWVzdCIgcmVmPSJTdXBwbGllckxpc3RSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJEYXRhUmVxdWVzdCIgcmVmPSJTdXBwbGllckRhdGFSZXF1ZXN0Ii8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGVwbG95bWVudE1vZGUiIGRlZmF1bHQ9InByb2R1Y3Rpb24iPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb2R1Y3Rpb24iLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGVzdCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHJlZj0iU3RhdHVzIi8+Ci0JCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJCTx4czpjaG9pY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQcm9maWxlUmVzcG9uc2UiIHJlZj0iUHJvZmlsZVJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dFNldHVwUmVzcG9uc2UiIHJlZj0iUHVuY2hPdXRTZXR1cFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJHZXRQZW5kaW5nUmVzcG9uc2UiIHJlZj0iR2V0UGVuZGluZ1Jlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVzcG9uc2UiIHJlZj0iU3Vic2NyaXB0aW9uTGlzdFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50UmVzcG9uc2UiIHJlZj0iU3Vic2NyaXB0aW9uQ29udGVudFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxpc3RSZXNwb25zZSIgcmVmPSJTdXBwbGllckxpc3RSZXNwb25zZSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJEYXRhUmVzcG9uc2UiIHJlZj0iU3VwcGxpZXJEYXRhUmVzcG9uc2UiLz4KLQkJCQkJPC94czpjaG9pY2U+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hBdHRyaWJ1dGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoRGF0YUVsZW1lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEF0dHJpYnV0ZSIgcmVmPSJTZWFyY2hBdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwRGF0YSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hEYXRhRWxlbWVudCIgcmVmPSJTZWFyY2hEYXRhRWxlbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VnbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZWxlY3RlZEl0ZW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VuZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiIHJlZj0iQ3JlZGVudGlhbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVzZXJBZ2VudCIgcmVmPSJVc2VyQWdlbnQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNoYXJlZFNlY3JldCI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSIvPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyIgcmVmPSJBZGRyZXNzIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwcGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFja2luZ0RvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InRyYWNraW5nSWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFja2luZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNob3J0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3RhcnRQYWdlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN0YXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY29kZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idGV4dCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN0YXR1c1VwZGF0ZVJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRG9jdW1lbnRSZWZlcmVuY2UiIHJlZj0iRG9jdW1lbnRSZWZlcmVuY2UiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHJlZj0iU3RhdHVzIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdHJlZXQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcm5hbElEIiByZWY9IkludGVybmFsSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDaGFuZ2V0aW1lIiByZWY9IkNoYW5nZXRpbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGb3JtYXQiIHJlZj0iRm9ybWF0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ2hhbmdlTWVzc2FnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iIHJlZj0iU3Vic2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJuZXciLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZSIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDSUZDb250ZW50IiByZWY9IkNJRkNvbnRlbnQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleCIgcmVmPSJJbmRleCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRyYWN0IiByZWY9IkNvbnRyYWN0Ii8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50UmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcm5hbElEIiByZWY9IkludGVybmFsSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iIHJlZj0iU3Vic2NyaXB0aW9uIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudCIgcmVmPSJTdWJzY3JpcHRpb25Db250ZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZS8+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkxpc3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iIHJlZj0iU3Vic2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyIgcmVmPSJDb21tZW50cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxvY2F0aW9uIiByZWY9IlN1cHBsaWVyTG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNvcnBvcmF0ZVVSTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InN0b3JlRnJvbnRVUkwiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckNoYW5nZU1lc3NhZ2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXIiIHJlZj0iU3VwcGxpZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5ldyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyRGF0YVJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckRhdGFSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllciIgcmVmPSJTdXBwbGllciIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxpc3RSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMaXN0UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXIiIHJlZj0iU3VwcGxpZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTG9jYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyIgcmVmPSJBZGRyZXNzIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJNZXRob2RzIiByZWY9Ik9yZGVyTWV0aG9kcyIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0QXV4aWxpYXJ5SUQiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0SUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyU2V0dXAiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVGF4Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5IiByZWY9Ik1vbmV5Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRlbGVwaG9uZU51bWJlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Q29kZSIgcmVmPSJDb3VudHJ5Q29kZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFyZWFPckNpdHlDb2RlIiByZWY9IkFyZWFPckNpdHlDb2RlIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiByZWY9Ik51bWJlciIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dGVuc2lvbiIgcmVmPSJFeHRlbnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUZXJyaXRvcnlBdmFpbGFibGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRvIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiIHJlZj0iQ3JlZGVudGlhbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVG90YWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiIHJlZj0iTW9uZXkiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRyYW5zYWN0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcHRpb24iIHJlZj0iT3B0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImEtZHR5cGUiIHR5cGU9InhzOk5NVE9LRU5TIiBmaXhlZD0icmVxdWVzdE5hbWUgTk1UT0tFTiIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlVuaXRPZk1lYXN1cmUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVuaXRQcmljZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVXNlckFnZW50IiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjWE1MIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9IkhlYWRlciIgcmVmPSJIZWFkZXIiLz4KLQkJCQkJPHhzOmNob2ljZT4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2UiIHJlZj0iTWVzc2FnZSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdCIgcmVmPSJSZXF1ZXN0Ii8+Ci0JCQkJCTwveHM6Y2hvaWNlPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2UiIHJlZj0iUmVzcG9uc2UiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IjEuMS4wMDkiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGF5bG9hZElEIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idGltZXN0YW1wIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvb2FnaXNfZmllbGRzLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19maWVsZHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFjMmI2Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19maWVsZHMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tR2VuZXJhdGVkIGJ5IFhNTCBBdXRob3JpdHkuIENvbmZvcm1zIHRvIHczYyBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS0tPgotPHhzOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4czphbm5vdGF0aW9uPgotCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQotCQlMaWNlbnNlIGluZm9ybWF0aW9uIGZvciB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgaW4gTElDRU5TRS5UWFQsIGFzIHB1Ymxpc2hlZAotCQlvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCQkKLQkJRm9yIHN1cHBvcnQsIG1vcmUgaW5mb3JtYXRpb24sIG9yIHRvIHJlcG9ydCBpbXBsZW1lbnRhdGlvbiBidWdzLAotCQlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0JCQotCQkkUmV2aXNpb246IDEuMSAkCi0JCSREYXRlOiAyMDAzLzA5LzE1IDE4OjIwOjQyICQKLQkJT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWE1MCi0JCUNvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQkJCi0JCSROYW1lOiAgJAotCQkKLQkJYWp3CTcuMgkJMDkvMTQvMjAwMQlGaWVsZHMgdG8gc3VwcG9ydCBFQ2F0YWxvZzogQ0xBU1NGTklELENMQVNTRk4sQ0xBU1NMRVZFTCxDTFNTU0NITVJWLEZUR1JPVVAsCi0JCQkJCQkJCQlGVFZBTElORCxGVFZBTFFVQUwsCVBSSUNFQ09ERSwJUFJJQ0VUWVBFLFNFUU5DRU5VTSxVU0FHRVJFU1ROCi0JCWFqdwk3LjIJCTA5LzE0LzIwMDEJRmllbGRzIHRvIHN1cHBvcnQgQ29uc3VtcHRuOiBDT05TTElORU5VTSxST1VURUxFVkVMMS1ST1VURUxFVkVMOSAgCi0JCW1scgk3LjIgCQkwOS8xNC8yMDAxCUFkZGVkIGZpZWxkcyB0byBzdXBwb3J0IHVwZGF0ZWQgZGVsaXZlcnk6IEFDS01PREUsIERJU0NSUFRZUEUsIFJFQ0VJUFRZUEUuCi0JCWFqdwk3LjIuMQkxMC8zMS8yMDAxCVczQyBTY2hlbWEgUmVsZWFzZSAKLQkJCi0KLQkJU3RydWN0dXJlIE92ZXJ2aWV3Ci0JCQotCQkJVGhpcyBzY2hlbWEgZGVmaW5lcyB0aGUgT0FHSSBGaWVsZCBkYXRhdHlwZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBzcGVjaWZpY2F0aW9uLgotCQkJQmVsb3cgaXMgYW4gb3V0bGluZSBkZXBpY3RpbmcgdGhlaXIgcGxhY2VtZW50IGFuZCB1c2FnZS4KLQkJCQotCQkJQk9EIE5hbWVzcGFjZSAoImh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvbm5uX3ZlcmJfbm91bl9yZWwiKQotCQkJCXwKLQkJCQl8LS0tIFNlZ21lbnRzIE5hbWVzcGFjZSAtIG9hZ2lzX3NlZ21lbnRzLnhzZCAob3M6ICJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIikKLQkJCQl8CXwKLQkJCQl8LS0tCXwtLS0gRmllbGRzIE5hbWVzcGFjZSAtIG9hZ2lzX2ZpZWxkcy54c2QgKG9mOiJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIpIAotCQkJCQkKLQkJCQkJCi0JCQkKLQkJPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJWRVJCIiB0eXBlPSJWRVJCIi8+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iVkVSQiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0tOT1dMRURHRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTExPQ0FURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBREQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOQ0VMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT05GSVJNIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRUFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iR0VUTElTVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NVRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPQUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9DRVNTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFQ0VJVkUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTUE9ORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSE9XIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNZTkMiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBTlNGRVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVVBEQVRFIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9Ik5PVU4iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUSVZJVFkiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQk9NIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJPRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQVRBTE9HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPQSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT05TVU1QVE4iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09VTlRJTkZPIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRURJVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDVVNUT01FUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxJVkVSWSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEU1BUQ0hMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVDQVRBTE9HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOR0NIR09SRFIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDSE5HUkFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlNQRUNUSU9OIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOVkVOQ09VTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WRU5UT1JZIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOVk9JQ0UiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVNTVUUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVNTVUVJTkZPIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTUNMQVNTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU1TUEVDUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNWFJFRiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKT1VSTkFMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxER1JBQ1RVQUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTERHUkJVREdFVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQUlOVE9SREVSIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENIRE9DIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENIRkFJTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQVRDSE9LIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1GR1RMQ09ERSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNSVNDSVRFTSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQQVlBQkxFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNPTk5FTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJTT05USU1FIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBJQ0tMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMQU5TQ0hEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMSU5WT0lDRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUklDRUxJU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPREFWQUlMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0RPUkRFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9EVUNUUkVRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0pBQ0NUTkciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPSklORk8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVPVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWQUJMRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVNJVE4iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1VSQ0UiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkZRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJPVVRJTkciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0FMRVNPUkRFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFTQ0hEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBNRU5UIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBTQ0hEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNJVEVMRVZFTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTVEFUVVMiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1VQUExJRVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU9NR1JPVVAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQQ09ORklSTSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBNRVJHRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBNT1ZFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJUFJFQ09WRVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQU1BMSVQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQU1RBVFVTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldSS1NDSERVTEUiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iUkVWSVNJT04iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkxPR0lDQUxJRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ09ORklSTUFUSU9OIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTAgLSBObyBDb25maXJtIEJPRCByZXF1ZXN0ZWQsIDEgLSBTZW5kIENvbmZpcm0gQk9EIG9ubHkgb24gZXJyb3IsIDIgLSBTZW5kIENvbmZpcm0gQk9EIGFsd2F5cwkJCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT0NPTkZJUk0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT05FUlJPUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJZRVNDT05GSVJNIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkxBTkdVQUdFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJDSEFSR0VUWVBFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJET0NUWVBFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJET0NVTUVOVElEIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJET0NVTUVOVFJWIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJJVEVNIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJPUklHUkVGIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJQQVJUTlJJRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iUEFSVE5SVFlQRSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUbyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlGcm9tIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSlYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlciIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJQQVlNRVRIT0QiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlJFQVNPTkNPREUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlNDSExJTkVOVU0iPgotCQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJTVEFUVVNMVkwiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPjAwIC0gU3VjY2VzcywgOTkgLSBGYWlsdXJlPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMDAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iOTkiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iU1VCTElORU5VTSI+Ci0JCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRBWENPREUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRBWEpSU0RDVE4iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRFUk1JRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTk9VTiIgdHlwZT0iTk9VTiIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFVklTSU9OIiB0eXBlPSJSRVZJU0lPTiIvPgotCTwhLS0gQVc6IHN1cHBvcnQgQlNSIFR5cGUgLSBFbmQgLS0+Ci0JPCEtLSBBVzogQmVsb3cgc3VwcG9ydCBTRU5ERVIgVHlwZSAtIFN0YXJ0IC0tPgotCTx4czplbGVtZW50IG5hbWU9IkxPR0lDQUxJRCIgdHlwZT0iTE9HSUNBTElEIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09NUE9ORU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVNLIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUZFUkVOQ0VJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09ORklSTUFUSU9OIiB0eXBlPSJDT05GSVJNQVRJT04iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMQU5HVUFHRSIgdHlwZT0iTEFOR1VBR0UiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT0RFUEFHRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQVVUSElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIEVuZCAtIFN1cHBvcnQgU0VOREVSIFR5cGUgLS0+Ci0JPCEtLSBTdGFydCAtIFN1cHBvcnQgREFURVRJTUUgVHlwZSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJZRUFSIiB0eXBlPSJ4czpnWWVhciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1PTlRIIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFZIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSE9VUiIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1JTlVURSIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlNFQ09ORCIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlNVQlNFQ09ORCIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlRJTUVaT05FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIEVuZCAtIFN1cHBvcnQgREFURVRJTUUgVHlwZSAtLT4KLQk8IS0tIFN0YXJ0IC0gQWxwaGFiZXRpY2FsIGZyb20gaGVyZSBvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQlNFTkNFVFlQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0NUUEVSSU9EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0NUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNDVFlFQVIiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tNT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tSRVFVRVNUIj4KLQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjIiLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PQUNLIi8+Ci0JCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPTkNIQU5HRSIvPgotCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iWUVTQUNLIi8+Ci0JCQk8L3hzOnJlc3RyaWN0aW9uPgotCQk8L3hzOnNpbXBsZVR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFDVElPTkNPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDVElWRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUREUkxJTkUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBRERSVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUxMT1dUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBUFBST1ZBTCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBUFBST1ZFRCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFVVEhDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCQUNLT1JESU5EIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQklMTE9MQURORyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQktUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCT01BTFRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTU5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTVJFVklTT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTVNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NVVNBR0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVREdTVEFUIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlVER1RYTiIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVREdWRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVU05BUkVBIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCVVlFUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVJSSUVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVJSU1JWTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVRBTEdOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVRBTE9HUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNIQVJHRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDSEFSR0VUWVBFIiB0eXBlPSJDSEFSR0VUWVBFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0hHTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0lUWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xBU1NGTiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNMQVNTRk5JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xBU1NMRVZFTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xTU1NDSE1SViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xTRUxNTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTFNTRUxNVCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNMU1NMTU5USUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNMU1NTQ0hNSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNNUFJTTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTVBSU05UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTlRDVFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTU1FTlRTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT01NT0RJVFkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT01QTEVWRUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTVBSRUZERVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTkRTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT05TVU1QVE4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRBSU5SSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRDVFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlROUlNFQUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlROUlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRSQUNUQiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVFJBQ1RJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVFJBQ1RTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1NUQ0VOVEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1NUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRSWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRSWURTVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRSWU9SRyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDUkFGVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDVENIV0NPTlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNUQ0hXRkxBRyIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkNVUlJFTkNZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDVVJSRlJPTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ1VSUlRPIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEQVRFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFZT0ZNT05USCIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRBWVNOVU0iIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERUZBVUxUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERUZMVFZBTFVFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERUxJVkVSVE8iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFTlNJVFlGQUMiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERVBBUlRNRU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERVNDUklQVE4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRJU0NSUFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRJU1BPU0lUTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElTUE9TSVRPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElTVENFTlRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElWSVNJT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ0tJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRE9DVFlQRSIgdHlwZT0iRE9DVFlQRSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNRU5USUQiIHR5cGU9IkRPQ1VNRU5USUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJET0NVTUVOVFJWIiB0eXBlPSJET0NVTUVOVFJWIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFJBV0lORyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFJDUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFJPUFNISVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRTUFNUTklOViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFVOU05VTUJFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPQVBQU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPUFJJT1JJVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVDT1JFVklTT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVDT1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVMRU1FTlQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTUFJTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QQ0FURUdSWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QREVQVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QTE9ZRUVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QUVVBTElGIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVORElURU1JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhDTFVTSVZFIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhDUExJTk5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhDUFROQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhQSVJFRkxBRyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhQT1JUTElDIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFDVE9SIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFJTENMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGQUlMQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFJTFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZBSUxVUkVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFYIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkVBVFVSRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGRUFUVkFMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUVMRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUVMRFZBTFVFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUxFTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRklMRVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZJWERRVFlJTkQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSVhFREFTU0VUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGTEVYQktUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSRUlHSFRDTFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSR0hUQ0xTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUkdIVElURU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSR0hUVEVSTVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSTUlUTUNMU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSTUlUTU5NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUk1JVE1OTVJWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUk1TSVRFTFZMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJPTVBBUlRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVERBVEFUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVEdST1VQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVFZBTElORCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlRWQUxRVUFMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVU5EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHRU9HUkFQSFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkdMRU5USVRZRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR0xFTlRJVFlTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHTE5PTUFDQ1QiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkhBWlJETUFUTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSERSU1RBVFVTIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPCEtLQk8eHM6ZWxlbWVudCBuYW1lPSJIT1VSIiB0eXBlPSJ4czppbnRlZ2VyIi8+ICBkZWYnZCBhYm92ZSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJIUk9SRyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IklNUE9SVExJQyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IklOQ1BMQU5GTEciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTkRMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTk1SUFBMQU4iIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTlFVRVVFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IklOU1BET0NSRVYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOU1BFQ1RET0MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOU1BFQ1RSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOVkVORElTUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5WTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTSIgdHlwZT0iSVRFTSIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1YIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNQ0FUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1DTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTUNMQVNTSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1ERUZOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNREVTQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTVJWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNUlZYIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTVZBUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRNRlRWQUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklUTUlERkxHIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSkVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSk9CQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSlBJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iS0FOQkFOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMQUJPUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMRURHRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxJTkUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxJTkVGRUVEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMSU5FVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9BRFBPSU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMT0NLIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9UTEVWRUwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMT1RTTkZMQUciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hDTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNQUNISU5FSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hTVEFURSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hTVURFUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BSU5UQ0FMSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BSU5UTE9DSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BSU5UT1JESUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BTkRBVE9SWSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BVENIVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUNIRE9DSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1DSERPQ1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1DSExJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9Ik1PUEFSRU5USUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1PUFJJT1JJVFkiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNT1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTU9UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNU0RTSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1TR0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNU0dURVhUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNU0dUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOQU1FIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTkVXSVRNUkVWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJORVdSRVZGTEFHIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOT1RFUyIgdHlwZT0iTk9URVMiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk9URVMiPgotCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOVU1PRkRFQyIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9JTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT0xESVRNUkVWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPTkVUSU1FIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BFTklURU0iIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUEVSQVROQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUEVSQVROSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVE5TRVEiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QUkFNVEFVVEgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QUkdSUE5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QUkdSUFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUFRDTFNOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUFRDTFNTSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QVElPTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUFRJT05OQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUklHUkVGIiB0eXBlPSJPUklHUkVGIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1RFTElHSUJMRSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9VVFFVRVVFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9WRVJJRFBSSUMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9WRVJUSU1FIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1dOUlNIUENERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFDS0lORyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFDS05HREVTQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSQ05UTlJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSRU5USUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUkVOVExPVCIgdHlwZT0iUEFSRU5UTE9UIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBBUkVOVExPVCI+Ci0JCTx4czpzaW1wbGVDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6c2ltcGxlQ29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IlBBUkVOVFNOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlRJQUxTSFAiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTlJJRCIgdHlwZT0iUEFSVE5SSUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTlJJRFgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUlJBVEciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUlJPTEUiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTlJUWVBFIiB0eXBlPSJQQVJUTlJUWVBFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFZTUVUSE9EIiB0eXBlPSJQQVlNRVRIT0QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQRVJTT05DT0RFIiB0eXBlPSJSRUFTT05DT0RFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUElDTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUExBTk5FUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQTUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0VOVElUWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9MSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0xOU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1JFTEVBU0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBPU0lUSU9OIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1NUQUxDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUkNFU1NDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUkRMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUkVGRVJFTkNFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUklDRUNPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFTFNUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFTFNUUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJJTlQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUklOVENOVEwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSU9SSVRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk5UQ0xTRUxNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EQ1RMSU5FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9ET1JERVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RPUkRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPRE9TVEFUUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPRE9UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EU0VRQkVHIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EU0VRRU5EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EU0VRTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9GSVRDVFIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pBQ1RTVFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pBQ1RWVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pFQ1QiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pSRVNFTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBST0pTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pUWFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST1BFUlRZIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPWE1PTlRIIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNCTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNDTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNETElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBVQkxJU0hFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRU0xJTkVTVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRU0xJTkVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVRFSURYIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVMTlNUQVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFURVJFVklTT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFURVNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVRFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTEZOSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFVQUxGTlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFVQUxGTlZBTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTElGIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSQVRFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVBU09OQ09ERSIgdHlwZT0iUkVBU09OQ09ERSIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFQ0VJUFRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDRUlQVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDRVBURElTUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVGIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVHSU9OIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUxJVEVNSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFTExPQ0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUxNQUNISUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFTUlUVEFOQ0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUFJUR0ZMQUciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUUxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUUxOU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVRVUVTVEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVFVSVNUTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVNPUkNFVVNFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIERlcHJlY2F0ZWQgLS0+Ci0JCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ0tJTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ1VTRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBEZXByZWNhdGVkCS0tPgotCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ0dSUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVNPUkNUWVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFU09VUkNFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFU1RSSUNUTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVZJU0lPTiI+ICAgQWxyZWFkeSBkZWZpbmVkIGFib3ZlIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJFVklUTVNUQVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFJRFgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUxOU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURUxFVkVMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUk9VVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURVZBUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUk9VVElOR0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VUSU5HUkVWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VUSU5HVkFSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSUVNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU0JMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJTTElORVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJTUExJTk5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUlNQUkVWTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU1BTQ0hFRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU1BTRExOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBRkVUWUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUZFVFlUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUZUWUNMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUxFU09SRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUxFU09SRyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNBTEVTUEVSU04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBVkVTRVRVUCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDSERVTEVUWVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDSEVEVUxFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDSExJTkVOVU0iIHR5cGU9IlNDSExJTkVOVU0iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQ1JBUCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlNFUklBTE5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0VRTkNFTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElGVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUE1BVExJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUE5PVEVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElQUEVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNISVBQRVJOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNISVBQT0lOVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFBSSU9SIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFNSVkxWTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQTVRMREVTQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQVU5JVFNFUSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQVU5JVFNUUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQVU5JVFRPVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0lHTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0lURUxFVkVMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU09MSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT0xOU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT1NMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1BFQ0lBTEhORCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1BMSVRBQkxFIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RBR0VQT0lOVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RBVEVQUk9WTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RBVFVTTFZMIiB0eXBlPSJTVEFUVVNMVkwiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVEVQSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNURVBOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNURVBUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVUJMSU5FTlVNIiB0eXBlPSJTVUJMSU5FTlVNIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1VCU0ZMQUciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVUZGSVgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNVUEVSVklTT1IiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNZTkNJTkQiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gU2VlIGFib3ZlCi0JPHhzOmVsZW1lbnQgbmFtZT0iVEFTSyIgdHlwZT0iVEFTSyIvPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRBU0siPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhDT0RFIiB0eXBlPSJUQVhDT0RFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYRVhFTVBUIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRBWEpSU0RDVE4iIHR5cGU9IlRBWEpSU0RDVE4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhMSU5FIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYV0hFWE1QVCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlRFTEVQSE9ORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRFUk1GTEFHIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEVSTUlEIiB0eXBlPSJURVJNSUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUSVRMRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVE9JVE1DTFNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT0lUTU5NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT0lUTU5NUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRPT0xDTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVE9PTElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT1BBUlRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT1NJVEVMVkwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUkFDS0ZMRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSQUNLSU5HSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSQUtOR0ZMQUciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUkFOU01FVEhEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUkFOU1RFUk1TIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUk5TRlJUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUWEFOQUxZU0lTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVTklUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVTklUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVU9NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT01HUk9VUElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT01OVU1ERUMiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT01WQUxVRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVBDIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUENQS0dJTkQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVQQ1NDQzE0IiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUERUV0lQRkciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUkkiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS14czp1cmlSZWZlcmVuY2UgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU0FHRVJFU1ROIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU0VSQVJFQSIgdHlwZT0iVVNFUkFSRUEiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iVVNFUkFSRUEiIG1peGVkPSJ0cnVlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9InNraXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IlVTRVJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVNFVVBJVEVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU1VQSU5WRkciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJWQUxVRSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotCTx4czplbGVtZW50IG5hbWU9IlZBTFVFQ0xBU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlZPVUNIRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldBR0VHUk9VUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV0FHRVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldBUkVIT1VTRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV0FSUkFOVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldPUktDRU5URVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldPUktPUkRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV1JLU0NIRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJYUkVGVFlQRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIEVuZCAtIFN1cHBvcnRpbmcgRmllbGRzICYgVHlwZXMgLS0+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvb2FnaXNfc2VnbWVudHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWFkYTM3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIiB4bWxucz0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgeG1sbnM6b2Y9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHNjaGVtYUxvY2F0aW9uPSJvYWdpc19maWVsZHMueHNkIi8+Ci0JPHhzOmFubm90YXRpb24+Ci0JCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCi0JCUxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCi0JCW9uIHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCB3ZWIgc2l0ZS4gd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnCi0JCQotCQlGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCi0JCXBsZWFzZSBjb250YWN0IHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBhdCB4bWxAb3BlbmFwcGxpY2F0aW9ucy5vcmcKLQkJCi0JCSRSZXZpc2lvbjogMS4xICQKLQkJJERhdGU6IDIwMDMvMDkvMTUgMTg6MjA6NDIgJAotCQlPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBYTUwKLQkJQ29weXJpZ2h0IDE5OTgtMjAwMSwgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCQkKLQkJJE5hbWU6ICAkCi0JCQotCQlhancJNy4yLjEJMTAvMzEvMjAwMQlXM0MgU2NoZW1hIFJlbGVhc2UgCi0JCQotCi0JCVN0cnVjdHVyZSBPdmVydmlldwotCQkKLQkJCVRoaXMgc2NoZW1hIGRlZmluZXMgdGhlIE9BR0kgU2VnbWVudCBkYXRhdHlwZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBzcGVjaWZpY2F0aW9uLgotCQkJQmVsb3cgaXMgYW4gb3V0bGluZSBkZXBpY3RpbmcgdGhlaXIgcGxhY2VtZW50IGFuZCB1c2FnZS4KLQkJCQotCQkJQk9EIE5hbWVzcGFjZSAoImh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvbm5uX3ZlcmJfbm91bl9yZWwiKQotCQkJCXwKLQkJCQl8LS0tIFNlZ21lbnRzIE5hbWVzcGFjZSAtIG9hZ2lzX3NlZ21lbnRzLnhzZCAob3M6ICJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIikKLQkJCQl8CXwKLQkJCQl8LS0tCXwtLS0gRmllbGRzIE5hbWVzcGFjZSAtIG9hZ2lzX2ZpZWxkcy54c2QgKG9mOiJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIpIAotCQkJCQkKLQkJCQkJCi0JCQkKLQkJPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTlRST0xBUkVBIiB0eXBlPSJDTlRST0xBUkVBIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNOVFJPTEFSRUEiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkJTUiIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJTRU5ERVIiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iREFURVRJTUVBTlkiLz4KLQkJCTwhLS0gRWl0aGVyIERBVEVUSU1FIG9yIERBVEVUSU1FSVNPIC0tPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlNSIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VkVSQiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9VTiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UkVWSVNJT04iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNFTkRFUiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkxPR0lDQUxJRCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09NUE9ORU5UIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVNLIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpSRUZFUkVOQ0VJRCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09ORklSTUFUSU9OIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMQU5HVUFHRSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09ERVBBR0UiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFVVEhJRCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFURVRJTUVBTlkiIGFic3RyYWN0PSJ0cnVlIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFURVRJTUVJU08iIHR5cGU9IkRBVEVUSU1FSVNPIiBzdWJzdGl0dXRpb25Hcm91cD0iREFURVRJTUVBTlkiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iREFURVRJTUVJU08iPgotCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZVRpbWUiPgotCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB0eXBlPSJEQVRFVElNRXF1YWwiLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8IS0tIERBVEVUSU1FSVNPIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkRBVEVUSU1FIiB0eXBlPSJEQVRFVElNRSIgc3Vic3RpdHV0aW9uR3JvdXA9IkRBVEVUSU1FQU5ZIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRBVEVUSU1FIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpZRUFSIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk1PTlRIIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRBWSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpIT1VSIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk1JTlVURSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTRUNPTkQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1VCU0VDT05EIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRJTUVaT05FIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB0eXBlPSJEQVRFVElNRXF1YWwiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJEQVRFVElNRXR5cGUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNDT1VOVElORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUkVRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFQUFJPVkFMIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRBVEVUSU1FcXVhbCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0NPVU5USU5HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVEVORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUFBSRVEiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUk9WQUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVZBSUxBQkxFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJLVEVORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCS1RTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5DRUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01QREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT05TVU1FIi8+CQkJCi0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRUFUSU9OIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNVTVVMQVRJVkUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZBQ1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZTQ0hFRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJESVNDTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRE9DVU1FTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVBUkxTVEVGRiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQVJMU1RTSElQIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVGRkVDVElWRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTkdDSEciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhFQ0ZJTklTSCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWEVDU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhQSVJBVElPTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGQUlMREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JFQ0FTVEYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SRUNBU1RTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZST00iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iR0VORVJBVElPTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKT0JEVUUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU1QTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZPSUNFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxBQk9SRklOU0giLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTEFCT1JTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMQVNUVVNFRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0FESU5HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENISU5HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1TTUVOVERBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTkVFRERFTFYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1BGSU5JU0giLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1BTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQQVlFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExBTkVORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTEFOU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUE8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPTURFTFYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPTVNISVAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFlNVFRFUk0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWRUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVQT1JUREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVBPUlROR0ZOIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUE9SVE5HU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1JDRFdORiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPUkNEV05TIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJTUEREQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJTUERPQ0dFTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQ0hFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0VUVVBGSU5TSCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVRVUFNUQVJUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUFNDSEVEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNUQVRVU0RBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEVBUkRPV05GIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRFQVJET1dOUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUTyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8IS0tIERBVEVUSU1FIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkFERFJFU1MiIHR5cGU9IkFERFJFU1MiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQUREUkVTUyI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUREUkxJTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUREUlRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09VTlRSWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPVU5UWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZBWCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT1NUQUxDT0RFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UkVHSU9OIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1RBVEVQUk9WTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWEpSU0RDVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURUxFUEhPTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVJMIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVEFDVCIgdHlwZT0iQ09OVEFDVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJDT05UQUNUIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOQU1FIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTlRDVFRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpFTUFJTCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZBWCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOQU1FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRFTEVQSE9ORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBTU9VTlQiIHR5cGU9IkFNT1VOVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJBTU9VTlQiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZBTFVFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5VTU9GREVDIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNJR04iLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q1VSUkVOQ1kiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RFJDUiIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUVUFMIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUlZPUkQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkFJTEFCTEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCVURHRVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01NSVNTSU9OIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVDTEFSRVZBTCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRTQ1BSQ05UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFNDVkFMVUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJESVNDTlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJET0NVTUVOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVEVOR0lNUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVEZSRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RIUlMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RJTUFURSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVE1BTklNUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVFVDT1NUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhURU5ERUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGUkVJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QRU5JVEVNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1JERVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRMSU1JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWVJBVEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSQVRFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJDQlJLIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEFYIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEFYQkFTRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPVEFMIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVE9UTElNSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEFYIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8IS0tIEFNT1VOVCAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBVFRDSFJFRiIgdHlwZT0iQVRUQ0hSRUYiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQVRUQ0hSRUYiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkRBVEVUSU1FIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iUVVBTlRJVFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDTVBSU05UWVBFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q01QUlNOSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGSUxFVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRJVExFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwhLS0gPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+IC0tPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZJTEVOQU1FIi8+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVSSSIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZJTEVOQU1FIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkNIQVJHRSIgdHlwZT0iQ0hBUkdFIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNIQVJHRSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0iT1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNIQVJHRUlEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q0hBUkdFVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNIR0xJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkRJU1RSSUJVVE4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkRJU1RSSUJVVE4iIHR5cGU9IkRJU1RSSUJVVE4iLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iRElTVFJJQlVUTiI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0iT1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkJVU05BUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09TVENFTlRFUiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFUEFSVE1FTlQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpESVZJU0lPTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkVMRU1FTlQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RlVORCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdFT0dSQVBIWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdMRU5USVRZUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdMTk9NQUNDVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBST0ZJVENUUiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBST0pFQ1QiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVTklUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6V0FSRUhPVVNFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BFUkFNVCIgdHlwZT0iT1BFUkFNVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJPUEVSQU1UIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOVU1PRkRFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTSUdOIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNVUlJFTkNZIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTVZBTFVFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTU5VTURFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVT00iLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPU1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWFRFTkRFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZSRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTklUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+Ci0JCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJPC94czphdHRyaWJ1dGU+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTkVSIiB0eXBlPSJQQVJUTkVSIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBBUlRORVIiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5BTUUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6T05FVElNRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUklEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNZTkNJTkQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBQ1RJVkUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDVVJSRU5DWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRVTlNOVU1CRVIiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpHTEVOVElUWVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJFTlRJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUklEWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUlJBVEciIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJST0xFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFZTUVUSE9EIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYRVhFTVBUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURVJNSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkFERFJFU1MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iQ09OVEFDVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEVNUFJBVFVSRSIgdHlwZT0iVEVNUEVSQVRVUkUiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iVEVNUEVSQVRVUkUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZBTFVFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5VTU9GREVDIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNJR04iLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVFVBTCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWRVJZIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRElORyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+Ci0JCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VMU0lVUyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZBSFJFTkhFSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJLRUxWSU4iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTlRJVFkiIHR5cGU9IlFVQU5USVRZIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlFVQU5USVRZIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOVU1PRkRFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTSUdOIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTSIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNDRVBURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1REVVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RIUlMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTExPQ0FURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTExPV0VEV1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkFJTEFCTEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkdSVU5TSVpFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFDS09SREVSRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJBVENIU0laRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJBVENIVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJMT0NLRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCUkVBS1RJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQVBQRVJDRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FUQ0hXRUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTU1JU1NJT04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01QTEVURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDVU1VTEFUSVZFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZFUkVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVSQVRJT04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEVVJPVkVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVSVU5ERVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBMT1lFRVMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBSRVFEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNURFVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUV0VJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklMRU5BTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUxFU0laRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkhFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOU1BFQ1RFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOU1BFQ1RJT04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTERUTU9GRlNFVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxFTkdUSCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxBQk9SIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRElOR1dUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9UU0laRU1BWCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPVFNJWkVNSU4iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT1RTSVpFTUxUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9XRVJMSU1JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BQ0hJTkVIUlMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQVhJTVVNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFYUEFSTFRNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUlOSU1VTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1PVkVUSU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTVNNRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTVVMVElQTElFUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5FVFdFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QRU4iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRFUkVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVJSRUoiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVkVSU0hJUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBQ0tJTkciLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJDRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSQ0VOVFJFUSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNIQk5PUFIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJTSFdJT1BSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExORFBSQ1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUkNCUksiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUklPUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlFVRVVFVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJBVEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUNFSVZFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFSkVDVEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVKRklYRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUpQRVJDRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVNRFVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVNSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVRVUk5FRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFV09SSyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJVTlRJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQ1JBUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNFVFVQVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNIRUxGTElGRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBQRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSElQVU5JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNUQVJUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEVBUkRPV04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUT09MUkVRRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPVFdFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRlJMT1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRFUlNISVAiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTklUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVVBQRVJMSU1JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZPTFVNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldBSVRUSU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0VJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lEVEgiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPCEtLSBRVUFOVElUWSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJET0NVTU5UUkVGIiB0eXBlPSJET0NVTU5UUkVGIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRPQ1VNTlRSRUYiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1RZUEUiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVU1FTlRJRCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJJRCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJUWVBFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1VNRU5UUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9URVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTQ0hMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1VCTElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNRU5UIiB0eXBlPSJET0NVTUVOVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJET0NVTUVOVCI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVU1FTlRJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1VNRU5UUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NUWVBFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9UU0VSSUFMIiB0eXBlPSJMT1RTRVJJQUwiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iTE9UU0VSSUFMIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJRVUFOVElUWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8IS0tKCVRVUFOVElUWS5JVEVNOyk/IC0tPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMT1RMRVZFTCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJFTlRMT1QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSRU5UU05VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNFUklBTE5VTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9Db25zb2xpZGF0ZVRlc3QueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9Db25zb2xpZGF0ZVRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjEwODZhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvQ29uc29saWRhdGVUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxlbXBsb3llZXM+Ci0gIDxlbXBsb3llZT4KLSAgICA8bmFtZT5GcmVkIEpvbmVzPC9uYW1lPgotICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJob21lIj4KLSAgICAgIDxzdHJlZXQ+OTAwIEF1cm9yYSBBdmUuPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5TZWF0dGxlPC9jaXR5PgotICAgICAgPHN0YXRlPldBPC9zdGF0ZT4KLSAgICAgIDx6aXA+OTgxMDk8L3ppcD4KLSAgICA8L2FkZHJlc3M+Ci0gICAgPGFkZHJlc3MgbG9jYXRpb249IndvcmsiPgotICAgICAgPHN0cmVldD4yMDExIDE1Mm5kIEF2ZW51ZSBORTwvc3RyZWV0PgotICAgICAgPGNpdHk+UmVkbW9uZDwvY2l0eT4KLSAgICAgIDxzdGF0ZT5XQTwvc3RhdGU+Ci0gICAgICA8emlwPjk4MDUyPC96aXA+Ci0gICAgPC9hZGRyZXNzPgotICAgIDxwaG9uZSBsb2NhdGlvbj0id29yayI+KDQyNSk2NDEtOTM4NTwvcGhvbmU+Ci0gICAgPHBob25lIGxvY2F0aW9uPSJob21lIj4oMjA2KTQ0MS0xNjk1PC9waG9uZT4KLSAgICA8cGhvbmUgbG9jYXRpb249Im1vYmlsZSI+KDIwNik3MTQtMjUxNTwvcGhvbmU+Ci0gIDwvZW1wbG95ZWU+Ci0gIDxlbXBsb3llZT4KLSAgICA8bmFtZT5TYWxseSBTbWl0aDwvbmFtZT4KLSAgICA8YWRkcmVzcyBsb2NhdGlvbj0iaG9tZSI+Ci0gICAgICA8c3RyZWV0PjE0MzAgT2FrIFBsYWNlPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5TYWxlbTwvY2l0eT4KLSAgICAgIDxzdGF0ZT5PUjwvc3RhdGU+Ci0gICAgICA8emlwPjk3MTI1PC96aXA+Ci0gICAgPC9hZGRyZXNzPgotICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJ3b3JrIj4KLSAgICAgIDxzdHJlZXQ+NzY1IE1haW4gU3QuPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5LYWlzZXI8L2NpdHk+Ci0gICAgICA8c3RhdGU+T1I8L3N0YXRlPgotICAgICAgPHppcD45NzEwMzwvemlwPgotICAgIDwvYWRkcmVzcz4KLSAgICA8cGhvbmUgbG9jYXRpb249IndvcmsiPig1MDMpMjY0LTM4NTY8L3Bob25lPgotICAgIDxwaG9uZSBsb2NhdGlvbj0iaG9tZSI+KDUwMyk0MTYtNjk1MTwvcGhvbmU+Ci0gICAgPHBob25lIGxvY2F0aW9uPSJtb2JpbGUiPig1MDMpMjE0LTUxNTI8L3Bob25lPgotICA8L2VtcGxveWVlPgotPC9lbXBsb3llZXM+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lYXN5cG8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkODc3ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPHBvOnB1cmNoYXNlLW9yZGVyIHhtbG5zOnBvPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KLSAgPHBvOmN1c3RvbWVyPgotICAgIDxwbzpuYW1lPkRhdmlkIEJhdTwvcG86bmFtZT4KLSAgICA8cG86YWRkcmVzcz5HbGFkd3luZSwgUEE8L3BvOmFkZHJlc3M+Ci0gIDwvcG86Y3VzdG9tZXI+Ci0gIDxwbzpkYXRlPjIwMDItMDktMzBUMTQ6MTY6MDAtMDU6MDA8L3BvOmRhdGU+Ci0gIDxwbzpsaW5lLWl0ZW0+Ci0gICAgPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxPC9wbzpkZXNjcmlwdGlvbj4KLSAgICA8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz4KLSAgICA8cG86cHJpY2U+MjEuNzk8L3BvOnByaWNlPgotICAgIDxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT4KLSAgPC9wbzpsaW5lLWl0ZW0+Ci0gIDxwbzpsaW5lLWl0ZW0+Ci0gICAgPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyPC9wbzpkZXNjcmlwdGlvbj4KLSAgICA8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz4KLSAgICA8cG86cHJpY2U+MTkuODk8L3BvOnByaWNlPgotICAgIDxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT4KLSAgPC9wbzpsaW5lLWl0ZW0+Ci0gIDxwbzpsaW5lLWl0ZW0+Ci0gICAgPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzPC9wbzpkZXNjcmlwdGlvbj4KLSAgICA8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz4KLSAgICA8cG86cHJpY2U+MTkuODk8L3BvOnByaWNlPgotICAgIDxwbzpxdWFudGl0eT4xPC9wbzpxdWFudGl0eT4KLSAgPC9wbzpsaW5lLWl0ZW0+Ci0gIDxwbzpzaGlwcGVyPgotICAgIDxwbzpuYW1lPlVQUzwvcG86bmFtZT4KLSAgICA8cG86cGVyLW91bmNlLXJhdGU+MC43NDwvcG86cGVyLW91bmNlLXJhdGU+Ci0gIDwvcG86c2hpcHBlcj4KLTwvcG86cHVyY2hhc2Utb3JkZXI+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2VyaWN0ZXN0LnhtbCBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvZXJpY3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk5M2JkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvZXJpY3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGJhcj48Zm9vPjE8L2Zvbz48Zm9vPjI8L2Zvbz48L2Jhcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3Blb3BsZS54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL3Blb3BsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDEwNDQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9wZW9wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTxwZW9wbGUgeD0iIj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PkVyaWM8L2ZpcnN0PgotICAgICAgPGxhc3Q+VmFzaWxpazwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zNzwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlN5bHZpYTwvZmlyc3Q+Ci0gICAgICA8bGFzdD5WYXNpbGlrPC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjM0PC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+Um9kPC9maXJzdD4KLSAgICAgIDxsYXN0PkNoYXZlejwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zOTwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlRlcnJ5PC9maXJzdD4KLSAgICAgIDxsYXN0Pkx1Y2FzPC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjQyPC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+RGF2aWQ8L2ZpcnN0PgotICAgICAgPGxhc3Q+QmF1PC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjMxPC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+RXJpYzwvZmlyc3Q+Ci0gICAgICA8bGFzdD5WYXNpbGlrPC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjM3PC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+U3lsdmlhPC9maXJzdD4KLSAgICAgIDxsYXN0PlZhc2lsaWs8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+MzQ8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5Sb2Q8L2ZpcnN0PgotICAgICAgPGxhc3Q+Q2hhdmV6PC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjM5PC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+VGVycnk8L2ZpcnN0PgotICAgICAgPGxhc3Q+THVjYXM8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+NDI8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5EYXZpZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5CYXU8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+MzE8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5FcmljPC9maXJzdD4KLSAgICAgIDxsYXN0PlZhc2lsaWs8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzc8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5TeWx2aWE8L2ZpcnN0PgotICAgICAgPGxhc3Q+VmFzaWxpazwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zNDwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlJvZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5DaGF2ZXo8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzk8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5UZXJyeTwvZmlyc3Q+Ci0gICAgICA8bGFzdD5MdWNhczwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT40MjwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KLSAgICAgIDxsYXN0PkJhdTwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zMTwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlJvZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5DaGF2ZXo8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzk8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5FcmljPC9maXJzdD4KLSAgICAgIDxsYXN0PlZhc2lsaWs8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzc8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5TeWx2aWE8L2ZpcnN0PgotICAgICAgPGxhc3Q+VmFzaWxpazwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zNDwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlJvZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5DaGF2ZXo8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzk8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5UZXJyeTwvZmlyc3Q+Ci0gICAgICA8bGFzdD5MdWNhczwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT40MjwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KLSAgICAgIDxsYXN0PkJhdTwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zMTwvYWdlPgotICA8L3BlcnNvbj4KLQotPC9wZW9wbGU+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3NtYWxsLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvc21hbGwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU2NDUzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvc21hbGwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgICAKLQotICAgdmVyc2lvbgotPQotCi0KLSIKLSIKLXN0YW5kYWxvbmU9J3llcycgICA/PgotPGFhYWEgYT0iYV92YWx1ZSIgYjphID0gJ2JfdmFsdWUnICB4bWxuczpiPSJiX25zIj4JCi0gIDw/cGkJdGFiICB0ZXN4dCBydD8+Ci08L2FhYWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkOTI4YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGZvbyB4PSJ5Ij5hYjwvZm9vPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9BbGxUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTA4YzIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFsbFRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFFOYW1lU2V0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTbW9rZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShKYXZlbGluVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fubm90YXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1Y2YzYy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFubm90YXRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEFubm90YXRpb25zVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nW10gX2FyZ3M7Ci0gICAgc3RhdGljIFN0cmluZyBfdGVzdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDYXNlRmlsZShTdHJpbmcgdGhlQ2FzZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUZXN0RW52LnhiZWFuQ2FzZSgic3RvcmUvIiArIHRoZUNhc2UpOwotICAgIH0KLQotICAgIHN0YXRpYyBYbWxDdXJzb3IgbG9hZENhc2UoU3RyaW5nIHRoZUNhc2UpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShnZXRDYXNlRmlsZSh0aGVDYXNlKSwgbnVsbCkubmV3Q3Vyc29yKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFRlc3RCb29rbWFyayBleHRlbmRzIFhtbEN1cnNvci5YbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIEJhc2ljIGxvYWQgdXAgYSBmaWxlIGFuZCBpdGVyYXRlIHRocm91Z2ggaXQKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljWG1sKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgVGVzdEJvb2ttYXJrIGExID0gbmV3IFRlc3RCb29rbWFyaygpOwotCi0gICAgICAgIGMuc2V0Qm9va21hcmsoIGExICk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Qm9va21hcmsgYTIgPSBuZXcgVGVzdEJvb2ttYXJrKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLnNldEJvb2ttYXJrKCBhMiApOwotICAgICAgICAKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBjLnRvUHJldlRva2VuKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggYy5nZXRCb29rbWFyayggVGVzdEJvb2ttYXJrLmNsYXNzICksIGExICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApLCBhMiApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApID09IG51bGwgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQXNzb3J0ZWRUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fzc29ydGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkYjZlOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQXNzb3J0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRpbWU7Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sQ3VzdG9tZXJCZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sTGluZUl0ZW1CZWFuOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IHhpbnQudGVzdC5Qb3NpdGlvbkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgQXNzb3J0ZWRUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFzc29ydGVkVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEFzc29ydGVkVGVzdHMuY2xhc3MpOyB9Ci0gICAgCi0gICAgLy8gYnVnIDI3NDg5Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTYXZlckNoYXJFc2NhcGluZygpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICk7Ci0gICAgICAgIFhtbE9iamVjdCB4ZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIjx0ZXN0PnNvbWV0aGluZzwvdGVzdD4iKTsKLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHhkb2MubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGN1ci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgLy8gdmFsaWQgY2hhcnMKLSAgICAgICAgY3VyLnNldFRleHRWYWx1ZSgiPHNvbWV0aGluZyBvciBvdGhlcjpcdTAzQzBcdUQ3RkY+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjx0ZXN0PiZsdDtzb21ldGhpbmcgb3Igb3RoZXI6XHUwM0MwXHVEN0ZGPjwvdGVzdD4iICsgbmV3TGluZSwgeGRvYy50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGludmFsaWQgY2hhcnMgLSBjb250cm9sIGNoYXJzLCB1bmljb2RlIHN1cnJvZ2F0ZXMsIEZGRkYvRkZGRSwgZXRjCi0gICAgICAgIGN1ci5zZXRUZXh0VmFsdWUoIjxzb21ldGhpbmdcMG9yXDFvdGhlcjpcdTAwNDVcdUZGRkVcdUQ4MDBcdURGRkZcdURCODBcdURDMDBcdTAzQzBcdUQ3RkZcdTAwMUY+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjx0ZXN0PiZsdDtzb21ldGhpbmc/b3I/b3RoZXI6XHUwMDQ1Pz8/Pz9cdTAzQzBcdUQ3RkY/PjwvdGVzdD4iICsgbmV3TGluZSwgeGRvYy50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gYnVnIDI2MTQwLzI2MTA0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3ROb1R5cGVJbnZhbGlkKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHhkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgiPHRlc3Qtbm8tdHlwZT5zb21ldGhpbmc8L3Rlc3Qtbm8tdHlwZT4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlVudHlwZWQgZG9jdW1lbnQgc2hvdWxkIGJlIGludmFsaWQiLCAheGRvYy52YWxpZGF0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHhkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgiPHg6YmxhaCB4bWxuczp4PVwiaHR0cDovL25vLXR5cGUuY29tL1wiLz4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlVudHlwZWQgZG9jdW1lbnQgc2hvdWxkIGJlIGludmFsaWQiLCAheGRvYy52YWxpZGF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gYnVnIDI2NzkwCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDb21wbGV4U2V0dGVyKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiB4ZG9jID0gWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8cHVyY2hhc2Utb3JkZXIgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nPiIgKwotICAgICAgICAgICAgICAgICAiPGN1c3RvbWVyPiIgKwotICAgICAgICAgICAgICAgICAgICI8bmFtZT5EYXZpZCBCYXU8L25hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgIjxhZGRyZXNzPjEwMCBNYWluIFN0cmVldDwvYWRkcmVzcz4iICsgCi0gICAgICAgICAgICAgICAgICI8L2N1c3RvbWVyPiIgKwotICAgICAgICAgICAgICAgICAiPGRhdGU+MjAwMy0wNS0xOFQxMTo1MDowMDwvZGF0ZT4iICsKLSAgICAgICAgICAgICAgICAgIjxsaW5lLWl0ZW0+IiArCi0gICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPlJlZCBDYW5keTwvZGVzY3JpcHRpb24+IiArCi0gICAgICAgICAgICAgICAgICAiPHBlci11bml0LW91bmNlcz4wLjQyMzwvcGVyLXVuaXQtb3VuY2VzPiIgKwotICAgICAgICAgICAgICAgICAgIjxxdWFudGl0eT40PC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICAgICAgIjwvbGluZS1pdGVtPiIgKwotICAgICAgICAgICAgICAgICAiPGxpbmUtaXRlbT4iICsKLSAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+Qmx1ZSBDYW5keTwvZGVzY3JpcHRpb24+IiArCi0gICAgICAgICAgICAgICAgICAiPHBlci11bml0LW91bmNlcz41LjA8L3Blci11bml0LW91bmNlcz4iICsKLSAgICAgICAgICAgICAgICAgICI8cXVhbnRpdHk+MTwvcXVhbnRpdHk+IiArCi0gICAgICAgICAgICAgICAgICI8L2xpbmUtaXRlbT4iICsKLSAgICAgICAgICAgICAgICAiPC9wdXJjaGFzZS1vcmRlcj4iKTsKLSAgICAgICAgLy8gdGVzdCBjb3B5LXdpdGhpbiBkb2MKLSAgICAgICAgWG1sTGluZUl0ZW1CZWFuIG5ld0l0ZW0gPSB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBuZXdJdGVtLnNldCh4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoNCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLnNldExpbmVJdGVtQXJyYXkoMCwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gdGVzdCBjb3B5LWJldHdlZW4gZG9jcwotICAgICAgICBYbWxMaW5lSXRlbUJlYW4gYW5vdGhlckl0ZW0gPSBYbWxMaW5lSXRlbUJlYW4uRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHhtbC1mcmFnbWVudCB4bWxuczplcD0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbycgeG1sbnM6eHNpPSdodHRwOi8vd3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhzaTp0eXBlPSdsaW5lLWl0ZW0nPiIgKwotICAgICAgICAgICAgICAgICAiPGVwOmRlc2NyaXB0aW9uPlllbGxvdyBCYWxsb29uPC9lcDpkZXNjcmlwdGlvbj4iICsKLSAgICAgICAgICAgICAgICAgIjxlcDpwZXItdW5pdC1vdW5jZXM+MC4wMDE8L2VwOnBlci11bml0LW91bmNlcz4iICsKLSAgICAgICAgICAgICAgICAgIjxlcDpxdWFudGl0eT4yMDA8L2VwOnF1YW50aXR5PiIgKwotICAgICAgICAgICAgICAgICI8L3htbC1mcmFnbWVudD4iKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlllbGxvdyBCYWxsb29uIiwgYW5vdGhlckl0ZW0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLnNldExpbmVJdGVtQXJyYXkoMSwgYW5vdGhlckl0ZW0pOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiWWVsbG93IEJhbGxvb24iLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMjAwKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoNCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IGNvcHktdG8tc2VsZgotICAgICAgICB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5zZXRMaW5lSXRlbUFycmF5KDEsIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJZZWxsb3cgQmFsbG9vbiIsIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigyMDApLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZig0KSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICB9Ci0KLSAgICAvLyBidWcgNDUzMzgKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENvbXBsZXhHZXR0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIHhkb2MgPQotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8cHVyY2hhc2Utb3JkZXIgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nIiArCi0gICAgICAgICAgICAgICAgICAgICIgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSciICsKLSAgICAgICAgICAgICAgICAgICAgIiB4c2k6dHlwZT0nZm9vJz4iICsKLSAgICAgICAgICAgICAgICAgIjxjdXN0b21lciB4c2k6dHlwZT0nYmFyJz4iICsKLSAgICAgICAgICAgICAgICAgICAiPG5hbWU+RGF2aWQgQmF1PC9uYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICI8YWRkcmVzcz4xMDAgTWFpbiBTdHJlZXQ8L2FkZHJlc3M+IiArCi0gICAgICAgICAgICAgICAgICI8L2N1c3RvbWVyPiIgKwotICAgICAgICAgICAgICAgICAiPGRhdGU+MjAwMy0wNS0xOFQxMTo1MDowMDwvZGF0ZT4iICsKLSAgICAgICAgICAgICAgICAgIjxsaW5lLWl0ZW0+IiArCi0gICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPkJsdWUgQ2FuZHk8L2Rlc2NyaXB0aW9uPiIgKwotICAgICAgICAgICAgICAgICAgIjxwZXItdW5pdC1vdW5jZXM+NS4wPC9wZXItdW5pdC1vdW5jZXM+IiArCi0gICAgICAgICAgICAgICAgICAiPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgICAgICAiPC9saW5lLWl0ZW0+IiArCi0gICAgICAgICAgICAgICAgIjwvcHVyY2hhc2Utb3JkZXI+Iik7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgeGRvYy52YWxpZGF0ZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLnR5cGUsIHhkb2Muc2NoZW1hVHlwZSgpKTsKLQotICAgICAgICAvLyBjaGVjayB0eXBlIG9mIGVsZW1lbnQgd2hlbiB4c2k6dHlwZSBpcyBiYWQKLSAgICAgICAgWG1sT2JqZWN0IGN1c3QgPSB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRDdXN0b21lcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFhtbEN1c3RvbWVyQmVhbi50eXBlLCBjdXN0LnNjaGVtYVR5cGUoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRGF2aWQgQmF1IiwgKChYbWxDdXN0b21lckJlYW4pY3VzdCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvbnR0ZXN0UHJldHR5UHJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCI8dGVzdCB4bWxuczp4PSdmb28nPiZsdDtTSE9VTEROT1RCRUFUQUcmZ3Q7PGE+c2ltcGxlPGIvPjwvYT4mbHQ7QUxTT1NIT1VMRE5PVEJFQVRBRyZndDs8L3Rlc3Q+Iik7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHhvYmoueG1sVGV4dCgpKTsKLSAgICAgICAgLyoKLSAgICAgICAgWG1sQ3Vyc29yIHhjdXIgPSB4b2JqLm5ld0N1cnNvcigpOwotICAgICAgICB4Y3VyLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICB4b2JqID0geGN1ci5nZXRPYmplY3QoKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHhvYmoudG9TdHJpbmcoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICB4Y3VyLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICB4Y3VyLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICB4Y3VyLnRvRmlyc3RDb250ZW50VG9rZW4oKTsKLSAgICAgICAgeGN1ci5pbnNlcnRDaGFycygiPGh0bWw+PGJvZHk+dGhpcyBpcyBhIHRlc3Q8L2JvZHk+PC9odG1sPiIpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHhvYmopOwotICAgICAgICAqLwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9udFRlc3RRTmFtZUNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFEb2N1bWVudCB4b2JqID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKwotICAgICAgICAgICAgICAgICI8eHM6ZWxlbWVudCBuYW1lPSdmb28nIHR5cGU9J3hzOnN0cmluZycvPjwveHM6c2NoZW1hPiIpOwotICAgICAgICBTY2hlbWFEb2N1bWVudCB4b2JqMiA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLz4iKTsKLSAgICAgICAgeG9iajIuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldCh4b2JqLmdldFNjaGVtYSgpLmdldEVsZW1lbnRBcnJheSgwKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqMik7Ci0gICAgfQotICAgIAotICAgIC8vIGRvbid0IHJ1biBvbiBub3JtYWwgZHJ0IGJlY2F1c2UgaXQncyB0b28gc2xvdzogYWJvdXQgMjAtMzAgc2VjcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb250dGVzdEN1cnNvckZpbmFsaXplKCkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAwMCAqIDEwMDA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gb2JqLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgICAgIC8vIGN1ci5kaXNwb3NlKCk7IHNraXBwaW5nIHRoaXMgZGVwZW5kcyBvbiBmaW5hbGl6YXRpb24gb3IgZWxzZSBPT00KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRpZCAiICsgaSArICIgaXRlcmF0aW9ucyBiZWZvcmUgcnVubmluZyBvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0T3V0T2ZSYW5nZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBvc2l0aW9uRG9jdW1lbnQgZG9jID0gUG9zaXRpb25Eb2N1bWVudC5GYWN0b3J5LnBhcnNlKCI8cG9zaXRpb24geG1sbnM9J2phdmE6aW50LnRlc3QnPjxsYXQ+NDM8L2xhdD48bG9uPjAzNzwvbG9uPjwvcG9zaXRpb24+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDMsIGRvYy5nZXRQb3NpdGlvbigpLmdldExhdCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzNywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MudmFsaWRhdGUoKSk7Ci0gICAgICAgIAotICAgICAgICBkb2MgPSBQb3NpdGlvbkRvY3VtZW50LkZhY3RvcnkucGFyc2UoIjxwb3NpdGlvbiB4bWxucz0namF2YTppbnQudGVzdCc+PGxhdD40NDM8L2xhdD48bG9uPjczNzwvbG9uPjwvcG9zaXRpb24+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzM3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCFkb2MudmFsaWRhdGUoKSk7Ci0gICAgICAgIAotICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS5zZXRMYXQoKHNob3J0KS0zMDApOwotICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS5zZXRMb24oKHNob3J0KTMyNzY3KTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMzAwLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzI3NjcsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIWRvYy52YWxpZGF0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGRvYy5nZXRQb3NpdGlvbigpLnNldExhdCgoc2hvcnQpNDMpOwotICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS5zZXRMb24oKHNob3J0KTEyNyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDMsIGRvYy5nZXRQb3NpdGlvbigpLmdldExhdCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjcsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLnZhbGlkYXRlKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sVGltZSB4dCA9IFhtbFRpbWUuRmFjdG9yeS5wYXJzZSgiPHhtbC1mcmFnbWVudD4xMjowMDowMDwveG1sLWZyYWdtZW50PiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjowMDowMCIsIHh0LmNhbGVuZGFyVmFsdWUoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Db21waWxhdGlvblRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ29tcGlsYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFjMTg1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Db21waWxhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuQ29kZUdlblV0aWw7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBDb21waWxhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShDb21waWxhdGlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEoyRUUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2oyZWUiKSk7Ci0gICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYQotICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlL2oyZWVjb25maWd4bWwvc3JjIik7Ci0gICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlL2oyZWVjb25maWd4bWwvY2xhc3NlcyIpOwotICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlL2oyZWVjb25maWd4bWwuamFyIik7Ci0gICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10gewotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvZWpiLWphcl8yXzEueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvajJlZV8xXzQueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvanNwXzJfMC54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS93ZWItYXBwXzJfNC54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9YTUwueHNkIiksCi0gICAgICAgIH0pOwotICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3RCdWlsZCgpCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3M0cyIpKTsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zNHMvWE1MLnhzZCIpOwotICAgICAgICBGaWxlIGlucHV0ZmlsZTIgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3M0cy9YTUxTY2hlbWEueHNkIik7Ci0gICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3M0cy9zNHN0eXBlcy9zcmMiKTsKLSAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3M0cy9zNHN0eXBlcy9jbGFzc2VzIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3M0cy9zNHN0eXBlcy5qYXIiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7IGlucHV0ZmlsZTEsIGlucHV0ZmlsZTIgfSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlc2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRPdXRwdXRKYXIob3V0cHV0amFyKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGphciwgb3V0cHV0amFyLmV4aXN0cygpKTsKLSAgICB9Ci0KLSAgICAvKiB0ZXN0IG5vdCBuZWVkZWQgYmVjYXVzZSBib290c3RyYXAgYnVpbGQgdGVzdHMgdGhpcyBiZXR0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3QnVpbGQoKQotICAgIHsKLSAgICAgICAgVGVzdEVudi5kZWx0cmVlKFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zNHMiKSk7Ci0gICAgICAgIEZpbGUgaW5wdXRmaWxlMSA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvczRzL1hNTC54c2QiKTsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUyID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zNHMvWE1MU2NoZW1hLnhzZCIpOwotICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zNHMvczRzdHlwZXMuamFyIik7Ci0gICAgICAgIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUobmV3IEZpbGVbXSB7IGlucHV0ZmlsZTEsIGlucHV0ZmlsZTIgfSwgbmV3IEZpbGVbMF0sIG5ldyBGaWxlWzBdLCBuZXcgRmlsZVswXSwgbnVsbCwgb3V0cHV0amFyLCAic2NoZW1hLnM0cyIsIG51bGwsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGphciwgb3V0cHV0amFyLmV4aXN0cygpKTsKLSAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIF9fdGVzdFNpbXBsZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvc2ltcGxlIikpOwotICAgICAgICAvLyBGaXJzdCwgY29tcGlsZSBzY2hlbWEKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zaW1wbGUvcGVyc29uLnhzZCIpOwotICAgICAgICBGaWxlIGlucHV0ZmlsZTIgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3NpbXBsZS9zaW1wbGVjLnhzZCIpOwotICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvc2ltcGxldHlwZXMvc3JjIik7Ci0gICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvc2ltcGxldHlwZXMvY2xhc3NlcyIpOwotICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvc2ltcGxldHlwZXMuamFyIik7Ci0gICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10geyBpbnB1dGZpbGUxLCBpbnB1dGZpbGUyIH0pOwotICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotCi0gICAgICAgIC8vIFRoZW4sIGNvbXBpbGUgamF2YSBjbGFzc2VzCi0gICAgICAgIEZpbGUgamF2YXNyYyA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvc2ltcGxlL2phdmFzcmMiKTsKLSAgICAgICAgRmlsZSBqYXZhY2xhc3NlcyA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvamF2YWNsYXNzZXMiKTsKLSAgICAgICAgamF2YWNsYXNzZXMubWtkaXJzKCk7Ci0gICAgICAgIExpc3QgdGVzdGNwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0ZXN0Y3AuYWRkQWxsKEFycmF5cy5hc0xpc3QoQ29kZUdlblV0aWwuc3lzdGVtQ2xhc3NwYXRoKCkpKTsKLSAgICAgICAgdGVzdGNwLmFkZChvdXRwdXRqYXIpOwotICAgICAgICBDb2RlR2VuVXRpbC5leHRlcm5hbENvbXBpbGUoQXJyYXlzLmFzTGlzdChuZXcgRmlsZVtdIHsgamF2YXNyYyB9KSwgamF2YWNsYXNzZXMsIChGaWxlW10pdGVzdGNwLnRvQXJyYXkobmV3IEZpbGVbdGVzdGNwLnNpemUoKV0pLCB0cnVlKTsKLQotICAgICAgICAvLyBUaGVuIHJ1biB0aGUgdGVzdAotICAgICAgICB0ZXN0Y3AuYWRkKGphdmFjbGFzc2VzKTsKLSAgICAgICAgVGVzdFJ1blV0aWwucnVuKCJTaW1wbGVQZXJzb25UZXN0IiwgbmV3IEZpbGVbXSB7IG91dHB1dGphciwgamF2YWNsYXNzZXMgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX190ZXN0RG93bmxvYWQoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUiKSk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmlyc3QsIGNvbXBpbGUgc2NoZW1hIHdpdGhvdXQgZG93bmxvYWQgYW5kIHZlcmlmeSBmYWlsdXJlCi0gICAgICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZGZhaWwvc3JjIik7Ci0gICAgICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRmYWlsL2NsYXNzZXMiKTsKLSAgICAgICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkZmFpbC5qYXIiKTsKLSAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsKLSAgICAgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvajJlZV8xXzQueHNkIiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOwotICAgICAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCIsICFTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBub3QgaGF2ZSBjcmVhdGVkICIgKyBvdXRwdXRqYXIsICFvdXRwdXRqYXIuZXhpc3RzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm93IHR1cm4gb24gZG93bmxvYWQgYW5kIHZlcmlmeSBzdWNjZXNzCi0gICAgICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZHN1Y2NlZWQvc3JjIik7Ci0gICAgICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRzdWNjZWVkL2NsYXNzZXMiKTsKLSAgICAgICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkc3VjY2VlZC5qYXIiKTsKLSAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXREb3dubG9hZCh0cnVlKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsKLSAgICAgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvajJlZV8xXzQueHNkIiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOwotICAgICAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3RQcmljZXF1b3RlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgVGVzdEVudi5kZWx0cmVlKFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9wcmljZXF1b3RlIikpOwotICAgICAgICAvLyBGaXJzdCwgY29tcGlsZSBzY2hlbWEKLSAgICAgICAgRmlsZSBzcmNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvcHJpY2VxdW90ZS9zcmMiKTsKLSAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3ByaWNlcXVvdGUvY2xhc3NlcyIpOwotICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9wcmljZXF1b3RlL3ByaWNlcXVvdGUuamFyIik7Ci0gICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10geyBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3ByaWNlcXVvdGUvUHJpY2VRdW90ZS54c2QiKSB9KTsKLSAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQnVpbGQgZmFpbGVkIiwgU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNhbm5vdXQgZmluZCAiICsgb3V0cHV0amFyLCBvdXRwdXRqYXIuZXhpc3RzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF9fdGVzdEFubnVpdHkoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2FubnVpdHkiKSk7Ci0gICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYQotICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9hbm51aXR5L3NyYyIpOwotICAgICAgICBGaWxlIG91dHB1dGRpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9hbm51aXR5L2NsYXNzZXMiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZCIpIH0pOwotICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKG91dHB1dGRpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRDb25maWdGaWxlcyhuZXcgRmlsZVtdIHsgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9hbm51aXR5L2FubnVpdHluZXQueHNkY29uZmlnIikgfSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRkaXIsIG91dHB1dGRpci5leGlzdHMoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBbXSBpbnZhbGlkU2NoZW1hcyA9IHsKLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9J2V4dGVuc2lvbicvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnIGZpbmFsPScjYWxsJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+XG4iICsKLSAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyBmaW5hbERlZmF1bHQ9JyNhbGwnPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyBmaW5hbERlZmF1bHQ9J3Jlc3RyaWN0aW9uJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotICAgIH07Ci0KLSAgICBzdGF0aWMgU3RyaW5nIFtdIHZhbGlkU2NoZW1hcyA9IHsKLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9J2V4dGVuc2lvbicvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnIGZpbmFsPSdyZXN0cmljdGlvbicvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgZmluYWxEZWZhdWx0PSdyZXN0cmljdGlvbic+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXh0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgIjwveHM6c2NoZW1hPlxuIiwKLQotICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIGZpbmFsRGVmYXVsdD0nZXh0ZW5zaW9uJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotICAgIH07Ci0KLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3RGaW5hbCgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFNjaGVtYURvY3VtZW50W10gc2NoZW1hcyA9IG5ldyBTY2hlbWFEb2N1bWVudFtpbnZhbGlkU2NoZW1hcy5sZW5ndGhdOwotCi0gICAgICAgIC8vIFBhcnNlIHRoZSBpbnZhbGlkIHNjaGVtYSBmaWxlcwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpbnZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShpbnZhbGlkU2NoZW1hc1tpXSk7Ci0KLSAgICAgICAgLy8gTm93IGNvbXBpbGUgdGhlIGludmFsaWQgc2NoZW1hcywgdGVzdCB0aGF0IHRoZXkgZmFpbAotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXSB7c2NoZW1hc1tpXX0pOwotICAgICAgICAgICAgICAgIGZhaWwoIlNjaGVtYSBzaG91bGQgaGF2ZSBmYWlsZWQgdG8gY29tcGlsZTpcbiIgKyBpbnZhbGlkU2NoZW1hc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQYXJzZSB0aGUgdmFsaWQgc2NoZW1hIGZpbGVzCi0gICAgICAgIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbdmFsaWRTY2hlbWFzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh2YWxpZFNjaGVtYXNbaV0pOwotCi0gICAgICAgIC8vIENvbXBpbGUgdGhlIHZhbGlkIHNjaGVtYXMuIFRoZXkgc2hvdWxkIG5vdCBmYWlsCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtde3NjaGVtYXNbaV19KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZmFpbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBjb21waWxlIHNjaGVtYTpcbiIgKyB2YWxpZFNjaGVtYXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ3JlYXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NyZWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxNDI5NC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ3JlYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uUHVyY2hhc2VPcmRlcjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbExpbmVJdGVtQmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFNoaXBwZXJCZWFuOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgQ3JlYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3JlYXRpb25UZXN0cy5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQbygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4gZG9jID0KLSAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgUHVyY2hhc2VPcmRlciBvcmRlciA9IGRvYy5hZGROZXdQdXJjaGFzZU9yZGVyKCk7Ci0gICAgICAgIG9yZGVyLmFkZE5ld0N1c3RvbWVyKCkuc2V0TmFtZSgiRGF2aWQgQmF1Iik7Ci0gICAgICAgIG9yZGVyLmdldEN1c3RvbWVyKCkuc2V0QWRkcmVzcygiR2xhZHd5bmUsIFBBIik7Ci0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBsaTsKLSAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiKTsKLSAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjIxLjc5IikpOwotICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMikpOwotICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOwotICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIpOwotICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSk7Ci0gICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7Ci0gICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7Ci0gICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzIik7Ci0gICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKLSAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKLSAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKLSAgICAgICAgWG1sU2hpcHBlckJlYW4gc2ggPSBvcmRlci5hZGROZXdTaGlwcGVyKCk7Ci0gICAgICAgIHNoLnNldE5hbWUoIlVQUyIpOwotICAgICAgICBzaC5zZXRQZXJPdW5jZVJhdGUobmV3IEJpZ0RlY2ltYWwoIjAuNzQiKSk7Ci0KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZG9jLnhtbFRleHQoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRGF2aWQgQmF1Iiwgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHbGFkd3luZSwgUEEiLCBvcmRlci5nZXRDdXN0b21lcigpLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgb3JkZXIuc2l6ZU9mTGluZUl0ZW1BcnJheSgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjIxLjc5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDIiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyLmlzU2V0U2hpcHBlcigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVVBTIiwgb3JkZXIuZ2V0U2hpcHBlcigpLmdldE5hbWUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjAuNzQiKSwgb3JkZXIuZ2V0U2hpcHBlcigpLmdldFBlck91bmNlUmF0ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRG9tVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Eb21UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE4MGZlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Eb21UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBEb21UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIERvbVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShEb21UZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKLSAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGdldENhc2VGaWxlKHRoZUNhc2UpLCBudWxsKS5uZXdDdXJzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1Rlc3REb21JbXBvcnQgKCBTdHJpbmcgeG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgICAgICBEb2N1bWVudCBkb2MgPSBwYXJzZXIucGFyc2UoIG5ldyBJbnB1dFNvdXJjZSggbmV3IFN0cmluZ1JlYWRlciggeG1sICkgKSApOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIGRvYyApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoIHhtbCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvVGVzdERvbUV4cG9ydCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICkubmV3RG9tTm9kZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoIHhtbCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvVGVzdCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1Rlc3REb21JbXBvcnQoIHhtbCApOwotICAgICAgICBkb1Rlc3REb21FeHBvcnQoIHhtbCApOwotICAgIH0KLQotLy8gICAgcHVibGljIHZvaWQgdGVzdERvbTIgKCApCi0vLyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotLy8gICAgewotLy8gICAgICAgIERPTVBhcnNlciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLS8vICAgICAgICAKLS8vICAgICAgICBwYXJzZXIucGFyc2UoIG5ldyBJbnB1dFNvdXJjZSggbmV3IFN0cmluZ1JlYWRlciggIjxmb28gYT0neFxuXG55Jz48L2Zvbz4iICkgKSApOwotLy8KLS8vICAgICAgICBYbWxPYmplY3QgeCA9IFhtbExvYWRlci5GYWN0b3J5LnBhcnNlKCBwYXJzZXIuZ2V0RG9jdW1lbnQoKSApOwotLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIHgueG1sVGV4dCgpICk7Ci0vLyAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdERvbSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZG9UZXN0KCAiPGZvbyB4bWxucz1cInhcIi8+IiApOwotICAgICAgICBkb1Rlc3QoICI8Zm9vIHhtbG5zPVwieFwiIHhtbG5zOmU9XCJ2XCIvPiIgKTsKLSAgICAgICAgZG9UZXN0KCAiPGZvbz5hPD9YPz5iPC9mb28+IiApOwotICAgICAgICBkb1Rlc3QoICI8Zm9vPmE8IS0tWC0tPmI8L2Zvbz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjwhLS1YLS0+PGZvby8+IiApOwotICAgICAgICBkb1Rlc3QoICI8Zm9vLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28geD1cInlcIi8+IiApOwotICAgICAgICBkb1Rlc3QoICI8Zm9vPjxhLz48Yj5tb288L2I+PC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHh4ID0KLSAgICAgICAgICAgICI8IS0tZ2ctLT48P2EgYj8+PGZvbz5zZHNkPGEvPnNkc2Q8Yj5tb288L2I+c2Q8IS0tYXNhcy0tPnNkPC9mb28+PCEtLWhoLS0+IjsKLSAgICAgICAgCi0gICAgICAgIGRvVGVzdCggeHggKTsKLQotICAgICAgICBTdHJpbmcgeG1sID0KLSAgICAgICAgICAgICI8eG1sLWZyYWdtZW50PiIgKwotICAgICAgICAgICAgImZvbyIgKwotICAgICAgICAgICAgIjwveG1sLWZyYWdtZW50PiI7Ci0KLSAgICAgICAgZG9UZXN0RG9tRXhwb3J0KCB4bWwgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB4bWwgPQotICAgICAgICAgICAgICAgICI8eG1sLWZyYWdtZW50ICIgKwotICAgICAgICAgICAgICAgICIgIGZvbz0nYmFyJz4iICsKLSAgICAgICAgICAgICAgICAiPC94bWwtZnJhZ21lbnQ+IjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGRvVGVzdERvbUV4cG9ydCggeG1sICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4eCApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIG4gPSBjLm5ld0RvbU5vZGUoKTsKLSAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBuICk7Ci0KLSAgICAgICAgICAgIGlmIChjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRWFzeVBvVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FYXN5UG9UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzIwMWU5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FYXN5UG9UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLlB1cmNoYXNlT3JkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFYXN5UG9UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEVhc3lQb1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShFYXN5UG9UZXN0cy5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFYXN5UG8oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIGRvYyA9IChYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuKQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInN0b3JlL2Vhc3lwbzEueG1sIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBkb2MuaXNOaWwoKSk7Ci0gICAgICAgIFB1cmNoYXNlT3JkZXIgb3JkZXIgPSBkb2MuZ2V0UHVyY2hhc2VPcmRlcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEYXZpZCBCYXUiLCBvcmRlci5nZXRDdXN0b21lcigpLmdldE5hbWUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdsYWR3eW5lLCBQQSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBvcmRlci5zaXplT2ZMaW5lSXRlbUFycmF5KCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIxIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXIuaXNTZXRTaGlwcGVyKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVUFMiLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMC43NCIpLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0UGVyT3VuY2VSYXRlKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgb3JkZXIuc2l6ZU9mTGluZUl0ZW1BcnJheSgpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUF1dG9WYWxpZGFpdG9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlciB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbycvPiIgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8cHVyY2hhc2Utb3JkZSB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbycvPiIgKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlciB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwJy8+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8ZjpmcmFnbWVudCB4bWxuczpmPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL2ZyYWdtZW50Jy8+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8ZjpmcmFnbWVudCB4bWxuczpmPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL2ZyYWdtZW50Jz48YS8+PC9mOmZyYWdtZW50PiIgKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGY6ZnJhZ21lbnQgeG1sbnM6Zj0naHR0cDovL3d3dy5vcGVudXJpLm9yZy9mcmFnbWVudCc+PGEvPjxhLz48L2Y6ZnJhZ21lbnQ+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0VudW1UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0VudW1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTllNzk1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FbnVtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5vcGVudXJpLmVudW10ZXN0LlN0YXR1c3JlcG9ydERvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLmVudW10ZXN0LlF1YW50aXR5OwotaW1wb3J0IG9yZy5vcGVudXJpLmVudW10ZXN0LkRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBFbnVtVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBFbnVtVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEVudW1UZXN0cy5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UmVwb3J0MSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0YXR1c3JlcG9ydERvY3VtZW50IGRvYyA9IChTdGF0dXNyZXBvcnREb2N1bWVudCkKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoImVudW10ZXN0L3JlcG9ydDEueG1sIikpOwotCi0gICAgICAgIFF1YW50aXR5LkVudW1bXSBjb250ZW50cyA9IG5ldyBRdWFudGl0eS5FbnVtW10KLSAgICAgICAgewotICAgICAgICAgICAgUXVhbnRpdHkuQUxMLAotICAgICAgICAgICAgUXVhbnRpdHkuQUxMLAotICAgICAgICAgICAgUXVhbnRpdHkuRkVXLAotICAgICAgICAgICAgUXVhbnRpdHkuQUxMLAotICAgICAgICAgICAgUXVhbnRpdHkuTU9TVCwKLSAgICAgICAgICAgIFF1YW50aXR5Lk5PTkUsCi0gICAgICAgICAgICBRdWFudGl0eS5OT05FLAotICAgICAgICAgICAgUXVhbnRpdHkuTk9ORSwKLSAgICAgICAgfTsKLSAgICAgICAgRGF0YVtdIGRhdGEgPSBkb2MuZ2V0U3RhdHVzcmVwb3J0KCkuZ2V0U3RhdHVzQXJyYXkoKTsKLSAgICAgICAgaW50IHQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbdCsrXSwgZGF0YVtpXS5lbnVtVmFsdWUoKSk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIGRhdGFbaV0uZ2V0VGFyZ2V0KCkgKyAiLCB2YWx1ZTogIiArIGRhdGFbaV0uZW51bVZhbHVlKCkpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCBkYXRhW2ldLmdldFRhcmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvR0RhdGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzEyNzZlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ2FsZW5kYXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1wdWJsaWMgY2xhc3MgR0RhdGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEdEYXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEdEYXRlVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nW10gdmFsaWREdXJhdGlvbnMgPQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICJQVDBTIiwKLSAgICAgICAgICAgICAgICAiUDFZIiwKLSAgICAgICAgICAgICAgICAiUDFNIiwKLSAgICAgICAgICAgICAgICAiUDFEIiwKLSAgICAgICAgICAgICAgICAiUDJZIiwKLSAgICAgICAgICAgICAgICAiUDJNIiwKLSAgICAgICAgICAgICAgICAiUDJEIiwKLSAgICAgICAgICAgICAgICAiUFQxSCIsCi0gICAgICAgICAgICAgICAgIlBUMU0iLAotICAgICAgICAgICAgICAgICJQVDFTIiwKLSAgICAgICAgICAgICAgICAiUFQzNjAwUyIsCi0gICAgICAgICAgICAgICAgIlAxWTFNMURUMUgxTTFTIiwKLSAgICAgICAgICAgICAgICAiUDFZMU0xRFQxSDFNMS4xUyIsCi0gICAgICAgICAgICAgICAgIlAxWTM2NUQiLAotICAgICAgICAgICAgICAgICJQMVkzNjZEIiwKLSAgICAgICAgICAgICAgICAiUFQwLjFTIiwKLSAgICAgICAgICAgICAgICAiUDFZLTM2NEQiLAotICAgICAgICAgICAgICAgICJQMVktMzY1RCIsCi0gICAgICAgICAgICAgICAgIlAxWS0zNjZEIiwKLSAgICAgICAgICAgICAgICAiUDFZLTM2N0QiLAotICAgICAgICAgICAgICAgICJQMVktMTJNIiwKLSAgICAgICAgICAgICAgICAiUDFNMjlEIiwKLSAgICAgICAgICAgICAgICAiUDFNLTI3RCIsCi0gICAgICAgICAgICAgICAgIlAxTS0yOEQiLAotICAgICAgICAgICAgICAgICJQMU0tMjlEIiwKLSAgICAgICAgICAgICAgICAiUDFNLTMxRCIsCi0gICAgICAgICAgICAgICAgIlAxTS0zMkQiLAotICAgICAgICAgICAgICAgICJQMU1ULTY2MEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTY3MEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTY4MEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTY5MEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTcwMEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTcxMEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTcyMEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTczMEgiLAotICAgICAgICAgICAgICAgICJQMU1ULTc0MEgiLAotICAgICAgICAgICAgICAgICJQVDAuMTQxNTkyNlMiLAotICAgICAgICAgICAgICAgICJQVDUyMzMxMzJTIiwKLSAgICAgICAgICAgICAgICAiUFQxNDIzMzJNIiwKLSAgICAgICAgICAgICAgICAiUFQ5ODAyM0giLAotCi0gICAgICAgICAgICAgICAgIi1QVDBTIiwKLSAgICAgICAgICAgICAgICAiLVAxWSIsCi0gICAgICAgICAgICAgICAgIi1QMU0iLAotICAgICAgICAgICAgICAgICItUDFEIiwKLSAgICAgICAgICAgICAgICAiLVBUMUgiLAotICAgICAgICAgICAgICAgICItUFQxTSIsCi0gICAgICAgICAgICAgICAgIi1QVDFTIiwKLSAgICAgICAgICAgICAgICAiLVAxWTFNMURUMUgxTTFTIiwKLSAgICAgICAgICAgICAgICAiLVAxWTFNMURUMUgxTTEuMVMiLAotICAgICAgICAgICAgICAgICItUDI3RCIsCi0gICAgICAgICAgICAgICAgIi1QMjhEIiwKLSAgICAgICAgICAgICAgICAiLVAyOUQiLAotICAgICAgICAgICAgICAgICItUDMwRCIsCi0gICAgICAgICAgICAgICAgIi1QMzFEIiwKLSAgICAgICAgICAgICAgICAiLVAzNjREIiwKLSAgICAgICAgICAgICAgICAiLVAzNjVEIiwKLSAgICAgICAgICAgICAgICAiLVAzNjZEIiwKLSAgICAgICAgICAgICAgICAiLVBUMC4xUyIsCi0gICAgICAgICAgICAgICAgIi1QVDAuMTQxNTkyNlMiLAotICAgICAgICAgICAgICAgICItUFQ1MjMzMTMyUyIsCi0gICAgICAgICAgICAgICAgIi1QVDE0MjMzMk0iLAotICAgICAgICAgICAgICAgICItUFQ5ODAyM0giLAotCi0gICAgICAgICAgICB9OwotCi0gICAgc3RhdGljIFN0cmluZ1tdIGludmFsaWREYXRlcyA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIisxNDowMSIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIi0xNDowMSIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIisxNTowMCIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIi0xNTowMCIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIlgiLAotICAgICAgICAgICAgICAgICIsIiwKLSAgICAgICAgICAgICAgICAiVCIsCi0gICAgICAgICAgICAgICAgIisiLAotICAgICAgICAgICAgICAgICItIiwKLSAgICAgICAgICAgICAgICAiOiIsCi0gICAgICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgICAgICJNYXJjaCAyIiwKLSAgICAgICAgICAgICAgICAiVDAwOjAwOjAwWiIsIC8vIFQgbm90IGFsbG93ZWQKLSAgICAgICAgICAgICAgICAiLTAwOjAwOjAwWiIsIC8vIC0gbm90IGFsbG93ZWQKLSAgICAgICAgICAgICAgICAiOTYtMDItMjhUMDA6MDA6MDBaIiwgLy8geWVhciB3aWR0aAotICAgICAgICAgICAgICAgICIxMDAtMDItMjhUMDA6MDA6MDBaIiwgLy8geWVhciB3aWR0aAotICAgICAgICAgICAgICAgICIxOTAwLTItMjhUMDA6MDA6MDBaIiwgLy8gbW9udGggd2lkdGgKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi04VDAwOjAwOjAwWiIsIC8vIGRheSB3aWR0aAotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDA6MDA6MDBaIiwgLy8gaG91ciB3aWR0aAotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjA6MDBaIiwgLy8gaG91ciB3aWR0aAotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjAwOjBaIiwgLy8gaG91ciB3aWR0aAotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjAwWiIsIC8vIHRpbWUgaW5jb21wbGV0ZQotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4IFQwMDowMDowMFoiLCAvLyBzcGFjZQotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VCAwMDowMDowMFoiLCAvLyBzcGFjZQotICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjAwOjAwIFoiLCAvLyBzcGFjZQotICAgICAgICAgICAgICAgICIxOTAwLTAyLTI5VDAwWiIsIC8vIHRpbWUgaW5jb21wbGV0ZQotICAgICAgICAgICAgICAgICIwMDowMCIsIC8vIHRpbWUgaW5jb21wbGV0ZQotICAgICAgICAgICAgICAgICIwMCIsIC8vIGluY29tcGxldGUKLSAgICAgICAgICAgICAgICAiMjEwMC0wMi0yOSIsIC8vIG5vdCBsZWFwCi0gICAgICAgICAgICAgICAgIi05OTk5OTk5LTAyLTI4VDAwOjAwOjAwWiIsIC8vIHRvbyBsb25nIGFnbwotICAgICAgICAgICAgICAgICI5OTk5OTk5LTAyLTI4VDAwOjAwOjAwWiIsIC8vIHRvbyBsb25nIGZyb20gbm93Ci0gICAgICAgICAgICAgICAgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTktMDItMjhUMDA6MDA6MDBaIiwgLy8gb3ZlcmZsb3c/Ci0gICAgICAgICAgICAgICAgIjE5OTYtMDAtMjhUMDA6MDA6MDBaIiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiMTk5Ni0xMy0yOFQwMDowMDowMFoiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICIxOTk2LTAyLTAwVDAwOjAwOjAwWiIsIC8vIGRheQotICAgICAgICAgICAgICAgICIyMDAwLTAyLTMwVDAwOjAwOjAwWiIsIC8vIGRheQotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDI0OjAwOjAwWiIsIC8vIGhyCi0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6NjA6MDBaIiwgLy8gbWluCi0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6NjBaIiwgLy8gc2VjCi0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDArMTQ6MDEiLCAvLyB0egotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjAwLTE0OjAxIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDowMCsxNTowMCIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDAtMTU6MDAiLCAvLyB0egotICAgICAgICAgICAgICAgICIxOTk2LTAwLTI5IiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiMTk5Ni0xMy0yOSIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIjE5OTYtMDItMDAiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiMjAwMC0wMi0zMCIsIC8vIGRheQotICAgICAgICAgICAgICAgICItLTAwIiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiLS0xMyIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIi0tMDAtMDEiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICItLTEzLTAxIiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiLS0wMi0wMCIsIC8vIGRheQotICAgICAgICAgICAgICAgICItLTAyLTMwIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIi0tMDEtMzIiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiLS0xMS0zMSIsIC8vIGRheQotICAgICAgICAgICAgICAgICItLS0wMCIsIC8vIGRheQotICAgICAgICAgICAgICAgICItLS0zMiIsIC8vIGRheQotICAgICAgICAgICAgICAgICIyNDowMDowMFoiLCAvLyBocgotICAgICAgICAgICAgICAgICIwMDo2MDowMFoiLCAvLyBtaW4KLSAgICAgICAgICAgICAgICAiMDA6MDA6NjBaIiwgLy8gc2VjCi0gICAgICAgICAgICAgICAgIjAwOjAwOjAwKzE0OjAxIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDAtMTQ6MDEiLCAvLyB0egotICAgICAgICAgICAgICAgICIwMDowMDowMCsxNTowMCIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjAwOjAwOjAwLTE1OjAwIiwgLy8gdHoKLSAgICAgICAgICAgIH07Ci0KLSAgICBzdGF0aWMgU3RyaW5nW10gdmFsaWREYXRlcyA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgIloiLCAvLyB0aW1lem9uZSBvbmx5Ci0gICAgICAgICAgICAgICAgIi0xNDowMCIsIC8vIHRpbWV6b25lIG9ubHkKLSAgICAgICAgICAgICAgICAiOTk5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OVoiLAotICAgICAgICAgICAgICAgICIxOTcwLTEyLTMxVDIzOjU5OjU5Ljk5MCsxNDowMCIsCi0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAotICAgICAgICAgICAgICAgICIyMDAwLTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKLSAgICAgICAgICAgICAgICAiMjAwNC0wMi0yOVQwMDowMDowMFoiLCAvLyBsZWFwCi0gICAgICAgICAgICAgICAgIjIwMDgtMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAotICAgICAgICAgICAgICAgICIyMDEyLTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKLSAgICAgICAgICAgICAgICAiMTkwMC0wMi0yOFQwMDowMDowMFoiLCAvLyBub3QgbGVhcAotICAgICAgICAgICAgICAgICIyMTAwLTAyLTI4VDAwOjAwOjAwWiIsIC8vIG5vdCBsZWFwCi0gICAgICAgICAgICAgICAgIjE5MDAtMDMtMjhUMDA6MDA6MDBaIiwgLy8gbm90IGxlYXAKLSAgICAgICAgICAgICAgICAiLTQ3MTItMDEtMDFUMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiMTk5OS0wMS0wMVQwMDowMDowMCswMTowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDEtMTItMzFUMjM6NTk6NTkuMDEwIiwKLSAgICAgICAgICAgICAgICAiMjAwMS0xMi0zMVQyMzo1OTo1OS45OTk5MDEwMDAiLAotICAgICAgICAgICAgICAgICIxOTk5LTEyLTMxVDIzOjU5OjU5LjEyMzQ1Njc4OTAtMTQ6MDAiLAotICAgICAgICAgICAgICAgICIxOTkyLTEyLTMxVDIzOjU5OjU5LjAxLTE0OjAwIiwKLSAgICAgICAgICAgICAgICAiMTk2NS0xMi0zMVQyMzo1OTo1OS4wMDBaIiwKLSAgICAgICAgICAgICAgICAiMDAwMC0xMi0zMVQwNDozNToyMi40NTYiLAotICAgICAgICAgICAgICAgICIxNjk2LTA5LTAxVDAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIjE2OTctMDItMDFUMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiMTkwMy0wMy0wMVQwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICIxOTAzLTA3LTAxVDAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIjE2OTYtMDktMDFUMDA6MDA6MDArMDA6MDAiLAotICAgICAgICAgICAgICAgICIxNjk3LTAyLTAxVDAwOjAwOjAwLTAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMiIsCi0gICAgICAgICAgICAgICAgIi0wMDAxIiwKLSAgICAgICAgICAgICAgICAiLS0xMiIsCi0gICAgICAgICAgICAgICAgIi0wMDAxLTExIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0wMSIsCi0gICAgICAgICAgICAgICAgIi0tLTMxIiwKLSAgICAgICAgICAgICAgICAiMTU1NC0tMzEiLAotICAgICAgICAgICAgICAgICItMDAwNC0tMzEiLAotICAgICAgICAgICAgICAgICItLTAyLTI5IiwKLSAgICAgICAgICAgICAgICAiLS0xMi0zMSIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDQtMTgiLAotICAgICAgICAgICAgICAgICItMDQyMy0xMi0zMSIsCi0gICAgICAgICAgICAgICAgIjIzOjU5OjU5IiwKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDAiLAotICAgICAgICAgICAgICAgICIyMDEwVDIzOjU5OjU5IiwKLSAgICAgICAgICAgICAgICAiLTAwMDFUMDA6MDA6MDAiLAotICAgICAgICAgICAgICAgICItLTEyVDIzOjU5OjU5IiwKLSAgICAgICAgICAgICAgICAiLTAwMDEtMTFUMDA6MDA6MDAiLAotICAgICAgICAgICAgICAgICIyMDExLTAxVDIzOjU5OjU5IiwKLSAgICAgICAgICAgICAgICAiLS0tMzFUMDA6MDA6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyLS0zMVQyMzo1OTo1OSIsCi0gICAgICAgICAgICAgICAgIi0wMDA0LS0zMVQwMDowMDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDItMThUMjM6NTk6NTkiLAotICAgICAgICAgICAgICAgICItMDQyMy0xMi0zMVQwMDowMDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDJaIiwKLSAgICAgICAgICAgICAgICAiLTAwMDErMDE6MzAiLAotICAgICAgICAgICAgICAgICItLTEyLTE0OjAwIiwKLSAgICAgICAgICAgICAgICAiLTAwMDEtMTFaIiwKLSAgICAgICAgICAgICAgICAiMTk3MC0xMi0wMTowMCIsCi0gICAgICAgICAgICAgICAgIi0tLTMxKzAxOjMwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0tMzFaIiwKLSAgICAgICAgICAgICAgICAiLS0wMy0zMS0wMzowMCIsCi0gICAgICAgICAgICAgICAgIi0tMDQtMzArMDU6MDAiLAotICAgICAgICAgICAgICAgICItMDAwNC0tMzEtMDE6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyLTA0LTE4LTE0OjAwIiwKLSAgICAgICAgICAgICAgICAiLTA0MjMtMTItMzFaIiwKLSAgICAgICAgICAgICAgICAiMjM6NTk6NTktMDE6MDAiLAotICAgICAgICAgICAgICAgICIwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICIwMDowMDowMCswMTozMCIsCi0gICAgICAgICAgICAgICAgIjE3NzZUMjM6NTk6NTktMTQ6MDAiLAotICAgICAgICAgICAgICAgICItMDAwMVQwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICItLTEyVDIzOjU5OjU5KzAxOjMwIiwKLSAgICAgICAgICAgICAgICAiLTAwMDEtMTFUMDA6MDA6MDAtMDE6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyLTAyVDIzOjU5OjU5WiIsCi0gICAgICAgICAgICAgICAgIi0tLTMxVDAwOjAwOjAwLTE0OjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0tMzFUMjM6NTk6NTktMDE6MDAiLAotICAgICAgICAgICAgICAgICItMDAwNC0tMzFUMDA6MDA6MDArMDE6MzAiLAotICAgICAgICAgICAgICAgICIyMDAyLTA0LTE4VDIzOjU5OjU5WiIsCi0gICAgICAgICAgICAgICAgIi0wNDIzLTEyLTMxVDAwOjAwOjAwLTA1OjAwIiwKLSAgICAgICAgICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1RpbWUoR0R1cmF0aW9uIGdkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdkLmdldEhvdXIoKSAhPSAwIHx8IGdkLmdldE1pbnV0ZSgpICE9IDAgfHwgZ2QuZ2V0U2Vjb25kKCkgIT0gMCB8fCBnZC5nZXRGcmFjdGlvbigpLnNpZ251bSgpICE9IDA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0R3JlZ29yaWFuQ2FsZW5kYXIoKQotICAgIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGNoZWNrIG9mIERTVCBvZmZzZXRzCi0gICAgICAgIERhdGUgZGF0ZSA9IG5ldyBHRGF0ZSgiMjAwMi0wNC0xOFQyMzo1OTo1OVoiKS5nZXREYXRlKCk7Ci0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBuZXcgWG1sQ2FsZW5kYXIoZGF0ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOwotCi0gICAgICAgIC8vIG5vdyBjaGVjayBvdXQgc29tZSB0aGluZ3MKLSAgICAgICAgR0RhdGUgZ2QgPSBuZXcgR0RhdGUoIjIwMDEtMTItMzFUMDc6MDA6NTkuMDEwIik7Ci0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gZ2QuZ2V0Q2FsZW5kYXIoKTsKLSAgICAgICAgRGF0ZSBnZGQgPSBnZC5nZXREYXRlKCk7Ci0gICAgICAgIERhdGUgZ2NkID0gZ2MuZ2V0VGltZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkZCwgZ2NkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNldCB1cCAyLzI5LCBhbmQgcmVhZCBvdXQgRmViIDI5IGluIHRoZSB5ZWFyIDEgQkMuCi0gICAgICAgIENhbGVuZGFyIGdyZWdjYWwgPSBuZXcgR0RhdGUoIi0tMDItMjkiKS5nZXRDYWxlbmRhcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDI5LCBncmVnY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyIC0gMSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBncmVnY2FsLmdldChDYWxlbmRhci5ZRUFSKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuRVJBKSk7Ci0gICAgICAgIC8vIHJlcGVhdCBzb21lIHRlc3RzIHRvIG1ha2Ugc3VyZSBpdCdzIHN0YWJsZS4KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyOSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiAtIDEsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSk7Ci0KLSAgICAgICAgLy8gbm93IHRyeSBzb21lIHNldHRlcnMKLSAgICAgICAgZ3JlZ2NhbCA9IG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmdldENhbGVuZGFyKCk7Ci0gICAgICAgIGdyZWdjYWwuc2V0KENhbGVuZGFyLk1PTlRILCAxMCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIi0tMTEtMjkiLCBncmVnY2FsLnRvU3RyaW5nKCkpOwotICAgICAgICAvLyByZXBlYXQgdG8gZW5zdXJlIGl0J3Mgc3RhYmxlLgotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCItLTExLTI5IiwgZ3JlZ2NhbC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFZhbGlkRHVyYXRpb24oKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZER1cmF0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgR0R1cmF0aW9uIGdkID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSB2YWxpZER1cmF0aW9uc1tpXTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdkID0gbmV3IEdEdXJhdGlvbihzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9ibGVtIHdpdGggIiArIHN0ciArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0ciwgZ2QudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsaWREdXJhdGlvbnMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR0R1cmF0aW9uIGdkMiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0cjIgPSB2YWxpZER1cmF0aW9uc1tqXTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdkMiA9IG5ldyBHRHVyYXRpb24oc3RyMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9ibGVtIHdpdGggIiArIHN0cjIgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdGluZyB0d28gd2F5cyB3b3JrcwotICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBkaWZmID0gZ2Quc3VidHJhY3QoZ2QyKTsKLSAgICAgICAgICAgICAgICBHRHVyYXRpb25CdWlsZGVyIGdkYiA9IG5ldyBHRHVyYXRpb25CdWlsZGVyKGdkMik7Ci0gICAgICAgICAgICAgICAgZ2RiLnNldFNpZ24oLWdkYi5nZXRTaWduKCkpOwotICAgICAgICAgICAgICAgIGdkYi5hZGRHRHVyYXRpb24oZ2QpOwotICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBzdW0yID0gZ2RiLnRvR0R1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBkaWZmLmNvbXBhcmVUb0dEdXJhdGlvbihzdW0yKSk7Ci0gICAgICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgICAgIEdEdXJhdGlvbkJ1aWxkZXIgZ2RiMSA9IG5ldyBHRHVyYXRpb25CdWlsZGVyKGRpZmYpOwotICAgICAgICAgICAgICAgIGdkYjEubm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiUHJvYmxlbTogIiArIGdkICsgIiBhbmQgIiArIGdkMiwgZ2RiLnRvU3RyaW5nKCksIGdkYjEudG9TdHJpbmcoKSk7Ci0KLQotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBpcyByZXZlcnNpYmxlCi0gICAgICAgICAgICAgICAgaW50IGNvbXAxID0gZ2QuY29tcGFyZVRvR0R1cmF0aW9uKGdkMik7Ci0gICAgICAgICAgICAgICAgaW50IGNvbXAyID0gZ2QyLmNvbXBhcmVUb0dEdXJhdGlvbihnZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXAxID09IDIpCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgY29tcDIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtY29tcDEsIGNvbXAyKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyB0cmFuc2xhdGVzIHRvIGFkZGl0aW9uIHRvIGRhdGVzCi0gICAgICAgICAgICAgICAgYm9vbGVhbltdIHNlZW4gPSBuZXcgYm9vbGVhblszXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdmFsaWREYXRlcy5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdEYXRlIGRhdGUgPSBuZXcgR0RhdGUodmFsaWREYXRlc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGF0ZS5oYXNEYXRlKCkgfHwgZGF0ZS5nZXRZZWFyKCkgPiA5OTk5OSB8fCBkYXRlLmdldFllYXIoKSA8IC00MDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoaGFzVGltZShnZCkgfHwgaGFzVGltZShnZDIpKSAmJiAhZGF0ZS5oYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgIiArIGdkICsgIiBhbmQgIiArIGdkMiArICIgdG8gIiArIGRhdGUgKyAiLCBleHBlY3RpbmcgIiArIGNvbXAxKTsKLSAgICAgICAgICAgICAgICAgICAgR0RhdGUgZGF0ZTEgPSBkYXRlLmFkZChnZCk7Ci0gICAgICAgICAgICAgICAgICAgIEdEYXRlIGRhdGUyID0gZGF0ZS5hZGQoZ2QyKTsKLQotICAgICAgICAgICAgICAgICAgICBjb21wMiA9IGRhdGUxLmNvbXBhcmVUb0dEYXRlKGRhdGUyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAxICE9IDIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkFkZGluZyAiICsgZGF0ZSArICIgKyAiICsgZ2QgKyAiIC0+ICIgKyBkYXRlMSArICIsICIgKyBnZDIgKyAiIC0+ICIgKyBkYXRlMiArICIsIGV4cGVjdGluZyAiICsgY29tcDEsIGNvbXAxLCBjb21wMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb21wMiAhPSAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bY29tcDIgKyAxXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdGlvbiBzaG91bGQgeWVpbGQgdGhlIHNhbWUgcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wMSAhPSAyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRGF0ZSBkYXRlMyA9IGRhdGUuYWRkKGRpZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb21wMSwgZGF0ZTMuY29tcGFyZVRvR0RhdGUoZGF0ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvbXAxID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2VlbmNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzZWVuLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5ba10pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJOb3QgYW1iaWd1b3VzIGFzIGFkdmVydGlzZWQiIC8qICsgZ2QgKyAiLCAiICsgZ2QyICsgIiBkOiAiICsgZGlmZiAqLywgc2VlbmNvdW50ID4gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RPcmRlcigpCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjE5OTgtMDgtMjYiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDYiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjE5NzAtMTItMjBUMDQ6MTQ6MjJaIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIxOTcxLTA0LTE4VDEyOjUxOjQxWiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTA4LTA2IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA2WiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTA4LTA2IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA3KzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIwMDEtMDgtMDYiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDUtMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjAwMS0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wMy0wMSsxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTAyLTI4LTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAwLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAwLTAzLTAxKzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIjIwMDAtMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDAtMDItMjgtMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjIwMDEtMDgtMDZaIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA2LTAwOjAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBuZXcgR0RhdGUoIjAwOjAwOjAwWiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDE6MDArMDA6MDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5ldyBHRGF0ZSgiMTI6MDA6MDAtMDU6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjA5OjAwOjAwLTA4OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwOTowMDowMC0wNTowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDk6MDA6MDAtMDg6MDAiKSkpOyAvLyB0aGUgZWFzdCBjb2FzdCByaXNlcyBiZWZvcmUgdGhlIHdlc3QKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAzLTA1LTA1VDA5OjAwOjAwLTA1OjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAzLTA1LTA1VDA5OjAwOjAwLTA4OjAwIikpKTsgLy8gdGhlIGVhc3QgY29hc3QgcmlzZXMgYmVmb3JlIHRoZSB3ZXN0Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTMxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMzErMTQ6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0zMS0xNDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0zMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMzEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxKzE0OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTMxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMS0xNDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAyIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTAyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAyWiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0wMiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDFaIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tLTAyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMS0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDIrMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMDIiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxLTA5OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDIrMDk6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAzIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDA0IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTExIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTEyIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAzLTEyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDA0LTAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTExLTMwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTEyLTAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTAyLTI5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAzLTAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tMDItMjkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMy0wMSsxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI4LTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDItMjktMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMDItMjkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMDk6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMDItMjgiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMDk6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMi0yOC0wOTowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI5LTA5OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTo1OSswOTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjAxKzA5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTowMCswOTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6NTkrMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTo1OS0xNDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6MDAtMDk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjU4LTA5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIzOjU5OjU5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMDo1OS0wOTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6MDAtMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjAwKzE0OjAwIikpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RBUEkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBHRGF0ZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIoIjE5NzAtMTItMjBUMDQ6MTQ6MjJaIik7Ci0gICAgICAgIGJ1aWxkZXIubm9ybWFsaXplVG9UaW1lWm9uZSgxLCAwLCAwKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTk3MC0xMi0yMFQwNDoxNDoyMiswMDowMCIsIGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0VGltZVpvbmUoNjE1KTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTk3MC0xMi0yMFQwNDoxNDoyMisxMDoxNSIsIGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0VGltZVpvbmUoLTM0NSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE5NzAtMTItMjBUMDQ6MTQ6MjItMDU6NDUiLCBidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBidWlsZGVyLm5vcm1hbGl6ZVRvVGltZVpvbmUoLTMwMCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE5NzAtMTItMjBUMDQ6NTk6MjItMDU6MDAiLCBidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkRGF0ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnZhbGlkRGF0ZXNbaV07Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgR0RhdGUoc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJNaXNzaW5nIGV4Y2VwdGlvbiBmb3IgR0RhdGUgIiArIHN0ciwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZERhdGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gdmFsaWREYXRlc1tpXTsKLSAgICAgICAgICAgIEdEYXRlIGdkYXRlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdkYXRlID0gbmV3IEdEYXRlKHN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2JsZW0gd2l0aCAiICsgc3RyICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBzdHJpbmcKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RyLCBnZGF0ZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gbXVzdCByb3VuZC10cmlwIHRvIEdyZWdvcmlhbkNhbGVuZGFyIGlmIGZyYWN0aW9ucy1vZi1zZWNvbmRzIDw9MyBkaWdpdHMKLSAgICAgICAgICAgIGlmIChnZGF0ZS5nZXRGcmFjdGlvbigpID09IG51bGwgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpCi0gICAgICAgICAgICAgICAgaWYgKCFnZGF0ZS50b1N0cmluZygpLmVxdWFscygiLS0wMi0yOSIpKSAvLyBidWcgaW4gZ2NhbCAtPiAwMy0wMQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIEdEYXRlIGdkYXRlMiA9IG5ldyBHRGF0ZShnY2FsKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLCBnZGF0ZTIpOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIGlmIGZyYWN0aW9ucy1vZi1zZWNvbmRzIGlzIDMgZGlnaXRzLCBzdHJpbmdyZXAgbXVzdCByb3VuZC10cmlwCi0gICAgICAgICAgICAgICAgaWYgKGdkYXRlLmdldEZyYWN0aW9uKCkgPT0gbnVsbCB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMyB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZS50b1N0cmluZygpLCBnZGF0ZTIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBEYXRlIGlmIGFic29sdXRlIHRpbWUrdGltZXpvbmUgKyBmcmFjdGlvbnMtb2Ytc2Vjb25kcyA8PSAzCi0gICAgICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZVpvbmUoKSAmJiBnZGF0ZS5nZXRZZWFyKCkgPiAtNDAwMCAmJiBnZGF0ZS5nZXRZZWFyKCkgPCA5OTk5OSAmJiBnZGF0ZS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgJiYgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gZ2RhdGUuZ2V0RGF0ZSgpOwotICAgICAgICAgICAgICAgIEdEYXRlIGdkYXRlMiA9IG5ldyBHRGF0ZShkYXRlKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLCBnZGF0ZTIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0byBVVEMgZnJhY3Rpb25zLW9mLXNlY29uZHMgaXMgMCBvciAzIGRpZ2l0cyBbbm90IDAwMF0sIHN0cmluZ3JlcCBtdXN0IHJvdW5kLXRyaXAKLSAgICAgICAgICAgICAgICBpZiAoZ2RhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gMCAmJiAoKGdkYXRlLmdldEZyYWN0aW9uKCkuc2NhbGUoKSA9PSAzICYmIGdkYXRlLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMCkgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID09IDApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdkYiA9IG5ldyBHRGF0ZUJ1aWxkZXIoZ2RhdGUyKTsKLSAgICAgICAgICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZVRvVGltZVpvbmUoMCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RhdGUudG9TdHJpbmcoKSwgZ2RiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGdvaW5nIHRocm91Z2ggZ2NhbCBnaXZlcyB1cyB0aGUgc2FtZSB0aGluZwotICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1jaGVjayBYbWxDYWxlbmRhciBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgIGdjYWwgPSBuZXcgWG1sQ2FsZW5kYXIoZGF0ZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRG9pbmcgIiArIGdkYXRlLCBkYXRlLCBnY2FsLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChnZGF0ZS5oYXNEYXRlKCkgJiYgKGdkYXRlLmdldEZyYWN0aW9uKCkgPT0gbnVsbCB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPD0gMykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhYmxlIHRvIGdldCBhIGRhdGUgaWYgdGltZSt0aW1lem9uZSBpcyB1bnNldCAobWlkbmlnaHQsIGx0eiBhcmUgYXNzdW1lZCkKLSAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSBnZGF0ZS5nZXREYXRlKCk7Ci0gICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdkYXRlMSA9IG5ldyBHRGF0ZUJ1aWxkZXIoZ2RhdGUpOwotICAgICAgICAgICAgICAgIGlmICghZ2RhdGUxLmhhc1RpbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgZ2RhdGUxLnNldFRpbWUoMCwgMCwgMCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZTEuZ2V0RGF0ZSgpLCBkYXRlKTsKLQotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGdvaW5nIHRocm91Z2ggZ2NhbCBnaXZlcyB1cyB0aGUgc2FtZSB0aGluZwotICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkNvbXBhcmluZyAiICsgZ2RhdGUgKyAiIGFuZCAiICsgZ2NhbCwgZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0lERUN1cnNvclVzYWdlVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0lERUN1cnNvclVzYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmEyZjFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JREVDdXJzb3JVc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBhIHNpbXBsZSB1c2FnZSBvZiB0aGUgY3Vyc29yIEknbSBoYXZpbmcgdHJvdWJsZSB3aXRoIGluIElERSBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgSURFQ3Vyc29yVXNhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgSURFQ3Vyc29yVXNhZ2VUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShJREVDdXJzb3JVc2FnZVRlc3QuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCi0gICAgewotICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSkpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FuRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXJzb3IgPSBsb2FkQ2FzZSgiQ29uc29saWRhdGVUZXN0LnhtbCIpOwotICAgICAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IGN1cnNvci5uZXdDdXJzb3IoKTsKLQotICAgICAgICAvLyBiYWNrIHVwIHRvIHByZXZpb3VzIHN0YXJ0IG9yIGVuZCB0YWcKLSAgICAgICAgd2hpbGUgKCFpc1N0YXJ0T3JFbmQoY3VyLnRvUHJldlRva2VuKCkpKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmFja2luZyB1cDogYXQgIiArIGN1ci5jdXJyZW50VG9rZW5UeXBlKCkpOyB9Ci0gICAgICAgIC8vIHRoZW4gZm9yd2FyZCB0byBmaXJzdCBzdGFydCBvciBjb21tZW50IChtYXkgZW5kIHVwIHdoZXJlIHdlIHN0YXJ0ZWQpCi0gICAgICAgIHdoaWxlICghaXNTdGFydE9yQ29tbWVudChjdXIudG9OZXh0VG9rZW4oKSkpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZHZhbmNpbmc6IGF0ICIgKyBjdXIuY3VycmVudFRva2VuVHlwZSgpKTsgfQotICAgICAgICAvLyB0aGVuIGdyYWIgdGhlICJzdGFydCIgamF2ZWxpbiBhbm5vdGF0aW9uLCBhbmQgZ3JhYiB0aGUgc3RhcnQgdG9rZW4gYW5kIHRoZSBmaXJzdCBjaGFyCi0gICAgICAgIC8vIF9maXJzdFRva2VuID0gKChKYXZlbGluQW5ub3RhdGlvbiljdXIuZ2V0QW5ub3RhdGlvbihKYXZlbGluQW5ub3RhdGlvbi5jbGFzcykpLmdldFN0YXJ0VG9rZW4oKTsKLQotICAgICAgICAvLyBub3cgcGVlayBhdCB0aGUgZW5kIHRhZyAoaXQgbWF5IGJlIHVucGxhY2VkIGZvciB0aGUgPGEvPiBjYXNlLCBzbyB1c2UgdGhlIHN0YXJ0IHRhZyBpZiBuZWVkZWQKLSAgICAgICAgY3VyLnRvQ3Vyc29yKGN1cnNvcik7Ci0gICAgICAgIC8vIF9sYXN0VG9rZW4gPSAoKEphdmVsaW5Bbm5vdGF0aW9uKWN1ci5nZXRBbm5vdGF0aW9uKEphdmVsaW5Bbm5vdGF0aW9uLmNsYXNzKSkuZ2V0RW5kVG9rZW4oKTsKLSAgICAgICAgY3VyLnRvRW5kVG9rZW4oKTsKLSAgICAgICAgLy8gSmF2ZWxpbkFubm90YXRpb24gZW5kQW5uID0gKEphdmVsaW5Bbm5vdGF0aW9uKWN1ci5nZXRBbm5vdGF0aW9uKEphdmVsaW5Bbm5vdGF0aW9uLmNsYXNzKTsKLSAgICAgICAgLy8gaWYgKGVuZEFubiAhPSBudWxsKQotICAgICAgICAvLyAgICBfbGFzdFRva2VuID0gZW5kQW5uLmdldEVuZFRva2VuKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1N0YXJ0T3JFbmQoWG1sQ3Vyc29yLlRva2VuVHlwZSB0b2tUeXBlKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh0b2tUeXBlLmludFZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfRU5EOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9FTkRET0M6Ci0gICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX1NUQVJUOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9TVEFSVERPQzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1N0YXJ0T3JDb21tZW50KFhtbEN1cnNvci5Ub2tlblR5cGUgdG9rVHlwZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAodG9rVHlwZS5pbnRWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX1NUQVJUOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9TVEFSVERPQzoKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfQ09NTUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSW50VGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhhYjZhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCB4aW50LnRlc3QuUG9zaXRpb25Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEludFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgSW50VGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEludFRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RMYXRMb25nKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUG9zaXRpb25Eb2N1bWVudCBkb2MgPSBQb3NpdGlvbkRvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgIjxwOnBvc2l0aW9uIHhtbG5zOnA9J2phdmE6aW50LnRlc3QnPjxwOmxhdD40MzwvcDpsYXQ+PHA6bG9uPjAyMDwvcDpsb24+PC9wOnBvc2l0aW9uPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkueGdldExhdCgpLnNldCgiMDciKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkueGdldExvbigpLnNldCgiMDQwIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7Ci0gICAgICAgIGRvYy5nZXRQb3NpdGlvbigpLnNldExhdCgoc2hvcnQpMjIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9MaXN0QW5kVW5pb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0xpc3RBbmRVbmlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2Q4NjYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0xpc3RBbmRVbmlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubHV0Lkxpc3RzRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubHV0LlVuaW9uc0RvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLmx1dC5JbmNpZGVudFJlcG9ydHNEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5sdXQuRGF0ZU9yRGF0ZVRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIExpc3RBbmRVbmlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgTGlzdEFuZFVuaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKExpc3RBbmRVbmlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdHNEb2N1bWVudCBsaXN0cyA9IExpc3RzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGx1dDpsaXN0cyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6aW50LWxpc3Q+MiA0IDggMTYgMzI8L2x1dDppbnQtbGlzdD48bHV0Om5uaS1saXN0PnVuYm91bmRlZCAzIHVuYm91bmRlZCA2PC9sdXQ6bm5pLWxpc3Q+PC9sdXQ6bGlzdHM+Iik7Ci0gICAgICAgIExpc3QgaW50TGlzdCA9IGxpc3RzLmdldExpc3RzKCkuZ2V0SW50TGlzdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDIpLCBpbnRMaXN0LmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIGludExpc3QuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig4KSwgaW50TGlzdC5nZXQoMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE2KSwgaW50TGlzdC5nZXQoMykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyKSwgaW50TGlzdC5nZXQoNCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUsIGludExpc3Quc2l6ZSgpKTsKLQotICAgICAgICBMaXN0IG5uaUxpc3QgPSBsaXN0cy5nZXRMaXN0cygpLmdldE5uaUxpc3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5ib3VuZGVkIiwgbm5pTGlzdC5nZXQoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigzKSwgbm5pTGlzdC5nZXQoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCBubmlMaXN0LmdldCgyKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDYpLCBubmlMaXN0LmdldCgzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNCwgbm5pTGlzdC5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExpc3RzRG9jdW1lbnQgZG9jID0gTGlzdHNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIExpc3RzRG9jdW1lbnQuTGlzdHMgbGlzdHMgPSBkb2MuYWRkTmV3TGlzdHMoKTsKLSAgICAgICAgbGlzdHMuc2V0SW50TGlzdChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDQpLCBuZXcgSW50ZWdlcigxOCkgfSkpOwotICAgICAgICBsaXN0cy5zZXRObmlMaXN0KEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMiksICJ1bmJvdW5kZWQiIH0pKTsKLSAgICAgICAgU3RyaW5nIHh0ZXh0ID0gZG9jLnhtbFRleHQoKTsKLQotICAgICAgICBMaXN0c0RvY3VtZW50IGRvY3J0ID0gTGlzdHNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHh0ZXh0KTsKLSAgICAgICAgTGlzdCBpbnRMaXN0ID0gZG9jcnQuZ2V0TGlzdHMoKS5nZXRJbnRMaXN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIGludExpc3QuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxOCksIGludExpc3QuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBpbnRMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgTGlzdCBubmlMaXN0ID0gZG9jcnQuZ2V0TGlzdHMoKS5nZXRObmlMaXN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBubmlMaXN0LmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDIpLCBubmlMaXN0LmdldCgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIG5uaUxpc3QuZ2V0KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBubmlMaXN0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW9uR2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IHVuaW9ucyA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxsdXQ6dW5pb25zIHhtbG5zOmx1dD0naHR0cDovL29wZW51cmkub3JnL2x1dCc+PGx1dDpubmk+dW5ib3VuZGVkPC9sdXQ6bm5pPjxsdXQ6c2l6ZXM+MiAzIDUgNyAxMTwvbHV0OnNpemVzPjwvbHV0OnVuaW9ucz4iKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCB1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0Tm5pKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHVuaW9ucy5nZXRVbmlvbnMoKS5nZXRTaXplcygpIGluc3RhbmNlb2YgTGlzdCk7Ci0gICAgICAgIExpc3Qgc2l6ZXMgPSAoTGlzdCl1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0U2l6ZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgc2l6ZXMuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzKSwgc2l6ZXMuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgc2l6ZXMuZ2V0KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgc2l6ZXMuZ2V0KDMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMSksIHNpemVzLmdldCg0KSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNSwgc2l6ZXMuc2l6ZSgpKTsKLQotICAgICAgICBVbmlvbnNEb2N1bWVudCB1bmlvbnMyID0gVW5pb25zRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGx1dDp1bmlvbnMgeG1sbnM6bHV0PSdodHRwOi8vb3BlbnVyaS5vcmcvbHV0Jz48bHV0Om5uaT4zNzwvbHV0Om5uaT48bHV0OnNpemVzPmFsbDwvbHV0OnNpemVzPjwvbHV0OnVuaW9ucz4iKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigzNyksIHVuaW9uczIuZ2V0VW5pb25zKCkuZ2V0Tm5pKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhbGwiLCB1bmlvbnMyLmdldFVuaW9ucygpLmdldFNpemVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvblNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGRvY3VtZW50Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IGRvYyA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgVW5pb25zRG9jdW1lbnQuVW5pb25zIHVuaW9ucyA9IGRvYy5hZGROZXdVbmlvbnMoKTsKLSAgICAgICAgdW5pb25zLnNldE5uaSgidW5ib3VuZGVkIik7Ci0gICAgICAgIHVuaW9ucy5zZXRTaXplcyhBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDUpLCBuZXcgSW50ZWdlcigyMikgfSkpOwotCi0gICAgICAgIC8vIHJvdW5kIHRyaXAgdG8gcyB0ZXh0Ci0gICAgICAgIFN0cmluZyB4dGV4dCA9IGRvYy54bWxUZXh0KCk7Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IGRvY3J0ID0gVW5pb25zRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4dGV4dCk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGNvbnRlbnRzCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIGRvY3J0LmdldFVuaW9ucygpLmdldE5uaSgpKTsKLSAgICAgICAgTGlzdCBzaXplcyA9IChMaXN0KWRvY3J0LmdldFVuaW9ucygpLmdldFNpemVzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHNpemVzLmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMjIpLCBzaXplcy5nZXQoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIHNpemVzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbCBkb2N1bWVudAotICAgICAgICB1bmlvbnMuc2V0Tm5pKG5ldyBJbnRlZ2VyKDExKSk7Ci0gICAgICAgIHVuaW9ucy5zZXRTaXplcygidW5rbm93biIpOwotCi0gICAgICAgIC8vIHJvdW5kIHRyaXAgaXQgYWdhaW4KLSAgICAgICAgeHRleHQgPSBkb2MueG1sVGV4dCgpOwotICAgICAgICBkb2NydCA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoeHRleHQpOwotCi0gICAgICAgIC8vIHZlcmlmeSBjb250ZW50cyBhZ2FpbgotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxMSksIGRvY3J0LmdldFVuaW9ucygpLmdldE5uaSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5rbm93biIsIGRvY3J0LmdldFVuaW9ucygpLmdldFNpemVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbkFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQgZG9jID0gSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgIjxsdXQ6aW5jaWRlbnQtcmVwb3J0cyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6d2hlbj4yMDAxLTA4LTA2VDAzOjM0OjAwPC9sdXQ6d2hlbj48bHV0OndoZW4+MjAwMi0wMS0wNDwvbHV0OndoZW4+PGx1dDp3aGVuPjIwMDItMDgtMjZUMjM6MTA6MDA8L2x1dDp3aGVuPjwvbHV0OmluY2lkZW50LXJlcG9ydHM+Iik7Ci0gICAgICAgIEluY2lkZW50UmVwb3J0c0RvY3VtZW50LkluY2lkZW50UmVwb3J0cyByZXBvcnRzID0gZG9jLmdldEluY2lkZW50UmVwb3J0cygpOwotICAgICAgICBEYXRlT3JEYXRlVGltZVtdIGR0ID0gcmVwb3J0cy54Z2V0V2hlbkFycmF5KCk7Ci0gICAgICAgIENhbGVuZGFyW10gZ2QgPSByZXBvcnRzLmdldFdoZW5BcnJheSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGR0Lmxlbmd0aCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgZ2QubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoKChTaW1wbGVWYWx1ZSlkdFtpXSkuZ0RhdGVWYWx1ZSgpLCBuZXcgR0RhdGUoZ2RbaV0pKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RbaV0sIGR0W2ldLm9iamVjdFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjIwMDEtMDgtMDZUMDM6MzQ6MDAiKSwgZ2RbMF0pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wMS0wNCIpLCBnZFsxXSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIyMDAyLTA4LTI2VDIzOjEwOjAwIiksIGdkWzJdKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFhtbERhdGVUaW1lLnR5cGUsIGR0WzBdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlLnR5cGUsIGR0WzFdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFsyXS5pbnN0YW5jZVR5cGUoKSk7Ci0KLSAgICAgICAgcmVwb3J0cy5zZXRXaGVuQXJyYXkoMCwgbmV3IFhtbENhbGVuZGFyKCIxOTgwLTA0LTE4IikpOwotICAgICAgICByZXBvcnRzLnNldFdoZW5BcnJheSgxLCBuZXcgWG1sQ2FsZW5kYXIoIjE5NzAtMTItMjBUMDQ6MzM6MDAiKSk7Ci0KLSAgICAgICAgZHQgPSByZXBvcnRzLnhnZXRXaGVuQXJyYXkoKTsKLSAgICAgICAgZ2QgPSByZXBvcnRzLmdldFdoZW5BcnJheSgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIxOTgwLTA0LTE4IiksIGdkWzBdKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjE5NzAtMTItMjBUMDQ6MzM6MDAiKSwgZ2RbMV0pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wOC0yNlQyMzoxMDowMCIpLCBnZFsyXSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlLnR5cGUsIGR0WzBdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFsxXS5pbnN0YW5jZVR5cGUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZVRpbWUudHlwZSwgZHRbMl0uaW5zdGFuY2VUeXBlKCkpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTmFtZXdvcmxkVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL05hbWV3b3JsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGJjZi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTmFtZXdvcmxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcub3BlbnVyaS5uYW1ld29ybGQuTmFtZXdvcmxkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubmFtZXdvcmxkLk5hbWV3b3JsZERvY3VtZW50Lk5hbWV3b3JsZDsKLWltcG9ydCBvcmcub3BlbnVyaS5uYW1ld29ybGQuTG9jOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1ld29ybGRUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgTmFtZXdvcmxkVGVzdChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTmFtZXdvcmxkVGVzdC5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0V29ybGQxKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTmFtZXdvcmxkRG9jdW1lbnQgZG9jID0gKE5hbWV3b3JsZERvY3VtZW50KQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgibmFtZXdvcmxkL3dvcmxkMS54bWwiKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAibmFtZXdvcmxkIiksIGRvYy5zY2hlbWFUeXBlKCkuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpKTsKLQotICAgICAgICBRTmFtZVtdIGNvbnRlbnRzID0gbmV3IFFOYW1lW10KLSAgICAgICAgewotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFyY2l0eSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vY2l0eSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdmlsbGFnZSIpLAotICAgICAgICB9OwotICAgICAgICBpbnQgdCA9IDA7Ci0KLSAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gZG9jLmdldE5hbWV3b3JsZCgpOwotICAgICAgICBOYW1ld29ybGQuSXNsYW5kW10gaXNsYW5kcyA9IHdvcmxkLmdldElzbGFuZEFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXNsYW5kcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTG9jW10gbG9jcyA9IGlzbGFuZHNbaV0uZ2V0TG9jYXRpb25BcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2NzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvYy5SZWZlcmVuY2VbXSByZWZzID0gbG9jc1tqXS5nZXRSZWZlcmVuY2VBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVmcy5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbdCsrXSwgcmVmc1trXS5nZXRUbygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QWNjZXNzQnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTmFtZXdvcmxkRG9jdW1lbnQgZG9jID0gKE5hbWV3b3JsZERvY3VtZW50KQotICAgICAgICAgICAgICAgICAgICBYbWxMb2FkZXIuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgibmFtZXdvcmxkL3dvcmxkMS54bWwiKSwKLSAgICAgICAgICAgICAgICAgICAgTmFtZXdvcmxkRG9jdW1lbnQudHlwZSk7Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRlbnRzID0gbmV3IFN0cmluZ1tdCi0gICAgICAgIHsKLSAgICAgICAgICAgICJodHRwOi8vZm9vLmNvbS8iLAotICAgICAgICAgICAgImZvb2NpdHkiLAotICAgICAgICAgICAgImZvb3Rvd24iLAotICAgICAgICAgICAgImZvb3ZpbGxhZ2UiLAotICAgICAgICAgICAgImh0dHA6Ly9iYXIuY29tLyIsCi0gICAgICAgICAgICAiYmFyY2l0eSIsCi0gICAgICAgICAgICAiYmFydG93biIsCi0gICAgICAgICAgICAiYmFydmlsbGFnZSIsCi0gICAgICAgIH07Ci0gICAgICAgIGludCB0ID0gMDsKLSAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gKE5hbWV3b3JsZClkb2MuZWxlbWVudEJ5TmFtZShuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJuYW1ld29ybGQiKSwgMCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ybGQuY291bnRPZkVsZW1lbnRCeU5hbWUobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAiaXNsYW5kIikpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWV3b3JsZC5Jc2xhbmQgaXNsYW5kID0gKE5hbWV3b3JsZC5Jc2xhbmQpd29ybGQuZWxlbWVudEJ5TmFtZShuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJpc2xhbmQiKSwgaSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sICgoU2ltcGxlVmFsdWUpaXNsYW5kLmF0dHJpYnV0ZUJ5TmFtZShuZXcgTmFtZSgidGFyZ2V0TmFtZXNwYWNlIikpKS5zdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaXNsYW5kLmNvdW50T2ZFbGVtZW50QnlOYW1lKG5ldyBOYW1lKCAiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJsb2NhdGlvbiIpKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvYyBsb2MgPSAoTG9jKWlzbGFuZC5lbGVtZW50QnlOYW1lKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIiwgImxvY2F0aW9uIiksIGopOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbdCsrXSwgKChTaW1wbGVWYWx1ZSlsb2MuYXR0cmlidXRlQnlOYW1lKG5ldyBOYW1lKCJuYW1lIikpKS5zdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTnVtZXJhbHNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL051bWVyYWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YzgyZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTnVtZXJhbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5vcGVudXJpLnRlc3ROdW1lcmFscy5Eb2NEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpIChjZXphci5hbmRyZWkgYXQgYmVhLmNvbSkKLSAqIERhdGU6IE5vdiAyMywgMjAwMwotICovCi1wdWJsaWMgY2xhc3MgTnVtZXJhbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIE51bWVyYWxzVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKE51bWVyYWxzVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEb2NEb2N1bWVudC5Eb2MgZG9jOwotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgU3RyaW5nIGluc3QgPQotICAgICAgICAgICAgIjxkb2MgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy90ZXN0TnVtZXJhbHMnPlxuIiArCi0gICAgICAgICAgICAiICA8c3RyaW5nPiAgICB0aGlzIGlzIGEgbG9uZyBzdHJpbmcgXG4iICsKLSAgICAgICAgICAgICIgIC4uLiAgIDwvc3RyaW5nPlxuIiArCi0gICAgICAgICAgICAiICA8aW50PlxuIiArCi0gICAgICAgICAgICAiICAJCSs1XG4iICsKLSAgICAgICAgICAgICIgIDwvaW50PlxuIiArCi0gICAgICAgICAgICAiICA8aW50PlxuIiArCi0gICAgICAgICAgICAiICAJCS02XG4iICsKLSAgICAgICAgICAgICIgIDwvaW50PlxuIiArCi0gICAgICAgICAgICAiICA8aW50PlxuIiArCi0gICAgICAgICAgICAiICAJCSswMDAwMDAwMDAxNVxuIiArCi0gICAgICAgICAgICAiICA8L2ludD5cbiIgKwotICAgICAgICAgICAgIiAgPGludD43PCEtLXRoaXMgaGFzIHRvIGJlIGEgNzcgaW50IHZhbHVlLS0+NzwvaW50PlxuIiArCi0gICAgICAgICAgICAiICA8Ym9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgCQl0cnVlXG4iICsKLSAgICAgICAgICAgICIgIDwvYm9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgPGJvb2xlYW4+XG4iICsKLSAgICAgICAgICAgICIgIAkJZmFsc2VcbiIgKwotICAgICAgICAgICAgIiAgPC9ib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICA8Ym9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgCQkwXG4iICsKLSAgICAgICAgICAgICIgIDwvYm9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgPGJvb2xlYW4+XG4iICsKLSAgICAgICAgICAgICIgIAkJMVxuIiArCi0gICAgICAgICAgICAiICA8L2Jvb2xlYW4+XG4iICsKLSAgICAgICAgICAgICIgIDxib29sZWFuPlxuIiArCi0gICAgICAgICAgICAiICAJCXRydWUgaXMgbm90XG4iICsKLSAgICAgICAgICAgICIgIDwvYm9vbGVhbj5cbiIgKwotICAgICAgICAgICAgIiAgPHNob3J0PlxuIiArCi0gICAgICAgICAgICAiICAJCSswM1xuIiArCi0gICAgICAgICAgICAiICA8L3Nob3J0PlxuIiArCi0gICAgICAgICAgICAiICA8Ynl0ZT5cbiIgKwotICAgICAgICAgICAgIiAgCQkrMDAxXG4iICsKLSAgICAgICAgICAgICIgIDwvYnl0ZT5cbiIgKwotICAgICAgICAgICAgIiAgPGxvbmc+LTA1MDAwMDA8L2xvbmc+XG4iICsKLSAgICAgICAgICAgICIgIDxsb25nPlxuIiArCi0gICAgICAgICAgICAiICAgIDAwMVxuIiArCi0gICAgICAgICAgICAiICA8L2xvbmc+XG4iICsKLSAgICAgICAgICAgICIgIDxsb25nPlxuIiArCi0gICAgICAgICAgICAiICAgICswMDJcbiIgKwotICAgICAgICAgICAgIiAgPC9sb25nPlxuIiArCi0gICAgICAgICAgICAiICA8ZG91YmxlPlxuIiArCi0gICAgICAgICAgICAiICAgICswMDFcbiIgKwotICAgICAgICAgICAgIiAgPC9kb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgIDxkb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgICAgLTAwMi4wMDcwMDBcbiIgKwotICAgICAgICAgICAgIiAgPC9kb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgIDxkb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgICAgSU5GXG4iICsKLSAgICAgICAgICAgICIgIDwvZG91YmxlPlxuIiArCi0gICAgICAgICAgICAiICA8ZG91YmxlPlxuIiArCi0gICAgICAgICAgICAiICAgIC1JTkZcbiIgKwotICAgICAgICAgICAgIiAgPC9kb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgIDxkb3VibGU+XG4iICsKLSAgICAgICAgICAgICIgICAgTmFOXG4iICsKLSAgICAgICAgICAgICIgIDwvZG91YmxlPlxuIiArCi0gICAgICAgICAgICAiICA8ZmxvYXQ+XG4iICsKLSAgICAgICAgICAgICIgICAgKzEyLjMyNVxuIiArCi0gICAgICAgICAgICAiICA8L2Zsb2F0PlxuIiArCi0gICAgICAgICAgICAiICA8ZmxvYXQ+XG4iICsKLSAgICAgICAgICAgICIgICAgTmFOXG4iICsKLSAgICAgICAgICAgICIgIDwvZmxvYXQ+XG4iICsKLSAgICAgICAgICAgICIgIDxmbG9hdD5cbiIgKwotICAgICAgICAgICAgIiAgICBJTkZcbiIgKwotICAgICAgICAgICAgIiAgPC9mbG9hdD5cbiIgKwotICAgICAgICAgICAgIiAgPGZsb2F0PlxuIiArCi0gICAgICAgICAgICAiICAgIC1JTkZcbiIgKwotICAgICAgICAgICAgIiAgPC9mbG9hdD5cbiIgKwotICAgICAgICAgICAgIiAgPGRlY2ltYWw+XG4iICsKLSAgICAgICAgICAgICIgICAgKzAwMS4wMDFcbiIgKwotICAgICAgICAgICAgIiAgPC9kZWNpbWFsPlxuIiArCi0gICAgICAgICAgICAiICA8aW50ZWdlcj5cbiIgKwotICAgICAgICAgICAgIiAgICArMDAxPCEtLWNvbW1lbnRzLS0+MDAwMDAwMDAwXG4iICsKLSAgICAgICAgICAgICIgIDwvaW50ZWdlcj5cbiIgKwotICAgICAgICAgICAgIjwvZG9jPiI7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRvYyA9IERvY0RvY3VtZW50LkZhY3RvcnkucGFyc2UoaW5zdCkuZ2V0RG9jKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHMgPSAiICAgIHRoaXMgaXMgYSBsb25nIHN0cmluZyBcbiIgKyAiICAuLi4gICAiOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU3RyaW5nIGV4cGVjdGVkOlxuJyIgKyBzICsgIicgICAgICAgICBhY3R1YWw6XG4nIiArCi0gICAgICAgICAgICBkb2MuZ2V0U3RyaW5nQXJyYXkoKVswXSArICInIiwgcy5lcXVhbHMoZG9jLmdldFN0cmluZ0FycmF5KClbMF0pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJpbnQgZXhwZWN0ZWQ6IiArIDUgKyAiIGFjdHVhbDoiICsgZG9jLmdldEludEFycmF5KClbMF0sIGRvYy5nZXRJbnRBcnJheSgpWzBdPT01KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJpbnQgZXhwZWN0ZWQ6IiArICgtNikgKyAiIGFjdHVhbDoiICsgZG9jLmdldEludEFycmF5KClbMV0sIGRvYy5nZXRJbnRBcnJheSgpWzFdPT0tNik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiaW50IGV4cGVjdGVkOiIgKyAxNSArICIgYWN0dWFsOiIgKyBkb2MuZ2V0SW50QXJyYXkoKVsyXSwgZG9jLmdldEludEFycmF5KClbMl09PTE1KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJpbnQgZXhwZWN0ZWQ6IiArIDc3ICsgIiBhY3R1YWw6IiArIGRvYy5nZXRJbnRBcnJheSgpWzNdLCBkb2MuZ2V0SW50QXJyYXkoKVszXT09NzcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldEJvb2xlYW5BcnJheSgwKT09dHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDcoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0Qm9vbGVhbkFycmF5KDEpPT1mYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDgoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0Qm9vbGVhbkFycmF5KDIpPT1mYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDkoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0Qm9vbGVhbkFycmF5KDMpPT10cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MTAoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgeyBib29sZWFuIGIgPSBkb2MuZ2V0Qm9vbGVhbkFycmF5KClbNF07IEFzc2VydC5hc3NlcnRUcnVlKGZhbHNlKTsgfQotICAgICAgICBjYXRjaChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgeyBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cnVlKTsgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxMSgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXRTaG9ydEFycmF5KClbMF09PTMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXRCeXRlQXJyYXkoKVswXT09MSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEzKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImxvbmcgZXhwZWN0ZWQ6IiArICgtNTAwMDApICsgIiBhY3R1YWw6IiArIGRvYy5nZXRMb25nQXJyYXkoKVswXSwKLSAgICAgICAgICAgIGRvYy5nZXRMb25nQXJyYXkoKVswXT09LTUwMDAwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDE0KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImxvbmcgZXhwZWN0ZWQ6IiArIDEgKyAiIGFjdHVhbDoiICsgZG9jLmdldExvbmdBcnJheSgpWzFdLAotICAgICAgICAgICAgZG9jLmdldExvbmdBcnJheSgpWzFdPT0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MTUoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgibG9uZyBleHBlY3RlZDoiICsgMiArICIgYWN0dWFsOiIgKyBkb2MuZ2V0TG9uZ0FycmF5KClbMl0sCi0gICAgICAgICAgICBkb2MuZ2V0TG9uZ0FycmF5KClbMl09PTIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxNigpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXREb3VibGVBcnJheSgpWzBdPT0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MTcoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiZG91YmxlIGV4cGVjdGVkOiIgKyAtMi4wMDdkICsgIiBhY3R1YWw6IiArIGRvYy5nZXREb3VibGVBcnJheSgpWzFdLAotICAgICAgICAgICAgZG9jLmdldERvdWJsZUFycmF5KClbMV09PS0yLjAwN2QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxOCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBEb3VibGUoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKS4KLSAgICAgICAgICAgIGVxdWFscyhuZXcgRG91YmxlKGRvYy5nZXREb3VibGVBcnJheSgpWzJdKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxOSgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBEb3VibGUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKS4KLSAgICAgICAgICAgIGVxdWFscyhuZXcgRG91YmxlKGRvYy5nZXREb3VibGVBcnJheSgpWzNdKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBEb3VibGUoRG91YmxlLk5hTikuCi0gICAgICAgICAgICBlcXVhbHMobmV3IERvdWJsZShkb2MuZ2V0RG91YmxlQXJyYXkoKVs0XSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MjEoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiZmxvYWQgZXhwZWN0ZWQ6IiArIDEyLjMyNWYgKyAiIGFjdHVhbDoiICsgZG9jLmdldEZsb2F0QXJyYXkoKVswXSwKLSAgICAgICAgICAgIGRvYy5nZXRGbG9hdEFycmF5KClbMF09PTEyLjMyNWYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMigpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBGbG9hdChGbG9hdC5OYU4pLgotICAgICAgICAgICAgZXF1YWxzKG5ldyBGbG9hdChkb2MuZ2V0RmxvYXRBcnJheSgpWzFdKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMygpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJmbG9hZCBleHBlY3RlZDoiICsgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkgKyAiIGFjdHVhbDoiICsgZG9jLmdldEZsb2F0QXJyYXkoKVsyXSwKLSAgICAgICAgICAgIG5ldyBGbG9hdChGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkuZXF1YWxzKG5ldyBGbG9hdChkb2MuZ2V0RmxvYXRBcnJheSgpWzJdKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyNCgpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBGbG9hdChGbG9hdC5ORUdBVElWRV9JTkZJTklUWSkuCi0gICAgICAgICAgICBlcXVhbHMobmV3IEZsb2F0KGRvYy5nZXRGbG9hdEFycmF5KClbM10pKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDI1KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IEJpZ0RlY2ltYWwoIjEuMDAxIikuZXF1YWxzKGRvYy5nZXREZWNpbWFsQXJyYXkoKVswXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyNigpIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBCaWdJbnRlZ2VyKCIxMDAwMDAwMDAwIikuZXF1YWxzKGRvYy5nZXRJbnRlZ2VyQXJyYXkoMCkpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVTZXRUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVTZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmJiZjEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lU2V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgUU5hbWVTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgUU5hbWVTZXRUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVNldFRlc3QuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoaW50IGluZGVudCwgaW50IGl0ZXIsIFN0cmluZyBwLCBRTmFtZVNldEJ1aWxkZXIgc2V0KQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgU3lzdGVtLmVyci5wcmludChuZXcgRGVjaW1hbEZvcm1hdCgiMDAwMDAgIikuZm9ybWF0KGl0ZXIpKTsKLSAgICAgICAgd2hpbGUgKGluZGVudC0tID4gMCkKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoJyAnKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludChwKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludCgiID0gIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzZXQuZHVtcCgpKTsKLSAgICAgICAgKi8KLQotICAgICAgICByZXR1cm4gImNhc2UjICIgKyBpdGVyICsgIiAiICsgcCArICIgIiArIHNldC50b1N0cmluZygpOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWVTZXRzKCkKLSAgICB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gMTAwMDA7Ci0gICAgICAgIGludCBzZWVkID0gMDsKLSAgICAgICAgaW50IHN0b3BhdCA9IC0xOwotCi0gICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKHNlZWQpOwotICAgICAgICBTdHJpbmdbXSBsb2NhbG5hbWUgPSB7ImEiLCAiYiIsICJjIiwgImQiLCAiZSJ9OwotICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2UgPSB7Im4xIiwgIm4yIiwgIm4zIiwgIm40IiwgIm41In07Ci0gICAgICAgIGludCB3aWR0aCA9IGxvY2FsbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAgUU5hbWVbXSBuYW1lID0gbmV3IFFOYW1lW3dpZHRoICogbmFtZXNwYWNlLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lc3BhY2UubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZVtpICsgd2lkdGggKiBqXSA9IG5ldyBRTmFtZShuYW1lc3BhY2Vbal0sIGxvY2FsbmFtZVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdGFjayB0ZXN0c3RhY2sgPSBuZXcgU3RhY2soKTsgLy8gc3RhY2sgb2Ygc2V0cwotICAgICAgICBTdGFjayB0cmFja3N0YWNrID0gbmV3IFN0YWNrKCk7IC8vIHN0YWNrIG9mIGJvb2xlYW4gYXJyYXlzCi0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgIGJvb2xlYW5bXSBjb250ZW50cyA9IG5ldyBib29sZWFuW3dpZHRoICogbmFtZXNwYWNlLmxlbmd0aF07Ci0gICAgICAgIGJvb2xlYW5bXSB0ZW1wOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBqID0gMDsKLQotICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGl0ZXJhdGlvbnM7IGwrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZwotCi0gICAgICAgICAgICBpZiAobCA9PSBzdG9wYXQpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXZSdyZSBoZXJlIik7Ci0KLSAgICAgICAgICAgIC8vIGFwcGx5IGEgcmFuZG9tIG9wZXJhdGlvbgotCi0gICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMykgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpID0gcm5kLm5leHRJbnQod2lkdGggLSAxKTsgLy8gZG9uJ3QgZG8gdGhlIGxhc3Qgb25lIGZvciBpc0FsbCB0ZXN0Ci0gICAgICAgICAgICAgICAgaiA9IHJuZC5uZXh0SW50KG5hbWVzcGFjZS5sZW5ndGggLSAxKTsgLy8gZG9uJ3QgZG8gdGhlIGxhc3Qgb25lIGZvciBpc0FsbCB0ZXN0Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbDsKLQotICAgICAgICAgICAgc3dpdGNoICh0ZXN0c3RhY2suc2l6ZSgpIDwgMSA/IDI0IDogcm5kLm5leHRJbnQoaXRlcmF0aW9ucyAtIGwgPiB0ZXN0c3RhY2suc2l6ZSgpID8gMjQgOiA1KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0ZXN0c3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzdGFjay5wdXNoKGNvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJuZXciOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgICB0ZXN0c3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzdGFjay5wdXNoKGNvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChybmQubmV4dEludCgyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIChuYW1lc3BhY2UubGVuZ3RoIC0gMSldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgbmFtZXNwYWNlLmxlbmd0aCAtIDE7IGgrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJuZC5uZXh0SW50KDIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVOYW1lc3BhY2UobmFtZXNwYWNlW2hdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZE5hbWVzcGFjZShuYW1lc3BhY2VbaF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW3dpZHRoIC0gMSArIHdpZHRoICogaF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAtIDE7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmUobmFtZVtrICsgd2lkdGggKiBoXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGQobmFtZVtrICsgd2lkdGggKiBoXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIGhdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAicmFuZG9tIjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYWRkQWxsKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBvcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiYWRkIHNldCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZUFsbCgoUU5hbWVTZXRTcGVjaWZpY2F0aW9uKXRlc3RzdGFjay5wb3AoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgc2V0IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVzdHJpY3QoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGJvb2xlYW5bXSl0cmFja3N0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gInJlc3RyaWN0IHNldCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJ1bmlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGN1cnJlbnQudW5pb24oKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAidW5pb24iOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiaW50ZXJzZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudC5pbnRlcnNlY3QoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVtcFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJpbnRlcnNlY3QiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImNvcHkiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZChuYW1lW2kgKyB3aWR0aCAqIGpdKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHNbaSArIHdpZHRoICogal0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJhZGQgb25lICIgKyBuYW1lW2kgKyB3aWR0aCAqIGpdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlKG5hbWVbaSArIHdpZHRoICogal0pOwotICAgICAgICAgICAgICAgICAgICBjb250ZW50c1tpICsgd2lkdGggKiBqXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgb25lICIgKyBuYW1lW2kgKyB3aWR0aCAqIGpdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGROYW1lc3BhY2UobmFtZXNwYWNlW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbayArIHdpZHRoICogal0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJhZGQgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZU5hbWVzcGFjZShuYW1lc3BhY2Vbal0pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trICsgd2lkdGggKiBqXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSAhY29udGVudHNba107Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludmVydCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudC5pbnZlcnNlKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSAhY29udGVudHNba107Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludmVyc2UiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybWF0KHRlc3RzdGFjay5zaXplKCksIGwsIGxhYmVsLCBjdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4sIHZlcmlmeSBjdXJyZW50IG1hdGNoZXMgY29udGVudHMKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiQ29udGVudCBtaXNtYXRjaCAiICsgbmFtZVtrXSwgY3VycmVudCksIChjdXJyZW50LmNvbnRhaW5zKG5hbWVba10pID09IGNvbnRlbnRzW2tdKSk7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgIkVSUk9SIE9OICIgKyBuYW1lW2tdLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgY29udGVudHNba10gKyAiLCBnb3QgIiArICFjb250ZW50c1trXSwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudHNba10pCi0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiRVJST1I6IGlzRW1wdHkgaXMgd3JvbmciLCBjdXJyZW50KSwgKChjb3VudCA9PSAwKSA9PSBjdXJyZW50LmlzRW1wdHkoKSkpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGlzRW1wdHkgaXMgd3JvbmciLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgImV4cGVjdGVkICIgKyAoY291bnQgPT0gMCkgKyAiLCBnb3QgIiArICEoY291bnQgPT0gMCksIGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBpc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpLCAoY291bnQgPT0gd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoKSA9PSBjdXJyZW50LmlzQWxsKCkpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGlzQWxsIGlzIHdyb25nIiwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgKGNvdW50ID09IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aCkgKyAiLCBnb3QgIiArICEoY291bnQgPT0gd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoKSwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlc3QgaXNEaXNqb2ludCBhbmQgY29udGFpbnNBbGwKLSAgICAgICAgICAgIGlmICh0ZXN0c3RhY2suc2l6ZSgpID49IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNqb2ludCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wZWVrKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdICYmIGNvbnRlbnRzW2tdKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNqb2ludCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZm9ybWF0KDAsIGwsICJFUlJPUjogZGlzam9pbnQgaXMgd3JvbmciLCBjdXJyZW50KSwgZGlzam9pbnQgPT0gY3VycmVudC5pc0Rpc2pvaW50KChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBlZWsoKSkpOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJFUlJPUjogZGlzam9pbnQgaXMgd3JvbmciLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgZGlzam9pbnQgKyAiLCBnb3QgIiArICFkaXNqb2ludCwgKFFOYW1lU2V0QnVpbGRlcil0ZXN0c3RhY2sucGVlaygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNBbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSAmJiAhY29udGVudHNba10pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zQWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBjb250YWluc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpLCBjb250YWluc0FsbCA9PSBjdXJyZW50LmNvbnRhaW5zQWxsKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBlZWsoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2NjdlMS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFFOYW1lVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBRTmFtZVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOwotICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYW55Jz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iICsKLSAgICAgICAgICAgICIiOwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0KLSAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QoIG5ldyBYbWxPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2Uoc2NoZW1hKSB9ICk7Ci0KLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgdGhlIHNldF9YTUxOYW1lIGZ1bmN0aW9uIG9uIFhtbFFOYW1lSW1wbAotICAgICAgICAvLwotCi0gICAgICAgIFN0cmluZyBucyA9Ci0gICAgICAgICAgICAieG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIiArCi0gICAgICAgICAgICAgICAgInhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSciOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IHNvdXJjZURvY3VtZW50ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpRTmFtZScgeG1sbnM6eHh4PSd4eHguY29tJz4iICsKLSAgICAgICAgICAgICAgICAgICAgInh4eDphYmM8L2FueT4iLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIHNvdXJjZUN1cnNvciA9IHNvdXJjZURvY3VtZW50Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIHNvdXJjZUN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICBYbWxRTmFtZSBzb3VyY2VRTmFtZSA9IChYbWxRTmFtZSkgc291cmNlQ3Vyc29yLmdldE9iamVjdCgpOwotCi0gICAgICAgIFhtbE9iamVjdCB0YXJnZXREb2N1bWVudCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6UU5hbWUnPiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9hbnk+IiwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIFhtbEN1cnNvciB0YXJnZXRDdXJzb3IgPSB0YXJnZXREb2N1bWVudC5uZXdDdXJzb3IoKTsKLQotICAgICAgICB0YXJnZXRDdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgWG1sUU5hbWUgdGFyZ2V0UU5hbWUgPSAoWG1sUU5hbWUpIHRhcmdldEN1cnNvci5nZXRPYmplY3QoKTsKLQotICAgICAgICB0YXJnZXRRTmFtZS5zZXQoIHNvdXJjZVFOYW1lICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB0YXJnZXRRTmFtZS5xTmFtZVZhbHVlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAieHh4LmNvbSIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgdGhlIHNldF90ZXh0IGZ1bmN0aW9uIG9uIFhtbFFOYW1lSW1wbAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgdGFyZ2V0RG9jdW1lbnQgPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOlFOYW1lJyB4bWxuczp4eHg9J3h4eC5jb20nPiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9hbnk+IiwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIHRhcmdldEN1cnNvciA9IHRhcmdldERvY3VtZW50Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIHRhcmdldEN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICB0YXJnZXRRTmFtZSA9IChYbWxRTmFtZSkgdGFyZ2V0Q3Vyc29yLmdldE9iamVjdCgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRRTmFtZS5zZXQoICJ6eno6YWJjIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsgLy8gTXVzdCBmYWlsCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgdCApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGFyZ2V0UU5hbWUuc2V0KCAieHh4OmFiYyIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgdGFyZ2V0UU5hbWUucU5hbWVWYWx1ZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggInh4eC5jb20iICkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUnVudGltZVNjaGVtYUxvYWRlclRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9SdW50aW1lU2NoZW1hTG9hZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZlMDlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9SdW50aW1lU2NoZW1hTG9hZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgUnVudGltZVNjaGVtYUxvYWRlclRlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNMb2FkKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkIik7Ci0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnB1dGZpbGUxKSB9KTsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkQ9d3JhcHBlZGluc3RhbmNlQGh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCByZXN1bHQuc2NoZW1hVHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRG9jdW1lbnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIsICJ3cmFwcGVkaW5zdGFuY2UiICkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zY2hlbWFUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTG9hZDIoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBGaWxlIGlucHV0ZmlsZTEgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkIik7Ci0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnB1dGZpbGUxKSB9KTsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdDIueG1sIiksIG51bGwsIG51bGwpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEPXdyYXBwZWR3aWxkY2FyZEBodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgcmVzdWx0LnNjaGVtYVR5cGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZERvY3VtZW50VHlwZShuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZHdpbGRjYXJkIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zY2hlbWFUeXBlKCkpOwotICAgICAgICBYbWxDdXJzb3IgY3VyID0gcmVzdWx0Lm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgYSByb290IGVsZW1lbnQiLCBjdXIudG9GaXJzdENoaWxkKCkpOwotICAgICAgICByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkU9d3JhcHBlZHdpbGRjYXJkfEQ9d3JhcHBlZHdpbGRjYXJkQGh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCByZXN1bHQuc2NoZW1hVHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZHdpbGRjYXJkIikpLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBoYXZlIGEgZmlyc3QgY2hpbGQiLCBjdXIudG9GaXJzdENoaWxkKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAic2NoZW1hIiksIGN1ci5nZXROYW1lKCkpOwotICAgICAgICBYbWxPYmplY3Qgb2JqID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNjaGVtYS50eXBlLCBvYmouc2NoZW1hVHlwZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2NoZW1hVHlwZXNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NjaGVtYVR5cGVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2ZWI5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2NoZW1hVHlwZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcub3BlbnVyaS54c3R5cGVzLnRlc3QuKjsKLWltcG9ydCBvcmcub3BlbnVyaS5kZWYuRGVmYXVsdHNEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlc1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTY2hlbWFUeXBlc1Rlc3RzLmNsYXNzKTsgfQotCi0gICAgcHJpdmF0ZSBDdXN0b21lckRvY3VtZW50IGRvYzsKLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVEb2MoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggZG9jPT1udWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZG9jID0gKEN1c3RvbWVyRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCIuLi9zcmMveHN0eXBlcy94c3R5cGVzLnhtbCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIERlZmF1bHRzRG9jdW1lbnQgZG9jID0gRGVmYXVsdHNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIERlZmF1bHRzRG9jdW1lbnQuRGVmYXVsdHMgZGVmcyA9IGRvYy5hZGROZXdEZWZhdWx0cygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDc4MywgZGVmcy5nZXRDb29sKCkpOyAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvdXJjZU5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IERlZmF1bHRzRG9jdW1lbnQudHlwZS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImRlZmF1bHRzLnhzZCIsIG5hbWUpOwotICAgICAgICBJbnB1dFN0cmVhbSBzdHIgPSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLmdldFNvdXJjZUFzU3RyZWFtKCJkZWZhdWx0cy54c2QiKTsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShzdHIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MudmFsaWRhdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBlbnN1cmVEb2MoKTsKLQotICAgICAgICAvLyBNb3ZlIGZyb20gdGhlIHJvb3QgdG8gdGhlIHJvb3QgY3VzdG9tZXIgZWxlbWVudAotICAgICAgICBQZXJzb24gcGVyc29uID0gZG9jLmdldEN1c3RvbWVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhvd2R5IiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0LCAgIHBlcnNvbi5zaXplT2ZOdW1iZXJBcnJheSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MzYsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTIzLCBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQ0LCAgcGVyc29uLmdldE51bWJlckFycmF5KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg5MzMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgICBwZXJzb24uc2l6ZU9mQmlydGhkYXlBcnJheSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjE5OTgtMDgtMjZaIiksCi0gICAgICAgICAgICAgcGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMC0wOC0wNi0wODowMCIpLAotICAgICAgICAgICAgIHBlcnNvbi5nZXRCaXJ0aGRheUFycmF5KDEpKTsKLQotICAgICAgICBQZXJzb24uR2VuZGVyLkVudW0gZyA9IHBlcnNvbi5nZXRHZW5kZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhQZXJzb24uR2VuZGVyLk1BTEUsIGcpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkVHSVFUV1laSiIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleCgpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0KCkpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHR0lRVFdZR0ciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXhBdHQoKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygie3NvbWVfdXJpfWxvY2FsbmFtZSIsIHBlcnNvbi5nZXRRbmFtZUF0dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7aHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdH1vcGVudXJpX29yZ19sb2NhbG5hbWUiLCBwZXJzb24uZ2V0UW5hbWUoKS50b1N0cmluZygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vZG1vei5vcmcvV29ybGQvRnJhblx1MDBlN2Fpcy8iLCBwZXJzb24uZ2V0QW55dXJpQXR0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly8zc3BhY2Uub3JnL3NwYWNlJTIwc3BhY2UvIiwgcGVyc29uLmdldEFueXVyaSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vUnVudGltZUV4Y2VwdGlvbjogc3JjL3htbHN0b3JlL2NvbS9iZWEveG1sL3N0b3JlL1NwbGF5LmphdmEoMTUzNyk6IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwIGZhaWxlZAotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkpQRUciLCBwZXJzb24uZ2V0Tm90YXRpb25BdHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJHSUYiLCBwZXJzb24uZ2V0Tm90YXRpb24oKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVSZWFkKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgZW5zdXJlRG9jKCk7Ci0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLQotICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2VvcmdlIiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLQotICAgICAgICBwZXJzb24uc2V0SGV4KCJoZXggZW5jb2RpbmciLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXgoKSkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRCYXNlNjQoImJhc2U2NCBlbmNvZGVkIi5nZXRCeXRlcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmFzZTY0IGVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEhleEF0dCgiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmcgaW4gYXR0cmlidXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4QXR0KCkpKTsKLQotICAgICAgICBwZXJzb24uc2V0QmFzZTY0QXR0KCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEFueXVyaSgiYS5jOjcwMDEiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYS5jOjcwMDEiLCBwZXJzb24uZ2V0QW55dXJpKCkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmlBdHQoImIuZDo3MDAyIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImIuZDo3MDAyIiwgcGVyc29uLmdldEFueXVyaUF0dCgpKTsKLQotICAgICAgICBwZXJzb24uc2V0UW5hbWVBdHQobmV3IFFOYW1lKCJhYWEiLCJiYmIiKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInthYWF9YmJiIiwgcGVyc29uLmdldFFuYW1lQXR0KCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldFFuYW1lKG5ldyBRTmFtZSgiZGRkIiwiZWVlIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7ZGRkfWVlZSIsIHBlcnNvbi5nZXRRbmFtZSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vRXhjZXB0aW9uOiBzcmMveG1sc3RvcmUvY29tL2JlYS94bWwvc3RvcmUvVHlwZS5qYXZhKDE4OSk6IHVzZXIgPT0gX3VzZXIgZmFpbGVkCi0vLyAgICAgICAgcGVyc29uLnNldEFueXVyaUF0dChVUkkuY3JlYXRlKCJiLmQ6NzAwMiIpKTsKLS8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiLmQ6NzAwMiIsIHBlcnNvbi5nZXRBbnl1cmlBdHQoKS50b1N0cmluZygpKTsKLQotICAgICAgICAvL1htbE5PVEFUSU9OIG5vdGF0aW9uID0gKFhtbE5PVEFUSU9OKVBlcnNvbi5Ob3RhdGlvbi50eXBlLmNyZWF0ZU5vZGUoKTsKLSAgICAgICAgLy9ub3RhdGlvbi5zZXRWYWx1ZSgiSlBFRyIpOwotICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbiggbm90YXRpb24gKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJKUEVHIiwgcGVyc29uLmdldE5vdGF0aW9uKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy9YbWxOT1RBVElPTiBub3RhdGlvbkF0dCA9IChYbWxOT1RBVElPTilQZXJzb24uTm90YXRpb25BdHQudHlwZS5jcmVhdGVOb2RlKCk7Ci0gICAgICAgIC8vbm90YXRpb25BdHQuc2V0VmFsdWUoIkdJRiIpOwotICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbkF0dCggbm90YXRpb25BdHQgKTsKLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb25BdHQobm90YXRpb24pOwotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkdJRiIsIHBlcnNvbi5nZXROb3RhdGlvbkF0dCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZVdyaXRlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgZW5zdXJlRG9jKCk7Ci0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLQotICAgICAgICBYbWxPYmplY3QgeG1sb2JqOwotICAgICAgICBYbWxDdXJzb3IgeG1sY3VyczsKLQotICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLSAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRGaXJzdG5hbWUoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2VvcmdlIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIHBlcnNvbi5zZXRRbmFtZUF0dCggbmV3IFFOYW1lKCJodHRwOi8vZ2dnLmNvbSIsImhoaCIpICk7Ci0gICAgICAgIHhtbG9iaiA9IHBlcnNvbi54Z2V0UW5hbWVBdHQoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2dnOmhoaCIsIHhtbGN1cnMuZ2V0VGV4dFZhbHVlKCkgKTsKLQotICAgICAgICBwZXJzb24uc2V0UW5hbWUoIG5ldyBRTmFtZSgiaHR0cDovL2dnZy5jb20vZ2dnQWdhaW4iLCJra2siKSApOwotICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldFFuYW1lKCk7Ci0gICAgICAgIHhtbGN1cnMgPSB4bWxvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdnZzE6a2trIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmkoICJjcm9zc2dhaW4uY29tIiApOwotICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldEFueXVyaSgpOwotICAgICAgICB4bWxjdXJzID0geG1sb2JqLm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjcm9zc2dhaW4uY29tIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmlBdHQoICJ3d3cuY3Jvc3NnYWluLmNvbSIgKTsKLSAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRBbnl1cmlBdHQoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygid3d3LmNyb3NzZ2Fpbi5jb20iLCB4bWxjdXJzLmdldFRleHRWYWx1ZSgpICk7Ci0KLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb24oIkdJRiIpOwotICAgICAgICAvL3htbG9iaiA9IHBlcnNvbi5nZXROb3RhdGlvbigpOwotICAgICAgICAvL3htbGN1cnMgPSB4bWxvYmoubmV3WG1sQ3Vyc29yKCk7Ci0gICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiR0lGIiwgeG1sY3Vycy5nZXRUZXh0KCkgKTsKLQotICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbkF0dCgiSlBFR3UiKTsKLSAgICAgICAgLy94bWxvYmogPSBwZXJzb24ueGdldE5vdGF0aW9uQXR0KCk7Ci0gICAgICAgIC8veG1sY3VycyA9IHhtbG9iai5uZXdYbWxDdXJzb3IoKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJKUEVHIiwgeG1sY3Vycy5nZXRUZXh0KCkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2VyaWFsaXphdGlvblRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2VyaWFsaXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjQyYWQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NlcmlhbGl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5QdXJjaGFzZU9yZGVyOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sTGluZUl0ZW1CZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sU2hpcHBlckJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgU2VyaWFsaXphdGlvblRlc3RzIChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VyaWFsaXphdGlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFhtbE9iamVjdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2ltcGxlRG9jdW1lbnQgPSAiPHNpbXBsZURvYz48bmVzdGVkVGFnIGF0dHI9XCJzYW1wbGVcIj40MzwvbmVzdGVkVGFnPjwvc2ltcGxlRG9jPiI7Ci0gICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShzaW1wbGVEb2N1bWVudCk7Ci0KLSAgICAgICAgLy8gYmFzZWxpbmUgdGVzdAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNpbXBsZURvY3VtZW50LCBkb2MueG1sVGV4dCgpKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICBvb3Mud3JpdGVPYmplY3QoZG9jKTsKLSAgICAgICAgb29zLmNsb3NlKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXkpOwotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBYbWxPYmplY3QgbmV3ZG9jID0gKFhtbE9iamVjdClvaXMucmVhZE9iamVjdCgpOwotICAgICAgICBvaXMuY2xvc2UoKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNpbXBsZURvY3VtZW50LCBuZXdkb2MueG1sVGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WEJlYW5TZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiBkb2MgPSBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgUHVyY2hhc2VPcmRlciBvcmRlciA9IGRvYy5hZGROZXdQdXJjaGFzZU9yZGVyKCk7Ci0gICAgICAgIG9yZGVyLmFkZE5ld0N1c3RvbWVyKCkuc2V0TmFtZSgiRGF2aWQgQmF1Iik7Ci0gICAgICAgIG9yZGVyLmdldEN1c3RvbWVyKCkuc2V0QWRkcmVzcygiR2xhZHd5bmUsIFBBIik7Ci0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBsaTsKLSAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiKTsKLSAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjIxLjc5IikpOwotICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMikpOwotICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOwotICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIpOwotICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSk7Ci0gICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7Ci0gICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7Ci0gICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzIik7Ci0gICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKLSAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKLSAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKLSAgICAgICAgWG1sU2hpcHBlckJlYW4gc2ggPSBvcmRlci5hZGROZXdTaGlwcGVyKCk7Ci0gICAgICAgIHNoLnNldE5hbWUoIlVQUyIpOwotICAgICAgICBzaC5zZXRQZXJPdW5jZVJhdGUobmV3IEJpZ0RlY2ltYWwoIjAuNzQiKSk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0KTsKLSAgICAgICAgb29zLndyaXRlT2JqZWN0KGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKSk7Ci0gICAgICAgIG9vcy53cml0ZU9iamVjdChkb2MpOwotICAgICAgICBvb3Mud3JpdGVPYmplY3QoZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpKTsKLSAgICAgICAgb29zLmNsb3NlKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXkpOwotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBYbWxMaW5lSXRlbUJlYW4gbmV3bGkxID0gKFhtbExpbmVJdGVtQmVhbilvaXMucmVhZE9iamVjdCgpOwotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIG5ld2RvYyA9IChYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuKW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBuZXdsaTIgPSAoWG1sTGluZUl0ZW1CZWFuKW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIG9pcy5jbG9zZSgpOwotCi0gICAgICAgIFB1cmNoYXNlT3JkZXIgbmV3b3JkZXIgPSBuZXdkb2MuZ2V0UHVyY2hhc2VPcmRlcigpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3bGkxLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXdsaTIsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsIG5ld29yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2xhZHd5bmUsIFBBIiwgbmV3b3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG5ld29yZGVyLnNpemVPZkxpbmVJdGVtQXJyYXkoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyMS43OSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIiwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMyIsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjEiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCBuZXdvcmRlci5pc1NldFNoaXBwZXIoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVQUyIsIG5ld29yZGVyLmdldFNoaXBwZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjc0IiksIG5ld29yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TbW9rZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYmNiOTYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNtb2tlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIFNtb2tlVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFNtb2tlVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBc3NvcnRlZFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEludFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN0b3JlVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoUU5hbWVUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ29tcGlsYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbm5vdGF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEVhc3lQb1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KE5hbWV3b3JsZFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU2NoZW1hVHlwZXNUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChFbnVtVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRpbmdUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFNlcmlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChEb21UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChHRGF0ZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN1YnN0R3JvdXBUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChOdW1lcmFsc1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0YW5kYWxvbmVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0YW5kYWxvbmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDI0NzE3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdGFuZGFsb25lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN0YW5kYWxvbmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgU3RhbmRhbG9uZVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShTdGFuZGFsb25lVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBc3NvcnRlZFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEludFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN0b3JlVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoUU5hbWVUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ29tcGlsYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbm5vdGF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEVhc3lQb1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KE5hbWV3b3JsZFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU2NoZW1hVHlwZXNUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChFbnVtVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRpbmdUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFNlcmlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChEb21UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChHRGF0ZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN1YnN0R3JvdXBUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdG9yZVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGZiYTYzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdG9yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbE5hbWVJbXBsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkF0dHJpYnV0ZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZzsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5Db21tZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRG9jdW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5FbmRFbGVtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kUHJlZml4TWFwcGluZzsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydFByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLSAgIAotcHVibGljIGNsYXNzIFN0b3JlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBTdG9yZVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTdG9yZVRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOwotICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCi0gICAgewotICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSksIG51bGwpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQ29udGVudHMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4RHN0ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgWG1sT2JqZWN0IHhTcmMgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28vPiIgKTsKLSAgICAgICAgWG1sT2JqZWN0IG5ld0RzdCA9IHhEc3Quc2V0KCB4U3JjICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuZXdEc3QueG1sVGV4dCgpLmVxdWFscyggIjxmb28vPiIgKSApOwotICAgICAgICAKLSAgICAgICAgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhci8+IiApOwotICAgICAgICB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geERzdC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgeERzdC5zZXQoIHhTcmMgKTsKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIHhEc3QgPSBjLmdldE9iamVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeERzdC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhcj48Zm9vLz48L2Jhcj4iICkgKTsKLQotICAgICAgICB4RHN0ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyIHg9J3knLz4iICk7Ci0gICAgICAgIHhTcmMgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+bW9vPC9mb28+IiApOwotICAgICAgICBjID0geERzdC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIHhEc3QgPSBjLmdldE9iamVjdCgpOwotICAgICAgICB4RHN0LnNldCggeFNyYyApOwotICAgICAgICBjLnRvU3RhcnREb2MoKTsKLSAgICAgICAgeERzdCA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4RHN0LnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHg9XCJtb29cIi8+IiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTbmlmZmluZyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8eG9vLz4iICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnNjaGVtYVR5cGUoKSA9PSBYbWxCZWFucy5OT19UWVBFICk7Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPHNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLz4iICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC5zY2hlbWFUeXBlKCkgPT0gb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC50eXBlICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hL21vbycvPiIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHguc2NoZW1hVHlwZSgpID09IFhtbEJlYW5zLk5PX1RZUEUgKTsKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPHNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLz4iICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC5zY2hlbWFUeXBlKCkgPT0gb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC50eXBlICk7Ci0KLSAgICAgICAgeCA9IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLz4iICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC5zY2hlbWFUeXBlKCkgPT0gb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC50eXBlICk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHggPSAKLSAgICAgICAgICAgICAgICBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICI8c2NoZW1hIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS9tb28nLz4iICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkgeyB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JTdGFjayAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geD0neScvPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnB1c2goKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnB1c2goKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5pc0F0dHIoKSApOwotICAgICAgICBjLnBvcCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0KCkgKTsKLSAgICAgICAgYy5wb3AoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNTdGFydGRvYygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdE5hbWVzcGFjZXMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbmFtZXNwYWNlcy5wdXQoICJmb28iLCAiZm9vLmNvbSIgKTsKLSAgICAgICAgbmFtZXNwYWNlcy5wdXQoICJiYXIiLCAiYmFyLmNvbSIgKTsKLSAgICAgICAgbmFtZXNwYWNlcy5wdXQoICIiLCAiZGVmYXVsdC5jb20iICk7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9JTVBMSUNJVF9OQU1FU1BBQ0VTLCBuYW1lc3BhY2VzICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgIGMuYmVnaW5FbGVtZW50KCAiYSIsICJmb28uY29tIiApOwotICAgICAgICBjLmJlZ2luRWxlbWVudCggImIiLCAiZGVmYXVsdC5jb20iICk7Ci0gICAgICAgIGMuYmVnaW5FbGVtZW50KCAiYyIsICJiYXIuY29tIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGZvbzphPjxiPjxiYXI6Yy8+PC9iPjwvZm9vOmE+IiApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGVudCBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlcgotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfRE9DVU1FTlQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX0RPQ1VNRU5UIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50ICgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cyApCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJTVEFSVF9FTEVNRU5UIiApOwotICAgICAgICAgICAgYWRkKCAiICBuYW1lc3BhY2VVUkk6ICIgKyBuYW1lc3BhY2VVUkkgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbG9jYWxOYW1lOiAiICsgbG9jYWxOYW1lICk7Ci0vLyAgICAgICAgICAgIGFkZCggIiAgcU5hbWU6ICIgKyBxTmFtZSApOyAKLQotICAgICAgICAgICAgVHJlZVNldCBzb3J0ZWRBdHRycyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBhdHRzLmdldExlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG4gPSBhdHRzLmdldExvY2FsTmFtZSggaSApOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhdHRzLmdldFVSSSggaSApOwotICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZSA9IGF0dHMuZ2V0UU5hbWUoIGkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChsbi5lcXVhbHMoInhtbG5zIikpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChxbmFtZS5zdGFydHNXaXRoKCJ4bWxucyIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotLy8gICAgICAgICAgICAgICAgaWYgKGxuLmVxdWFscyggInhtbG5zIiApKQotLy8gICAgICAgICAgICAgICAgICAgIGxuID0gIiI7Ci0vLwotLy8gICAgICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoICJ4bWxucyIgKSkKLS8vICAgICAgICAgICAgICAgICAgICB1cmkgPSAiIjsKLQotICAgICAgICAgICAgICAgIHNvcnRlZEF0dHJzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgdXJpICsgIi0iICsgbG4gKyAiLSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cy5nZXRRTmFtZSggaSApICsgIi0iICsgYXR0cy5nZXRUeXBlKCBpICkgKyAiLSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0VmFsdWUoIGkgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gc29ydGVkQXR0cnMuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIGFkZCggIiAgQXR0cjogIiArIGkubmV4dCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50ICgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSApCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJFTkRfRUxFTUVOVCIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbmFtZXNwYWNlVVJJOiAiICsgbmFtZXNwYWNlVVJJICk7Ci0gICAgICAgICAgICBhZGQoICIgIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSApOwotLy8gICAgICAgICAgICBhZGQoICIgIHFOYW1lOiAiICsgcU5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZCggIkNIQVJBQ1RFUlMiICk7Ci0gICAgICAgICAgICAgICAgYWRkKCBjaCwgc3RhcnQsIGxlbmd0aCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29tbWVudCAoIGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkgCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIAotICAgICAgICB7IAotICAgICAgICAgICAgYWRkKCAiQ09NTUVOVCIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgQ29tbWVudDogIiwgY2gsIHN0YXJ0LCBsZW5ndGggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAoIFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIgKTsKLSAgICAgICAgICAgIGFkZCggICAidGFyZ2V0OiAiICsgdGFyZ2V0ICk7Ci0gICAgICAgICAgICBhZGQoICAgImRhdGE6ICIgKyBkYXRhICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoICJJR05PUkFCTEVfV0hJVEVTUEFDRSIgKTsKLSAgICAgICAgICAgICAgICBhZGQoICIgIHdoaXRlc3BhY2U6ICIsIGNoLCBzdGFydCwgbGVuZ3RoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJTVEFSVF9QUkVGSVhfTUFQUElORyIgKTsKLS8vICAgICAgICAgICAgYWRkKCAiICBwcmVmaXg6ICIgKyBwcmVmaXggKTsKLSAgICAgICAgICAgIGFkZCggIiAgdXJpOiAiICsgdXJpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4ICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJFTkRfUFJFRklYX01BUFBJTkciICk7Ci0vLyAgICAgICAgICAgIGFkZCggIiAgcHJlZml4OiAiICsgcHJlZml4ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEgKCApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfQ0RBVEEiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9DREFUQSIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREVEQgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQgKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJTVEFSVF9EVEQiICk7Ci0gICAgICAgICAgICBhZGQoICIgIG5hbWU6ICIgKyBuYW1lICk7Ci0gICAgICAgICAgICBhZGQoICIgIHB1YmxpY0lkOiAiICsgcHVibGljSWQgKTsKLSAgICAgICAgICAgIGFkZCggIiAgc3lzdGVtSWQ6ICIgKyBzeXN0ZW1JZCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmREVEQgKCApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX0RURCIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkgKCBTdHJpbmcgbmFtZSApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfRU5USVRZIiApOwotICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkgKCBTdHJpbmcgbmFtZSApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX0VOVElUWSIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbmFtZTogIiArIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yICggTG9jYXRvciBsb2NhdG9yICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWRkKCAiU1RBUlRfRE9DVU1FTlRfTE9DQVRPUiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkgKCBTdHJpbmcgbmFtZSApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU0tJUFBFRF9FTlRJVFkiICk7Ci0gICAgICAgICAgICBhZGQoICIgIG5hbWU6ICIgKyBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkICggU3RyaW5nIHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCBzICk7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCAiXG4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGQgKCBTdHJpbmcgcywgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zYi5hcHBlbmQoIHMgKTsKLSAgICAgICAgICAgIF9zYi5hcHBlbmQoIGJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIF9zYi5hcHBlbmQoICJcbiIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCAiXG4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyAoIE9iamVjdCB0aGF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuZXF1YWxzKCB0aGF0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIF9zYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9UZXN0U2F4U2F2ZXIgKCBTdHJpbmcgeG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gTUUKLSAgICAgICAgCi0gICAgICAgIENvbnRlbnQgY29udGVudDIgPSBuZXcgQ29udGVudCgpOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotCi0gICAgICAgIHguc2F2ZSggY29udGVudDIsIGNvbnRlbnQyICk7Ci0KLSAgICAgICAgLy8gVEhFTQotCi0gICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTQVhQYXJzZXIgc3AgPSBzcGYubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgIAotICAgICAgICBYTUxSZWFkZXIgeHIgPSBzcC5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRlbnQgY29udGVudDEgPSBuZXcgQ29udGVudCgpOwotICAgICAgICAKLSAgICAgICAgeHIuc2V0UHJvcGVydHkoICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBjb250ZW50MSApOwotICAgICAgICB4ci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUgKTsKLSAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSApOwotICAgICAgICB4ci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSApOwotCi0gICAgICAgIHhyLnNldENvbnRlbnRIYW5kbGVyKCBjb250ZW50MSApOwotICAgICAgICAKLSAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoIG5ldyBTdHJpbmdSZWFkZXIoICB4bWwgKSApOwotCi0gICAgICAgIHhyLnBhcnNlKCBpcyApOwotCi0KLSAgICAgICAgaWYgKCFjb250ZW50MS5lcXVhbHMoIGNvbnRlbnQyICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlNBWCBzYXZlIGZhaWx1cmU6ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeG1sICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiU0FYOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIGNvbnRlbnQxLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJNRTogIiApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBjb250ZW50Mi50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNheFNhdmVyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhIHhtbG5zPSdubm4nPjwvYT4iICk7Ci0gICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPGEgeD0neSc+PCEtLS0tPng8Yi8+PGMgcD0ncSc+ejwvYz48L2E+IiApOwotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhIHg9J3knPjwhLS0tLT48Yj5tb288L2I+PGMgcD0ncSc+PC9jPjwvYT4iICk7Ci0gICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPGE+YXNhPGIvPnNkc2Q8Yz5hYXo8L2M+YWRzYXNkPC9hPiIgKTsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YT48P3RhcmdldCB2YWx1ZT8+PC9hPiIgKTsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8bjphIHhtbG5zOm49J25ubic+PC9uOmE+IiApOwotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxqOmEgeD0neScgcD0ncScgeG1sbnM6aj0nayc+PC9qOmE+IiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3RQYXJzaW5nICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oIDEgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCAxMDAwMDAgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgeG1sID0gbWFrZVJhbmRvbURvY3VtZW50KCByICk7Ci0KLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiU3RhcnRpbmcuLi4iICk7Ci0vLwotLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHhtbCApOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJGYWlsZWQgcGFyc2UgdGVzdDoiICk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHhtbCApOwotCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oICJjOlxcZWUueG1sIiApOwotICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKCBvcyApOwotICAgICAgICAgICAgICAgIHBzLnByaW50bG4oIHhtbCApOwotICAgICAgICAgICAgICAgIHBzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkZpbmlzaGVkLi4uIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9UZXN0TGluZU51bWJlcnMgKCBTdHJpbmcgeG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGxpbmUgPSAxOwotICAgICAgICBpbnQgY29sID0gMTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICB4bWwsIG5ldyBYbWxPcHRpb25zKCkuc2V0TG9hZExpbmVOdW1iZXJzKCkgKS4KLSAgICAgICAgICAgICAgICAgICAgbmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHhtbC5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB4bWwuY2hhckF0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnPCcgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKCB4bWwuY2hhckF0KCBpICsgMSApICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICghYy5jdXJyZW50VG9rZW5UeXBlKCkuaXNTdGFydCgpKQotICAgICAgICAgICAgICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5jdXJyZW50VG9rZW5UeXBlKCkuaXNTdGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhtbExpbmVOdW1iZXIgbG4gPQotICAgICAgICAgICAgICAgICAgICAoWG1sTGluZU51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsbiAhPSBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbG4uZ2V0TGluZSgpICAgPT0gLTEgfHwgbG4uZ2V0TGluZSgpID09IGxpbmUgKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbG4uZ2V0Q29sdW1uKCkgPT0gLTEgfHwgbG4uZ2V0Q29sdW1uKCkgPT0gY29sICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldE9mZnNldCgpID09IC0xIHx8IGxuLmdldE9mZnNldCgpID09IGkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpbmUrKzsKLSAgICAgICAgICAgICAgICBjb2w9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29sKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgX190ZXN0TGluZU51bWJlcnMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSggMSApOwotICAgICAgICAKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IDEwMDAgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgeG1sID0gbWFrZVJhbmRvbURvY3VtZW50KCByICk7Ci0KLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiU3RhcnRpbmcuLi4iICk7Ci0vLwotLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHhtbCApOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb1Rlc3RMaW5lTnVtYmVycyggeG1sICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJGYWlsZWQgbGluZSBudW1iZXIgdGVzdDoiICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCAiYzpcXGVlLnhtbCIgKTsKLSAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbSggb3MgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludGxuKCB4bWwgKTsKLSAgICAgICAgICAgICAgICBwcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJGaW5pc2hlZC4uLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERvY0J1aWxkZXIKLSAgICB7Ci0gICAgICAgIFJhbmRvbSByOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2I7Ci0gICAgICAgIAotICAgICAgICBEb2NCdWlsZGVyICggUmFuZG9tIF9yLCBTdHJpbmdCdWZmZXIgX3NiICkKLSAgICAgICAgewotICAgICAgICAgICAgciA9IF9yOwotICAgICAgICAgICAgc2IgPSBfc2I7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcGVuZCAoIGNoYXIgY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIGNoICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgYXBwZW5kICggU3RyaW5nIHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBwID0gci5uZXh0SW50KCAxMDAgKTsKLQotICAgICAgICAgICAgaWYgKHAgPCAyMCkKLSAgICAgICAgICAgICAgICBhcHBlbmQoICdcdCcgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA0MCkKLSAgICAgICAgICAgICAgICBhcHBlbmQoICdcbicgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhcHBlbmQoICcgJyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2hpdGVzcGFjZXMgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gci5uZXh0SW50KCA4ICkgOyBpID4gMCA7IGktLSApCi0gICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGNoYXIgbWFrZUxldHRlciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChjaGFyKSAoKChpbnQpICdhJykgKyByLm5leHRJbnQoIDI2ICkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBsZXR0ZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGVuZCggbWFrZUxldHRlcigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGFyRW50aXR5ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCByLm5leHRJbnQoIDUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDAgOiBhcHBlbmQoICImbHQ7IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSA6IGFwcGVuZCggIiZndDsiICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyIDogYXBwZW5kKCAiJmFtcDsiICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzIDogYXBwZW5kKCAiJmFwb3M7IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNCA6IGFwcGVuZCggIiZxdW90OyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgdGV4dCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDIwICkgOyBpID4gMCA7IGktLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHAgPSByLm5leHRJbnQoIDEwMCApOwotCi0gICAgICAgICAgICAgICAgaWYgKHAgPCA3MCkKLSAgICAgICAgICAgICAgICAgICAgbGV0dGVyKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocCA8IDc0KQotICAgICAgICAgICAgICAgICAgICBjaGFyRW50aXR5KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIG1ha2VOY05hbWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBuYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBtYWtlTGV0dGVyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3gnIHx8IGNoID09ICdYJykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBuYW1lLmFwcGVuZCggY2ggKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggMjAgKSA7IGkgPiAwIDsgaS0tICkKLSAgICAgICAgICAgICAgICBuYW1lLmFwcGVuZCggbWFrZUxldHRlcigpICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBuY05hbWUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGVuZCggbWFrZU5jTmFtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb21tZW50ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmQoICI8IS0tIiApOwotICAgICAgICAgICAgdGV4dCgpOwotICAgICAgICAgICAgYXBwZW5kKCAiLS0+IiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jaW5zdCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kKCAiPD8iICk7Ci0gICAgICAgICAgICBuY05hbWUoKTsKLQotICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAwICkgPCA5MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgdGV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcHBlbmQoICI/PiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlQ29udGVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcCA9IHIubmV4dEludCggMTAwICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA8IDIwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwIDwgNTApCi0gICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocCA8IDcwKQotICAgICAgICAgICAgICAgICAgICBjb21tZW50KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwcm9jaW5zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCB4bWxEZWNsICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmQoICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY29udGVudCAoIGludCBkZXB0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gci5uZXh0SW50KCAxMCApIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoIHIubmV4dEludCggNCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudENvbnRlbnQoIGRlcHRoICsgMSApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSAxIDogdGV4dCgpOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyIDogY29tbWVudCgpOyAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzIDogcHJvY2luc3QoKTsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jTmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgIGFwcGVuZCggJz0nICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKLQotICAgICAgICAgICAgY2hhciBxID0gci5uZXh0SW50KCAyICkgPT0gMCA/ICdcJycgOiAnIic7Ci0KLSAgICAgICAgICAgIGFwcGVuZCggcSApOwotCi0gICAgICAgICAgICB0ZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFwcGVuZCggcSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudCAoIGludCBkZXB0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIGRlcHRoID09IDAsIGd1YXJhbnRlZSBhbiBlbGVtZW50LCBvdGhlcndpc2UsIGFzIGRlcHRoCi0gICAgICAgICAgICAvLyBpbmNyZWFzZXMsIHRoZSBwcm9iYWJsaWxpdHkgd2UnbGwgc3BpdCBvdXQgYW4gZWxlbWVudAotICAgICAgICAgICAgLy8gZ2V0cyBzbWFsbGVyLgotCi0gICAgICAgICAgICBpZiAoci5uZXh0SW50KCBkZXB0aCArIDEgKSA8PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWFrZU5jTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnPCcgKTsKLSAgICAgICAgICAgICAgICBhcHBlbmQoIG5hbWUgKTsKLQotICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICBIYXNoTWFwIGF0dHJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggMyApIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCAnICcgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbmFtZTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmFtZSA9IG1ha2VOY05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cnMuY29udGFpbnNLZXkoIGFuYW1lICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXQoIGFuYW1lLCBudWxsICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCBhbmFtZSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggJz0nICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAwICkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhciBxID0gci5uZXh0SW50KCAyICkgPT0gMCA/ICdcJycgOiAnIic7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCBxICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFwcGVuZCggJz4nICk7Ci0KLSAgICAgICAgICAgICAgICBjb250ZW50KCBkZXB0aCApOwotCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAiPC8iICk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAwICkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKLQotICAgICAgICAgICAgICAgIGFwcGVuZCggJz4nICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoci5uZXh0SW50KCAyICkgPT0gMCkKLSAgICAgICAgICAgICAgICB4bWxEZWNsKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaXRlQ29udGVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbGVtZW50Q29udGVudCggMCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGl0ZUNvbnRlbnQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIG1ha2VSYW5kb21Eb2N1bWVudCAoIFJhbmRvbSByICkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBEb2NCdWlsZGVyIGRiID0gbmV3IERvY0J1aWxkZXIoIHIsIHNiICk7Ci0KLSAgICAgICAgZGIuZG9jdW1lbnQoKTsKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRoYXRBc3NlcnRJc09uICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgICAgIAotICAgIHN0YXRpYyBjbGFzcyBNeU1hcmsgZXh0ZW5kcyBYbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9va21hcmtzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmNkZWZnPCEtLS0tPnh5PC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBNeU1hcmsgbTEgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG0xICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIE15TWFyayBtMiA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTIgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgTXlNYXJrIG0zID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtMyApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeU1hcmsgbTQgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG00ICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dENoYXIoIDEgKTsKLSAgICAgICAgTXlNYXJrIG01ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRDaGFyKCAzICk7Ci0gICAgICAgIE15TWFyayBtNiA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTYgKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeU1hcmsgbTcgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG03ICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIE15TWFyayBtOCA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTggKTsKLQotICAgICAgICBjLnRvU3RhcnREb2MoKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRCb29rbWFyayAgICggTXlNYXJrLmNsYXNzICkgPT0gbTEgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG0yICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG01ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG04ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvRW5kRG9jKCk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRCb29rbWFyayAgICggTXlNYXJrLmNsYXNzICkgPT0gbTggKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG03ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG00ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG0xICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J2EnLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnNldE5hbWUoIG5ldyBRTmFtZSggImJhciIgKSApOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMuc2V0TmFtZSggbmV3IFFOYW1lKCAieSIgKSApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHk9XCJhXCIvPiIgKSApOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vIEJhc2ljIGxvYWQgdXAgYSBmaWxlIGFuZCBpdGVyYXRlIHRocm91Z2ggaXQKLSAgICAvLwotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNYbWwoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBsb2FkQ2FzZSgidGVzdC54bWwiKTsKLQotICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb2tlblR5cGUgdCA9IGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodCA9PSBUb2tlblR5cGUuTk9ORSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gNiApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gTWFrZSBzdXJlIHRoZSB0b2tlbnMgZ29pbmcgZm9yd2FyZCB0aGUgdGhlIHJldmVyc2Ugb2YgdGhlIHRva2VucwotICAgIC8vIGdvaW5nIGJhY2t3YXJkCi0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zaXN0ZW50VG9rZW5PcmRlciggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IGxvYWRDYXNlKCJ0ZXN0LnhtbCIpOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihjLmN1cnJlbnRUb2tlblR5cGUoKSk7Ci0gICAgICAgICAgICBsLmFkZChjLmN1cnJlbnRUb2tlblR5cGUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChjLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLk5PTkUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjLnRvRW5kRG9jKCk7Ci0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiUmV2ZXJzaW5nIik7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSBsLnNpemUoKSAtIDEgOyA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihjLmN1cnJlbnRUb2tlblR5cGUoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGwuZ2V0KGkpLCBjLmN1cnJlbnRUb2tlblR5cGUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChjLnRvUHJldlRva2VuKCkgPT0gVG9rZW5UeXBlLk5PTkUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIE1ha2Ugc3VyZSB5b3UgY2FuJ3QgaW5zZXJ0IHRleHQgYmVmb3JlIHRoZSBkb2MgYmVnaW4KLSAgICAvLyBnb2luZyBiYWNrd2FyZAotICAgIC8vCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFRleHRJbnNlcnQoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBsb2FkQ2FzZSgidGVzdC54bWwiKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYy5pbnNlcnRDaGFycyggIkhvIGhvIGhvIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkRpZCBub3QgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgZmFsc2UpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gTWFrZSBzdXJlIGdldFRleHQgd29ya3MgaW4gYSBiYXNpYyB3YXkKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgdGVzdGdldFRleHQoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBsb2FkQ2FzZSgidGVzdC54bWwiKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJhYiIgKSApOyAvLyBEb2Mgbm9kZQotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0VGV4dFZhbHVlKCkuZXF1YWxzKCAiYWIiICkgKTsgLy8gRG9jIGVsZW0KLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldFRleHRWYWx1ZSgpLmVxdWFscyggInkiICkgKTsgLy8gQXR0ciB4Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRDaGFycygpLmVxdWFscyggImFiIiApICk7IC8vIFRleHQKLQotICAgICAgICBjLnRvTmV4dENoYXIoIDEgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5lcXVhbHMoICJiIiApICk7IC8vIFRleHQKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldENoYXJzKCkubGVuZ3RoKCkgPT0gMCApOyAgICAgICAvLyBFbmQgdGFnCi0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRDaGFycygpLmxlbmd0aCgpID09IDAgKTsgICAgICAgLy8gRW5kIGRvYwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gVGV4dCBYTUxJbnB1dFN0cmVhbSBzdXBwb3J0Ci0gICAgLy8KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnROYW1lICgKLSAgICAgICAgWE1MTmFtZSBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWwsIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxvY2FsICE9IG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lVXJpID0gbmFtZS5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVMb2NhbCA9IG5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lUHJlZml4ID0gbmFtZS5nZXRQcmVmaXgoKTsKLQotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVVyaSA9PSBudWxsICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lVXJpLmVxdWFscyggdXJpICkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChsb2NhbCA9PSBudWxsKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVMb2NhbCA9PSBudWxsICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lTG9jYWwuZXF1YWxzKCBsb2NhbCApICk7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVByZWZpeCA9PSBudWxsICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lUHJlZml4LmVxdWFscyggcHJlZml4ICkgKTsKLQotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBxTmFtZSA9IHByZWZpeCArICI6IiArIGxvY2FsOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyggcU5hbWUgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoIGxvY2FsICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9YbWxTdHJlYW1UZXN0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApLm5ld0N1cnNvcigpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4bWxTdHJlYW0gPSBjLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgICAgIFhtbE9iamVjdCBvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbFN0cmVhbSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggby54bWxUZXh0KCkuZXF1YWxzKCB4bWwgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NhdmVyVGVzdCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2F2ZVRlc3QgKCBTdHJpbmcgeG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZG9YbWxTdHJlYW1UZXN0KCB4bWwgKTsKLSAgICAgICAgZG9TYXZlclRlc3QoIHhtbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZpbmcgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vIHhtbG5zPVwiZm9vLmNvbVwiPjxiYXI+MTwvYmFyPjwvZm9vPiIgKTsKLSAgICAgICAgZG9TYXZlVGVzdCggIjxmb28+PCEtLWNvbW1lbnQtLT48P3RhcmdldCBmb28/PjwvZm9vPiIgKTsKLSAgICAgICAgZG9TYXZlVGVzdCggIjxmb28+YTxiYXI+YjwvYmFyPmM8YmFyPmQ8L2Jhcj5lPC9mb28+IiApOwotICAgICAgICBkb1NhdmVUZXN0KCAiPGZvbyB4bWxuczp4PVwieVwiPjxiYXIgeG1sbnM6eD1cInpcIi8+PC9mb28+IiApOwotICAgICAgICBkb1NhdmVUZXN0KCAiPGZvbyB4PVwieVwiIHA9XCJyXCIvPiIgKTsKLQotICAgICAgICBTdHJpbmcgcyA9ICI8Zm9vPmFhYTwvZm9vPmJiYiI7Ci0gICAgICAgIHMgPSBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHM7Ci0gICAgICAgIHMgPSAiPGJhcj54eHh4IiArIHMgKyAiPC9iYXI+IjsKLSAgICAgICAgCi0gICAgICAgIGRvU2F2ZVRlc3QoIHMgKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6YT0nYS5jb20nPjxiYXIgeG1sbnM6YT0nYi5jb20nLz48L2Zvbz4iICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMueG1sVGV4dCgpLmVxdWFscyggIjxiYXIgeG1sbnM6YT1cImIuY29tXCIvPiIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4bWxuczphPSdhLmNvbSc+PGJhci8+PC9mb28+IiApOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMueG1sVGV4dCgpLmVxdWFscyggIjxiYXIgeG1sbnM6YT1cImEuY29tXCIvPiIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RYTUxTdHJlYW0gKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBvID0KLSAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8Zm9vIHg9XCJ5XCIgeG1sbnM9XCJkZWZhdWx0LmNvbVwiPiIgKwotICAgICAgICAgICAgICAgICAgICAiPCEtLSB4IC0tPmJhcjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbEN1cnNvciBjID0gby5uZXdDdXJzb3IoKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIsICJiYXIuY29tIiApOwotICAgICAgICAKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzID0gYy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotCi0gICAgICAgIFhNTEV2ZW50IHhldjsKLSAgICAgICAgU3RhcnREb2N1bWVudCBzdGFydERvY3VtZW50OwotICAgICAgICBFbmREb2N1bWVudCBlbmREb2N1bWVudDsKLSAgICAgICAgU3RhcnRFbGVtZW50IHN0YXJ0RWxlbWVudDsKLSAgICAgICAgQXR0cmlidXRlSXRlcmF0b3IgYXR0cmlidXRlSXRlcmF0b3I7Ci0gICAgICAgIFN0YXJ0UHJlZml4TWFwcGluZyBzdGFydFByZWZpeE1hcHBpbmc7Ci0gICAgICAgIEVuZFByZWZpeE1hcHBpbmcgZW5kUHJlZml4TWFwcGluZzsKLSAgICAgICAgQ2hhbmdlUHJlZml4TWFwcGluZyBjcG07Ci0gICAgICAgIEVuZEVsZW1lbnQgZW5kRWxlbWVudDsKLSAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZTsKLSAgICAgICAgQ29tbWVudCBjb21tZW50OwotICAgICAgICBDaGFyYWN0ZXJEYXRhIGNoYXJhY3RlckRhdGE7Ci0gICAgICAgIFhNTE5hbWUgbmFtZTsKLSAgICAgICAgU3RyaW5nIHN0cjsKLSAgICAgICAgTWFwIG1hcDsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRE9DVU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdGFydERvY3VtZW50LmlzU3RhcnREb2N1bWVudCgpICk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBzdGFydFByZWZpeE1hcHBpbmcgPSAoU3RhcnRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc1N0YXJ0UHJlZml4TWFwcGluZygpICk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0UHJlZml4TWFwcGluZy5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJkZWZhdWx0LmNvbSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnRQcmVmaXhNYXBwaW5nLmdldFByZWZpeCgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc1N0YXJ0RWxlbWVudCgpICk7Ci0gICAgICAgIGFzc2VydE5hbWUoIHN0YXJ0RWxlbWVudC5nZXROYW1lKCksICJkZWZhdWx0LmNvbSIsICJmb28iLCBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnROYW1lKCBhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBudWxsLCAieCIsIG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpLmVxdWFscyggInkiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnROYW1lKCBhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBudWxsLCAieG1sbnMiLCBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoICJkZWZhdWx0LmNvbSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpID09IG51bGwgKTsKLSAgICAgICAgYXR0cmlidXRlSXRlcmF0b3IgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSAhPSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgIT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpID09IG51bGwgKTsKLSAgICAgICAgbmFtZSA9IG5ldyBYbWxOYW1lSW1wbCggbnVsbCwgIngiLCBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVCeU5hbWUoIG5hbWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZSAhPSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIG5hbWUgPSBuZXcgWG1sTmFtZUltcGwoIG51bGwsICJ4bWxucyIsIG51bGwgKTsKLSAgICAgICAgYXR0cmlidXRlID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZUJ5TmFtZSggbmFtZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlID09IG51bGwgKTsKLSAgICAgICAgc3RyID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZVVyaSggbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImRlZmF1bHQuY29tIiApICk7Ci0KLSAgICAgICAgeGV2ID0gc3RhcnRQcmVmaXhNYXBwaW5nID0gKFN0YXJ0UHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydFByZWZpeE1hcHBpbmcoKSApOwotICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAiYmFyLmNvbSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnRQcmVmaXhNYXBwaW5nLmdldFByZWZpeCgpLmVxdWFscyggImJhciIgKSApOwotICAgICAgICAKLSAgICAgICAgeGV2ID0gc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzU3RhcnRFbGVtZW50KCkgKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggc3RhcnRFbGVtZW50LmdldE5hbWUoKSwgImJhci5jb20iLCAiYmFyIiwgImJhciIgKTsKLSAgICAgICAgYXR0cmlidXRlSXRlcmF0b3IgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpID09IG51bGwgKTsKLSAgICAgICAgYXR0cmlidXRlSXRlcmF0b3IgPSBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydE5hbWUoIGF0dHJpYnV0ZS5nZXROYW1lKCksIG51bGwsICJiYXIiLCAieG1sbnMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoICJiYXIuY29tIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVzQW5kTmFtZXNwYWNlcygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpICE9IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VVcmkoICJiYXIiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAiYmFyLmNvbSIgKSApOwotICAgICAgICBtYXAgPSBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBtYXAuZ2V0KCAiYmFyIiApLmVxdWFscyggImJhci5jb20iICkgKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZEVsZW1lbnQoKSApOwotICAgICAgICBhc3NlcnROYW1lKCBlbmRFbGVtZW50LmdldE5hbWUoKSwgImJhci5jb20iLCAiYmFyIiwgImJhciIgKTsKLQotICAgICAgICB4ZXYgPSBlbmRQcmVmaXhNYXBwaW5nID0gKEVuZFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZFByZWZpeE1hcHBpbmcoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZW5kUHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJiYXIiICkgKTsKLQotICAgICAgICB4ZXYgPSBjb21tZW50ID0gKENvbW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkNPTU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjb21tZW50Lmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY29tbWVudC5nZXRDb250ZW50KCkuZXF1YWxzKCAiIHggIiApICk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzQ2hhcmFjdGVyRGF0YSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYmFyIiApICk7Ci0KLSAgICAgICAgeGV2ID0gZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5FTkRfRUxFTUVOVCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzRW5kRWxlbWVudCgpICk7Ci0gICAgICAgIGFzc2VydE5hbWUoIGVuZEVsZW1lbnQuZ2V0TmFtZSgpLCAiZGVmYXVsdC5jb20iLCAiZm9vIiwgbnVsbCApOwotCi0gICAgICAgIHhldiA9IGNwbSA9IChDaGFuZ2VQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNDaGFuZ2VQcmVmaXhNYXBwaW5nKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNwbS5nZXRQcmVmaXgoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0T2xkTmFtZXNwYWNlVXJpKCkuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNwbS5nZXROZXdOYW1lc3BhY2VVcmkoKS5lcXVhbHMoICIiICkgKTsKLQotICAgICAgICB4ZXYgPSBlbmREb2N1bWVudCA9IChFbmREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0RPQ1VNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzRW5kRG9jdW1lbnQoKSApOwotICAgICAgICAKLSAgICAgICAgeGV2ID0geGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldiA9PSBudWxsICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGVzdCBDaGFuZ2VQcmVmaXhNYXBwaW5nIGV2ZW50Ci0gICAgICAgIC8vCi0KLSAgICAgICAgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4bWxuczp4PVwieVwiPjxiYXIgeG1sbnM6eD1cInpcIi8+PC9mb28+IiApOwotICAgICAgICBjID0gby5uZXdDdXJzb3IoKTsKLSAgICAgICAgeGlzID0gYy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICAKLSAgICAgICAgc3RhcnREb2N1bWVudCA9IChTdGFydERvY3VtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgc3RhcnRQcmVmaXhNYXBwaW5nID0gKFN0YXJ0UHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgc3RyID0gc3RhcnRQcmVmaXhNYXBwaW5nLmdldE5hbWVzcGFjZVVyaSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggInkiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJ4IiApICk7Ci0gICAgICAgIAotICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0UHJlZml4TWFwcGluZy5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ6IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdGFydFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAieCIgKSApOwotICAgICAgICAKLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBjcG0gPSAoQ2hhbmdlUHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgc3RyID0gY3BtLmdldE9sZE5hbWVzcGFjZVVyaSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggInoiICkgKTsKLSAgICAgICAgc3RyID0gY3BtLmdldE5ld05hbWVzcGFjZVVyaSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggInkiICkgKTsKLSAgICAgICAgc3RyID0gY3BtLmdldFByZWZpeCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggIngiICkgKTsKLQotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBlbmRQcmVmaXhNYXBwaW5nID0gKEVuZFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBlbmRQcmVmaXhNYXBwaW5nLmdldFByZWZpeCgpLmVxdWFscyggIngiICkgKTsKLQotICAgICAgICBlbmREb2N1bWVudCA9IChFbmREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYgPT0gbnVsbCApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgQ2hhcmFjdGVyRGF0YSBldmVudHMKLSAgICAgICAgLy8KLQotICAgICAgICBvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmE8YmFyPmI8YmF6PmM8L2Jhej5kPC9iYXI+ZTwvZm9vPiIgKTsKLSAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJhIiApICk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJiIiApICk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImQiICkgKTsKLQotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImUiICkgKTsKLQotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBlbmREb2N1bWVudCA9IChFbmREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYgPT0gbnVsbCApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgU3ViU3RyZWFtcwotICAgICAgICAvLwotCi0gICAgICAgIG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YTxiYXI+YjxiYXo+YzwvYmF6PmQ8L2Jhcj5lPC9mb28+IiApOwotICAgICAgICBjID0gby5uZXdDdXJzb3IoKTsKLSAgICAgICAgeGlzID0gYy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICAKLSAgICAgICAgc3RhcnREb2N1bWVudCA9IChTdGFydERvY3VtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImEiICkgKTsKLQotICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImIiICkgKTsKLQotICAgICAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzMiA9IHhpcy5nZXRTdWJTdHJlYW0oKTsKLQotICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImMiICkgKTsKLQotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiZCIgKSApOwotCi0gICAgICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMyLm5leHQoKTsKLQotICAgICAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMyLm5leHQoKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImMiICkgKTsKLQotICAgICAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMyLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgeGV2ID0geGlzMi5uZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImUiICkgKTsKLQotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBlbmREb2N1bWVudCA9IChFbmREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYgPT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFhtbEN1cnNvciBuYXZEb2MgKCBYbWxPYmplY3QgeCwgU3RyaW5nIGRpcnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hdkN1cnNvciggeC5uZXdDdXJzb3IoKSwgZGlycyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFhtbEN1cnNvciBuYXZOZXdDdXJzb3IgKCBYbWxDdXJzb3IgYywgU3RyaW5nIGRpcnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hdkN1cnNvciggYy5uZXdDdXJzb3IoKSwgZGlycyApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gRm9ybWF0OgotICAgIC8vCi0gICAgLy8gICAgKCBbLV1bTl0gdHlwZSApICoKLSAgICAvLwotICAgIC8vICAgIHR5cGU6Ci0gICAgLy8KLSAgICAvLyAgICAgIGMgLSBjaGFyYWN0ZXIKLSAgICAvLyAgICAgIHQgLSB0b2tlbgotICAgIC8vICAgICAgcCAtIHBhcmVudCBlbGVtZW50Ci0gICAgLy8gICAgICBzIC0gc2libGluZyBlbGVtZW50Ci0gICAgLy8gICAgICBkIC0gZGVzY2VuZGVudCAoY2hpbGQpIGVsZW1lbnQKLSAgICAvLyAgICAgIHIgLSBlbmQgb2YgdGhlIGRvYyAocm9vdCkKLSAgICAvLyAgICAgIGIgLSBiZWdpbiBvZiB0aGUgZG9jCi0gICAgLy8KLSAgICAKLSAgICBwcml2YXRlIFhtbEN1cnNvciBuYXZDdXJzb3IgKCBYbWxDdXJzb3IgYywgU3RyaW5nIGRpcnMgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSAwOwotICAgICAgICBib29sZWFuIHByZXYgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBkaXJzLmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IGRpcnMuY2hhckF0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJldiA9ICEgcHJldjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbiA9IG4gKiAxMCArIChjaCAtICcwJyk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuID09IDApCi0gICAgICAgICAgICAgICAgbiA9IDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjaCA9PSAnYycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYpCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkNoYXIoIG4gKSA9PSBuICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRDaGFyKCBuICkgPT0gbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ3QnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJldikKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0VG9rZW4oKSAhPSBUb2tlblR5cGUuTk9ORSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdwJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBuLS0gPiAwICkKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ3InKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIHByZXYgKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbiA9PSAxICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ2InKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIHByZXYgKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbiA9PSAxICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAncycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBuLS0gPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2KQotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dFNpYmxpbmcoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdkJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBuLS0gPiAwICkKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9GaXJzdENoaWxkKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgICAgICBwcmV2ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE9wcyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHgsIHgyLCB5OwotICAgICAgICBYbWxDdXJzb3IgY0Zyb20sIGNUbywgY1RlbXAsIGNUZW1wMiwgYywgZDsKLSAgICAgICAgWG1sQm9va21hcmsgYW5ubzsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAiIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zLnB1dCgKLSAgICAgICAgICAgIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCwKLSAgICAgICAgICAgIG5ldyBRTmFtZSggbnVsbCwgImJhciIgKSApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj5bRlJPTV1bVE9dPGZvbz5hYmNkZWY8L2Zvbz48L2Jhcj4iICkgfHwKLSAgICAgICAgICAgICAgICB4LnhtbFRleHQoIG9wdGlvbnMgKS5lcXVhbHMoICI8YmFyPltUT11bRlJPTV08Zm9vPmFiY2RlZjwvZm9vPjwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YWJjZGVmPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAidHR0IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj5bRlJPTV08Zm9vPmFiY2RlZjwvZm9vPltUT108L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgInQzYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dPGZvbz5hYmNbVE9dZGVmPC9mb28+PC9iYXI+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj48L3I+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgInItMXQiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxyPltGUk9NXTxiPnBxcjwvYj48YT54eXo8L2E+W1RPXTwvcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PGI+cHFyPC9iPkFCPC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJyLTF0LTFjIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wcXI8L2I+QTxhPnh5ejwvYT5bVE9dQjwvcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PGI+cHFyPC9iPkFCPC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJzdGMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxyPltGUk9NXTxiPnA8YT54eXo8L2E+W1RPXXFyPC9iPkFCPC9yPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+QUI8L3I+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8YT54eXo8L2E+W1RPXTxyPltGUk9NXTxiPnBxcjwvYj5BQjwvcj4iICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJyIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoIG9wdGlvbnMgKS5lcXVhbHMoICI8YmFyPjxyPltGUk9NXTxiPnBxcjwvYj5BQjwvcj48YT54eXo8L2E+W1RPXTwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48L3I+IiApOwotICAgICAgICB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHM+PC9zPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeDIsICJkdCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPC9yPiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeDIueG1sVGV4dCgpLmVxdWFscyggIjxzPjxhPnh5ejwvYT5bVE9dPC9zPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnBxPC9hPjxiPjwvYj48L3I+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZGRzdCIgKTsKLSAgICAgICAgY1RlbXAgPSBuYXZEb2MoIHgsICJkZHQxYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotICAgICAgICBjVGVtcC5pbnNlcnRDaGFycyggIltURU1QXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxyPltGUk9NXVtURU1QXTxiPjxhPnBxPC9hPltUT108L2I+PC9yPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YWJjZGVmPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIydDJjIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAiLTFjIiApOwotICAgICAgICBjRnJvbS5tb3ZlQ2hhcnMoIDIsIGNUbyApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+YWNkW1RPXWJbRlJPTV1lZjwvZm9vPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YWJjZGVmPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIydDJjIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAiM2MiICk7Ci0gICAgICAgIGNGcm9tLm1vdmVDaGFycyggMiwgY1RvICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbz5hYltGUk9NXWVjZFtUT11mPC9mb28+IiApICk7Ci0gICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjxmb28+YWJjZGVmPC9mb28+PGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjN0MmMiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICIzdDNjIiApOwotICAgICAgICBjRnJvbS5tb3ZlQ2hhcnMoIDIsIGNUbyApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj48Zm9vPmFiW0ZST01dZWY8L2Zvbz48Zm9vPjEyM2NkW1RPXTQ1NjwvZm9vPjwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXI+PGZvbz5hYmNkZWY8L2Zvbz48Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMmQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIjJkc3QyYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICI8YmFyPltGUk9NXTxmb28+YWJjZGVmPC9mb28+PGZvbz4xMiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjxmb28+YWJjZGVmPC9mb28+W1RPXTM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKLQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjwvcj4iICk7Ci0gICAgICAgIHgyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cz48L3M+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4MiwgImR0IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29weVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08YT54eXo8L2E+PC9yPiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeDIueG1sVGV4dCgpLmVxdWFscyggIjxzPjxhPnh5ejwvYT5bVE9dPC9zPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICI8YmFyPjxmb28+YWJjZGVmPC9mb28+YmxhaDxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIyZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzdDJjIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29weVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgIjxiYXI+W0ZST01dPGZvbz5hYmNkZWY8L2Zvbz5ibGFoPGZvbz4xMiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjxmb28+YWJjZGVmPC9mb28+W1RPXTM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhcj48Zm9vIHg9J3knPmFiY2RlZjwvZm9vPjxmb28+MTIzNDU2PC9mb28+Nzg5MDwvYmFyPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMmR0IiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIyZHN0IiApOwotICAgICAgICBjVGVtcCA9IG5hdkRvYyggeCwgIjJkc3QzYyIgKTsKLSAgICAgICAgY1RlbXAyID0gbmF2RG9jKCB4LCAiMmRzM3QyYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7Ci0gICAgICAgIGNUZW1wLmluc2VydENoYXJzKCAiW1RFTVBdIiApOwotICAgICAgICBjVGVtcDIuaW5zZXJ0Q2hhcnMoICJbVEVNUDJdIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICI8YmFyPjxmb28geD1cInlcIj5hYmNkZWY8L2Zvbz4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxmb28geD1cInlcIj4xMjNbVEVNUF00NTY8L2Zvbz43OFtURU1QMl05MDwvYmFyPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhcj54eTxmb28geD0neSc+YWJjZGVmPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIyZHMtMmMiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ucmVtb3ZlWG1sKCkgKTsKLQotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj54eVtGUk9NXXBbVE9dcXI8Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICI8YmFyPnh5PGZvbyB4PSd5Jz5hYmNkZWY8L2Zvbz5wcXI8Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMmQydDJjIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIyZDJ0NWMiICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbS5yZW1vdmVDaGFycyggMiApOwotCi0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICI8YmFyPnh5PGZvbyB4PVwieVwiPmFiW0ZST01dZVtUT11mIiArCi0gICAgICAgICAgICAgICAgICAgICI8L2Zvbz5wcXI8Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXI+PCEtLS0tPmFiYzwvYmFyPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAidHQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInR0dGMiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ucmVtb3ZlWG1sKCkgKTsKLQotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhcj5bRlJPTV1hW1RPXWJjPC9iYXI+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInQiICk7Ci0gICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAiYm9vIiApOwotICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKLSAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJtb28iICk7Ci0gICAgICAgIGNUby50b1ByZXZUb2tlbigpOwotICAgICAgICBjVG8uaW5zZXJ0RWxlbWVudCggImdvbyIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgIjxib28+PG1vbz48Z29vLz48L21vbz48L2Jvbz4iICkgKTsKLQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAidCIgKTsKLSAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJib28iICk7Ci0gICAgICAgIGNUby50b1ByZXZUb2tlbigpOwotICAgICAgICBjVG8uaW5zZXJ0RWxlbWVudCggIm1vbyIgKTsKLSAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7Ci0gICAgICAgIGNUby5pbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoICJ4IiwgInkiICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8Ym9vPjxtb28geD1cInlcIi8+PC9ib28+IiApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyIHg9J3knPmFiYzwvYmFyPiIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAidHQiICk7Ci0gICAgICAgIGNUby5pbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoICJwIiwgInEiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgIjxiYXIgcD1cInFcIiB4PVwieVwiPmFiYzwvYmFyPiIgKSApOwotCi0gICAgICAgIC8vIFRleHQgWG1sQm9va21hcmsKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48Zm9vPmFiYzwvZm9vPjxiYXI+PC9iYXI+PC9yPiIgKTsKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJ0dCIgKTsKLSAgICAgICAgYW5ubyA9IG5ldyBBbm5vKCk7Ci0gICAgICAgIGNGcm9tLnNldEJvb2ttYXJrKCBhbm5vICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIjZ0IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0gICAgICAgIGFubm8uY3JlYXRlQ3Vyc29yKCkuaW5zZXJ0Q2hhcnMoICJbQU5OT10iICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgIjxyPltGUk9NXTxiYXI+W0FOTk9dPGZvbz5hYmM8L2Zvbz5bVE9dPC9iYXI+PC9yPiIgKSApOwotCi0gICAgICAgIC8vIFRlc3QgY29udGVudCBvcHMKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J3knPmFiYzwvZm9vPiIgKTsKLSAgICAgICAgeSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGQgPSB5Lm5ld0N1cnNvcigpOwotICAgICAgICBkLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIHgubmV3Q3Vyc29yKCkubW92ZVhtbENvbnRlbnRzKCBkICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB5LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vIHg9XCJ5XCI+YWJjPC9mb28+IiApICk7Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjxmb28geD0neSc+YWJjPC9mb28+PC9iYXI+IiApOwotICAgICAgICB5ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgZCA9IHkubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGQudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5tb3ZlWG1sQ29udGVudHMoIGQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHkueG1sVGV4dCgpLmVxdWFscyggIjxmb28geD1cInlcIj5hYmM8L2Zvbz4iICkgKTsKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjxmb28geD0neSc+YWJjPC9mb28+PC9iYXI+IiApOwotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnJlbW92ZVhtbENvbnRlbnRzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8YmFyLz4iICkgKTsKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J3knPmFiYzwvZm9vPiIgKTsKLSAgICAgICAgeSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGQgPSB5Lm5ld0N1cnNvcigpOwotICAgICAgICBkLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIHgubmV3Q3Vyc29yKCkuY29weVhtbENvbnRlbnRzKCBkICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB5LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vIHg9XCJ5XCI+YWJjPC9mb28+IiApICk7Ci0gICAgfSAgICAgICAgCi0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFubm8gZXh0ZW5kcyBYbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICBYbWxDdXJzb3IgY1RvOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YWJjZGVmPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+YWJjZGVmPC9mb28+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YSZsdDtiJmFtcDtjPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+YSZsdDtiJmFtcDtjPC9mb28+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+PC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZHQiICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIiY8IiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+JmFtcDsmbHQ7PC9mb28+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+PGJvbz5iYXI8L2Jvbz48L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkdCIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxib28+YmFyPC9ib28+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+PGJvbyB4PVwieVwiPmJhcjwvYm9vPjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNUby54bWxUZXh0KCkuZXF1YWxzKCAiPGJvbyB4PVwieVwiPmJhcjwvYm9vPiIgKSApOwotCi0gICAgICAgIC8vIFRlc3RzIGZyYWdtZW50IHNhdmluZyBhbmQgbG9hZGluZwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5FcmljPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZHQiICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBjVG8ueG1sVGV4dCgpICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLmdldFRleHRWYWx1ZSgpLmVxdWFscyggIkVyaWMiICkgKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgd2hlcmUgSSByZXBsYWNlIHRoZSBuYW1lIG9mIGFuIGVsZW1lbnQKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+RXJpYzwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImQiICk7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMucHV0KAotICAgICAgICAgICAgWG1sT3B0aW9ucy5TQVZFX1NZTlRIRVRJQ19ET0NVTUVOVF9FTEVNRU5ULAotICAgICAgICAgICAgbmV3IFFOYW1lKCBudWxsLCAiYmFyIiApICk7Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIGNUby54bWxUZXh0KCBvcHRpb25zICkgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIiIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+RXJpYzwvYmFyPiIgKSApOwotCi0gICAgICAgIC8vIHRlc3Qgc2F2ZSB3aGVyZSBJIHJlcGxhY2UgdGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPkVyaWM8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7Ci0KLSAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zLnB1dCgKLSAgICAgICAgICAgIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCwKLSAgICAgICAgICAgIG5ldyBRTmFtZSggbnVsbCwgImJhciIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBjVG8ueG1sVGV4dCggb3B0aW9ucyApICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIGNUby54bWxUZXh0KCkuZXF1YWxzKCAiPGJhcj48Zm9vPkVyaWM8L2Zvbz48L2Jhcj4iICkgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGEgeG1sbnM9J2ZvbycvPiIgKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOwotCi0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImIiICk7Ci0gICAgICAgIGMudG9QcmV2U2libGluZygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4LnhtbFRleHQoKSApOwotICAgICAgICAKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIAotICAgICAgICBjLnRvRmlyc3RDb250ZW50VG9rZW4oKTsKLSAgICAgICAgYy50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImIiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFRleHRGcmFnICggU3RyaW5nIGFjdHVhbCwgU3RyaW5nIGV4cGVjdGVkICkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcmUgPSAiPHhtbC1mcmFnbWVudD4iOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBvc3QgPSAiPC94bWwtZnJhZ21lbnQ+IjsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhY3R1YWwuc3RhcnRzV2l0aCggcHJlICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGFjdHVhbC5lbmRzV2l0aCggcG9zdCApICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIGV4cGVjdGVkLmVxdWFscygKLSAgICAgICAgICAgICAgICBhY3R1YWwuc3Vic3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBwcmUubGVuZ3RoKCksIGFjdHVhbC5sZW5ndGgoKSAtIHBvc3QubGVuZ3RoKCkgKSApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRnJhZyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIFhtbEN1cnNvciBjOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLmluc2VydENoYXJzKCAiRXJpYyIgKTsKLQotICAgICAgICB0ZXN0VGV4dEZyYWcoIHgueG1sVGV4dCgpLCAiRXJpYyIgKTsKLQotICAgICAgICAvLwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydENvbW1lbnQoICIiICk7Ci0gICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJ4IiApOwotICAgICAgICAKLSAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIjwhLS0tLT54IiApOwotCi0gICAgICAgIC8vCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImZvbyIgKTsKLSAgICAgICAgYy5pbnNlcnRDaGFycyggIngiICk7Ci0gICAgICAgIAotICAgICAgICB0ZXN0VGV4dEZyYWcoIHgueG1sVGV4dCgpLCAiPGZvby8+eCIgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImZvbyIgKTsKLSAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiYmFyIiApOwotICAgICAgICAKLSAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIjxmb28vPjxiYXIvPiIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdExvYWQgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICAKLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkxPQURfUkVQTEFDRV9ET0NVTUVOVF9FTEVNRU5ULCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB4ID0KLSAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8YmFyIHA9J3EnIHg9J3knPmFiPGZvbz54eTwvZm9vPmNkPC9iYXI+Iiwgb3B0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBuYXZEb2MoIHgsICJ0IiApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpID09IFRva2VuVHlwZS5BVFRSICk7Ci0KLSAgICAgICAgU3RyaW5nIG9wZW4gPSAieG1sbnM6b3Blbj0naHR0cDovL3d3dy5vcGVudXJpLm9yZy9mcmFnbWVudCciOwotICAgICAgICAKLSAgICAgICAgeCA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPG9wZW46ZnJhZ21lbnQgcD0ncScgeD0neScgIiArIG9wZW4gKwotICAgICAgICAgICAgICAgICAgICAiPmFiPGZvbz54eTwvZm9vPmNkPC9vcGVuOmZyYWdtZW50PiIgKTsKLSAgICAgICAgCi0gICAgICAgIGMgPSBuYXZEb2MoIHgsICJ0IiApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpID09IFRva2VuVHlwZS5BVFRSICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgWG1sQ3Vyc29yIGNGcm9tLCBjVG87Ci0KLSAgICAgICAgLy8gRm9yd2FyZCBuYXZpZ2F0aW9uIAotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciBwPSdxJyB4PSd5Jz5hYjxmb28+eHk8L2Zvbz5jZDwvYmFyPiIgKTsKLQotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIiIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotICAgICAgICAgICAgCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb21wYXJlUG9zaXRpb24oIGNUbyApID09IDAgKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5pc0F0U2FtZVBvc2l0aW9uQXMoIGNUbyApICk7Ci0KLSAgICAgICAgICAgIFRva2VuVHlwZSB0dCA9IGNGcm9tLmN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHR0ID09IFRva2VuVHlwZS5FTkRET0MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0dCA9PSBUb2tlblR5cGUuVEVYVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjRnJvbS50b05leHRDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgY1RvLnRvTmV4dENoYXIoIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjRnJvbS50b05leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGNUby50b05leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQmFja3dhcmQgbmF2aWdhdGlvbiAKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+Y2Q8L2Jhcj4iICk7Ci0KLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJyIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJyIiApOwotICAgICAgICAgICAgCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb21wYXJlUG9zaXRpb24oIGNUbyApID09IDAgKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5pc0F0U2FtZVBvc2l0aW9uQXMoIGNUbyApICk7Ci0KLSAgICAgICAgICAgIGlmIChjRnJvbS50b1ByZXZDaGFyKCAxICkgPT0gMSkKLSAgICAgICAgICAgICAgICBjVG8udG9QcmV2Q2hhciggMSApOwotICAgICAgICAgICAgZWxzZSBpZiAoY0Zyb20udG9QcmV2VG9rZW4oKSAhPSBUb2tlblR5cGUuTk9ORSkKLSAgICAgICAgICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhciBwPSdxJyB4PSd5Jz5hYjxmb28+eHk8L2Zvbz5jPGYgeT0neCc+eHk8L2Y+ZDwvYmFyPiIgKTsKLQotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIiIgKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNUby5pc0F0U2FtZVBvc2l0aW9uQXMoIGNGcm9tICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXBhc3NlZCApOwotICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjVG8uaXNMZWZ0T2YoIGNGcm9tICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXBhc3NlZCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggcGFzc2VkICk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjVG8uaXNSaWdodE9mKCBjRnJvbSApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjVG8udG9OZXh0Q2hhciggMSApICE9IDEpCi0gICAgICAgICAgICAgICAgICAgIGlmIChjVG8udG9OZXh0VG9rZW4oKSA9PSBUb2tlblR5cGUuRU5ERE9DKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjRnJvbS50b05leHRDaGFyKCAxICkgIT0gMSkKLSAgICAgICAgICAgICAgICBpZiAoY0Zyb20udG9OZXh0VG9rZW4oKSA9PSBUb2tlblR5cGUuRU5ERE9DKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBNeUFubm8gZXh0ZW5kcyBYbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbiAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28vPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIE15QW5ubyBhID0gbmV3IE15QW5ubygpOwotICAgICAgICBjLnNldEJvb2ttYXJrKCBhICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnJlbW92ZVhtbCgpICk7Ci0gICAgICAgIFhtbEN1cnNvciBjMiA9IGEuY3JlYXRlQ3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjMiA9PSBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyU2V0dGVyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvby8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5zZXRBdHRyaWJ1dGVUZXh0KCBuZXcgUU5hbWUoIG51bGwsICJ4IiApLCAiaGFyZGVoYXIiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vIHg9XCJoYXJkZWhhclwiLz4iICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb24gKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YT48eC8+PHkvPjx6Lz48L2E+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dFNpYmxpbmcoKSA9PSBmYWxzZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9GaXJzdEF0dHJpYnV0ZSgpID09IGZhbHNlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTGFzdEF0dHJpYnV0ZSgpID09IGZhbHNlICk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YSBwPSdxJyBtPSduJz48eC8+PHkvPjx6Lz48L2E+IiApOwotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc0F0dHIoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpLmlzQXR0cigpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dFNpYmxpbmcoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ4IiApICk7Ci0KLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICBjLnRvUHJldlRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ6IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ4IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSA9PSBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICBjLnRvUHJldlRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1BhcmVudCgpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnRkb2MoKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGE+bW9vPCEtLS0tPmZvbzwvYT4iICk7Ci0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvU3RhcnREb2MoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvU3RhcnREb2MoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1BhcmVudCgpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImEiICkgKTsKLQotICAgICAgICBjLnRvU3RhcnREb2MoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dENoYXIoIDIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmVhcmx5PGJhcj50ZXh0PGNoYXI+emFwPC9jaGFyPjwvYmFyPjwvZm9vPiIgKTsKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b0ZpcnN0Q2hpbGQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldFRleHRWYWx1ZSgpLmVxdWFscyggInphcCIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhIHg9J3knPmVyaWM8IS0tLS0+PD9tb28/PjwvYT4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImEiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggIngiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggIm1vbyIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkgPT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkgPT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFycyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+YWJjZGVmZ2hpamtsPC9mb28+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dENoYXIoIDIgKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsgMyBdOwotICAgICAgICBpbnQgbiA9IGMuZ2V0Q2hhcnMoIGJ1ZiwgMCwgNDAwICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYnVmWzBdID09ICdjJyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYnVmWzFdID09ICdkJyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYnVmWzJdID09ICdlJyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlU3Vic3RpdHV0aW9uICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBIYXNoTWFwIHN1YnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBzdWJzLnB1dCggImZvbyIsICJtb28iICk7Ci0gICAgICAgIHN1YnMucHV0KCAiYSIsICJiIiApOwotICAgICAgICAKLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuTE9BRF9TVUJTVElUVVRFX05BTUVTUEFDRVMsIHN1YnMgKTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGEgeG1sbnM9J2ZvbycgeG1sbnM6YT0nYScgYTp4PSd5Jy8+IiwKLSAgICAgICAgICAgICAgICBvcHRpb25zICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggIm1vbyIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAibW9vIiApICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJiIiApICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJiIiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lc3BhY2VJbnNlcnRpb24gKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iLCAiaHR0cDovL3AuY29tIiApOwotICAgICAgICBjLnRvUHJldlRva2VuKCk7Ci0gICAgICAgIGMuaW5zZXJ0TmFtZXNwYWNlKCAicCIsICJodHRwOi8vcC5jb20iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cDpmb28geG1sbnM6cD1cImh0dHA6Ly9wLmNvbVwiLz4iICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG90ZXN0UGFyc2VyICggU3RyaW5nIHhtbCwgU3RyaW5nIHhtbFJlc3VsdCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0geC54bWxUZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4bWxSZXN1bHQuZXF1YWxzKCByZXN1bHQgKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZG90ZXN0UGFyc2VyRXJyb3JzICggU3RyaW5nIHhtbCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWwgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gbm9OYW1lc3BhY2UuQ2FuQmVOaWxEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCAiPGNhbkJlTmlsLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgWG1sT2JqZWN0IGZjID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgZmMuaXNOaWwoKSApOwotICAgICAgICBmYy5zZXROaWwoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZjLmlzTmlsKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxjYW5CZU5pbCB4c2k6bmlsPVwidHJ1ZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIvPiIgKSApOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmlzQXR0cigpICk7Ci0gICAgICAgIGMucmVtb3ZlWG1sKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Y2FuQmVOaWwvPiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBmYy5pc05pbCgpICk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXIgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxoZWUgeWVlPSdmaXZlJz48aGF3PjY2PC9oYXc+PC9hbnk+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vPjwvbW9vPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGE+PGZvbz48L21vbz48L2E+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICIiICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIiAgICAiICk7Ci0gICAgICAgIAotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICJoYXIiICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjwhLS0gY29tbWVudCAtLT4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjw/bW9vPz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGEkLz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxmb28gYT0nPCc+PC9mb28+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vIGE+PC9mb28+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPC9mb28+IiApOwotLy8gRml4IHRoZSBwYXJzZXIgdG8gbWFrZSB0aGVzZSB3b3JrCi0vLyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48IS0tIC0tIC0tPjwvZm9vPiIgKTsKLS8vICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vPjwhLS0gLS0tPjwvZm9vPiIgKTsKLQotICAgICAgICBkb3Rlc3RQYXJzZXIoICI8YSBiPVwieFxuXG55XCIvPiIsICI8YSBiPVwieCAgeVwiLz4iICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXhQYXJzZXIgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyB4bWwgPSAgIjxhIHg9J3knPjwhLS0tLT54PGIvPjxjIHA9J3EnPno8L2M+PC9hPiI7Ci0gICAgICAgIAotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU0FYUGFyc2VyIHNwID0gc3BmLm5ld1NBWFBhcnNlcigpOwotICAgICAgICBYTUxSZWFkZXIgeHIgPSBzcC5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoIG5ldyBTdHJpbmdSZWFkZXIoICB4bWwgKSApOwotICAgICAgICBYbWxTYXhIYW5kbGVyIHNoID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3WG1sU2F4SGFuZGxlcigpOwotICAgICAgICAKLSAgICAgICAgeHIuc2V0RmVhdHVyZSgKLSAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwKLSAgICAgICAgICAgIHRydWUgKTsKLQotICAgICAgICB4ci5zZXRGZWF0dXJlKAotICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSApOwotCi0gICAgICAgIHhyLnNldEZlYXR1cmUoCi0gICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSApOwotCi0gICAgICAgIHhyLnNldENvbnRlbnRIYW5kbGVyKCBzaC5nZXRDb250ZW50SGFuZGxlcigpICk7Ci0gICAgICAgIAotICAgICAgICB4ci5zZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAotICAgICAgICAgICAgc2guZ2V0TGV4aWNhbEhhbmRsZXIoKSApOwotCi0gICAgICAgIHhyLnBhcnNlKCBpcyApOwotCi0gICAgICAgIFhtbE9iamVjdCB4MSA9IHNoLmdldE9iamVjdCgpOwotCi0gICAgICAgIFhtbE9iamVjdCB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeDEueG1sVGV4dCgpLmVxdWFscyggeDIueG1sVGV4dCgpICkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3Vic3RHcm91cFRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3Vic3RHcm91cFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzAzMjkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N1YnN0R3JvdXBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9ybWFsaXplZFN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gVHlwZXMgZnJvbSBzdWJzdGdyb3VwLnhzZAotaW1wb3J0IG9yZy5vcGVudXJpLnNncy5BRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkuc2dzLkJEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5zZ3MuQ0RvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLnNncy5Sb290RG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFN1YnN0R3JvdXBUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIFN1YnN0R3JvdXBUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3Vic3RHcm91cFRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbDEgPSAiPHJvb3QgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPiIgKwotICAgICAgICAgICAgIjxBPlx0YVx0YVx0PC9BPiIgKwotICAgICAgICAgICAgIjxCPlx0Ylx0Ylx0PC9CPiIgKwotICAgICAgICAgICAgIjxDPlx0Y1x0Y1x0PC9DPiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iOwotCi0KLSAgICAgICAgUm9vdERvY3VtZW50IGRvYzEgPSBSb290RG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwxKTsKLSAgICAgICAgUm9vdERvY3VtZW50LlJvb3Qgcm9vdCA9IGRvYzEuZ2V0Um9vdCgpOwotICAgICAgICBhc3NlcnRUcnVlKGRvYzEudmFsaWRhdGUoKSk7Ci0KLSAgICAgICAgWG1sU3RyaW5nIGEgPSByb290LnhnZXRBQXJyYXkoMCk7Ci0gICAgICAgIGFzc2VydFRydWUoYS5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbFN0cmluZy50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXHRhXHRhXHQiLCBhLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIFhtbFN0cmluZyBiID0gcm9vdC54Z2V0QUFycmF5KDEpOwotICAgICAgICBhc3NlcnRUcnVlKGIuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxOb3JtYWxpemVkU3RyaW5nLnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIgYiBiICIsIGIuc3RyaW5nVmFsdWUoKSk7Ci0KLSAgICAgICAgWG1sU3RyaW5nIGMgPSByb290LnhnZXRBQXJyYXkoMik7Ci0gICAgICAgIGFzc2VydFRydWUoYy5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbFRva2VuLnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIGMiLCBjLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIHJvb3QuaW5zZXJ0QSgyLCAiZCBkIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZCBkIiwgcm9vdC5nZXRBQXJyYXkoMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcm9vdC5zaXplT2ZBQXJyYXkoKSk7Ci0gICAgICAgIHJvb3QucmVtb3ZlQSgyKTsKLQotICAgICAgICByb290LnJlbW92ZUEoMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYyBjIiwgcm9vdC5nZXRBQXJyYXkoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcm9vdC5zaXplT2ZBQXJyYXkoKSk7Ci0KLSAgICAgICAgcm9vdC5hZGRBKCJmIGYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImYgZiIsIHJvb3QuZ2V0QUFycmF5KDIpKTsKLQotICAgICAgICAvLyBUZXN0IGFycmF5IHNldHRlcnMKLQotICAgICAgICAvLyB0ZXN0IG0gPCBuIGNhc2UKLSAgICAgICAgU3RyaW5nW10gc21hbGxlciA9IG5ldyBTdHJpbmdbXXsgIngiLCAieSIgfTsKLSAgICAgICAgcm9vdC5zZXRBQXJyYXkoc21hbGxlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByb290LnNpemVPZkFBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ5Iiwgcm9vdC5nZXRBQXJyYXkoMSkpOwotCi0gICAgICAgIC8vIHRlc3QgbSA+IG4gY2FzZQotICAgICAgICBTdHJpbmdbXSBsYXJnZXIgPSBuZXcgU3RyaW5nW10geyAicCIsICJxIiwgInIiLCAicyIgfTsKLSAgICAgICAgcm9vdC5zZXRBQXJyYXkobGFyZ2VyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInIiLCByb290LmdldEFBcnJheSgyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbDEgPSAiPEEgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPlx0YVx0YVx0PC9BPiI7Ci0gICAgICAgIFN0cmluZyB4bWwyID0gIjxCIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz5cdGJcdGJcdDwvQj4iOwotICAgICAgICBTdHJpbmcgeG1sMyA9ICI8QyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+XHRjXHRjXHQ8L0M+IjsKLQotICAgICAgICBBRG9jdW1lbnQgZDEgPSBBRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwxKTsKLSAgICAgICAgWG1sU3RyaW5nIGEgPSBkMS54Z2V0QSgpOwotICAgICAgICBhc3NlcnRUcnVlKGEuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxTdHJpbmcudHlwZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlx0YVx0YVx0IiwgYS5zdHJpbmdWYWx1ZSgpKTsKLQotICAgICAgICBBRG9jdW1lbnQgZDIgPSBBRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwyKTsKLSAgICAgICAgWG1sU3RyaW5nIGIgPSBkMi54Z2V0QSgpOwotICAgICAgICBhc3NlcnRUcnVlKGQyLnNjaGVtYVR5cGUoKS5lcXVhbHMoQkRvY3VtZW50LnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sTm9ybWFsaXplZFN0cmluZy50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIGIgYiAiLCBiLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIEFEb2N1bWVudCBkMyA9IEFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHhtbDMpOwotICAgICAgICBYbWxTdHJpbmcgYyA9IGQzLnhnZXRBKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZDMuc2NoZW1hVHlwZSgpLmVxdWFscyhDRG9jdW1lbnQudHlwZSkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxUb2tlbi50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYyBjIiwgYy5zdHJpbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGludmFsaWRTY2hlbWFzID0gCi0gICAgewotICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnN0cmluZycvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDppbnQnIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz4gIiArCi0gICAgICAgICIgICAgPHhzZDpzZXF1ZW5jZT4gIiArCi0gICAgICAgICIgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0nYmFyJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiIgKwotICAgICAgICAiICAgIDwveHNkOnNlcXVlbmNlPiAiICsKLSAgICAgICAgIiAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnIGZpbmFsPScjYWxsJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnIGZpbmFsPSdyZXN0cmljdGlvbicvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDp0b2tlbicgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdCJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0MnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdDJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nRCcvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0QnIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdFJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nRScgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDp0b2tlbicgc3Vic3RpdHV0aW9uR3JvdXA9J0InLz4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdCJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0NvbXBsZXgnPiAiICsKLSAgICAgICAgIiAgICA8eHNkOmNvbXBsZXhUeXBlPiAiICsKLSAgICAgICAgIiAgICAgIDx4c2Q6Y2hvaWNlPiAiICsKLSAgICAgICAgIiAgICAgICAgPHhzZDplbGVtZW50IHJlZj0nQScvPiIgKwotICAgICAgICAiICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdCJy8+IiArCi0gICAgICAgICIgICAgICA8L3hzZDpjaG9pY2U+ICIgKwotICAgICAgICAiICAgIDwveHNkOmNvbXBsZXhUeXBlPiAiICsKLSAgICAgICAgIiAgPC94c2Q6ZWxlbWVudD4gIiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB2YWxpZFNjaGVtYXMgPSAKLSAgICB7Ci0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLSAgICAgICAgIiAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJz4iICsKLSAgICAgICAgIiAgICA8eHNkOmFsbD4iICsKLSAgICAgICAgIiAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J2hlYWQnLz4iICsKLSAgICAgICAgIiAgICA8L3hzZDphbGw+IiArCi0gICAgICAgICIgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAiICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3RyJz4iICsKLSAgICAgICAgIiAgICA8eHNkOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAiICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZSc+IiArCi0gICAgICAgICIgICAgICAgICA8eHNkOmFsbD4iICsKLSAgICAgICAgIiAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ndGFpbCcvPiIgKwotICAgICAgICAiICAgICAgICAgPC94c2Q6YWxsPiIgKwotICAgICAgICAiICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPiIgKwotICAgICAgICAiICAgIDwveHNkOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAiICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J2hlYWQnIHR5cGU9J3hzZDpzdHJpbmcnLz4iICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J3RhaWwnIHN1YnN0aXR1dGlvbkdyb3VwPSdoZWFkJy8+IiArCi0gICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLSAgICB9OwotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTY2hlbWFEb2N1bWVudFtdIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbaW52YWxpZFNjaGVtYXMubGVuZ3RoXTsKLQotICAgICAgICAvLyBQYXJzZSB0aGUgaW52YWxpZCBzY2hlbWEgZmlsZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgaW52YWxpZFNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgc2NoZW1hc1tpXSA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoaW52YWxpZFNjaGVtYXNbaV0pOwotCi0gICAgICAgIC8vIE5vdyBjb21waWxlIHRoZSBpbnZhbGlkIHNjaGVtYXMsIHRlc3QgdGhhdCB0aGV5IGZhaWwKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10ge3NjaGVtYXNbaV19KTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTY2hlbWEgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGNvbXBpbGU6XG4iICsgaW52YWxpZFNjaGVtYXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBzdWNjZXNzKSB7IC8qIFN5c3RlbS5vdXQucHJpbnRsbihzdWNjZXNzKTsgKi8gfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBQYXJzZSB0aGUgdmFsaWQgc2NoZW1hIGZpbGVzCi0gICAgICAgIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbdmFsaWRTY2hlbWFzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh2YWxpZFNjaGVtYXNbaV0pOwotCi0gICAgICAgIC8vIE5vdyBjb21waWxlIHRoZSB2YWxpZCBzY2hlbWFzLCB0ZXN0IHRoYXQgdGhleSBzdWNjZWVkCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHtzY2hlbWFzW2ldfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGZhaWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gY29tcGlsZSBzY2hlbWE6ICIgKyBzY2hlbWFzW2ldICsgIiB3aXRoIGVycm9yOiAiICsgZmFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGludmFsaWREb2NzID0gCi0gICAgewotICAgICAgICAiPGFic3RyYWN0VGVzdCB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+IiArCi0gICAgICAgICIgICAgPGFic3RyYWN0PmNvbnRlbnQ8L2Fic3RyYWN0PiAiICsKLSAgICAgICAgIjwvYWJzdHJhY3RUZXN0PiAiLAotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHZhbGlkRG9jcyA9IAotICAgIHsKLSAgICAgICAgIjxhYnN0cmFjdFRlc3QgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPiIgKwotICAgICAgICAiICAgIDxjb25jcmV0ZT5jb250ZW50PC9jb25jcmV0ZT4gIiArCi0gICAgICAgICI8L2Fic3RyYWN0VGVzdD4gIiwKLSAgICB9OwotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB0aHJvd3MgRXhjZXB0aW9uIAotICAgIHsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpbnZhbGlkRG9jcy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCB4byA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGludmFsaWREb2NzW2ldKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkRvYyB3YXMgdmFsaWQuIFNob3VsZCBiZSBpbnZhbGlkOiAiICsgaW52YWxpZERvY3NbaV0sIAotICAgICAgICAgICAgICAgICEgeG8udmFsaWRhdGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWxpZERvY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSh2YWxpZERvY3NbaV0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRG9jIHdhcyBpbnZhbGlkLiBTaG91bGQgYmUgdmFsaWQ6ICIgKyB2YWxpZERvY3NbaV0sCi0gICAgICAgICAgICAgICAgeG8udmFsaWRhdGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0RW52LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdEVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU4NDAwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0RW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEVudgotewotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZndyb290ID0gZ2V0Um9vdEZpbGUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGNhc2Vyb290ID0gbmV3IEZpbGUoZndyb290LCAidGVzdC9jYXNlcyIpOwotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgb3V0cHV0cm9vdCA9IG5ldyBGaWxlKGZ3cm9vdCwgImJ1aWxkL3Rlc3Qvb3V0cHV0Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Um9vdEZpbGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJ4YmVhbi5yb290ZGlyIiApICkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIHhiZWFuQ2FzZShTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuZXcgRmlsZShjYXNlcm9vdCwgc3RyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIHhiZWFuT3V0cHV0KFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBGaWxlIHJlc3VsdCA9IChuZXcgRmlsZShvdXRwdXRyb290LCBzdHIpKTsKLSAgICAgICAgRmlsZSBwYXJlbnRkaXIgPSByZXN1bHQuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBwYXJlbnRkaXIubWtkaXJzKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbHRyZWUoRmlsZSBkaXIpCi0gICAgewotICAgICAgICBpZiAoZGlyLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGlzdCA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBkZWx0cmVlKG5ldyBGaWxlKGRpciwgbGlzdFtpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaXIuZGVsZXRlKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZSAiICsgZGlyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Rlc3RSdW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWRmOGMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Rlc3RSdW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJ1blV0aWwKLXsKLSAgICAvKioKLSAgICAgKiBSdW5zIG1ldGhvZCB0aGF0IG11c3QgYmUgZGVjbGFyZWQgInN0YXRpYyB2b2lkIHRlc3QoKSIgb24gdGhlIGdpdmVuCi0gICAgICogY2xhc3MsIHdpdGggdGhlIGdpdmVuIGFkZGl0aW9uYWwgamFycyBvciBkaXJlY3RvcmllcyBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU3RyaW5nIGNsYXNzbmFtZSwgRmlsZVtdIGNsYXNzcGF0aCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSdW5uaW5nICIgKyBjbGFzc25hbWUgKyAiIHdpdGggY2xhc3NwYXRoOiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKGNsYXNzcGF0aFtpXSk7Ci0gICAgICAgICAgICBpZiAoIWNsYXNzcGF0aFtpXS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzc3BhdGggY29tcG9uZW50ICIgKyBjbGFzc3BhdGggKyAiIGNhbm5vdCBiZSBmb3VuZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTFtdIGV4dHJhY3AgPSBuZXcgVVJMW2NsYXNzcGF0aC5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0cmFjcFtpXSA9IGNsYXNzcGF0aFtpXS50b1VSTCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hbGZvcm1lZCBjbGFzc3BhdGggZmlsZW5hbWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGN1cmNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2hpbGRjbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihleHRyYWNwKTsKLSAgICAgICAgICAgIENsYXNzIGphdmFDbGFzcyA9IGNoaWxkY2wubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBjaGlsZGNsLmxvYWRDbGFzcygib3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQiKTsKLSAgICAgICAgICAgIGlmICh0ZXN0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aCA9IGphdmFDbGFzcy5nZXRNZXRob2QoInRlc3QiLCBuZXcgQ2xhc3NbMF0pOyAvLyBzaG91bGQgYmUgc3RhdGljCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjaGlsZGNsKTsKLSAgICAgICAgICAgIG1ldGguaW52b2tlKG51bGwsIG5ldyBPYmplY3RbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNsYXNzIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gdGVzdCgpIG1ldGhvZCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdWxkIG5vdCBpbnZva2Ugc3RhdGljIHB1YmxpYyB0ZXN0IG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cmNsKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UaHJlYWRpbmdUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGhyZWFkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg3ODRjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UaHJlYWRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFRocmVhZGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBUaHJlYWRpbmdUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShUaHJlYWRpbmdUZXN0LmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX0NPVU5UID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVSQVRJT05fQ09VTlQgPSAxOwotCi0gICAgcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVGhyZWFkIGV4dGVuZHMgVGhyZWFkCi0gICAgewotICAgICAgICBwcml2YXRlIFRocm93YWJsZSBfdGhyb3dhYmxlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3Jlc3VsdDsKLQotICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGhyb3dhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElURVJBVElPTl9DT1VOVDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIgPSBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXSB7IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIikpIH0pOwotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gbG9hZGVyLnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbCIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZERvY3VtZW50VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiLCAiU2lnbmF0dXJlIikpLCByZXN1bHQuc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Rocm93YWJsZSA9IHQ7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlYWRlZENvbXBpbGF0aW9uKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgQ29tcGlsYXRpb25UaHJlYWRbXSB0aHJlYWRzID0gbmV3IENvbXBpbGF0aW9uVGhyZWFkW1RIUkVBRF9DT1VOVF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZWFkc1tpXSA9IG5ldyBDb21waWxhdGlvblRocmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlYWRzW2ldLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVhZHNbaV0uam9pbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCh0aHJlYWRzW2ldLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJUaHJlYWQgIiArIGkgKyAiIGRpZG4ndCBzdWNjZWVkIiwgdGhyZWFkc1tpXS5nZXRSZXN1bHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVHlwZWRTZXR0ZXJzVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UeXBlZFNldHRlcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjI1NjlhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UeXBlZFNldHRlcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLkNvbXBhcmFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotICAgCi1wdWJsaWMgY2xhc3MgVHlwZWRTZXR0ZXJzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBUeXBlZFNldHRlcnNUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVHlwZWRTZXR0ZXJzVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2NoZW1hTnMgPSJ4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5zdGFuY2VOcyA9ICJ4bWxuczp4cz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZtdCAoIFN0cmluZyBzICkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgcy5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICBpZiAoY2ggIT0gJyQnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggY2ggKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2ggPSBzLmNoYXJBdCggKytpICk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZCA9ICIiOwotCi0gICAgICAgICAgICB3aGlsZSAoIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWQgPSBpZCArIGNoOwotICAgICAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoICsraSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYXJnID0gIiI7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnKCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2ggPSBzLmNoYXJBdCggKytpICk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIGNoICE9ICcpJyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcmcgKz0gY2g7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoICsraSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpLS07Ci0KLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoICJzY2hlbWEiICkpCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBzY2hlbWFOcyApOwotICAgICAgICAgICAgZWxzZSBpZiAoaWQuZXF1YWxzKCAieHNpIiApKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggaW5zdGFuY2VOcyApOwotICAgICAgICAgICAgZWxzZSBpZiAoaWQuZXF1YWxzKCAidHlwZSIgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXJnLmxlbmd0aCgpID4gMCApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggInhzaTp0eXBlPVwiIiArIGFyZyArICJcIiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBuc2VzID0gc2NoZW1hTnMgKyAiICIgKyBpbnN0YW5jZU5zOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhTm9UeXBlU2luZ2xldG9uRWxlbWVudCAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjx4eXp6eS8+IiApOwotICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxidWJiYT5tb288L2J1YmJhPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBYbWxDdXJzb3IgYzIgPSB4Mi5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMyLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgYy5nZXRPYmplY3QoKS5zZXQoIGMyLmdldE9iamVjdCgpICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjx4eXp6eT5tb288L3h5enp5PiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YU5vVHlwZVNpbmdsZXRvbkF0dHJpYnV0ZSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjx4eXp6eSBhPScnLz4iICk7Ci0gICAgICAgIFhtbE9iamVjdCB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJ1YmJhIGI9J21vbycvPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBYbWxDdXJzb3IgYzIgPSB4Mi5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYzIudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYzIudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmdldE9iamVjdCgpLnNldCggYzIuZ2V0T2JqZWN0KCkgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPHh5enp5IGE9XCJtb29cIi8+IiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhTm9UeXBlU2luZ2xldG9uRWxlbWVudFdpdGhYc2lUeXBlICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHh5enp5Lz4iLCBuZXcgWG1sT3B0aW9ucygpLnNldERvY3VtZW50VHlwZSggWG1sT2JqZWN0LnR5cGUgKSApOwotICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggZm10KCAiPGJ1YmJhICR0eXBlKHhzOmludCkgJHhzaSAkc2NoZW1hPjY5PC9idWJiYT4iICkgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBYbWxDdXJzb3IgYzIgPSB4Mi5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMyLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHh5enp5ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgWG1sT2JqZWN0IGJ1YmJhID0gYzIuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1YmJhLnNjaGVtYVR5cGUoKSA9PSBYbWxJbnQudHlwZSApOwotCi0vLyAgICAgICAgeHl6enkuc2V0KCBidWJiYSApOwotCi0vLyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggZm10KCAiPHh5enp5ICR0eXBlKHhzOmludCkgJHhzaSAkc2NoZW1hPm1vbzwveHl6enk+IiApICkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVmFsaWRhdGlvblRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVmFsaWRhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzIxODMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1ZhbGlkYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERlY2ltYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIFZhbGlkYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsaWRhdGlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOwotICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCi0gICAgewotICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgIGdldENhc2VGaWxlKCB0aGVDYXNlICkgKS5uZXdDdXJzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBtYWtlU2NoZW1hVHlwZUxvYWRlciAoIFN0cmluZ1tdIHNjaGVtYXMgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3RbXSBzY2hlbWFEb2NzID0gbmV3IFhtbE9iamVjdCBbIHNjaGVtYXMubGVuZ3RoIF07Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgc2NoZW1hRG9jc1sgaSBdID0KLSAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hc1sgaSBdICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gWG1sQmVhbnMubG9hZFhzZCggc2NoZW1hRG9jcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBtYWtlU2NoZW1hVHlwZUxvYWRlciAoIEZpbGVbXSBzY2hlbWFzICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hRG9jcyA9IG5ldyBYbWxPYmplY3QgWyBzY2hlbWFzLmxlbmd0aCBdOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNjaGVtYURvY3NbIGkgXSA9Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYXNbIGkgXSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRMb2FkTGluZU51bWJlcnMoKS5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBYbWxCZWFucy5sb2FkWHNkKCBzY2hlbWFEb2NzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHYgKCBTdHJpbmcgeG1sICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnNjaGVtYVR5cGUoKSAhPSBYbWxPYmplY3QudHlwZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC52YWxpZGF0ZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG52ICggU3RyaW5nIHhtbCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgIT0gWG1sT2JqZWN0LnR5cGUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4LnZhbGlkYXRlKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgX19fdGVzdERlZmF1bHQgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIERlZmF1bHQKLSAgICAgICAgCi0vLyAgICAgICAgdiggIjx2YWxpZEVsZW1EZWZhdWx0Lz4iICk7Ci0vLyAgICAgICAgdiggIjx2YWxpZEF0dHJEZWZhdWx0Lz4iICk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgbnYoICI8aW52YWxpZEVsZW1EZWZhdWx0Lz4iICk7Ci0gICAgICAgIG52KCAiPGludmFsaWRBdHRyRGVmYXVsdC8+IiApOwotCi0gICAgICAgIHYoICI8aW52YWxpZEVsZW1EZWZhdWx0PjExPGludmFsaWRFbGVtRGVmYXVsdD4iICk7Ci0gICAgICAgIHYoICI8aW52YWxpZEF0dHJEZWZhdWx0IGF0dHI9JzIyJz4iICk7Ci0gICAgICAgIAotICAgICAgICAvLyBGaXhlZAotCi0gICAgICAgIHYoICI8dmFsaWRFbGVtRml4ZWQvPiIgKTsKLSAgICAgICAgdiggIjx2YWxpZEF0dHJGaXhlZC8+IiApOwotICAgICAgICAKLSAgICAgICAgbnYoICI8aW52YWxpZEVsZW1GaXhlZC8+IiApOwotICAgICAgICBudiggIjxpbnZhbGlkQXR0ckZpeGVkLz4iICk7Ci0gICAgICAgIAotICAgICAgICB2KCAiPGludmFsaWRFbGVtRml4ZWQ+MzM8aW52YWxpZEVsZW1GaXhlZD4iICk7Ci0gICAgICAgIHYoICI8aW52YWxpZEF0dHJGaXhlZCBhdHRyPSc0NCcvPiIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1Rlc3QgKAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzLCBRTmFtZSBkb2NUeXBlLAotICAgICAgICBTdHJpbmdbXSB2YWxpZEluc3RhbmNlcywgU3RyaW5nW10gaW52YWxpZEluc3RhbmNlcykKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBkb2NUeXBlLCB2YWxpZEluc3RhbmNlcywgaW52YWxpZEluc3RhbmNlcywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9UZXN0ICgKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcywgUU5hbWUgZG9jVHlwZSwKLSAgICAgICAgU3RyaW5nW10gdmFsaWRJbnN0YW5jZXMsIFN0cmluZ1tdIGludmFsaWRJbnN0YW5jZXMsIGJvb2xlYW4gc3RhcnRPbkRvY3VtZW50ICkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLQotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotCi0gICAgICAgIGlmIChkb2NUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZG9jU2NoZW1hID0gc3RsLmZpbmREb2N1bWVudFR5cGUoIGRvY1R5cGUgKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGRvY1NjaGVtYSAhPSBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUsIGRvY1NjaGVtYSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHZhbGlkSW5zdGFuY2VzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCB4ID0KLSAgICAgICAgICAgICAgICBzdGwucGFyc2UoIChTdHJpbmcpIHZhbGlkSW5zdGFuY2VzWyBpIF0sIG51bGwsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgaWYgKCFzdGFydE9uRG9jdW1lbnQpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgIHggPSBjLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0IHhlbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRVJST1JfTElTVEVORVIsIHhlbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGlzVmFsaWQgPSB4LnZhbGlkYXRlKCBvcHRpb25zICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghaXNWYWxpZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJJbnZhbGlkIGRvYywgZXhwZWN0ZWQgYSB2YWxpZCBkb2M6ICIgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJJbnN0YW5jZSgiICsgaSArICIpOiAiICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4LnhtbFRleHQoKSApOwotICAgICAgICAgICAgICAgIFJvb3QuZHVtcCggeCApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yczogIiApOwotICAgICAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCB4ZWwuc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4ZWwuZ2V0KCBqICkgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGlzVmFsaWQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBpbnZhbGlkSW5zdGFuY2VzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4ID0gc3RsLnBhcnNlKCAoU3RyaW5nKSBpbnZhbGlkSW5zdGFuY2VzWyBpIF0sIG51bGwsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgICAgIGlmICghIHN0YXJ0T25Eb2N1bWVudCkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHggPSBjLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGlzVmFsaWQgPSB4LnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlZhbGlkIGRvYywgZXhwZWN0ZWQgYSBpbnZhbGlkIGRvYzogIiApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJJbnN0YW5jZSgiICsgaSArICIpOiAiICk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgUm9vdC5kdW1wKCB4ICk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhaXNWYWxpZCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBKdXN0IGNvbXBpbGUgYSBzY2hlbWEsIGdvb2QgYW5kIGJhZAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTAgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSBtb3N0IGJhc2ljIHNjaGVtYQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OwotICAgICAgICAKLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgLy8gT25lIHdoaWNoIHVzZXMgIyN0YXJnZXROYW1lc3BhY2Ugb24gYSB3aWxkY2FyZAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdmb28nPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czphbnkgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT4iICsKLSAgICAgICAgICAgICIiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hczk5ID0geyBzY2hlbWEgfTsKLSAgICAgICAgCi0gICAgICAgIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzOTkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgYmlnLCBuYXN0eSBzY2hlbWEgOi0pCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICBGaWxlIGZpbGUgPSBUZXN0RW52LmdldFJvb3RGaWxlKCk7Ci0gICAgICAgIEZpbGUgc2NoZW1lRmlsZSA9IG5ldyBGaWxlKCBmaWxlLCAidGVzdC9jYXNlcy9zY2hlbWEvczRzL1hNTFNjaGVtYS54c2QiICk7Ci0gICAgICAgIEZpbGUgeG1sRmlsZSA9IG5ldyBGaWxlKCBmaWxlLCAidGVzdC9jYXNlcy9zY2hlbWEvczRzL1hNTC54c2QiICk7Ci0KLSAgICAgICAgRmlsZVtdIHNjaGVtYXNGID0geyBzY2hlbWVGaWxlLCB4bWxGaWxlIH07Ci0KLSAgICAgICAgUm9vdC5kaXNhYmxlU3RvcmVWYWxpZGF0aW9uKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hc0YgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QuZW5hYmxlU3RvcmVWYWxpZGF0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPQotICAgICAgICAgICAgc3RsLmZpbmREb2N1bWVudFR5cGUoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAic2NoZW1hIiApICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHR5cGUgIT0gbnVsbCApOwotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQSBnb29kIHBpZWNlIGZyb20gYSBKMkVFIHNjaGVtYQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgc2NoZW1hID0KLSAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PlxuIiArIAotICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKyAKLSAgICAgICAgICAgICIgICAgIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsgCi0gICAgICAgICAgICAiICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCdcbiIgKyAKLSAgICAgICAgICAgICIgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSd1bnF1YWxpZmllZCc+XG4iICsgCi0gICAgICAgICAgICAiPHhzZDphbm5vdGF0aW9uPlxuIiArIAotICAgICAgICAgICAgIjx4c2Q6ZG9jdW1lbnRhdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICJAKCMpYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2RzCTEuNyAwNy8wOC8wMlxuIiArIAotICAgICAgICAgICAgIjwveHNkOmRvY3VtZW50YXRpb24+XG4iICsgCi0gICAgICAgICAgICAiPC94c2Q6YW5ub3RhdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+XG4iOwotICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzNSA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXM1ICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQSBiYWQgc2NoZW1hCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgPSAiPGZvby8+IjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMyID0geyBzY2hlbWEgfTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMyICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQSBiYWQgc2NoZW1hCi0gICAgICAgIC8vCi0gICAgICAgIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiICA8Zm9vLz5cbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKwotICAgICAgICAgICAgIiI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzMyA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzMyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTEgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBlcmljU2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczpudz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnXG4iICsKLSAgICAgICAgICAgICIgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdmb28nPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2ZvbycgdHlwZT0nbnc6Zm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2VyaWMnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYScgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYicgLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9J3lheWEnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPScxJyBwcm9jZXNzQ29udGVudHM9J2xheCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdjJyAvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6YW55IG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIHByb2Nlc3NDb250ZW50cz0nc3RyaWN0Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8L3hzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSd4JyB1c2U9J29wdGlvbmFsJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J3knIHVzZT0ncmVxdWlyZWQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0neicgdXNlPSdwcm9oaWJpdGVkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iOwotCi0gICAgICAgIFN0cmluZyBlcmljMlNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYVxuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6bnc9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMidcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOmVyaWM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgdGFyZ2V0TmFtZXNwYWNlPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYTInXG4iICsKLSAgICAgICAgICAgICIgICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2VyaWMyJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2VyaWM6Zm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2EnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8L3hzOmV4dGVuc2lvbj5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iOwotCi0gICAgICAgIFN0cmluZyBlcmljID0gIjxlcmljIHk9J1knIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSc+IjsKLSAgICAgICAgU3RyaW5nIGVyaWMyID0gIjxlcmljIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYTInPiI7Ci0gICAgICAgIFN0cmluZyB4c2kgPSAieG1sbnM6ZXJpYzI9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMicgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSciOwotCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkID0gewotICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPjxjLz48Zm9vIHhzaTp0eXBlPSdlcmljMjplcmljMicgIiArCi0gICAgICAgICAgICAgICAgeHNpICsgIj48YSB4bWxucz1cImh0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMlwiLz48L2Zvbz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz48Ym9vIHhtbG5zPSd5YXlhJy8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEgeD0neScvPjxiLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICAiPGVyaWMgeT0nWScgeD0nWCcgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJz4iICsKLSAgICAgICAgICAgICAgICAiPGEvPjxiLz48Yy8+PC9lcmljPiIKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmcgZXJpY1NhbnNZID0KLSAgICAgICAgICAgICI8ZXJpYyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnPiI7Ci0KLSAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKLSAgICAgICAgICAgICI8Zm9vLz4iLAotICAgICAgICAgICAgIjxlcmljPjxhLz48Zm9vLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgInRleHQ8YS8+PGIvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPnRleHQ8Yi8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPnRleHQ8Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGMvPnRleHQ8L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEgeD0neScvPjxiLz48Yy8+dGV4dDwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPjxib28geG1sbnM9J3lheWEnLz48bW9vIHhtbG5zPSd5YXlhJy8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpY1NhbnNZICsgIjxhLz48Yi8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgIjxlcmljIHk9Jycgej0nJyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnPiIgKwotICAgICAgICAgICAgICAgICI8YS8+PGIvPjxjLz48L2VyaWM+IgotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IGVyaWNTY2hlbWEsIGVyaWMyU2NoZW1hIH07Ci0gICAgICAgIAotICAgICAgICBkb1Rlc3QoCi0gICAgICAgICAgICBzY2hlbWFzLAotICAgICAgICAgICAgbmV3IFFOYW1lKCAiaHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEiLCAiZXJpYyIgKSwKLSAgICAgICAgICAgIHZhbGlkLCBpbnZhbGlkICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlMiAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGJvYlNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYVxuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6Ym9iPSdodHRwOi8vb3BlbnVyaS5vcmcvYm9ic2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgdGFyZ2V0TmFtZXNwYWNlPSdodHRwOi8vb3BlbnVyaS5vcmcvYm9ic2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiaWZmJz5cbiIgKwotICAgICAgICAgICAgIiAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2JvYjpmb28nPlxuIiArCi0gICAgICAgICAgICAiICAgICA8eHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYScgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICA8L3hzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6ZXh0ZW5zaW9uPlxuIiArCi0gICAgICAgICAgICAiICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Zvbyc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2ZvbycgdHlwZT0nYm9iOmZvbyc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIjsKLQotICAgICAgICBTdHJpbmcgeHNpVHlwZSA9ICJ4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyI7Ci0KLSAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGJvYjpmb28geG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeG1sbnM6Ym9iPSdodHRwOi8vb3BlbnVyaS5vcmcvYm9ic2NoZW1hJyAiICsKLSAgICAgICAgICAgICAgICAieHNpOnR5cGU9J2JvYjpiaWZmJz48Ym9iOmEvPjxib2I6YS8+PGJvYjphLz48L2JvYjpmb28+IgotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGJvYjpmb28geG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeG1sbnM6Ym9iPSdodHRwOi8vb3BlbnVyaS5vcmcvYm9ic2NoZW1hJyAiICsKLSAgICAgICAgICAgICAgICAieHNpOnR5cGU9J2JvYjpiaWZmJz48Ym9iOnEvPjwvYm9iOmZvbz4iLAotICAgICAgICAgICAgIjxib2I6Zm9vIGE9J2InIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhtbG5zOmJvYj0naHR0cDovL29wZW51cmkub3JnL2JvYnNjaGVtYScgIiArCi0gICAgICAgICAgICAgICAgInhzaTp0eXBlPSdib2I6YmlmZic+PGJvYjphLz48Ym9iOmEvPjxib2I6YS8+PC9ib2I6Zm9vPiIKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBib2JTY2hlbWEgfTsKLSAgICAgICAgCi0gICAgICAgIGRvVGVzdCggc2NoZW1hcywgbnVsbCwgdmFsaWQsIGludmFsaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5zID0KLSAgICAgICAgInhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnICIgKwotICAgICAgICAgICAgInhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSciOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlMyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiIDx4czpzaW1wbGVUeXBlIG5hbWU9J2FsbE5OSSc+XG4iICsgCi0gICAgICAgICAgICAiICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICIgICBmb3IgbWF4T2NjdXJzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICIgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0neHM6bm9uTmVnYXRpdmVJbnRlZ2VyJz5cbiIgKyAKLSAgICAgICAgICAgICIgICA8eHM6c2ltcGxlVHlwZT5cbiIgKyAKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOk5NVE9LRU4nPlxuIiArIAotICAgICAgICAgICAgIiAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSd1bmJvdW5kZWQnLz5cbiIgKyAKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICIgICA8L3hzOnNpbXBsZVR5cGU+XG4iICsgCi0gICAgICAgICAgICAiICA8L3hzOnVuaW9uPlxuIiArIAotICAgICAgICAgICAgIiA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2VyaWNCYXNlNjRCaW5hcnknPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpiYXNlNjRCaW5hcnknPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdFcmljJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdhYmNkSGV4QmluYXJ5Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6aGV4QmluYXJ5Jz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nYWJjZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nemVyb051bWJlcic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J251bWJlcic+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1plcm8nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nbnVtYmVyJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6dW5pb24+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6c3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0nY29sbGFwc2UnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1plcm8nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J09uZScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nVHdvJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUaHJlZScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nTWFueScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6dW5pb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nbGlzdE9mSW50Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6bGlzdCBpdGVtVHlwZT0neHM6aW50Jy8+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nbGlzdE9mUHJpbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpsaXN0IGl0ZW1UeXBlPSdwcmltZScvPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2VyaWNCcm90aGVyJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6c3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSdjb2xsYXBzZScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdCcmlhbicvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdLZXZpbicvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXJpY0Jyb3RoZXJzJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6bGlzdCBpdGVtVHlwZT0nZXJpY0Jyb3RoZXInLz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd3ZWVrU3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6c3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSdjb2xsYXBzZScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdNb25kYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nVHVlc2RheScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdXZWRuZXNkYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nVGh1cnNkYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nRnJpZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1NhdHVyZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1N1bmRheScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nYVllYXInPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkdXJhdGlvbic+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1AxWScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXJpY0JEYXknPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkYXRlJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTk2NS0wNi0xMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0neW91bmdlclRoYW5FcmljJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGF0ZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPScxOTY1LTA2LTEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmaXZlQ2hhclFuYW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6UU5hbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmxlbmd0aCB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nd2Fja3lRbmFtZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOlFOYW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhMZW5ndGggdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nW3hzOmFiY2RlXSonLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0neHM6YWJjJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J3hzOmJjZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZml2ZUNoYXJBbnlVUkknPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czphbnlVUkknPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmxlbmd0aCB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nd2Fja3lBbnlVUkknPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czphbnlVUkknPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nZm9vJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J2JhcicvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nYml0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Ym9vbGVhbic+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nMXwwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdldmVuSW50ZWdlcic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1swLTldKlswMjQ2OF0nLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3ByaW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nWzAtOV0qWzEzNTc5XScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxMScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxNycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxOScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZm91ckNoYXJTdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmxlbmd0aCB2YWx1ZT0nNCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGhyZWVPck1vcmVDaGFyU3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6c3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2ZpdmVPckxlc3NDaGFyU3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6c3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhMZW5ndGggdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2ZpdmVUb3RhbERpZ2l0cyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnRvdGFsRGlnaXRzIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1pbkV4Y2x1c2l2ZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEV4Y2x1c2l2ZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEluY2x1c2l2ZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1pbkluY2x1c2l2ZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1pbkV4Y2x1c2l2ZUZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEluY2x1c2l2ZUZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1pbkluY2x1c2l2ZUZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZmxvYXQnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluRXhjbHVzaXZlRG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5FeGNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NYXhFeGNsdXNpdmVEb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEluY2x1c2l2ZURvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluSW5jbHVzaXZlRG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2FueSc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZGVmYXVsdF8xMjM0NScgZGVmYXVsdD0nMTIzNDUnPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2RlZmF1bHRfMTIzNCcgZGVmYXVsdD0nMTIzNCc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZGVmYXVsdF9lcmljJyBkZWZhdWx0PSdlcmljJz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iOwotCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkID0gewotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVGcmFjdGlvbkRpZ2l0cyc+LjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVGcmFjdGlvbkRpZ2l0cyc+LjEyPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlRnJhY3Rpb25EaWdpdHMnPi4xMjM8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhbGxOTkknPnVuYm91bmRlZDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhbGxOTkknPjA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYWxsTk5JJz4xPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6YmFzZTY0QmluYXJ5Jz5DQUZFQkFCRTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhYmNkSGV4QmluYXJ5Jz5hYmNkPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6YmFzZTY0QmluYXJ5Jz5hYmNkZWZnaDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQmFzZTY0QmluYXJ5Jz5FcmljPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nemVyb051bWJlcic+IFplcm88L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nemVyb051bWJlcic+WmVybzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz4wPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+IDEgPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+VHdvPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+IFRocmVlIDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+QnJpYW48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5LZXZpbjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPktldmluIEJyaWFuPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+QnJpYW4gS2V2aW48L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdsaXN0T2ZJbnQnPiAgMSAgMjIgIDMzMyAgNDQ0NCAgPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+NTk5OTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FZZWFyJz5QMVk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlQ2hhckFueVVSSSc+YWJjZGU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6YW55VVJJJz5mb288L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lBbnlVUkknPmZvbzwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3lvdW5nZXJUaGFuRXJpYyc+MTk2NS0wNi0xMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQkRheSc+MTk2NS0wNi0xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpkYXRlVGltZSc+MTk5OS0wNS0zMVQxMzoyMDowMC0wNTowMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czp0aW1lJz4wMDowMDowMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czp0aW1lJz4xMzoyMDowMC0wNTowMDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dhY2t5UW5hbWUnPnhzOmFiYzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlQ2hhclFuYW1lJz5hYmNkZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlQ2hhclFuYW1lJz54czphYjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdwcmltZSc+MzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdwcmltZSc+MTE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+KzQ1PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+MDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4tMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4tMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz40ODk3NDM1Nzk4Mzc1ODk3NDM0MzQ8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6Ym9vbGVhbic+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGRlZmF1bHRfMTIzNCAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+PC9kZWZhdWx0XzEyMzQ+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz4xMjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYml0Jz4wPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJvb2xlYW4nPmZhbHNlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz4wPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dlZWtTdHJpbmcnPk1vbmRheTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3ZWVrU3RyaW5nJz5TdW5kYXk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Vla1N0cmluZyc+ICBUaHVyc2RheSAgPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlJz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZSc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlJz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlJz45Ljk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVGbG9hdCc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmVGbG9hdCc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZUZsb2F0Jz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVGbG9hdCc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVGbG9hdCc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRmxvYXQnPjkuOTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZURvdWJsZSc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmVEb3VibGUnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVEb3VibGUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZURvdWJsZSc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVEb3VibGUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZURvdWJsZSc+OS45PC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZm91ckNoYXJTdHJpbmcnPmVyaWM8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVPck1vcmVDaGFyU3RyaW5nJz4xMjM0NTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlT3JMZXNzQ2hhclN0cmluZyc+MTIzNDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlVG90YWxEaWdpdHMnPjEyMzQ1PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVUb3RhbERpZ2l0cyc+MTIzNDwvYW55PiIsCi0gICAgICAgICAgICAiPGRlZmF1bHRfMTIzNCAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+XG5cbjwvZGVmYXVsdF8xMjM0PiIKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBpbnZhbGlkID0gewotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYWxsTk5JJz5mb288L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aGV4QmluYXJ5Jz5QPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmhleEJpbmFyeSc+Q0FGRUJBQlA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYWJjZEhleEJpbmFyeSc+YWJjZTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJhc2U2NEJpbmFyeSc+YWJjZGU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jhc2U2NEJpbmFyeSc+RXJpazwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPk9uZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz5Ud2VudHk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPlNldmVuPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+Qm9iPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+PC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+Qm9iPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+UmFscGggRnJhbms8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdsaXN0T2ZJbnQnPiAgMSAgMjIgIDMzMyAgRXJpYyAgPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+RXJpYzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdsaXN0T2ZJbnQnPi08L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhWWVhcic+UDJZPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neW91bmdlclRoYW5FcmljJz4xOTY1LTA2LTEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCRGF5Jz4xOTg1LTA2LTEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmRhdGVUaW1lJz54eDE5OTktMDUtMzFUMTM6MjA6MDAtMDU6MDA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6ZGF0ZVRpbWUnPmVyaWM8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6dGltZSc+OTk6OTk6MDA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6dGltZSc+MTM6MjA6MDAtOTk6MDA8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3YWNreUFueVVSSSc+bW9vPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyQW55VVJJJz5hYjwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dhY2t5UW5hbWUnPnhzOmFiY2RlZmdoaWprPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dhY2t5UW5hbWUnPnhzOnBxcjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpRTmFtZSc+Zm9vOmJhcjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlQ2hhclFuYW1lJz54czphYmM8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ncHJpbWUnPjEyPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3ByaW1lJz42PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPmZvbzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4uMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPnRydWU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYml0Jz5mYWxzZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPm5pYmJsZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPjI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6Ym9vbGVhbic+Ymx1cmY8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6Ym9vbGVhbic+PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Vla1N0cmluZyc+TW9uZGF5IFN1Y2tzPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlJz4xMC4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmUnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmUnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmUnPjEwLjE8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmVGbG9hdCc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmVGbG9hdCc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRmxvYXQnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZUZsb2F0Jz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRmxvYXQnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVGbG9hdCc+MTAuMTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmVEb3VibGUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRG91YmxlJz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRG91YmxlJz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZU9yTGVzc0NoYXJTdHJpbmcnPiAxMjM0IDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlVG90YWxEaWdpdHMnPjEyMzQ1NjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmb3VyQ2hhclN0cmluZyc+dmFzaWxpazwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZU9yTW9yZUNoYXJTdHJpbmcnPjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZU9yTGVzc0NoYXJTdHJpbmcnPjEyMzQ1Njc8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVGcmFjdGlvbkRpZ2l0cyc+LjEyMzQ8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZm91ckNoYXJTdHJpbmcnPiBlcmljIDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0NSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+PC9kZWZhdWx0XzEyMzQ1PiIsCi0gICAgICAgICAgICAiPGRlZmF1bHRfMTIzNDUgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPlxuXG48L2RlZmF1bHRfMTIzNDU+IgotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIGRvVGVzdCggc2NoZW1hcywgbnVsbCwgdmFsaWQsIGludmFsaWQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU0ICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYW55Jz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2tpbmRhUHJpbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbMC05XSpbMTM1NzldJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc3Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzExJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzEzJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE3Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiIgKwotICAgICAgICAgICAgIiI7Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdraW5kYVByaW1lJz4xMDA8L2FueT4iLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwgKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVudmFsaWRhdGVkIHN0cmVhbSBpcyBPSwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpcyA9IHgubmV3WE1MSW5wdXRTdHJlYW0oKTsKLQotICAgICAgICB3aGlsZSAoIHhpcy5oYXNOZXh0KCkgKQotICAgICAgICAgICAgeGlzLm5leHQoKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHZhbGlkYXRlZCBzdHJlYW0gZmFpbHMKLQotICAgICAgICBib29sZWFuIGJsZXdDaHVua3MgPSBmYWxzZTsKLQotICAgICAgICB4aXMgPQotICAgICAgICAgICAgc3RsLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICB4Lm5ld1hNTElucHV0U3RyZWFtKCksIG51bGwsIG51bGwgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCB4aXMuaGFzTmV4dCgpICkKLSAgICAgICAgICAgICAgICB4aXMubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgYmxld0NodW5rcyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYmxld0NodW5rcyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdoZWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naGF3JyB0eXBlPSd4czppbnQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDwveHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J3llZScgdHlwZT0neHM6aW50Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2tpbmRhUHJpbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbMC05XSpbMTM1NzldJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc3Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzExJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzEzJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE3Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiIgKwotICAgICAgICAgICAgIiI7Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGhlZSB5ZWU9JzMnPjxoYXc+NjY8L2hhdz48L2hlZT4iLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCBvYmogPSBjLmdldE9iamVjdCgpOwotCi0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICAgICAgICAgICAgb2JqLnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbnZhbGlkCi0KLSAgICAgICAgeCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxoZWUgeWVlPSdmaXZlJz48aGF3PjY2PC9oYXc+PC9oZWU+IiwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgeC52YWxpZGF0ZSgpICk7Ci0KLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIGMuZ2V0T2JqZWN0KCkudmFsaWRhdGUoKSApOwotCi0gICAgICAgIC8vIE5vIHNjaGVtYQotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geD0neSc+YXNhczxiYXI+YXNhczwvYmFyPjwvZm9vPiIgKTsKLQotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3Qgb2JqID0gYy5nZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICAgIG9iai52YWxpZGF0ZSgpOwotCi0gICAgICAgICAgICBpZiAoYy50b05leHRUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlNiAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdoZWUnPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiIgKwotICAgICAgICAgICAgIiI7Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hLCBzY2hlbWEgfTsKLQotCi0gICAgICAgIC8vIFNob3VsZCBnZXQgYSBzY2hlbWEgY29tcGlsZSBlcnJvcgotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTcgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2Jhc2UnIHR5cGU9J2Jhc2UnLz4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJz4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbGVtZW50IG5hbWU9J2ZvbycvPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdkZXJpdmVkJz4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZSc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2JhcicvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICA8L3hzOmV4dGVuc2lvbj4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIjsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8YmFzZT48Zm9vLz48L2Jhc2U+IiwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnZhbGlkYXRlKCkgKTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICBYbWxPYmplY3QgYmFzZSA9IGMuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgYy50b0VuZFRva2VuKCk7Ci0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXgudmFsaWRhdGUoKSApOwotCi0gICAgICAgIGMudG9QcmV2U2libGluZygpOwotCi0gICAgICAgIGMucmVtb3ZlWG1sKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOwotCi0gICAgICAgIGJhc2UuY2hhbmdlVHlwZSggc3RsLmZpbmRUeXBlKCBuZXcgUU5hbWUoICJkZXJpdmVkIiApICkgKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiYXIiICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOwotICAgIH0KLQotICAgIC8vIFRlc3RzIGFic3RyYWN0ICYgYmxvY2sgYXR0cmlidXRlcyBvbiBDb21wbGV4VHlwZQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTgoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0gewotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2Fic3RyYWN0JyB0eXBlPSdhYnN0cmFjdCcvPiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYmFzZScgdHlwZT0nYmFzZScvPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Fic3RyYWN0JyBhYnN0cmFjdD0ndHJ1ZScvPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2NvbmNyZXRlJz4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYWJzdHJhY3QnLz4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgYmxvY2s9J2V4dGVuc2lvbicvPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+IiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ncmVzdCc+IiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT4iICsKLSAgICAgICAgICAgICIiLAotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZyB4c2lUeXBlID0gIiB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyAiOwotCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkID0gewotICAgICAgICAgICAgIjxhYnN0cmFjdCIgKyB4c2lUeXBlICsgInhzaTp0eXBlPSdjb25jcmV0ZScvPiIsCi0gICAgICAgICAgICAiPGJhc2UvPiIsCi0gICAgICAgICAgICAiPGJhc2UiICsgeHNpVHlwZSArICJ4c2k6dHlwZT0ncmVzdCcvPiIsCi0gICAgICAgIH07Ci0gICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGFic3RyYWN0Lz4iLAotICAgICAgICAgICAgIjxiYXNlIiArIHhzaVR5cGUgKyAieHNpOnR5cGU9J2V4dCcvPiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0gewotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLSAgICAgICAgICAgICIgICA8eHM6ZWxlbWVudCBuYW1lPSdvcmRlcicgdHlwZT0nT3JkZXJUeXBlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOmtleXJlZiBuYW1lPSdwcm9kTnVtS2V5UmVmJyByZWZlcj0ncHJvZE51bUtleSc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9J2l0ZW1zLyonLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czpmaWVsZCB4cGF0aD0nQG51bWJlcicvPiIgKwotICAgICAgICAgICAgIiAgICAgICA8L3hzOmtleXJlZj4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOmtleSBuYW1lPSdwcm9kTnVtS2V5Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0nLi8vcHJvZHVjdCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSdudW1iZXInLz4iICsKLSAgICAgICAgICAgICIgICAgICAgPC94czprZXk+IiArCi0gICAgICAgICAgICAiICAgPC94czplbGVtZW50PiIgKwotCi0gICAgICAgICAgICAiICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J09yZGVyVHlwZSc+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2l0ZW1zJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2l0ZW0nIHR5cGU9J0l0ZW1UeXBlJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDwveHM6ZWxlbWVudD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3Byb2R1Y3RzJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3Byb2R1Y3QnIHR5cGU9J1Byb2R1Y3RUeXBlJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgbWluT2NjdXJzPScwJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDwveHM6ZWxlbWVudD4iICsKLSAgICAgICAgICAgICIgICAgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdudW1iZXInIHR5cGU9J3hzOnN0cmluZycvPiIgKwotICAgICAgICAgICAgIiAgIDwveHM6Y29tcGxleFR5cGU+IiArCi0KLSAgICAgICAgICAgICIgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nSXRlbVR5cGUnPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdxdWFudGl0eScgdHlwZT0neHM6aW50Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0nbnVtYmVyJyB0eXBlPSd4czppbnQnLz4iICsKLSAgICAgICAgICAgICIgICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotCi0gICAgICAgICAgICAiICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J1Byb2R1Y3RUeXBlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nbnVtYmVyJyB0eXBlPSd4czppbnQnIG1pbk9jY3Vycz0nMCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nbmFtZScgdHlwZT0neHM6c3RyaW5nJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdwcmljZSc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0neHM6ZGVjaW1hbCc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdjdXJyZW5jeScgdHlwZT0neHM6c3RyaW5nJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPC94czpzaW1wbGVDb250ZW50PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8L3hzOmVsZW1lbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgPC94czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT4gIiwKLQotICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdyb290JyB0eXBlPSdSb290VHlwZSc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmtleSBuYW1lPSdGb29JZCc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0nLi8vc3RyaW5nfC4vL3Rva2VufC4vL2ludCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9J0BpZCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6a2V5PiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDplbGVtZW50PiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6Z3JvdXAgbmFtZT0nZ3JvdXAnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDpjaG9pY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0nc3RyaW5nJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ndG9rZW4nLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdpbnQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmNob2ljZT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6Z3JvdXA+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdSb290VHlwZSc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmdyb3VwIHJlZj0nZ3JvdXAnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J3N0cmluZyc+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpncm91cCByZWY9J2dyb3VwJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0naWQnIHR5cGU9J3hzZDpzdHJpbmcnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDplbGVtZW50PiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdpbnQnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0nZ3JvdXAnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSdpZCcgdHlwZT0neHNkOmludCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J3Rva2VuJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpncm91cCByZWY9J2dyb3VwJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0naWQnIHR5cGU9J3hzZDp0b2tlbicvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCi0KLSAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+IiwKLQotICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnICIgKwotICAgICAgICAgICAgIiAgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly93d3cudGltLWhhbnNvbi5jb20vJyB4bWxuczp0aD0naHR0cDovL3d3dy50aW0taGFuc29uLmNvbS8nICIgKwotICAgICAgICAgICAgIiAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJyBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+IiArCi0KLSAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J3Jvb3QnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0nZm9vJyBtYXhPY2N1cnM9J3VuYm91bmRlZCc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9J2lkJyB0eXBlPSd4c2Q6aW50Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDprZXkgbmFtZT0naWQnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9Jy4vdGg6Zm9vJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0nQHRoOmlkJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDprZXk+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCi0gICAgICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0KLSAgICAgICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyA+IiArCi0gICAgICAgICAgICAiICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdpZHRlc3QnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOnNlcXVlbmNlIG1heE9jY3Vycz0ndW5ib3VuZGVkJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0naWQnIG1heE9jY3Vycz0ndW5ib3VuZGVkJyB0eXBlPSd4c2Q6SUQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdpZHJlZicgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIHR5cGU9J3hzZDpJRFJFRicvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9J2lkcmVmcycgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIHR5cGU9J3hzZDpJRFJFRlMnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCi0gICAgICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0KLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKLSAgICAgICAgICAgICI8b3JkZXI+IiArCi0gICAgICAgICAgICAiICAgIDxpdGVtcz4iICsKLSAgICAgICAgICAgICIgICAgICA8aXRlbSBudW1iZXI9JzEyNCAnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8cXVhbnRpdHk+MTwvcXVhbnRpdHk+IiArCi0gICAgICAgICAgICAiICAgICAgPC9pdGVtPiIgKwotICAgICAgICAgICAgIiAgICAgIDxpdGVtIG51bWJlcj0nNTYzJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgIiAgICAgIDwvaXRlbT4iICsKLSAgICAgICAgICAgICIgICAgPC9pdGVtcz4iICsKLSAgICAgICAgICAgICIgICAgPHByb2R1Y3RzPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj4gMTI0PC9udW1iZXI+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+U2hpcnQ8L25hbWU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjI5Ljk5PC9wcmljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+NTYzPC9udW1iZXI+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+SGF0PC9uYW1lPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz42OS45OTwvcHJpY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPjQ0MzwvbnVtYmVyPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPlVtYnJlbGxhPC9uYW1lPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz40OS45OTwvcHJpY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgIDwvcHJvZHVjdHM+IiArCi0gICAgICAgICAgICAiPC9vcmRlcj4iLAotCi0gICAgICAgICAgICAiPHJvb3Q+IiArCi0gICAgICAgICAgICAiICAgIDxzdHJpbmcgaWQ9J2ZvbzEnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHN0cmluZyBpZD0nZm9vMic+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vMyc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzYnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNyc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vOCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHN0cmluZyBpZD0nZm9vOScvPiIgKwotICAgICAgICAgICAgIiAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IiwKLQotICAgICAgICAgICAgIjxyb290PiIgKwotICAgICAgICAgICAgIiAgICA8aW50IGlkPScxJy8+IiArCi0gICAgICAgICAgICAiICAgIDxzdHJpbmcgaWQ9JzEnLz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IiwKLQotICAgICAgICAgICAgIjx4eXo6cm9vdCB4bWxuczp4eXo9J2h0dHA6Ly93d3cudGltLWhhbnNvbi5jb20vJz4iICsKLSAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMScvPiIgKwotICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScyJy8+IiArCi0gICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzMnLz4iICsKLSAgICAgICAgICAgICI8L3h5ejpyb290PiIsCi0KLSAgICAgICAgICAgICI8aWR0ZXN0PiIgKwotICAgICAgICAgICAgIiAgPGlkcmVmPnh5ejwvaWRyZWY+IiArCi0gICAgICAgICAgICAiICA8aWRyZWZzPmFiYyBkZWY8L2lkcmVmcz4iICsKLSAgICAgICAgICAgICIgIDxpZD5hYmM8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkPmRlZjwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWQ+eHl6PC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZHJlZj5hYmM8L2lkcmVmPiIgKwotICAgICAgICAgICAgIiAgPGlkcmVmcz54eXogYWJjPC9pZHJlZnM+IiArCi0gICAgICAgICAgICAiPC9pZHRlc3Q+IiwKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBpbnZhbGlkID0gewotICAgICAgICAgICAgIjxvcmRlcj4iICsKLSAgICAgICAgICAgICIgICAgPGl0ZW1zPiIgKwotICAgICAgICAgICAgIiAgICAgIDxpdGVtIG51bWJlcj0nMTI1ICc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgIDxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICIgICAgICA8L2l0ZW0+IiArCi0gICAgICAgICAgICAiICAgICAgPGl0ZW0gbnVtYmVyPSc1NjMnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8cXVhbnRpdHk+MTwvcXVhbnRpdHk+IiArCi0gICAgICAgICAgICAiICAgICAgPC9pdGVtPiIgKwotICAgICAgICAgICAgIiAgICA8L2l0ZW1zPiIgKwotICAgICAgICAgICAgIiAgICA8cHJvZHVjdHM+IiArCi0gICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPiAxMjQ8L251bWJlcj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5TaGlydDwvbmFtZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+MjkuOTk8L3ByaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj41NjM8L251bWJlcj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5IYXQ8L25hbWU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjY5Ljk5PC9wcmljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+NDQzPC9udW1iZXI+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+VW1icmVsbGE8L25hbWU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjQ5Ljk5PC9wcmljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgPC9wcm9kdWN0cz4iICsKLSAgICAgICAgICAgICI8L29yZGVyPiIsCi0KLSAgICAgICAgICAgICI8cm9vdD4iICsKLSAgICAgICAgICAgICIgICAgPHRva2VuIHRva2VuPScgIGJsYWggIGJsYWgnLz4iICsKLSAgICAgICAgICAgICIgICAgPHN0cmluZyBpZD0nYmxhaCBibGFoJy8+IiArCi0gICAgICAgICAgICAiPC9yb290PiIsCi0KLSAgICAgICAgICAgICI8cm9vdD4iICsKLSAgICAgICAgICAgICIgICAgPHN0cmluZyBpZD0nZm9vMSc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8c3RyaW5nIGlkPSdmb28yJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb28zJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNic+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb283Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb28zJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiPC9yb290PiIsCi0KLSAgICAgICAgICAgICI8eHl6OnJvb3QgeG1sbnM6eHl6PSdodHRwOi8vd3d3LnRpbS1oYW5zb24uY29tLyc+IiArCi0gICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzEnLz4iICsKLSAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMicvPiIgKwotICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScyJy8+IiArCi0gICAgICAgICAgICAiPC94eXo6cm9vdD4iLAotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWRPbkRvY09ubHkgPSBuZXcgU3RyaW5nW10KLSAgICAgICAgewotCi0gICAgICAgICAgICAiPGlkdGVzdD4iICsKLSAgICAgICAgICAgICIgIDxpZHJlZj5mb288L2lkcmVmPiIgKwotICAgICAgICAgICAgIiAgPGlkPmFiYzwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWQ+ZGVmPC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZD54eXo8L2lkPiIgKwotICAgICAgICAgICAgIjwvaWR0ZXN0PiIsCi0KLSAgICAgICAgICAgICI8aWR0ZXN0PiIgKwotICAgICAgICAgICAgIiAgPGlkcmVmcz5hYmMgZm9vPC9pZHJlZnM+IiArCi0gICAgICAgICAgICAiICA8aWQ+YWJjPC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZD5kZWY8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkPnh5ejwvaWQ+IiArCi0gICAgICAgICAgICAiPC9pZHRlc3Q+IiwKLSAgICAgICAgfTsKLQotCi0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCwgdHJ1ZSk7Ci0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCwgZmFsc2UpOwotCi0gICAgICAgICAvLyBJRFJlZnMgYXJlIHZhbGlkYXRlZCBvbmx5IGlmIHN0YXJ0aW5nIGF0IHRoZSB2ZXJ5IHJvb3Qgb2YgdGhlIHdvcmxkCi0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBudWxsLCBuZXcgU3RyaW5nWzBdLCBpbnZhbGlkT25Eb2NPbmx5LCB0cnVlKTsKLSAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIGludmFsaWRPbkRvY09ubHksIG5ldyBTdHJpbmdbMF0sIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvLyBUZXN0IHZhbGlkYXRpb24gb2Ygc2V0dGluZyB3aXRoIHRoZSBWYWxpZGF0ZU9uU2V0IG9wdGlvbgotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZGVjLXJlc3RyaWN0aW9uJz4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhFeGNsdXNpdmUgdmFsdWU9JzEwMCcvPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKwotICAgICAgICAgICAgIiI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLQotICAgICAgICBYbWxPcHRpb25zIHZhbGlkYXRlID0gbmV3IFhtbE9wdGlvbnMoKS5zZXRWYWxpZGF0ZU9uU2V0KCk7Ci0gICAgICAgIFhtbE9wdGlvbnMgbm9WYWxpZGF0ZSA9IG5ldyBYbWxPcHRpb25zKCk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBzdCA9IHN0bC5maW5kVHlwZShuZXcgUU5hbWUoIiIsICJkZWMtcmVzdHJpY3Rpb24iKSk7Ci0KLSAgICAgICAgWG1sRGVjaW1hbCBkZWMgPSAoWG1sRGVjaW1hbClzdGwubmV3SW5zdGFuY2Uoc3QsIHZhbGlkYXRlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVjLnNldCgiMjAwIik7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHt9Ci0KLSAgICAgICAgZGVjID0gKFhtbERlY2ltYWwpc3RsLm5ld0luc3RhbmNlKHN0LCBub1ZhbGlkYXRlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVjLnNldCgiMjAwIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBCdWd6aWxsYSBidWcgIzI2MTA1OiB2YWxpZGF0ZSBkZXJpdmVkIHR5cGUgZnJvbSBiYXNlIHR5cGUgZW51bWVyYXRpb24KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUxMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NoZW1hc1tdID0gewotICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0KLSAgICAgICAgICAgICI8eHNkOmVsZW1lbnQgbmFtZT0nZW51bURlZicgdHlwZT0nZW51bURlZlR5cGUnLz5cbiIgKwotICAgICAgICAgICAgIjx4c2Q6Y29tcGxleFR5cGUgbmFtZT0nZW51bURlZlR5cGUnPlxuIiArCi0gICAgICAgICAgICAiICA8eHNkOnNpbXBsZUNvbnRlbnQ+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzZDpleHRlbnNpb24gYmFzZT0nZW51bVR5cGUnLz5cbiIgKwotICAgICAgICAgICAgIiAgPC94c2Q6c2ltcGxlQ29udGVudD5cbiIgKwotICAgICAgICAgICAgIjwveHNkOmNvbXBsZXhUeXBlPlxuIiArCi0KLSAgICAgICAgICAgICI8eHNkOnNpbXBsZVR5cGUgbmFtZT0nZW51bVR5cGUnPlxuIiArCi0gICAgICAgICAgICAiICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9J3hzZDp0b2tlbic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0nZW51bTEnLz5cbiIgKwotICAgICAgICAgICAgIiAgPC94c2Q6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICI8L3hzZDpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiPC94c2Q6c2NoZW1hPlxuIiwKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKLSAgICAgICAgICAgICI8ZW51bURlZj5lbnVtMTwvZW51bURlZj4iLAotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGVudW1EZWY+ZW51bTIvZW51bURlZj4iLAotICAgICAgICB9OwotCi0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZCBiL3YxL3Rlc3Qvc3JjL2Vhc3lwby9lYXN5cG8ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjljNjhjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2Vhc3lwby9lYXN5cG8ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icHVyY2hhc2Utb3JkZXIiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY3VzdG9tZXIiIHR5cGU9InBvOmN1c3RvbWVyIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImRhdGUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxpbmUtaXRlbSIgdHlwZT0icG86bGluZS1pdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InNoaXBwZXIiIHR5cGU9InBvOnNoaXBwZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tZXIiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFnZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb28iIHR5cGU9InhzOmludCIgZGVmYXVsdD0iMTAwIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb28iIHR5cGU9InhzOmludCIgZml4ZWQ9IjIwMCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsaW5lLWl0ZW0iPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InBlci11bml0LW91bmNlcyIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2hpcHBlciI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwZXItb3VuY2UtcmF0ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZWFzeXBvL2Vhc3lwby54c2Rjb25maWcgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkYjY4NS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyIKLSAgICAgICAgICAgeG1sbnM6ZXA9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iPgotCi0gIDx4YjpuYW1lc3BhY2UgdXJpPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KLSAgICA8eGI6cGFja2FnZT5jb20uZWFzeXBvPC94YjpwYWNrYWdlPgotICA8L3hiOm5hbWVzcGFjZT4KLQotICA8eGI6bmFtZXNwYWNlIHVyaT0iIyNhbnkiPgotICAgIDx4YjpwcmVmaXg+WG1sPC94YjpwcmVmaXg+Ci0gICAgPHhiOnN1ZmZpeD5CZWFuPC94YjpzdWZmaXg+Ci0gIDwveGI6bmFtZXNwYWNlPgotCi08L3hiOmNvbmZpZz4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2Vhc3lwb3VzZS9jb20vYmVhL3Rlc3QvTG9hZEFuZFVzZVBvLmphdmEgYi92MS90ZXN0L3NyYy9lYXN5cG91c2UvY29tL2JlYS90ZXN0L0xvYWRBbmRVc2VQby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU0ODFkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2Vhc3lwb3VzZS9jb20vYmVhL3Rlc3QvTG9hZEFuZFVzZVBvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCB4bWwudXRpbC4qOwotaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby4qOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgTG9hZEFuZFVzZVBvCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBmaWxlICIgKyBhcmdzW2ldKTsKLSAgICAgICAgICAgIHN1bW1hcml6ZVBvRG9jdW1lbnQoUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1tpXSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdW1tYXJpemVQb0RvY3VtZW50KFB1cmNoYXNlT3JkZXJEb2N1bWVudCBkb2MpCi0gICAgewotICAgICAgICBQdXJjaGFzZU9yZGVyIG9yZGVyID0gZG9jLmdldFB1cmNoYXNlT3JkZXIoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21lcjogIiArIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzOiAgIiArIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgTGluZUl0ZW1bXSBpdGVtID0gb3JkZXIuZ2V0TGluZUl0ZW0oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXRlbSBkZXNjcmlwdGlvbjogIiArIGl0ZW1baV0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUHJpY2U6ICIgKyBpdGVtW2ldLmdldFByaWNlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFF1YW50aXR5OiAiICsgaXRlbVtpXS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBPdW5jZXM6ICIgKyBpdGVtW2ldLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEFtb3VudDogIiArIGl0ZW1baV0uZ2V0QW1vdW50KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFdlaWdodDogIiArIGl0ZW1baV0uZ2V0TGluZUl0ZW1PdW5jZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIGlmIChvcmRlci5pc1NldFNoaXBwZXIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaGlwcGVyOiAiICsgb3JkZXIuZ2V0U2hpcHBlcigpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUGVyLW91bmNlIHJhdGU6ICIgKyBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0UGVyT3VuY2VSYXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHdlaWdodCBpbiBvdW5jZXM6ICIgKyBvcmRlci5nZXRUb3RhbE91bmNlcygpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaGlwcGluZyBhbW91bnQ6ICIgKyBvcmRlci5nZXRTaGlwcGluZ0Ftb3VudCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBhbW91bnQ6ICIgKyBvcmRlci5nZXRUb3RhbEFtb3VudCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkIGIvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmI4MmUzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2VudW10ZXN0L2VudW10ZXN0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOmV0PSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lbnVtdGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJxdWFudGl0eSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibW9zdCIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb21lIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZldyIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE9yTm9uZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9ImV0OnF1YW50aXR5Ij4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEiPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJldDpxdWFudGl0eSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJldDphbGxPck5vbmUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzdGF0dXNyZXBvcnQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhdHVzIiB0eXBlPSJldDpkYXRhIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8IS0tIGJ1ZyBDUjEyODkwNjogZ2VuJ2QgamF2YSBjb2RlIG11c3QgcXVhbGlmeSBqYXZhLmxhbmcuKiB0eXBlcyAtLT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ib2JqZWN0Ij4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhYmMiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVmIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2VyaWNzY2hlbWEvZXJpY3NjaGVtYS54c2QgYi92MS90ZXN0L3NyYy9lcmljc2NoZW1hL2VyaWNzY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjYyZGRmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2VyaWNzY2hlbWEvZXJpY3NjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXNkYXNkIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9lcmljdGVzdC9FcmljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyODQ5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuQ29kZUdlblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG9jdW1lbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEVyaWNUZXN0Ci17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSGFzaE1hcCBuc2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbnNlcy5wdXQoICJ4IiwgInguY29tIiApOwotICAgICAgICBuc2VzLnB1dCggInkiLCAieS5jb20iICk7Ci0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzKCBuc2VzICk7Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGE+PC9hPiIsIG9wdGlvbnMgKTsKLSAgICAgICAgeC5zYXZlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9uYW1ld29ybGR1c2UvY29tL2JlYS90ZXN0L0R1bXBOYW1ld29ybGQuamF2YSBiL3YxL3Rlc3Qvc3JjL25hbWV3b3JsZHVzZS9jb20vYmVhL3Rlc3QvRHVtcE5hbWV3b3JsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODU4ODAxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL25hbWV3b3JsZHVzZS9jb20vYmVhL3Rlc3QvRHVtcE5hbWV3b3JsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCBvcmcub3BlbnVyaS5uYW1ld29ybGQuKjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBEdW1wTmFtZXdvcmxkCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBmaWxlICIgKyBhcmdzW2ldKTsKLSAgICAgICAgICAgIGR1bXBEb2N1bWVudChOYW1ld29ybGREb2N1bWVudC5GYWN0b3J5LnBhcnNlKG5ldyBGaWxlKGFyZ3NbaV0pKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcERvY3VtZW50KE5hbWV3b3JsZERvY3VtZW50IGRvYykKLSAgICB7Ci0gICAgICAgIE5hbWV3b3JsZCB3b3JsZCA9IGRvYy5nZXROYW1ld29ybGQoKTsKLSAgICAgICAgTmFtZXdvcmxkLklzbGFuZFtdIGlzbGFuZHMgPSB3b3JsZC5nZXRJc2xhbmQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpc2xhbmRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXNsYW5kIHRhcmdldCBuYW1lc3BhY2U6ICIgKyBpc2xhbmRzW2ldLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIExvY1tdIGxvY3MgPSBpc2xhbmRzW2ldLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxvY3MubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIExvY2F0aW9uOiAiICsgbG9jc1tqXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIExvYy5SZWZlcmVuY2VbXSByZWZzID0gbG9jc1tqXS5nZXRSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlZnMubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUmVmZXJlbmNlOiAiICsgcmVmc1trXS5nZXRUbygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvbnVtZXJhbHMvbnVtZXJhbHMueHNkIGIvdjEvdGVzdC9zcmMvbnVtZXJhbHMvbnVtZXJhbHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDllOGUyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL251bWVyYWxzL251bWVyYWxzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScKLSAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL29wZW51cmkub3JnL3Rlc3ROdW1lcmFscycKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0nZG9jJz4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCc+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naW50JyB0eXBlPSd4czppbnQnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nc2hvcnQnIHR5cGU9J3hzOnNob3J0JyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2J5dGUnIHR5cGU9J3hzOmJ5dGUnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZG91YmxlJyB0eXBlPSd4czpkb3VibGUnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZmxvYXQnIHR5cGU9J3hzOmZsb2F0JyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2Jvb2xlYW4nIHR5cGU9J3hzOmJvb2xlYW4nIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nc3RyaW5nJyB0eXBlPSd4czpzdHJpbmcnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZGVjaW1hbCcgdHlwZT0neHM6ZGVjaW1hbCcgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdpbnRlZ2VyJyB0eXBlPSd4czppbnRlZ2VyJyAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2xvbmcnIHR5cGU9J3hzOmxvbmcnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naGV4QmluYXJ5JyB0eXBlPSd4czpoZXhCaW5hcnknIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYmFzZTY0QmluYXJ5JyB0eXBlPSd4czpiYXNlNjRCaW5hcnknIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZGF0ZScgdHlwZT0neHM6ZGF0ZScgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdkYXRlVGltZScgdHlwZT0neHM6ZGF0ZVRpbWUnIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZ1llYXJNb250aCcgdHlwZT0neHM6Z1llYXJNb250aCcgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdkdXJhdGlvbicgdHlwZT0neHM6ZHVyYXRpb24nIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nUU5hbWUnIHR5cGU9J3hzOlFOYW1lJyAvPgotICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvcmFuZG9tL1JhbmRvbS5qYXZhIGIvdjEvdGVzdC9zcmMvcmFuZG9tL1JhbmRvbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmZDMwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3JhbmRvbS9SYW5kb20uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLkNvbW1hbmRMaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLkN1cnNvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotCi1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLlB1cmNoYXNlT3JkZXI7Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxDdXN0b21lckJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxMaW5lSXRlbUJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxTaGlwcGVyQmVhbjsKLQotcHVibGljIGNsYXNzIFJhbmRvbSBpbXBsZW1lbnRzIFJ1bm5hYmxlCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAic2VlZCIsICJpIiwgInQiLCAiZG9jcyIsICI/IiwgImhlbHAiIH0pKTsKLSAgICAgICAgbG9uZyBzZWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCB0aHJlYWRzID0gMTsKLSAgICAgICAgaW50IGRvY3MgPSAxMDsKLSAgICAgICAgCi0gICAgICAgIGlmIChjbC5nZXRPcHQoIj8iKSAhPSBudWxsIHx8IGNsLmdldE9wdCgiaGVscCIpICE9IG51bGwgfHwgY2wuYXJncygpLmxlbmd0aCAhPSAwKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogcmFuZG9tIFstc2VlZCAjXSBbLWkgaXRlcmF0aW9uc10gWy10IHRocmVhZHNdIFstZG9jcyBkb2NzXSBbLXJlYWRvbmx5XSBbLW5vc2F2ZV0iKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHJlYWRvbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIG5vc2F2ZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBub3F1ZXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoInNlZWQiKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlZWQgPSBMb25nLnBhcnNlTG9uZyhjbC5nZXRPcHQoInNlZWQiKSk7Ci0gICAgICAgICAgICBpZiAoY2wuZ2V0T3B0KCJpIikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludChjbC5nZXRPcHQoImkiKSk7Ci0gICAgICAgICAgICBpZiAoY2wuZ2V0T3B0KCJ0IikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJlYWRzID0gSW50ZWdlci5wYXJzZUludChjbC5nZXRPcHQoInQiKSk7Ci0gICAgICAgICAgICBpZiAoY2wuZ2V0T3B0KCJkb2NzIikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkb2NzID0gSW50ZWdlci5wYXJzZUludChjbC5nZXRPcHQoImRvY3MiKSk7Ci0gICAgICAgICAgICBub3F1ZXJ5ID0gKGNsLmdldE9wdCgibm9xdWVyeSIpICE9IG51bGwpOwotICAgICAgICAgICAgcmVhZG9ubHkgPSAoY2wuZ2V0T3B0KCJyZWFkb25seSIpICE9IG51bGwpOwotICAgICAgICAgICAgbm9zYXZlID0gKGNsLmdldE9wdCgibm9zYXZlIikgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlZWQ9IiArIHNlZWQpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpdGVyYXRpb25zPSIgKyBpdGVyYXRpb25zICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRocmVhZHM9IiArIHRocmVhZHMpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb2NzPSIgKyBkb2NzICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVhZG9ubHkgPyAicmVhZG9ubHkiIDogInJlYWQvd3JpdGUiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihub3NhdmUgPyAibm9zYXZlIiA6ICJ3aXRoIHNhdmUiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihub3F1ZXJ5ID8gIm5vcXVlcnkiIDogIndpdGggcXVlcnkiKTsKLSAgICAgICAgICAgIGRvVGVzdHMoc2VlZCwgaXRlcmF0aW9ucywgdGhyZWFkcywgZG9jcywgcmVhZG9ubHksIG5vc2F2ZSwgbm9xdWVyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1Rlc3RzKGxvbmcgc2VlZCwgaW50IGl0ZXJhdGlvbnMsIGludCB0aHJlYWRDb3VudCwgaW50IGRvY0NvdW50LCBib29sZWFuIHJlYWRvbmx5LCBib29sZWFuIG5vc2F2ZSwgYm9vbGVhbiBub3F1ZXJ5KQotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gc2hhcmVkRG9jcyA9IG5ldyBYbWxPYmplY3QgW2RvY0NvdW50XTsKLSAgICAgICAgVGhyZWFkW10gdGhyZWFkcyA9IG5ldyBUaHJlYWRbdGhyZWFkQ291bnRdOwotICAgICAgICAKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGl0ZXJhdGlvbnMgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRocmVhZENvdW50OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmFuZG9tIHJ1bm5hYmxlID0gbmV3IFJhbmRvbShzZWVkLCBzaGFyZWREb2NzLCByZWFkb25seSwgbm9zYXZlLCBub3F1ZXJ5LCB0aHJlYWRDb3VudCA+IDEpOwotICAgICAgICAgICAgICAgIHRocmVhZHNbal0gPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICB0aHJlYWRzW2pdLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgc2VlZCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0aHJlYWRDb3VudDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkc1tqXS5qb2luKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaHJlYWQgaW50ZXJydXB0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAgICAgICAiU2Vjb25kcyB0byBydW4gcmFuZG9tIHRlc3RzOiAiICsgKGVuZCAtIHN0YXJ0KSAvIDEwMDAgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnQoICJcclNlZWQ6ICIgKyBfc2VlZCApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGludCBkID0gMCA7IGQgPCBfZG9jcy5sZW5ndGggOyBkKysgKQotICAgICAgICAgICAgICAgIF9kb2NzWyBkIF0gPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIAotICAgICAgICAgICAgX2N1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgbkl0ZXJhdGlvbnMgPSBybmQoIDYwMDAwICkgKyA1MDAwOwotICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG5JdGVyYXRpb25zIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGdvb2QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9pdGVyKys7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgZ29vZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZ29vZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBvbiBpdGVyYXRpb24gIiArIF9pdGVyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3Igb24gc2VlZCAiICsgX3NlZWQgKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0uZXJyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGphdmEudXRpbC5SYW5kb20gX3JuZDsKLSAgICAKLSAgICBwcml2YXRlIFhtbE9iamVjdFtdIF9kb2NzOyAvLyBzaGFyZWQgYW1vbmcgdGhyZWFkcyEhCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgICBfY3Vyc29yczsKLSAgICBwcml2YXRlIGxvbmcgICAgICAgIF9zZWVkOwotICAgIHByaXZhdGUgaW50ICAgICAgICAgX2l0ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICBfcmVhZG9ubHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICBfbm9zYXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX25vcXVlcnk7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICBfaW50ZXJmZXJlbmNlOwotCi0KLSAgICBwcml2YXRlIGludCBybmQgKCBpbnQgbiApCi0gICAgewotICAgICAgICByZXR1cm4gX3JuZC5uZXh0SW50KCBuICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IHJuZCAoIGludCBtaW4sIGludCBtYXhQbHVzT25lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcm5kLm5leHRJbnQobWF4UGx1c09uZSAtIG1pbikgKyBtaW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgZ2V0Q3Vyc29yICggKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBfY3Vyc29ycy5zaXplKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobiA9PSAwIHx8IChuIDwgX2RvY3MubGVuZ3RoICogMykgJiYgcm5kKCA0ICkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgX2N1cnNvcnMuYWRkKCBjICk7Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoWG1sQ3Vyc29yKSBfY3Vyc29ycy5nZXQoIHJuZCggbiApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGl0ZXJhdGUgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBybmQgKCA2ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAgMCA6IGludGVyYXRlSGlnaCgpOyAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMSA6IGludGVyYXRlSGlnaCgpOyAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMiA6IGludGVyYXRlSGlnaCgpOyAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMyA6IGludGVyYXRlTWVkaXVtKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNCA6IGludGVyYXRlTWVkaXVtKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNSA6IGludGVyYXRlTG93KCk7ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfaW50ZXJmZXJlbmNlKQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9pbnRlcmZlcmVuY2UpCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW50ZXJhdGVIaWdoICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBybmQgKCAyICkgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgIDAgOiBtb3ZlQ3Vyc29yUmlnaHRPbmVUb2tlbigpOyBicmVhazsKLSAgICAgICAgY2FzZSAgMSA6IG1vdmVDdXJzb3JMZWZ0T25lVG9rZW4oKTsgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbnRlcmF0ZU1lZGl1bSAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3dpdGNoICggX3JlYWRvbmx5ID8gcm5kICggNCApIDogcm5kICgyNCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICAwIDogZ2V0Q2hhcnMoKTsgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAxIDogZ2V0VGV4dFZhbHVlKCk7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAyIDogY29tcGFyZVZhbHVlKCk7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAzIDogcHJldlRva2VuVHlwZSgpOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlICA0IDogaW5zZXJ0VGV4dCgpOyAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA1IDogbW92ZUNoYXJzUmlnaHQoKTsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA2IDogbW92ZUNoYXJzTGVmdCgpOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA3IDogaW5zZXJ0RWxlbSgpOyAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA4IDogaW5zZXJ0QXR0cigpOyAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA5IDogcmVtb3ZlWG1sKCk7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwIDogcmVtb3ZlWG1sQ29udGVudHMoKTsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDExIDogY29weVhtbCgpOyAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyIDogY29weVhtbENvbnRlbnRzKCk7ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEzIDogbW92ZVhtbCgpOyAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0IDogbW92ZVhtbENvbnRlbnRzKCk7ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1IDogcmVtb3ZlVGV4dCgpOyAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE2IDogbW92ZVRleHQoKTsgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE3IDogY29weVRleHQoKTsgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4IDogaW5zZXJ0Q29tbWVudCgpOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE5IDogaW5zZXJ0UHJvY2luc3QoKTsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIwIDogc2V0VGV4dFZhbHVlKCk7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIxIDogc2V0U3Ryb25nKCk7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIyIDogb2JqZWN0U2V0KCk7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIzIDogc2V0TmFtZSgpOyAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGludGVyYXRlTG93ICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBybmQgKF9yZWFkb25seSA/IDEgOiAwLCBfbm9zYXZlID8gOCA6IDE3KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgIDAgOiBjaGFuZ2VUeXBlKCk7ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDEgOiBjcmVhdGVCb29rbWFyaygpOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDIgOiBjbGVhckJvb2ttYXJrKCk7ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAgMyA6IGxvYWREb2MoKTsgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNCA6IGxvYWRTY2hlbWFkRG9jKCk7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNSA6IGNvbXBhcmVDdXJzb3JzKCk7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNiA6IGdldE9iamVjdCgpOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNyA6IG5ld0N1cnNvcigpOyAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlICA4IDogdmFsaWRhdGUoKTsgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA5IDogZXhlY1F1ZXJ5KCk7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwIDogeG1sSW5wdXRTdHJlYW0oKTsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDExIDogZG9jQnl0ZXMoKTsgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyIDogY3Vyc29yQnl0ZXMoKTsgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEzIDogbmV3RG9tTm9kZSgpOyAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0IDogb2JqZWN0U3RyaW5nKCk7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1IDogY3Vyc29yU3RyaW5nKCk7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE2IDogcHJldHR5T2JqZWN0KCk7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBmaW5kT2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLSAgICAgICAgYy5wdXNoKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoICEoYy5pc0NvbnRhaW5lcigpIHx8IGMuaXNBdHRyKCkpICkKLSAgICAgICAgICAgIGlmIChjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCFjLmlzRW5kZG9jKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCB4ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGMucG9wKCk7Ci0gICAgICAgICAgICBpZiAoeCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldE9iamVjdCByZXR1cm5lZCBudWxsIC0gY29udGVudCBtdXN0IGhhdmUgY2hhbmdlZCIpOwotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIH0KLQotICAgICAgICBjLnBvcCgpOwotICAgICAgICBjLnB1c2goKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICggIShjLmlzQ29udGFpbmVyKCkgfHwgYy5pc0F0dHIoKSkgKQotICAgICAgICAgICAgaWYgKGMudG9QcmV2VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBYbWxPYmplY3QgeCA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGMucG9wKCk7Ci0gICAgICAgIGlmICh4ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRPYmplY3QgcmV0dXJuZWQgbnVsbCAtIGNvbnRlbnQgbXVzdCBoYXZlIGNoYW5nZWQiKTsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXR0eU9iamVjdCAoICkKLSAgICB7Ci0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2F2ZVByZXR0eVByaW50KCk7Ci0gICAgICAgIGZpbmRPYmplY3QoKS54bWxUZXh0KCBvcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBvYmplY3RTdHJpbmcgKCApCi0gICAgewotICAgICAgICBmaW5kT2JqZWN0KCkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGN1cnNvclN0cmluZyAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VUeXBlICggKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IG8sIG47Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbyA9IGZpbmRPYmplY3QoKTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IGZpbmRPYmplY3QoKS5zY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICBuID0gby5jaGFuZ2VUeXBlKCB0eXBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9kb2NzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvID09IF9kb2NzWyBpIF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RvY3NbIGkgXSA9IG47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByZXZUb2tlblR5cGUgKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5wcmV2VG9rZW5UeXBlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBuZXdDdXJzb3IgKCApCi0gICAgewotICAgICAgICBmaW5kT2JqZWN0KCkubmV3Q3Vyc29yKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXROYW1lICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBmaW5kT2JqZWN0KCkubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgaWYgKCFjLmlzU3RhcnRkb2MoKSkKLSAgICAgICAgICAgIGMuc2V0TmFtZSggZ2V0UU5hbWUoKSApOwotCi0gICAgICAgIGMuZGlzcG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbmV3RG9tTm9kZSAoICkKLSAgICB7Ci0gICAgICAgIGlmIChybmQoIDUgKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLm5ld0RvbU5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHhtbElucHV0U3RyZWFtICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocm5kKCA1ICkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpczsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB4aXMgPSBnZXRDdXJzb3IoKS5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIHhpcy5uZXh0KCkgIT0gbnVsbCApCi0gICAgICAgICAgICA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9iamVjdFNldCAoICkKLSAgICB7Ci0gICAgICAgIGZpbmRPYmplY3QoKS5zZXQoIGZpbmRPYmplY3QoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0U3Ryb25nICggKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBmaW5kT2JqZWN0KCk7Ci0KLSAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBQdXJjaGFzZU9yZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBQdXJjaGFzZU9yZGVyIG8gPSAoUHVyY2hhc2VPcmRlcikgeDsKLSAgICAgICAgICAgIG8uc2V0RGF0ZSggQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHggaW5zdGFuY2VvZiBYbWxDdXN0b21lckJlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1c3RvbWVyQmVhbiBvID0gKFhtbEN1c3RvbWVyQmVhbikgeDsKLSAgICAgICAgICAgIG8uc2V0TmFtZSggIkJvYiIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJuZCggMiApID09IDApCi0gICAgICAgICAgICAgICAgby5zZXRBZ2UoIDIzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChybmQoIDIgKSA9PSAwKQotICAgICAgICAgICAgICAgIG8uc2V0TW9vKCAyNCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocm5kKCAyICkgPT0gMCkKLSAgICAgICAgICAgICAgICBvLnNldFBvbyggMjAwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIFhtbExpbmVJdGVtQmVhbikKLSAgICAgICAgewotICAgICAgICAgICAgWG1sTGluZUl0ZW1CZWFuIG8gPSAoWG1sTGluZUl0ZW1CZWFuKSB4OwotICAgICAgICAgICAgby5zZXRQZXJVbml0T3VuY2VzKCBuZXcgQmlnRGVjaW1hbCggMTIyLjQ0ICkgKTsKLSAgICAgICAgICAgIG8uc2V0UHJpY2UoIG5ldyBCaWdEZWNpbWFsKCA1NTUuMzMgKSApOwotICAgICAgICAgICAgby5zZXRRdWFudGl0eSggQmlnSW50ZWdlci52YWx1ZU9mKCAxMTEgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHggaW5zdGFuY2VvZiBYbWxTaGlwcGVyQmVhbikKLSAgICAgICAgewotICAgICAgICAgICAgWG1sU2hpcHBlckJlYW4gbyA9IChYbWxTaGlwcGVyQmVhbikgeDsKLSAgICAgICAgICAgIG8uc2V0UGVyT3VuY2VSYXRlKCBuZXcgQmlnRGVjaW1hbCggMy4xNDE1OSApICk7Ci0gICAgICAgICAgICBvLnNldE5hbWUoICJFcmljIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVWYWx1ZSAoICkKLSAgICB7Ci0gICAgICAgIGZpbmRPYmplY3QoKS5jb21wYXJlVmFsdWUoIGZpbmRPYmplY3QoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUgKCApCi0gICAgewotICAgICAgICBmaW5kT2JqZWN0KCkudmFsaWRhdGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWNRdWVyeSAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfbm9xdWVyeSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGlmIChybmQoIDIwICkgPiAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgbmFtZSA9IGdldFFOYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcXVlcnkgPQotICAgICAgICAgICAgImRlY2xhcmUgbmFtZXNwYWNlIHh4eD0nIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiJyAiICsKLSAgICAgICAgICAgICAgICAiLi8veHh4OiIgKyBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IHggPSBnZXRDdXJzb3IoKS5leGVjUXVlcnkoIHF1ZXJ5ICkuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgaWYgKHJuZCggMyApID09IDApCi0gICAgICAgICAgICBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdID0geDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkuZ2V0T2JqZWN0KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBnZXRDaGFycyAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLmdldENoYXJzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVDdXJzb3JzICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmlzSW5TYW1lRG9jdW1lbnQoIGdldEN1cnNvcigpICk7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5jb21wYXJlUG9zaXRpb24oIGdldEN1cnNvcigpICk7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5pc0F0U2FtZVBvc2l0aW9uQXMoIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gX3htbHMgPQotICAgIHsKLSAgICAgICAgIjxhLz4iLAotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIF9zY2hlbWFfeG1scyA9Ci0gICAgewotICAgICAgICAiPHBvOnB1cmNoYXNlLW9yZGVyIHhtbG5zOnBvPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJz5cbiIgKyAKLSAgICAgICAgIjxwbzpjdXN0b21lciBhZ2U9JzMxJyBwb289JzIwMCc+XG4iICsgCi0gICAgICAgICAgICAiPHBvOm5hbWU+RGF2aWQgQmF1PC9wbzpuYW1lPlxuIiArIAotICAgICAgICAgICAgIjxwbzphZGRyZXNzPkdsYWR3eW5lLCBQQTwvcG86YWRkcmVzcz5cbiIgKyAKLSAgICAgICAgIjwvcG86Y3VzdG9tZXI+XG4iICsgCi0gICAgICAgICI8cG86Y3VzdG9tZXIgYWdlPSczNyc+XG4iICsgCi0gICAgICAgICAgICAiPHBvOm5hbWU+RXJpYyBWYXNpbGlrPC9wbzpuYW1lPlxuIiArIAotICAgICAgICAgICAgIjxwbzphZGRyZXNzPlJlZG1vbmQsIFdBPC9wbzphZGRyZXNzPlxuIiArIAotICAgICAgICAiPC9wbzpjdXN0b21lcj5cbiIgKyAKLSAgICAgICAgIjxwbzpkYXRlPjIwMDItMDktMzBUMTQ6MTY6MDAtMDU6MDA8L3BvOmRhdGU+XG4iICsgCi0gICAgICAgICI8cG86bGluZS1pdGVtPlxuIiArIAotICAgICAgICAgICAgIjxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMTwvcG86ZGVzY3JpcHRpb24+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnByaWNlPjIxLjc5PC9wbzpwcmljZT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cXVhbnRpdHk+MjwvcG86cXVhbnRpdHk+XG4iICsgCi0gICAgICAgICI8L3BvOmxpbmUtaXRlbT5cbiIgKyAKLSAgICAgICAgIjxwbzpsaW5lLWl0ZW0+XG4iICsgCi0gICAgICAgICAgICAiPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyPC9wbzpkZXNjcmlwdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cHJpY2U+MTkuODk8L3BvOnByaWNlPlxuIiArIAotICAgICAgICAgICAgIjxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT5cbiIgKyAKLSAgICAgICAgIjwvcG86bGluZS1pdGVtPlxuIiArIAotICAgICAgICAiPHBvOmxpbmUtaXRlbT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDM8L3BvOmRlc2NyaXB0aW9uPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwcmljZT4xOS44OTwvcG86cHJpY2U+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnF1YW50aXR5PjE8L3BvOnF1YW50aXR5PlxuIiArIAotICAgICAgICAiPC9wbzpsaW5lLWl0ZW0+XG4iICsgCi0gICAgICAgICI8cG86c2hpcHBlcj5cbiIgKyAKLSAgICAgICAgICAgICI8cG86bmFtZT5VUFM8L3BvOm5hbWU+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnBlci1vdW5jZS1yYXRlPjAuNzQ8L3BvOnBlci1vdW5jZS1yYXRlPlxuIiArIAotICAgICAgICAiPC9wbzpzaGlwcGVyPlxuIiArIAotICAgICAgICAiPC9wbzpwdXJjaGFzZS1vcmRlcj5cbiIgKwotICAgICAgICAiIiwKLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWREb2MgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChybmQoIDE1ICkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXSA9Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIF94bWxzWyBybmQoIF94bWxzLmxlbmd0aCApIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkU2NoZW1hZERvYyAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHJuZCggNCApID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0gPQotICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICBfc2NoZW1hX3htbHNbIHJuZCggX3NjaGVtYV94bWxzLmxlbmd0aCApIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yTGVmdE9uZVRva2VuICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkudG9QcmV2VG9rZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JSaWdodE9uZVRva2VuICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkudG9OZXh0VG9rZW4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNoYXJbXSBfY2hhcnMgPQotICAgIHsKLSAgICAgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsCi0gICAgICAgICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsIAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcgJywgJzwnLCAnPicsICcmJywgJy0nLCAnPycKLSAgICB9OwotICAgIAotICAgIHByaXZhdGUgdm9pZCBnZXRUZXh0VmFsdWUgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIGlmIChjLmlzRmluaXNoKCkgfHwgYy5pc05hbWVzcGFjZSgpIHx8IGMuaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBjLmdldFRleHRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRUZXh0VmFsdWUgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIGlmIChjLmlzRmluaXNoKCkgfHwgYy5pc05hbWVzcGFjZSgpIHx8IGMuaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSBybmQoIDEwICkgOyBpID49IDAgOyBpLS0gKQotICAgICAgICAgICAgc2IuYXBwZW5kKCBfY2hhcnNbIHJuZCggX2NoYXJzLmxlbmd0aCApIF0gKTsKLQotICAgICAgICBjLnNldFRleHRWYWx1ZSggc2IudG9TdHJpbmcoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlVGV4dCAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5tb3ZlQ2hhcnMoIHJuZCggMTAgKSwgZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlUZXh0ICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmNvcHlDaGFycyggcm5kKCAxMCApLCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVGV4dCAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnJlbW92ZUNoYXJzKCBybmQoIDYgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRDb21tZW50ICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmluc2VydENvbW1lbnQoICJwb28iICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRQcm9jaW5zdCAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5pbnNlcnRQcm9jSW5zdCggInRhcmdldCIsICJ2YWwiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRUZXh0ICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICBpZiAoYy5pc0FueUF0dHIoKSB8fCBjLmlzU3RhcnRkb2MoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IHJuZCggMTAgKSA7IGkgPj0gMCA7IGktLSApCi0gICAgICAgICAgICBzYi5hcHBlbmQoIF9jaGFyc1sgcm5kKCBfY2hhcnMubGVuZ3RoICkgXSApOwotCi0gICAgICAgIGMuaW5zZXJ0Q2hhcnMoIHNiLnRvU3RyaW5nKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9jQ2hhcnMgKCApCi0gICAgewotICAgICAgICBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdLnhtbFRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3Vyc29yQ2hhcnMgKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS54bWxUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvY0J5dGVzICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdLnNhdmUoIG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjdXJzb3JCeXRlcyAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkuc2F2ZSggbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBtb3ZlQ2hhcnNSaWdodCAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkudG9OZXh0Q2hhciggcm5kKCAxMCApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVDaGFyc0xlZnQgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnRvUHJldkNoYXIoIHJuZCggMTAgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0UU5hbWUgKCApCi0gICAgewotICAgICAgICBRTmFtZSBuYW1lID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAoIHJuZCggMyApICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDAgOiBuYW1lID0gWG1sQmVhbnMuZ2V0UU5hbWUoICJmb28uY29tIiwgImZvbyIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMSA6IG5hbWUgPSBYbWxCZWFucy5nZXRRTmFtZSggImJhci5jb20iLCAiYmFyIiApOyBicmVhazsKLSAgICAgICAgY2FzZSAyIDogbmFtZSA9IFhtbEJlYW5zLmdldFFOYW1lKCAibW9vIiApOyBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0RWxlbSAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICBpZiAoYy5pc0FueUF0dHIoKSB8fCBjLmlzU3RhcnRkb2MoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggZ2V0UU5hbWUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHIgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIHdoaWxlICggIWMuaXNFbmRkb2MoKSAmJiAhYy5pc0NvbnRhaW5lcigpICkKLSAgICAgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBpZiAoYy5pc0VuZGRvYygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGMuaW5zZXJ0QXR0cmlidXRlKCBnZXRRTmFtZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVhtbENvbnRlbnRzICggKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBnZXRDdXJzb3IoKTsKLQotICAgICAgICBjLnJlbW92ZVhtbENvbnRlbnRzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvcHlYbWxDb250ZW50cyAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5jb3B5WG1sQ29udGVudHMoIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvcHlYbWwgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuY29weVhtbCggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbW92ZVhtbENvbnRlbnRzICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLm1vdmVYbWxDb250ZW50cyggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbW92ZVhtbCAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5tb3ZlWG1sKCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVYbWwgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIGlmICghYy5pc1N0YXJ0ZG9jKCkgJiYgIWMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgIGMucmVtb3ZlWG1sKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb29rbWFyayBleHRlbmRzIFhtbEN1cnNvci5YbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVCb29rbWFyayAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkuc2V0Qm9va21hcmsoIG5ldyBCb29rbWFyaygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyQm9va21hcmsgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLmNsZWFyQm9va21hcmsoIEJvb2ttYXJrLmNsYXNzICk7Ci0gICAgfQotCi0gICAgcHVibGljIFJhbmRvbShsb25nIHNlZWQsIFhtbE9iamVjdFtdIHNoYXJlZERvY3MsIGJvb2xlYW4gcmVhZG9ubHksIGJvb2xlYW4gbm9zYXZlLCBib29sZWFuIG5vcXVlcnksIGJvb2xlYW4gaW50ZXJmZXJlbmNlKQotICAgIHsKLSAgICAgICAgX3NlZWQgPSBzZWVkOwotICAgICAgICBfcm5kID0gbmV3IGphdmEudXRpbC5SYW5kb20oc2VlZCk7Ci0gICAgICAgIF9kb2NzID0gc2hhcmVkRG9jczsKLSAgICAgICAgX3JlYWRvbmx5ID0gcmVhZG9ubHk7Ci0gICAgICAgIF9ub3NhdmUgPSBub3NhdmU7Ci0gICAgICAgIF9ub3F1ZXJ5ID0gbm9xdWVyeTsKLSAgICAgICAgX2ludGVyZmVyZW5jZSA9IGludGVyZmVyZW5jZTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9kZWZhdWx0cy54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2RlZmF1bHRzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMjExNi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2RlZmF1bHRzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnRucz0iaHR0cDovL29wZW51cmkub3JnL2RlZiIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2RlZiIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWZhdWx0cyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6Y29vbCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvb2wiIHR5cGU9InhzOmludCIgZGVmYXVsdD0iNzgzIi8+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlZC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVkLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyNjNhZi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVkLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJjaGFpbiIgdHlwZT0iY2hhaW5saW5rIi8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNoYWlubGluayI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJjaGFpbiIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9Im5hbWUiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0b2tlbiI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czptYXhMZW5ndGggdmFsdWU9IjUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ0b2tlbiIvPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIxLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIxLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxMTAyMy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVyMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9Imh0dHA6Ly9vcGVudXJpLm9yZy9pbmNsdWRlcjEiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9pbmNsdWRlcjEiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImluY2x1ZGVkLnhzZCIvPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im9uZWNoYWluIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOmNoYWluIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVyMi54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVyMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTY1ZGMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIyIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIyIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJpbmNsdWRlZC54c2QiLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0d29jaGFpbnMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Y2hhaW4iIG1pbk9jY3Vycz0iMiIgbWF4T2NjdXJzPSIyIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2ludHRlc3QueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbnR0ZXN0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3MjFkZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2ludHRlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICB0YXJnZXROYW1lc3BhY2U9ImphdmE6aW50LnRlc3QiCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9ImphdmE6aW50LnRlc3QiPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkxhdGl0dWRlRGVncmVlc1R5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDxkZWZpbml0aW9uPkRlZ3JlZXMgb2YgTGF0aXR1ZGU8L2RlZmluaXRpb24+Ci0gICAgICAgIDxVU01URnJlZj5TZWUgVVNNVEYgZmllbGQgbGF0aXR1ZGUuZGVncmVlcy4xNy4xPC9VU01URnJlZj4KLSAgICAgICAgPERvRFhNTHJlZj5UQkQ8L0RvRFhNTHJlZj4KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNob3J0Ij4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjAwIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI5MCIvPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IltcZF17Mn0iLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTG9uZ2l0dWRlRGVncmVlc1R5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDxkZWZpbml0aW9uPkRlZ3JlZXMgb2YgTG9uZ2l0dWRlPC9kZWZpbml0aW9uPgotICAgICAgICA8VVNNVEZyZWY+U2VlIFVTTVRGIGZpZWxkIGxvbmdpdHVkZS5kZWdyZWVzLjE4LjE8L1VTTVRGcmVmPgotICAgICAgICA8RG9EWE1McmVmPlRCRDwvRG9EWE1McmVmPgotICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2hvcnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMDAwIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxODAiLz4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXGRdezN9Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InBvc2l0aW9uIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxhdCIgdHlwZT0idG5zOkxhdGl0dWRlRGVncmVlc1R5cGUiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibG9uIiB0eXBlPSJ0bnM6TG9uZ2l0dWRlRGVncmVlc1R5cGUiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2xpc3RhbmR1bmlvbi54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2xpc3RhbmR1bmlvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGVhYTguLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9saXN0YW5kdW5pb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvbHV0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbHV0IgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuaW9ucyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJubmkiIHR5cGU9InRuczphbGxOTkkiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2l6ZXMiIHR5cGU9InRuczpsaXN0LW9yLWFsbCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nbGlzdC1vZi1pbnQnPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSd4czppbnQnLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE5OSSI+Ci0gICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6dW5pb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJsaXN0LW9yLWFsbCI+Ci0gICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ0bnM6bGlzdC1vZi1pbnQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5rbm93biIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6dW5pb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJsaXN0LW9mLWFsbE5OSSI+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InRuczphbGxOTkkiLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxpc3RzIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImludC1saXN0IiB0eXBlPSJ0bnM6bGlzdC1vZi1pbnQiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibm5pLWxpc3QiIHR5cGU9InRuczpsaXN0LW9mLWFsbE5OSSIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGF0ZS1vci1kYXRlVGltZSI+Ci0gICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czpkYXRlIHhzOmRhdGVUaW1lIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ3aGVuIiB0eXBlPSJ0bnM6ZGF0ZS1vci1kYXRlVGltZSIvPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImluY2lkZW50LXJlcG9ydHMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6d2hlbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9uYW1ld29ybGQueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9uYW1ld29ybGQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2QwYWU4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbmFtZXdvcmxkLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm53PSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5hbWV3b3JsZCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXNsYW5kIj4KLSAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ibnc6bG9jIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2MiPgotICAgIDx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0byIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9ub25hbWVzcGFjZS54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL25vbmFtZXNwYWNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0NTYxZC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL25vbmFtZXNwYWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJuY2hhaW4iIHR5cGU9Im5jaGFpbmxpbmsiLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmNoYWlubGluayI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJuY2hhaW4iLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJubmFtZSIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im50b2tlbiI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czptYXhMZW5ndGggdmFsdWU9IjUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJubmFtZSIgdHlwZT0ibnRva2VuIi8+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9zdWJzdGdyb3VwLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvc3Vic3Rncm91cC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2E4ODQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9zdWJzdGdyb3VwLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvc2dzIiB4bWxuczpzZz0iaHR0cDovL29wZW51cmkub3JnL3NncyI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkMiIHR5cGU9InhzZDp0b2tlbiIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkIiLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkEiLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJaIiB0eXBlPSJzZzpFeHQiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzpZIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJZIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6WCIgLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iWCIgdHlwZT0ic2c6QmFzZSIvPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFueVR5cGUiLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW55VHlwZVRhaWwiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzpBbnlUeXBlIi8+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW5vblNpbXBsZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0gICAgICAgICAgICAgICAgPHhzZDptYXhFeGNsdXNpdmUgdmFsdWU9IjEwMCIvPgotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbm9uU2ltcGxlVGFpbCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkFub25TaW1wbGUiLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbm9uQ29tcGxleCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb28iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFub25Db21wbGV4VGFpbCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkFub25Db21wbGV4Ii8+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzZzpBIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbnJlbGF0ZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0ciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXh0Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNnOkJhc2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iYWJzdHJhY3RUZXN0Ij4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6YWxsPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9InNnOmFic3RyYWN0Ii8+Ci0JCQk8L3hzZDphbGw+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzZDpzdHJpbmciIGFic3RyYWN0PSJ0cnVlIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmNyZXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6YWJzdHJhY3QiLz4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJibG9ja1Rlc3QiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphbGw+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0ic2c6YmxvY2siLz4KLQkJCTwveHNkOmFsbD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJibG9jayIgdHlwZT0ieHNkOnN0cmluZyIgYmxvY2s9InN1YnN0aXR1dGlvbiIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWJibG9jayIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOmJsb2NrIi8+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvSW50ZXJuLmphdmEgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L0ludGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Q5OWM5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvSW50ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBzdHJlYW10ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm4KLXsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9JVEVSID0gMTAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DUkVBVEUgPSAxMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ09NUCA9IDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBjaGFyW10gY2EgPSB7ICdhJywgJ2EnLCAnYSd9OwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSAiYWFhIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKCJhYWEiKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKGNhKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKGNhKS5pbnRlcm4oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBTdHJpbmcudmFsdWVPZihjYSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFhYSIgPT0gU3RyaW5nLmNvcHlWYWx1ZU9mKGNhKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSAiYWFhIik7Ci0KLSAgICAgICAgbG9uZyBzdGFydDsKLSAgICAgICAgZG91YmxlIGQxID0gMDsKLSAgICAgICAgZG91YmxlIGQyID0gMDsKLSAgICAgICAgZG91YmxlIGQzID0gMDsKLQotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTEoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocW4xLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUxOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKLQotICAgICAgICAvL2NyZWF0ZTIKLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUyOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKLQotICAgICAgICAvL2NyZWF0ZTMKLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUzOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKLSAgICB9Ci19Ci0KLWNsYXNzIENhY2hlCi17Ci0gICAgSGFzaE1hcCBoMSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBRTmFtZSBjcmVhdGUxKFN0cmluZyBsLCBTdHJpbmcgdSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUobCAsdSk7Ci0gICAgfQotCi0gICAgUU5hbWUgY3JlYXRlMihTdHJpbmcgbCwgU3RyaW5nIHUpCi0gICAgewotICAgICAgICBpbnQgaGNvZGUgPSBsLmhhc2hDb2RlKCkgKyAzMyp1Lmhhc2hDb2RlKCk7Ci0gICAgICAgIEludGVnZXIga2V5ID0gbmV3IEludGVnZXIoaGNvZGUpOwotCi0gICAgICAgIGlmKCBoMS5jb250YWluc0tleSgga2V5ICkgKQotICAgICAgICAgICAgcmV0dXJuIChRTmFtZSloMS5nZXQoa2V5KTsKLQotICAgICAgICBRTmFtZSBxbiA9IG5ldyBRTmFtZShsLCB1KTsKLSAgICAgICAgaDEucHV0KGtleSwgcW4pOwotICAgICAgICByZXR1cm4gcW47Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIFFOYW1lIGNyZWF0ZTMoU3RyaW5nIGwsIFN0cmluZyB1KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZTIobCwgdSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFFOYW1lCi0gICAgewotICAgICAgICBwcml2YXRlIFN0cmluZyBsb2NhbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotCi0gICAgICAgIHByaXZhdGUgUU5hbWUoKQotICAgICAgICB7fQotICAgICAgICBwcml2YXRlIFFOYW1lKFN0cmluZyBsLCBTdHJpbmcgdSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYWwgPSBsOwotICAgICAgICAgICAgdXJpID0gdTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxJbnRlcm4oIFFOYW1lIHFuICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsPT1xbi5sb2NhbCAmJiB1cmk9PXFuLnVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxFeHRlcm4oIFFOYW1lIHFuICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsLmVxdWFscyhxbi5sb2NhbCkgJiYgdXJpLmVxdWFscyhxbi51cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsb2NhbCArICIsIiArIHVyaTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2EwMjI3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvU3ViU3RyZWFtc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHN0cmVhbXRlc3Q7Ci0KLS8qCi0qIENyZWF0ZWQgYnkgY2V6YXJAYmVhLmNvbQotKi8KLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbUZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhtbFN0cmVhbVNvdXJjZTsKLWltcG9ydCBvcmcueG1scHVsbC5zdHJlYW0uWHBwWG1sU3RyZWFtSW1wbDsKLWltcG9ydCBvcmcueG1scHVsbC5zdHJlYW0uWG1sU3RyZWFtRmFjdG9yeTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdWJTdHJlYW1zVGVzdAotewotICAgIHB1YmxpYyBTdWJTdHJlYW1zVGVzdChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIC8vc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN1YlN0cmVhbSgpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0IHdvcmtzLiIpOwotCi0gICAgICAgIC8vdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktldmluJ3MgZXhjZXB0aW9uIik7Ci0KLSAgICAgICAgLy9hc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciByZWFkZXIxOwotICAgICAgICBSZWFkZXIgcmVhZGVyMjsKLSAgICAgICAgaWYoIGFyZ3MubGVuZ3RoPT0wICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAiPGE+PGI+PGMgYTE9J2ExdicgYTI9J2EydicgLz48L2I+PHgvPiIgKwotICAgICAgICAgICAgICAgICI8eT5Tb21lIHRleHQ8L3k+PC9hPiI7Ci0gICAgICAgICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKLSAgICAgICAgICAgIHJlYWRlcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVhZGVyMSA9IG5ldyBGaWxlUmVhZGVyKGFyZ3NbMF0pOwotICAgICAgICAgICAgcmVhZGVyMiA9IG5ldyBGaWxlUmVhZGVyKGFyZ3NbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkZXIgLi4uIik7Ci0gICAgICAgIFhtbFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgWHBwWG1sU3RyZWFtSW1wbChyZWFkZXIxKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlTdHJlYW0gPSBYbWxTdHJlYW1GYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKCBzb3VyY2UgKTsKLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYWJlbFN0cmVhbSA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpLgotICAgICAgICAgICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyMik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJteVN0cmVhbSAuLi4iKTsKLSAgICAgICAgZm9yKGludCBpPTA7IG15U3RyZWFtLmhhc05leHQoKSAmJiBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyBteVN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKyBiYWJlbFN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MgPSBteVN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmJzcyA9IGJhYmVsU3RyZWFtLmdldFN1YlN0cmVhbSgpOwotCi0gICAgICAgIGZvcihpbnQgaT0wOyAobXlzcy5oYXNOZXh0KCkgfHwgYmJzcy5oYXNOZXh0KCkpICYmIGk8MzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyBteXNzLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyBiYnNzLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYnNzLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIGJic3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgZm9yKDsgbXlzczIuaGFzTmV4dCgpIHx8IGJic3MyLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTdWJTVUJTdHJlYW0gMjogIiArIG15c3MyLmhhc05leHQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgJyIgKyBteXNzMi5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU3ViU1VCU3RyZWFtIDI6ICIgKyBiYnNzMi5oYXNOZXh0KCkgKwotICAgICAgICAgICAgICAgICAgICAiICciICsgYmJzczIubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICBteXNzMi5jbG9zZSgpOwotICAgICAgICBiYnNzMi5jbG9zZSgpOwotCi0gICAgICAgIGZvcig7IG15c3MuaGFzTmV4dCgpIHx8IGJic3MuaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArIG15c3MuaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArIGJic3MuaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcig7IG15U3RyZWFtLmhhc05leHQoKSB8fCBiYWJlbFN0cmVhbS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArIG15U3RyZWFtLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKyBiYWJlbFN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1haW4yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4yKCkKLSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciByZWFkZXIxOwotICAgICAgICBSZWFkZXIgcmVhZGVyMjsKLSAgICAgICAgICAgIFN0cmluZyBzID0gIjxhPjxiPjxjIGExPSdhMXYnIGEyPSdhMnYnIC8+PC9iPjx4Lz4iICsKLSAgICAgICAgICAgICAgICAiPHk+U29tZSB0ZXh0PC95PjwvYT4iOwotICAgICAgICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRlciAuLi4iKTsKLSAgICAgICAgWG1sU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBYcHBYbWxTdHJlYW1JbXBsKHJlYWRlcjEpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteVN0cmVhbSA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0oIHNvdXJjZSApOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIGJhYmVsU3RyZWFtID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCi0gICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyZWFkZXIyKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm15U3RyZWFtIC4uLiIpOwotICAgICAgICBmb3IoaW50IGk9MDsgbXlTdHJlYW0uaGFzTmV4dCgpICYmIGk8MzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzcyA9IG15U3RyZWFtLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYnNzID0gYmFiZWxTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7Ci0KLSAgICAgICAgZm9yKGludCBpPTA7IG15c3MuaGFzTmV4dCgpICYmIGk8MzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmJzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBmb3IoOyBteXNzMi5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU3ViU1VCU3RyZWFtIDI6ICIgKwotICAgICAgICAgICAgICAgICAgICAiICciICsgbXlzczIubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFN1YlNVQlN0cmVhbSAyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiAnIiArIGJic3MyLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgbXlzczIuY2xvc2UoKTsKLSAgICAgICAgYmJzczIuY2xvc2UoKTsKLQotICAgICAgICBmb3IoOyBteXNzLmhhc05leHQoKSB8fCBiYnNzLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcig7IG15U3RyZWFtLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKwotICAgICAgICAgICAgICAgICAgICAvL2JhYmVsU3RyZWFtLmhhc05leHQoKSArICAvL0JBQkVMIGJ1Z2J1ZzogdW4vY29tbWVudCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGluZSB5b3UnbGwgZ2V0IGRpZmZlcmVudCBiZWhhdmlvciBmb3IgbmV4dCgpCi0gICAgICAgICAgICAgICAgICAgICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFpbjMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbjMoKQotICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhZGVyIHJlYWRlcjE7Ci0gICAgICAgIFJlYWRlciByZWFkZXIyOwotICAgICAgICBTdHJpbmcgcyA9ICI8P3htbCB2ZXJzaW9uPScxLjEuMSc/PjxhPjxiIHhtbG5zPScnIHhtbG5zOmE9J3NkZnNkZic+PGMgYTE9J2EmbHQ7MXYnIGEyPSdhMnYnIC8+PC9iPjx4Lz4iICsKLSAgICAgICAgICAgICI8eT5Tb21lJmx0OyBhbmQgJmd0O3RleHQ8L3k+PC9hPiI7Ci0gICAgICAgIHJlYWRlcjEgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOwotICAgICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRlciAuLi4gaW4gbWFpbjMiKTsKLSAgICAgICAgWG1sU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBYcHBYbWxTdHJlYW1JbXBsKHJlYWRlcjEpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteVN0cmVhbSA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0oIHNvdXJjZSApOwotCi0gICAgICAgIC8vWE1MSW5wdXRTdHJlYW0gYmFiZWxTdHJlYW0gPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgLy8gICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyMik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJteVN0cmVhbSAuLi4iKTsKLSAgICAgICAgZm9yKGludCBpPTA7IG15U3RyZWFtLmhhc05leHQoKSAmJiBpPDA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArICIgJyIgKwotICAgICAgICAgICAgLy8gICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzID0gbXlTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIC8vWE1MSW5wdXRTdHJlYW0gYmJzcyA9IGJhYmVsU3RyZWFtLmdldFN1YlN0cmVhbSgpOwotCi0gICAgICAgIGZvcihpbnQgaT0wOyBteXNzLmhhc05leHQoKSAmJiBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAvLyAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOwotICAgICAgICAvL1hNTElucHV0U3RyZWFtIGJic3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgZm9yKDsgbXlzczIuaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFN1YlNVQlN0cmVhbSAyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiAnIiArIG15c3MyLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiIFN1YlNVQlN0cmVhbSAyOiAiICsKLSAgICAgICAgICAgIC8vICAgICAgICAiICciICsgYmJzczIubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICBteXNzMi5jbG9zZSgpOwotICAgICAgICAvL2Jic3MyLmNsb3NlKCk7Ci0KLSAgICAgICAgZm9yKDsgbXlzcy5oYXNOZXh0KCkgLyp8fCBiYnNzLmhhc05leHQoKSovIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgLy8gICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcig7IG15U3RyZWFtLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArCi0gICAgICAgICAgICAgICAgICAgIC8vYmFiZWxTdHJlYW0uaGFzTmV4dCgpICsgIC8vQkFCRUwgYnVnYnVnOiB1bi9jb21tZW50IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9saW5lIHlvdSdsbCBnZXQgZGlmZmVyZW50IGJlaGF2aW9yIGZvciBuZXh0KCkKLSAgICAgICAgICAgIC8vICAgICAgICAiICciICsKLSAgICAgICAgICAgIC8vICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1htbFN0cmVhbUNvbmZvcm1hbmNlLmphdmEgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1htbFN0cmVhbUNvbmZvcm1hbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmFmOWUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9YbWxTdHJlYW1Db25mb3JtYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugc3RyZWFtdGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBvcmcueG1scHVsbC5teHAxLk1YUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLm14cDEuTVhQYXJzZXJDYWNoaW5nU3RyaW5nczsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW1GYWN0b3J5OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgeG1sZXh0LnhtbC5YcHBBZGFwdG9yOwotaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YcHBYbWxTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YbWxTdHJlYW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLS8qKgotICogICBUZXN0cyB0aGUgY29uZm9ybWFuY2Ugb2YgdGhlIFhNTElucHV0U3RyZWFtIHByb2R1Y2VkIGJ5IFhwcFhtbFN0cmVhbUltcGwuCi0gKiAgIEBhdXRob3IgQ2V6YXIgQW5kcmVpCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTdHJlYW1Db25mb3JtYW5jZQotewotICAgIGZpbmFsIHN0YXRpYyBpbnQgVElNRVMgPSAzMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBhcmdzLmxlbmd0aD4wICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0gICAgICAgICAgICBpZiggZi5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgICAgICAgICBjb21wYXJlRGlyKGYpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIC8vY29tcGFyZUZpbGUoZik7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaWxlKGYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRVc2FnZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0VGhpcyBhcHAgdGVzdHMgdGhlIGNvbmZvcm1hbmNlIG9mIHRoZSB0d28gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiWE1MSW5wdXRTdHJlYW0gXG5cdHByb2R1Y2VkIGJ5IEJhYmVsIHBhcnNlciBhbmQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiWHBwMyBwYXJzZXIuIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblx0VVNBR0U6IGphdmEgLi4uIHRlc3QuWG1sU3RyZWFtQ29uZm9ybWFuY2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyfGZpbGUiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRkaXJcdFx0TWFrZXMgdGhlIHRlc3QgZm9yIGFsbCB0aGUgZmlsZXMgaW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGRpci4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0ZmlsZVx0XHRNYWtlcyB0aGUgdGVzdCBvbmx5IGZvciB0aGF0IGZpbGUuIik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY29tcGFyZUZpbGUoRmlsZSBmaWxlKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiIHNpemU6ICIgKyBmaWxlLmxlbmd0aCgpKTsKLQotICAgICAgICBpZighZmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigiY29tcGFyZUZpbGU6IGZpbGUgbm90IGEgRmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFJlYWRlciByMSA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotICAgICAgICBSZWFkZXIgcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4cHAgPSBYbWxTdHJlYW1GYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKG5ldyBYcHBYbWxTdHJlYW1JbXBsKHIyKSk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIGJhYmVsID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCi0gICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyMSk7Ci0KLSAgICAgICAgd2hpbGUoIHhwcC5oYXNOZXh0KCkgfHwgYmFiZWwuaGFzTmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgWE1MRXZlbnQgeHBwZXZlbnQgPSB4cHAucGVlaygpOwotICAgICAgICAgICAgWE1MRXZlbnQgYmFiZWxldmVudCA9IGJhYmVsLnBlZWsoKTsKLQotICAgICAgICAgICAgaWYoICEoIiIreHBwZXZlbnQpLmVxdWFscygoIiIrYmFiZWxldmVudCkpICkKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHhwcGV2ZW50LCBiYWJlbGV2ZW50KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiICAgYCIgKyB4cHBldmVudCArICInXG4gICBgIiArIGJhYmVsZXZlbnQgKwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICInIik7IFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeHBwZXZlbnQgPSB4cHAubmV4dCgpOwotICAgICAgICAgICAgYmFiZWxldmVudCA9IGJhYmVsLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgICB4cHAgICBvdmVybGltaXQ6ICIgKyB4cHAubmV4dCgpICk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgICBiYWJlbCBvdmVybGltaXQ6ICIgKyBiYWJlbC5uZXh0KCkgKTsKLQotICAgICAgICByMS5jbG9zZSgpOwotICAgICAgICByMi5jbG9zZSgpOwotCi0gICAgICAgIC8vY29tcGFyZVBlcmYoZmlsZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcHJpbnRGaWxlKEZpbGUgZmlsZSkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0UGF0aCgpICsgIiBzaXplOiAiICsgZmlsZS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgaWYoIWZpbGUuaXNGaWxlKCkpCi0gICAgICAgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oImNvbXBhcmVGaWxlOiBmaWxlIG5vdCBhIEZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBSZWFkZXIgcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4cHAgPSBYbWxTdHJlYW1GYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKG5ldyBYcHBYbWxTdHJlYW1JbXBsKHIyKSk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIG1vcnBoZWRTdHJlYW07Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHhxdWVyeSIpOwotICAgICAgICAgICAgWG1sT2JqZWN0IHhtbE9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhwcCk7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3JzID0geG1sT2JqLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIHJlc0NycyA9IGNycy5leGVjUXVlcnkoIiR0aGlzIik7Ci0gICAgICAgICAgICAvLyBub3QgeWV0IGltcGxlbWVudGVkCi0gICAgICAgICAgICAvL21vcnBoZWRTdHJlYW0gPSByZXNDcnMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSByZXNDcnMubmV3UmVhZGVyKCk7Ci0gICAgICAgICAgICByZWFkZXIgPSByZXNDcnMubmV3UmVhZGVyKCk7Ci0gICAgICAgICAgICBtb3JwaGVkU3RyZWFtID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi4uLiIpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIG1vcnBoZWRTdHJlYW0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgeHBwID0gbW9ycGhlZFN0cmVhbTsKLQotICAgICAgICB3aGlsZSggeHBwLmhhc05leHQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhNTEV2ZW50IHhwcGV2ZW50ID0geHBwLnBlZWsoKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBgIiArIHhwcGV2ZW50ICsgIiciKTsgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICAgICAgeHBwZXZlbnQgPSB4cHAubmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcjIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBwcmludEVycm9yKFhNTEV2ZW50IHhwcGV2ZW50LCBYTUxFdmVudCBiYWJlbGV2ZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIHN4cHAgPSAiIit4cHBldmVudDsKLSAgICAgICAgU3RyaW5nIHNiYWIgPSAiIitiYWJlbGV2ZW50OwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVJST1ItLS0tLSIpOwotICAgICAgICBpZiggIXN4cHAudHJpbSgpLmVxdWFscyhzYmFiLnRyaW0oKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhwcCAgIDpgIiArIHN4cHAgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiYmFiZWwgOmAiICsgc2JhYiArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ4cHAgICA6Iik7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxzeHBwLmxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBiID0gKGJ5dGUpc3hwcC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICMiICsgYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJcbmJhYmVsIDoiKTsKLSAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPHNiYWIubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlzYmFiLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIyIgKyBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuLS0tLS0tLS0tLSIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNvbXBhcmVEaXIoRmlsZSBkaXIpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCFkaXIuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImNvbXBhcmVEaXI6IGRpciBub3QgYSBEaXJlY3RvcnkiKTsKLQotICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0gICAgICAgIGZvciggaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGNvbXBhcmVGaWxlKGZpbGVzW2ldKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjb21wYXJlUGVyZihGaWxlIGZpbGUpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGxvbmcgc3RhcnQ7Ci0gICAgICAgIGRvdWJsZSB4c3RpbWUgPSAwOwotICAgICAgICBkb3VibGUgeHJ0aW1lID0gMDsKLSAgICAgICAgZG91YmxlIGJhYmVsdGltZSA9IDA7Ci0KLSAgICAgICAgLy9iYWJlbAotICAgICAgICBmb3IoIGludCBpPTA7IGk8VElNRVM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmFiZWwgPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyKTsKLSAgICAgICAgICAgIHdoaWxlKCBiYWJlbC5oYXNOZXh0KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhNTEV2ZW50IGJhYmVsZXZlbnQgPSBiYWJlbC5wZWVrKCk7Ci0gICAgICAgICAgICAgICAgYmFiZWxldmVudCA9IGJhYmVsLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhYmVsdGltZSArPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCIuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3hwcCB3aXRoIGRpcmVjdCBhY2NlcyB0byB0aGUgeHBwIHBhcnNlcgotICAgICAgICBmb3IoIGludCBpPTA7IGk8VElNRVM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICAgICAgTVhQYXJzZXIgeHBwID0gKE1YUGFyc2VyKSBuZXcgTVhQYXJzZXJDYWNoaW5nU3RyaW5ncygpOwotICAgICAgICAgICAgeHBwLnNldEZlYXR1cmUoIE1YUGFyc2VyLkZFQVRVUkVfUFJPQ0VTU19OQU1FU1BBQ0VTLCB0cnVlKTsKLSAgICAgICAgICAgIHhwcC5zZXRJbnB1dCggciApOwotICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IHhwcC5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIHdoaWxlICggZXZlbnRUeXBlICE9IHhwcC5FTkRfRE9DVU1FTlQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHhwcC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhydGltZSArPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCInIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3hwcCB3aXRoIFhwcFhtbFN0cmVhbUltcGwKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPFRJTUVTOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotICAgICAgICAgICAgLy9YTUxJbnB1dFN0cmVhbSB4cHAgPSBuZXcgWHBwQWRhcHRvcigpLmdldFN0cmVhbShyMik7Ci0gICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICAgICAgWE1MSW5wdXRTdHJlYW0geHBwID0gKFhNTElucHV0U3RyZWFtKSBuZXcgWHBwWG1sU3RyZWFtSW1wbChyKTsKLQotICAgICAgICAgICAgd2hpbGUoIHhwcC5oYXNOZXh0KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhNTEV2ZW50IHhwcGV2ZW50ID0geHBwLnBlZWsoKTsKLSAgICAgICAgICAgICAgICB4cHBldmVudCA9IHhwcC5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4c3RpbWUgKz0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludCgiYCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQRVJGOiAgYmFiZWwveHBwSVMgPSAiICsgZGVjKGJhYmVsdGltZS94c3RpbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXHRiYWJlbC94cHBSYXcgPSAiICsgZGVjKGJhYmVsdGltZS94cnRpbWUpICk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBkZWMoIGRvdWJsZSBmKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiICsgKChkb3VibGUpTWF0aC5yb3VuZChmKjEwMCkpLzEwMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zdHNzY2hlbWEvc3RzLnhzZCBiL3YxL3Rlc3Qvc3JjL3N0c3NjaGVtYS9zdHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FmN2Y2Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3N0c3NjaGVtYS9zdHMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOnN0cz0iaHR0cDovL2JlYS5jb20vaW50ZXJuYWwvc29hcC10ZXN0LXNjcmlwdCIKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYmVhLmNvbS9pbnRlcm5hbC9zb2FwLXRlc3Qtc2NyaXB0IgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgYmxvY2tEZWZhdWx0PSIjYWxsIj4KLSAgCi0KLTx4czplbGVtZW50IG5hbWU9InNvYXAtdGVzdC1zY3JpcHQiPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJzdHM6cmVxdWVzdFNwZWMiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXZlbnQiIHR5cGU9InN0czpldmVudFNwZWMiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWxsIiB0eXBlPSJzdHM6c2V0T2ZFdmVudHMiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4czppbnQiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNldE9mRXZlbnRzIj4KLSAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJldmVudCIgdHlwZT0ic3RzOmV2ZW50U3BlYyIvPgotICA8L3hzOmNob2ljZT4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJyZXF1ZXN0U3BlYyI+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InN0YXJ0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJleHBlY3QiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0iZXZlbnRTcGVjIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb250aW51ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaW5pc2giIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDwveHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IG5hbWU9ImV4cGVjdCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICA8L3hzOnNlcXVlbmNlPgotPC94czpjb21wbGV4VHlwZT4KLQotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg4ZjIwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgY29tLmJlYS50ZXN0OwotCi1pbXBvcnQgd2VibG9naWMueG1sLnNjaGVtYS5tb2RlbC5wYXJzZXIuWFNEUGFyc2VyRmFjdG9yeTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLnBhcnNlci5YU0RQYXJzZXI7Ci1pbXBvcnQgd2VibG9naWMueG1sLnNjaGVtYS5tb2RlbC5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLlhTRFNjaGVtYTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLlhTREV4Y2VwdGlvbjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtRmFjdG9yeTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLmV2ZW50cy5OYW1lOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZTsKLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc2NoZW1hLlNjaGVtYVR5cGVTeXN0ZW1CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuc2NoZW1hLlNjaGVtYVR5cGVDb2RlUHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnRvb2wuQ29tbWFuZExpbmU7Ci1pbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LlNpbXBsaWNpdHk7Ci1pbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LlBlcnNvbjsKLQotcHVibGljIGNsYXNzIFRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgbnVsbCk7Ci0gICAgICAgIFhTRFBhcnNlciB4c2RwYXJzZXIgPSBYU0RQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWFNEUGFyc2VyKCk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtRmFjdG9yeSB4bWxwYXJzZXIgPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBzaW1wbGV0ZXN0ID0gZmFsc2U7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTY2hlbWFUeXBlU3lzdGVtQnVpbGRlcigidGVzdCIpOwotCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVhZGVyIGlucHV0ID0gbmV3IEZpbGVSZWFkZXIoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQgc2RvYyA9IHhzZHBhcnNlci5wYXJzZVNjaGVtYSh4bWxwYXJzZXIubmV3SW5wdXRTdHJlYW0oaW5wdXQpKTsKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWEgcyA9IHNkb2MuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRBbGxDb21wb25lbnRzKHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlICIgKyBhcmdzW2ldICsgIjpcbiIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgZmlsZSAiICsgYXJnc1tpXSArICI6XG4iICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWFNERXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwYXJzaW5nIHNjaGVtYSBmaWxlICIgKyBhcmdzW2ldICsgIjpcbiIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJ1aWxkZXIucmVzb2x2ZUFsbFR5cGVzKCk7Ci0gICAgICAgIGJ1aWxkZXIuamF2YWl6ZUFsbFR5cGVzKCk7Ci0KLSAgICAgICAgLy8gT0ssIGhlcmUgd2UgZ28KLQotICAgICAgICBTY2hlbWFUeXBlW10gZ3R5cGVzID0gYnVpbGRlci5nbG9iYWxUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGd0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gZ3R5cGVzW2ldOwotCi0gICAgICAgICAgICAvLyBwcmludCBvbmx5IHR5cGVzIGluIHRoaXMgdHlwZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghdHlwZS5nZXRTY2hlbWFUeXBlU3lzdGVtKCkuZXF1YWxzKGJ1aWxkZXIpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlByaW50aW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlQ29kZVByaW50ZXIucHJpbnRUeXBlKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCksIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJTyBFcnJvciAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICBib29sZWFuIHNpbXBsZXRlc3QgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc2ltcGxldGVzdCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFN0b3JlIHN0b3JlID0gbmV3IFRlc3RTdG9yZShvcmcub3BlbnVyaS5teXRlc3QuU2ltcGxlRG9jdW1lbnQudHlwZSk7Ci0gICAgICAgICAgICBUZXN0U3RvcmUuQ3Vyc29yIGN1cnNvciA9IHN0b3JlLm5ld0N1cnNvcigpOwotCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkdvdCBzdG9yZSwgZmlsbGluZyBpdCBpbi4uLiIpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgInNpbXBsZSIpKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRBdHRyaWJ1dGUobmV3IE5hbWUobnVsbCwgIm5vdGUiKSwgImEgc21hbGxpc2ggbnVtYmVyIik7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMTQzIik7Ci0gICAgICAgICAgICBjdXJzb3IudG9Sb290KCk7Ci0gICAgICAgICAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBTaW1wbGljaXR5IHNpbXAgPSAoU2ltcGxpY2l0eSljdXJzb3Iub2JqKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSB2YWx1ZSBvZiBzaW1wbGljaXR5OiAiICsgc2ltcC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQW5kIGEgbm90ZTogIiArIHNpbXAuZ2V0Tm90ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RTdG9yZSBzdG9yZSA9IG5ldyBUZXN0U3RvcmUob3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQudHlwZSk7Ci0gICAgICAgICAgICBUZXN0U3RvcmUuQ3Vyc29yIGN1cnNvciA9IHN0b3JlLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJHb3Qgc3RvcmUsIGZpbGxpbmcgaXQgaW4uLi4iKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJjdXN0b21lciIpKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJmaXJzdG5hbWUiKSk7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAibnVtYmVyIikpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgIm51bWJlciIpKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJiaXJ0aGRheSIpKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJudW1iZXIiKSk7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAibnVtYmVyIikpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImJpcnRoZGF5IikpOwotICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIkhvd2R5Iik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiNDM2Iik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMTIzIik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMTk5OC0wOC0yNloiKTsKLSAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCI0NCIpOwotICAgICAgICAgICAgY3Vyc29yLnRvTmV4dCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIjkzMyIpOwotICAgICAgICAgICAgY3Vyc29yLnRvTmV4dCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIjIwMDAtMDgtMDYtMDg6MDAiKTsKLSAgICAgICAgICAgIGN1cnNvci50b1Jvb3QoKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIFBlcnNvbiBwZXJzb24gPSAoUGVyc29uKWN1cnNvci5vYmooKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLmdldEZpcnN0bmFtZSgpID0gIiArIHBlcnNvbi5nZXRGaXJzdG5hbWUoKSk7Ci0gICAgICAgICAgICBpbnQgc3VtID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc29uLmNvdW50T2ZOdW1iZXIoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLmdldE51bWJlcigiICsgaSArIikgPSAiICsgcGVyc29uLmdldE51bWJlcihpKSk7Ci0gICAgICAgICAgICAgICAgc3VtICs9IHBlcnNvbi5nZXROdW1iZXIoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInN1bSBvZiBudW1iZXJzID0gIiArIHN1bSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcnNvbi5jb3VudE9mQmlydGhkYXkoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLmdldEJpcnRoZGF5KCIgKyBpICsiKSA9ICIgKyBwZXJzb24uZ2V0QmlydGhkYXkoaSkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGVyc29uLnhnZXRCaXJ0aGRheSgiICsgaSArIikgPSAiICsgcGVyc29uLnhnZXRCaXJ0aGRheShpKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24ueGdldEJpcnRoZGF5KCIgKyBpICsiKS5nRGF0ZVZhbHVlKCkuZ2V0RGF5KCkgPSAiICsgcGVyc29uLnhnZXRCaXJ0aGRheShpKS5nRGF0ZVZhbHVlKCkuZ2V0RGF5KCkpOwotICAgICAgICAgICAgICAgIHN1bSArPSBwZXJzb24uZ2V0TnVtYmVyKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXR0aW5nIGZpcnN0bmFtZSB0byBHZW9yZ2UiKTsKLSAgICAgICAgICAgIHBlcnNvbi5zZXRGaXJzdG5hbWUoIkdlb3JnZSIpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0Rmlyc3RuYW1lKCkgPSAiICsgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDllMGMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnZhbHVlcy5UeXBlU3RvcmVVc2VyRmFjdG9yeTsKLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IHhtbC51dGlsLlhtbE9iamVjdDsKLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U3RvcmUKLXsKLSAgICBUZXN0VHlwZVN0b3JlIF9yb290OwotCi0gICAgcHVibGljIFRlc3RTdG9yZShTY2hlbWFUeXBlIHJvb3RUeXBlKQotICAgIHsKLSAgICAgICAgX3Jvb3QgPSBtYWtlUm9vdFN0b3JlKHJvb3RUeXBlKTsKLSAgICB9Ci0KLSAgICBDdXJzb3IgbmV3Q3Vyc29yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEN1cnNvcgotICAgIHsKLSAgICAgICAgVGVzdFR5cGVTdG9yZSBfY3VycG9zID0gX3Jvb3Q7Ci0gICAgICAgIGludCBfY3VySW5kZXggPSAwOwotCi0gICAgICAgIHB1YmxpYyBYbWxPYmplY3Qgb2JqKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpX2N1cnBvcy5fdXNlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcmVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY3VycG9zLl9wYXJlbnQgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvUm9vdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJwb3MgPSBfcm9vdDsKLSAgICAgICAgICAgIF9jdXJJbmRleCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvUGFyZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNQYXJlbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBfY3VycG9zID0gX2N1cnBvcy5fcGFyZW50OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX3BhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfY3VySW5kZXggKyAxIDwgX2N1cnBvcy5fcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9jdXJJbmRleCsrOwotICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoX2N1ckluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9QcmV2KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNQcmV2KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgX2N1ckluZGV4LS07Ci0gICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChfY3VySW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX3BhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfY3VySW5kZXggLSAxID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpID4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvRmlyc3RDaGlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBfY3VySW5kZXggPSAwOwotICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KF9jdXJJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvTGFzdENoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9jdXJJbmRleCA9IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICAgIF9jdXJwb3MgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChfY3VySW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkTmFtZWQoWE1MTmFtZSBuYW1lLCBpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgdGFyZ2V0aW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9yZS5fbmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2N1ckluZGV4ID0gdGFyZ2V0aW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY3VycG9zID0gc3RvcmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXRpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZEF0KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgX2N1ckluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZEF0KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHRhcmdldCA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgIHRhcmdldC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnNlcnRDaGlsZEF0KGludCBpbmRleCwgWE1MTmFtZSBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICBpbmRleCA+IDAgOiBpbmRleCA+IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBfY3VycG9zLl90ZXh0TGVhZkNvbnRlbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5hZGQoaW5kZXgsIF9jdXJwb3MubWFrZU5ld0NoaWxkKG5hbWUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChYTUxOYW1lIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJwb3MuX3RleHRMZWFmQ29udGVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmFkZChfY3VycG9zLm1ha2VOZXdDaGlsZChuYW1lLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjb3VudENoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIHJldHVybiBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFhNTE5hbWUgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIGF0dHIgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGF0dHIuX3RleHRMZWFmQ29udGVudDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICIiIDogcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBdHRyaWJ1dGUoWE1MTmFtZSBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFhNTE5hbWUgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBhdHRyID0gX2N1cnBvcy5tYWtlTmV3Q2hpbGQobmFtZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGF0dHIuX3RleHRMZWFmQ29udGVudCA9IHZhbHVlOwotICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzLnB1dChuYW1lLCBhdHRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2N1cnBvcy5fdGV4dExlYWZDb250ZW50ID0gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyAvLyBpbiBwcmFjdGljZSBwZXJoYXBzIHdlIHdhbnQgdG8gY29uY2F0ZW5hdGUgZmxhdHRlbmVkIHN0cmlwcGVkIHRleHQKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBfY3VycG9zLl90ZXh0TGVhZkNvbnRlbnQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAiIiA6IHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIEN1cnNvciBuZXdDdXJzb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJzb3IgcmVzdWx0ID0gbmV3IEN1cnNvcigpOwotICAgICAgICAgICAgcmVzdWx0Ll9jdXJJbmRleCA9IF9jdXJJbmRleDsKLSAgICAgICAgICAgIHJlc3VsdC5fY3VycG9zID0gX2N1cnBvczsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRlc3RUeXBlU3RvcmUgbWFrZVJvb3RTdG9yZShTY2hlbWFUeXBlIHJvb3RUeXBlKQotICAgIHsKLSAgICAgICAgVGVzdFR5cGVTdG9yZSByZXN1bHQgPSBuZXcgVGVzdFR5cGVTdG9yZSgpOwotICAgICAgICByZXN1bHQuX3BhcmVudCA9IG51bGw7Ci0gICAgICAgIHJlc3VsdC5fbmFtZSA9IG51bGw7Ci0gICAgICAgIHJlc3VsdC5faXNBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgcmVzdWx0Ll91c2VyID0gKChUeXBlU3RvcmVVc2VyRmFjdG9yeSlyb290VHlwZSkuY3JlYXRlVHlwZVN0b3JlVXNlcigpOwotICAgICAgICBpZiAocmVzdWx0Ll91c2VyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJlc3VsdC5fdXNlci5hdHRhY2hfc3RvcmUocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3RUeXBlU3RvcmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFR5cGVTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzk2YWQwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFR5cGVTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgY29tLmJlYS50ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy52YWx1ZXMuVHlwZVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudmFsdWVzLlR5cGVTdG9yZVVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy52YWx1ZXMuVHlwZVN0b3JlVmlzaXRvcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZTsKLWltcG9ydCB4bWwudXRpbC5RTmFtZVNldDsKLWltcG9ydCB4bWwudXRpbC5YbWxDdXJzb3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VHlwZVN0b3JlIGltcGxlbWVudHMgVHlwZVN0b3JlCi17Ci0gICAgVGVzdFR5cGVTdG9yZSBfcGFyZW50OwotICAgIFR5cGVTdG9yZVVzZXIgX3VzZXI7Ci0gICAgWE1MTmFtZSBfbmFtZTsKLSAgICBib29sZWFuIF9pc0F0dHJpYnV0ZTsKLSAgICBib29sZWFuIF9pc05pbDsKLSAgICBTdHJpbmcgX3RleHRMZWFmQ29udGVudDsKLSAgICBMaXN0IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzOwotICAgIE1hcCBfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzOwotCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdfY3Vyc29yKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX3RleHQoVHlwZVN0b3JlVXNlciB1c2VyKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KCFoYXNFbGVtZW50cygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZldGNoX3RleHQoaW50IHdoaXRlc3BhY2VSdWxlKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KCFoYXNFbGVtZW50cygpKTsKLSAgICAgICAgcmV0dXJuIF90ZXh0TGVhZkNvbnRlbnQgPT0gbnVsbCA/ICIiIDogYXBwbHlfd3NyKF90ZXh0TGVhZkNvbnRlbnQsIHdoaXRlc3BhY2VSdWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9yZV90ZXh0KFR5cGVTdG9yZVVzZXIgdXNlciwgU3RyaW5nIHRleHQpCi0gICAgewotICAgICAgICBhc3NlcnQoIWhhc0VsZW1lbnRzKCkpOwotICAgICAgICBfdGV4dExlYWZDb250ZW50ID0gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZXJlIHRoZSBUeXBlU3RvcmUgaXMgcmVzcG9uc2libGUgZm9yIGxvY2F0aW5nIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIFRoaXMgaXMgZG9uZSBhcyBmb2xsb3dzCi0gICAgICogKDEpIGdvIHRvIHRoZSBwYXJlbnQgVHlwZVN0b3JlVXNlcgotICAgICAqICgyKSBhc2sgaXQgdG8gZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KHFuYW1lKSAob3IgX2F0dHJpYnV0ZV8pLCBhbmQgcmV0dXJuIGl0IGlmIG5vdCBudWxsLgotICAgICAqICgyKSBvdGhlcndpc2UsIGdyYWIgYSBuZXcgVHlwZVN0b3JlVXNlclZpc2l0b3IgdmlhIHYgPSBwYXJlbnR1c2VyLm5ld192aXNpdG9yKCk7Ci0gICAgICogKDMpIGNhbGwgdi52aXNpdChuYW1lKSBvbiBfZXZlcnlfIGVsZW1lbnQgcW5hbWUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIG9uZSBpbiBvcmRlcgotICAgICAqICg0KSByZXR1cm4gdGhlIHJlc3VsdCBvZiB2LmdldF9kZWZhdWx0X3RleHQoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfZGVmYXVsdF90ZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIFN0cmluZyBkZWZ0ZXh0ID0KLSAgICAgICAgICAgIF9pc0F0dHJpYnV0ZSA/IF9wYXJlbnQuX3VzZXIuZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3RleHQoX25hbWUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJlbnQuX3VzZXIuZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KF9uYW1lKTsKLSAgICAgICAgaWYgKGRlZnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gX3BhcmVudC5fdXNlci5uZXdfdmlzaXRvcigpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc2libGluZyA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoc2libGluZy5fbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X2RlZmF1bHRfdGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJJbnZhcmlhbnQgZXJyb3I6IHBhcmVudCBkb2Vzbid0IGhhdmUgdGhpcyBhcyBjaGlsZC4iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZ0ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcHV0ZV9lbGVtZW50ZmxhZ3MoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpbnQgZmxhZ3M7Ci0gICAgICAgIGlmIChfaXNBdHRyaWJ1dGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZsYWdzID0gX3BhcmVudC5fdXNlci5nZXRfYXR0cmlidXRlZmxhZ3MoX25hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmxhZ3MgPSBfcGFyZW50Ll91c2VyLmdldF9lbGVtZW50ZmxhZ3MoX25hbWUpOwotICAgICAgICAgICAgaWYgKGZsYWdzID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IF9wYXJlbnQuX3VzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHNpYmxpbmcgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdChzaWJsaW5nLl9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9lbGVtZW50ZmxhZ3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJJbnZhcmlhbnQgZXJyb3I6IHBhcmVudCBkb2Vzbid0IGhhdmUgdGhpcyBhcyBjaGlsZC4iOwotICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmxhZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV9uaWwoVHlwZVN0b3JlVXNlciB1c2VyKQotICAgIHsKLSAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBkb25lIGxhdGVyCi0gICAgICAgIF9pc05pbCA9IF91c2VyLmJ1aWxkX25pbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmRfbmlsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaXNOaWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkoU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgdGVzdCBoYXJuZXNzIGhhcyBubyBuYW1lc3BhY2Ugc3VwcG9ydCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY291bnRfZWxlbWVudHMoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChUZXN0VHlwZVN0b3JlKWkubmV4dCgpKS5fbmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihYTUxOYW1lIG5hbWUsIGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKHN0b3JlLl9uYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLl91c2VyOwotICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsgLy8gbm8gZXhjZXB0aW9uIHBsZWFzZQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoWE1MTmFtZSBuYW1lLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBUeXBlU3RvcmVVc2VyIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIGludCBpbnNlcnRpbmRleCA9IDA7Ci0KLSAgICAgICAgaWYgKF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxhc3Rmb3VuZGF0ID0gMDsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdGZvdW5kYXQgPSBpbnNlcnRpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnNlcnRpbmRleCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZTsgaW5zZXJ0IHJpZ2h0IGJlZm9yZQotICAgICAgICAgICAgICAgIGluc2VydGluZGV4ID0gbGFzdGZvdW5kYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpbmRleCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgc2V2ZXJhbDsgdGhhdCdzIGlsbGVnYWwuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZvdW5kIGFsbCBidXQgbGFzdCBvbmU6IHdlIG11c3QgYmUgYXBwZW5kaW5nLgotICAgICAgICAgICAgICAgIC8vIGJ1dCB3aGVyZSB0byBhcHBlbmQ/Ci0KLSAgICAgICAgICAgICAgICBRTmFtZVNldCBkZWxpbWl0ZXJzID0gX3BhcmVudC5fdXNlci5nZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyhuYW1lKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW5zZXJ0aW5kZXggPSBsYXN0Zm91bmRhdCArIDE7IGluc2VydGluZGV4IDwgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpOyBpbnNlcnRpbmRleCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKV9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChpbnNlcnRpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXJzLmNvbnRhaW5zKHN0b3JlLl9uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpbnNlcnRpbmRleCBpcyB3aGVyZXZlciB0aGUgZmlyc3QgZGVsaW1pdGVyIGlzIGZvdW5kCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBpbnNlcnRpbmRleCBpcyBvbmUgcGFzdCB0aGUgZW5kLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVGVzdFR5cGVTdG9yZSBuZXdDaGlsZCA9IG1ha2VOZXdDaGlsZChuYW1lLCBmYWxzZSk7Ci0gICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmFkZChpbnNlcnRpbmRleCwgbmV3Q2hpbGQpOwotICAgICAgICByZXR1cm4gbmV3Q2hpbGQuX3VzZXI7Ci0gICAgfQotCi0gICAgVGVzdFR5cGVTdG9yZSBtYWtlTmV3Q2hpbGQoWE1MTmFtZSBuYW1lLCBib29sZWFuIGlzQXR0cmlidXRlKQotICAgIHsKLSAgICAgICAgVGVzdFR5cGVTdG9yZSByZXN1bHQgPSBuZXcgVGVzdFR5cGVTdG9yZSgpOwotICAgICAgICByZXN1bHQuX3BhcmVudCA9IHRoaXM7Ci0gICAgICAgIHJlc3VsdC5fbmFtZSA9IG5hbWU7Ci0gICAgICAgIHJlc3VsdC5faXNBdHRyaWJ1dGUgPSBpc0F0dHJpYnV0ZTsKLSAgICAgICAgaWYgKGlzQXR0cmlidXRlKQotICAgICAgICAgICAgcmVzdWx0Ll91c2VyID0gX3VzZXIuY3JlYXRlX2F0dHJpYnV0ZV91c2VyKG5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQuX3VzZXIgPSBfdXNlci5jcmVhdGVfZWxlbWVudF91c2VyKG5hbWUsIG51bGwpOyAvLyBubyB4c2k6dHlwZXMgZm9yIG5vdwotICAgICAgICBpZiAocmVzdWx0Ll91c2VyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJlc3VsdC5fdXNlci5hdHRhY2hfc3RvcmUocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoKQotICAgIHsKLSAgICAgICAgaWYgKF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHN0b3JlLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBfY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9IG51bGw7Ci0gICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RvcmUuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBudWxsOwotICAgICAgICBfdXNlci5kaXNjb25uZWN0X3N0b3JlKCk7Ci0gICAgICAgIF91c2VyID0gbnVsbDsKLSAgICAgICAgX3BhcmVudCA9IG51bGw7Ci0gICAgICAgIF9uYW1lID0gbnVsbDsKLSAgICAgICAgX3RleHRMZWFmQ29udGVudCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBmaW5kSW5zZXJ0SW5kZXhCYXNlZE9uT3JkZXIoWE1MTmFtZVtdIG9yZGVyLCBYTUxOYW1lIG5hbWVUb0FkZCkKLSAgICB7Ci0gICAgICAgIGludCBvcmRlcmluZGV4ID0gMDsKLSAgICAgICAgaW50IGluc2VydGluZGV4ID0gMDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICB3aGlsZSAob3JkZXJpbmRleCA8IG9yZGVyLmxlbmd0aCAmJiAhb3JkZXJbb3JkZXJpbmRleF0uZXF1YWxzKHN0b3JlLl9uYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3JkZXJbb3JkZXJpbmRleF0uZXF1YWxzKG5hbWVUb0FkZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0aW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9yZGVyaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc2VydGluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc2VydF9lbGVtZW50X3VzZXIobmFtZSwgY291bnRfZWxlbWVudHMobmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50KFhNTE5hbWUgbmFtZSwgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgVHlwZVN0b3JlVXNlciB0YXJnZXQgPSBudWxsOwotICAgICAgICBpbnQgcmVtb3ZlaW5kZXggPSAwOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMucmVtb3ZlKHJlbW92ZWluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2F0dHJpYnV0ZV91c2VyKFhNTE5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChzdG9yZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHN0b3JlLl91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9hdHRyaWJ1dGVfdXNlcihYTUxOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyAhPSBudWxsICYmIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIFRlc3RUeXBlU3RvcmUgbmV3Q2hpbGQgPSBtYWtlTmV3Q2hpbGQobmFtZSwgdHJ1ZSk7Ci0gICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMucHV0KG5hbWUsIG5ld0NoaWxkKTsKLSAgICAgICAgcmV0dXJuIG5ld0NoaWxkLl91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCB8fCAhX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRfZWxlbWVudHMoVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgdmlzaXRvci52aXNpdChzdG9yZS5fbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlzaXRvci52aXNpdChudWxsKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbGVtZW50cygpCi0gICAgewotICAgICAgICByZXR1cm4gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWxnb3JpdGhtIHVzZWQgYnkgYXBwbHlfd3NjYW5vbjogc29tZXRpbWVzIHVzZWQgaW4gaW1wbHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYXBwbHlfd3NyKFN0cmluZyB2LCBpbnQgd3NyKQotICAgIHsKLSAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFIHx8IHdzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0KLSAgICAgICAgaWYgKHYuaW5kZXhPZignXG4nKSA+PSAwKQotICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXG4nLCAnICcpOwotICAgICAgICBpZiAodi5pbmRleE9mKCdcdCcpID49IDApCi0gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdcdCcsICcgJyk7Ci0gICAgICAgIGlmICh2LmluZGV4T2YoJ1xyJykgPj0gMCkKLSAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xyJywgJyAnKTsKLQotICAgICAgICBpZiAod3NyID09IFNjaGVtYVR5cGUuV1NfUkVQTEFDRSkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgaW50IGxlbiA9IHYubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIC8qIGEgdHJpY2s6IGV4YW1pbmUgZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGxvb2tpbmcgZm9yIHBhaXJzIG9mIHNwYWNlcyAqLwotICAgICAgICBleGFtaW5lOiBpZiAodi5jaGFyQXQoMCkgIT0gJyAnKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAyOyBqIDwgbGVuOyBqICs9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqIC0gMSkgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogPT0gbGVuICYmIHYuY2hhckF0KGogLSAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaiBpcyBwb2ludGluZyBhdCB0aGUgZmlyc3Qgd3MgdG8gYmUgcmVtb3ZlZCwgb3IgcGFzdCBlbmQgKi8KLSAgICAgICAgY2hhcltdIGNoID0gdi50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgaSA9IGo7Ci0KLSAgICAgICAgc2hpZnRlcjogZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBqIHdhcyB3cyBvciBwYXN0IGVuZCAqLwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgaWYgKGogIT0gJyAnKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaiB3YXMgbm9ud3MgKi8KLSAgICAgICAgICAgICAgICBjaFtpKytdID0gY2hbaisrXTsKLSAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgaWYgKGNoW2pdID09ICcgJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOwotICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2gsIDAsIChpID09IDAgfHwgY2hbaSAtIDFdICE9ICcgJykgPyBpIDogaSAtIDEpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1Rlc3RTdHJ1Y3R1cmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVGVzdFN0cnVjdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFlNTUyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVGVzdFN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U3RydWN0dXJlCi17Ci0gICAgcHVibGljIGludCB2YXJJbnQ7Ci0gICAgcHVibGljIGZsb2F0IHZhckZsb2F0OwotICAgIHB1YmxpYyBTdHJpbmcgdmFyU3RyaW5nOwotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvdW5tYXJzaGFsL2NvbS9iZWEvdGVzdC9Vbm1hcnNoYWwuamF2YSBiL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVW5tYXJzaGFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDk2OWEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdW5tYXJzaGFsL2NvbS9iZWEvdGVzdC9Vbm1hcnNoYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudW5tYXJzaGFsLk1lc3NhZ2VQbGFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudW5tYXJzaGFsLlVubWFyc2hhbFBsYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuU2ltcGxlVHlwZVBsYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuU3RydWN0dXJlUGxhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5Vbm1hcnNoYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBVbm1hcnNoYWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNZXNzYWdlUGxhbiBtZXNzYWdlUGxhbiA9IG5ldyBNZXNzYWdlUGxhbigyKTsKLQotICAgICAgICBTaW1wbGVUeXBlUGxhbiBwYXJhbTFQbGFuID0gbmV3IFNpbXBsZVR5cGVQbGFuKFNpbXBsZVR5cGVQbGFuLkpBVkFfRkxPQVQsIHRydWUsIFNjaGVtYVR5cGUuQlRDX0RPVUJMRSwgbnVsbCwgMCk7Ci0KLSAgICAgICAgU3RydWN0dXJlUGxhbiBwYXJhbTJQbGFuID0gbmV3IFN0cnVjdHVyZVBsYW4oKTsKLQotICAgICAgICBwYXJhbTJQbGFuLnNldFRhcmdldENsYXNzKGNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlLmNsYXNzKTsKLSAgICAgICAgcGFyYW0yUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoInZhckludCIpLCBuZXcgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8oInZhckludCIsIGZhbHNlLCAiY29tLmJlYS50ZXN0LlRlc3RTdHJ1Y3R1cmUiLCBudWxsLCBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mby5TSU5HTEVUT04sIG5ldyBTaW1wbGVUeXBlUGxhbihTaW1wbGVUeXBlUGxhbi5KQVZBX0lOVCwgdHJ1ZSwgU2NoZW1hVHlwZS5CVENfSU5URUdFUiwgbnVsbCwgMCkpKTsKLSAgICAgICAgcGFyYW0yUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoInZhckZsb2F0IiksIG5ldyBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mbygidmFyRmxvYXQiLCBmYWxzZSwgImNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlIiwgbnVsbCwgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8uU0lOR0xFVE9OLCBuZXcgU2ltcGxlVHlwZVBsYW4oU2ltcGxlVHlwZVBsYW4uSkFWQV9GTE9BVCwgdHJ1ZSwgU2NoZW1hVHlwZS5CVENfRkxPQVQsIG51bGwsIDApKSk7Ci0gICAgICAgIHBhcmFtMlBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJ2YXJTdHJpbmciKSwgbmV3IFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvKCJ2YXJTdHJpbmciLCBmYWxzZSwgImNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlIiwgbnVsbCwgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8uU0lOR0xFVE9OLCBuZXcgU2ltcGxlVHlwZVBsYW4oU2ltcGxlVHlwZVBsYW4uSkFWQV9TVFJJTkcsIGZhbHNlLCBTY2hlbWFUeXBlLkJUQ19TVFJJTkcsIG51bGwsIDApKSk7Ci0KLSAgICAgICAgbWVzc2FnZVBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJMYXN0VHJhZGVQcmljZSIpLCBuZXcgTWVzc2FnZVBsYW4uUGFyYW1JbmZvKDAsIE1lc3NhZ2VQbGFuLlBhcmFtSW5mby5TSU5HTEVUT04sIHBhcmFtMVBsYW4pKTsKLSAgICAgICAgbWVzc2FnZVBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJpbnB1dFN0cnVjdCIpLCBuZXcgTWVzc2FnZVBsYW4uUGFyYW1JbmZvKDEsIE1lc3NhZ2VQbGFuLlBhcmFtSW5mby5TSU5HTEVUT04sIHBhcmFtMlBsYW4pKTsKLQotICAgICAgICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKG5ldyBGaWxlKGFyZ3NbMF0pKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlucHV0ID0geG9iai5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICB3aGlsZSAoeGlucHV0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHhpbnB1dC5wZWVrKCkuaXNTdGFydEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHhpbnB1dC5za2lwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVbm1hcnNoYWxDb250ZXh0IGNvbnRleHQgPSBuZXcgVW5tYXJzaGFsQ29udGV4dCgpOwotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pbWVzc2FnZVBsYW4udW5tYXJzaGFsKHhpbnB1dCwgY29udGV4dCk7Ci0gICAgICAgIGNvbnRleHQuY29tcGxldGUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgIiArIGkgKyAiID0gIiArIHJlc3VsdFtpXSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0W2ldIGluc3RhbmNlb2YgVGVzdFN0cnVjdHVyZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0U3RydWN0dXJlIHMgPSAoVGVzdFN0cnVjdHVyZSlyZXN1bHRbaV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHZhckludCA9ICIgKyBzLnZhckludCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHZhckZsb2F0ID0gIiArIHMudmFyRmxvYXQpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB2YXJTdHJpbmcgPSAiICsgcy52YXJTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveG1scGFkL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94bWxwYWQvWG1sUGFkLmphdmEgYi92MS90ZXN0L3NyYy94bWxwYWQvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3htbHBhZC9YbWxQYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljMmExYi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94bWxwYWQvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3htbHBhZC9YbWxQYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhtbHBhZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotCi1wdWJsaWMgY2xhc3MgWG1sUGFkCi17Ci0gICAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhpIHRoZXJlISIgKTsKLQotICAgICAgICBuZXcgWG1sUGFkKCkucnVuKCk7Ci0gICAgfQotCi0gICAgdm9pZCBydW4gKCApCi0gICAgewotLy8gICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyggU3lzdGVtLmluLnJlYWQoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHN0eXBlcy9kZWZhdWx0LnhzZCBiL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvZGVmYXVsdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZThhZTUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMveHN0eXBlcy9kZWZhdWx0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEVsZW1EZWZhdWx0IiAgIHR5cGU9InhzOmludCIgZGVmYXVsdD0iMSIvPgotPCEtLSBCQVU6IHdlIGNhbid0IGNvbXBpbGUgYW55IG1vcmUgYmVjYXVzZSBpdCdzIGludmFsaWQKLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW52YWxpZEVsZW1EZWZhdWx0IiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9ImEiLz4KLS0tPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEVsZW1GaXhlZCIgICAgIHR5cGU9InhzOmludCIgZml4ZWQ9IjIiLz4KLTwhLS0gQkFVOiB3ZSBjYW4ndCBjb21waWxlIGFueSBtb3JlIGJlY2F1c2UgaXQncyBpbnZhbGlkCi0gIDx4czplbGVtZW50IG5hbWU9ImludmFsaWRFbGVtRml4ZWQiICAgdHlwZT0ieHM6aW50IiBmaXhlZD0iYiIvPgotLS0+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idmFsaWRBdHRyRGVmYXVsdCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyIiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9IjMiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwhLS0gQkFVOiB3ZSBjYW4ndCBjb21waWxlIGFueSBtb3JlIGJlY2F1c2UgaXQncyBpbnZhbGlkCi0gIDx4czplbGVtZW50IG5hbWU9ImludmFsaWRBdHRyRGVmYXVsdCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyIiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9ImMiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0tLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEF0dHJGaXhlZCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcmljdHRyIiB0eXBlPSJ4czppbnQiIGZpeGVkPSI0Ii8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08IS0tIEJBVTogd2UgY2FuJ3QgY29tcGlsZSBhbnkgbW9yZSBiZWNhdXNlIGl0J3MgaW52YWxpZAotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZhbGlkQXR0ckZpeGVkIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHIiIHR5cGU9InhzOmludCIgZml4ZWQ9ImQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0tLT4gICAgCi0gIDwhLS0gdHlwZXMgdG8gaGVscCB0ZXN0IG5pbCAtLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJjYW5CZU5pbCIgbmlsbGFibGU9InRydWUiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHN0eXBlcy9wZXJzb24ueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9wZXJzb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTljNjMyLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvcGVyc29uLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiA+Ci0KLSAgPHhzOm5vdGF0aW9uIG5hbWU9ImpwZWciIHB1YmxpYz0iSlBFRyIgLz4KLSAgPHhzOm5vdGF0aW9uIG5hbWU9ImdpZiIgcHVibGljPSJHSUYiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNvbiI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlyc3RuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiPgotICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICAgICAgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwIi8+Ci0gICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImJpcnRoZGF5IiB0eXBlPSJ4czpkYXRlIi8+Ci0gICAgICAgIDwhLS0gdGVzdCB0aGF0IGludC12YWx1ZSBkb2VzIG5vdCBjb2xsaWRlIHdpdGggZ2V0SW50VmFsdWUoKSBvbiBTaW1wbGVWYWx1ZSAtLT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50LXZhbHVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaGV4IiB0eXBlPSJ4czpoZXhCaW5hcnkiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImJhc2U2NCIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbnl1cmkiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icW5hbWUiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJub3RhdGlvbiI+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOT1RBVElPTiI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImpwZWciIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImdpZiIgLz4KLSAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImdlbmRlciI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFsZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmVtYWxlIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJoZXhBdHQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpoZXhCaW5hcnkiPgotICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoWzQ1XVswLTlBLUZdKSoiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZTY0QXR0Ij4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaCIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhbnl1cmlBdHQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlVUkkiPgotICAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgICAgICAgIDx4czpsZW5ndGggdmFsdWU9IjEwMCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icW5hbWVBdHQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpRTmFtZSI+Ci0gICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5vdGF0aW9uQXR0Ij4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk9UQVRJT04iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ianBlZyIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ2lmIi8+Ci0gICAgICAgICAgPHhzOmxlbmd0aCB2YWx1ZT0iMjAiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImN1c3RvbWVyIiB0eXBlPSJtdDpwZXJzb24iLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJlbXBsb3llZSI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im10OnBlcnNvbiI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZWlkIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHN0eXBlcy9zZXR0ZXJzLnhzZCBiL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvc2V0dGVycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTVjZDcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMveHN0eXBlcy9zZXR0ZXJzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0ic2V0dGVycyIgdGFyZ2V0TmFtZXNwYWNlPSJzZXR0ZXJzIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3NpbXBsZWMueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9zaW1wbGVjLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwNzZhOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL3NpbXBsZWMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6bXQ9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxpY2l0eSI+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ibXQ6dGhvdXNhbmQiPgotICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0aG91c2FuZCI+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiLz4KLSAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTAwMCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InNpbXBsZSIgdHlwZT0ibXQ6c2ltcGxpY2l0eSIvPgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHN0eXBlcy94c3R5cGVzLnhtbCBiL3YxL3Rlc3Qvc3JjL3hzdHlwZXMveHN0eXBlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzBiODguLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMveHN0eXBlcy94c3R5cGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J0lTTy04ODU5LTEnPz4KLTxjdXN0b21lciB4bWxucz0iaHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdCIKLSAgIGdlbmRlcj0ibWFsZSIKLSAgIGhleEF0dD0iNDc0NzQ5NTE1NDU3NTk0NzQ3IgotICAgYmFzZTY0QXR0PSIgICAgICAgIAotCVZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaAotCSIKLSAgIGFueXVyaUF0dD0iaHR0cDovL2Rtb3oub3JnL1dvcmxkL0ZyYW7nYWlzLyIKLSAgIHFuYW1lQXR0PSJwcmVmOmxvY2FsbmFtZSIgeG1sbnM6cHJlZj0ic29tZV91cmkiCi0gICBub3RhdGlvbkF0dD0iSlBFRyIKLSAgPgotICA8Zmlyc3RuYW1lPkhvd2R5PC9maXJzdG5hbWU+Ci0gIDxudW1iZXI+NDM2PC9udW1iZXI+Ci0gIDxudW1iZXI+MTIzPC9udW1iZXI+Ci0gIDxiaXJ0aGRheT4xOTk4LTA4LTI2WjwvYmlydGhkYXk+Ci0gIDxudW1iZXI+NDQ8L251bWJlcj4KLSAgPG51bWJlcj45MzM8L251bWJlcj4KLSAgPGJpcnRoZGF5PjIwMDAtMDgtMDYtMDg6MDA8L2JpcnRoZGF5PgotICA8aGV4PjQ1NDc0OTUxNTQ1NzU5NUE0QTwvaGV4PgotICA8YmFzZTY0PlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaDwvYmFzZTY0PgotICA8YW55dXJpPmh0dHA6Ly8zc3BhY2Uub3JnL3NwYWNlJTIwc3BhY2UvPC9hbnl1cmk+Ci0gIDxxbmFtZT5vcGVudXJpX29yZ19sb2NhbG5hbWU8L3FuYW1lPgotICA8bm90YXRpb24+R0lGPC9ub3RhdGlvbj4KLTwvY3VzdG9tZXI+CmRpZmYgLS1naXQgYS92MS94YmVhbmVudi5jbWQgYi92MS94YmVhbmVudi5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDE1MWYuLjAwMDAwMDAKLS0tIGEvdjEveGJlYW5lbnYuY21kCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU0VUIFhNTEJFQU5TX0hPTUU9JX5kcDAuCmRpZmYgLS1naXQgYS92MS94YmVhbmVudi5zaCBiL3YxL3hiZWFuZW52LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2YyZDc5Li4wMDAwMDAwCi0tLSBhL3YxL3hiZWFuZW52LnNoCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZXhwb3J0IFhNTEJFQU5TX0hPTUU9YHB3ZGAKZGlmZiAtLWdpdCBhL3YxL3hraXQvUkVBRE1FLnR4dCBiL3YxL3hraXQvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlNTVkNS4uMDAwMDAwMAotLS0gYS92MS94a2l0L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotWE1MQmVhbnMgRGV2ZWxvcG1lbnQgS2l0Ci0KLQotV2VsY29tZSB0byBYTUxCZWFucyEKLQotQXBhY2hlIFhNTEJlYW5zIGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIGluY3ViYXRpb24gYXQgdGhlIAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRiksIHNwb25zb3JlZCBieSB0aGUgWE1MIHByb2plY3QuIAotSW5jdWJhdGlvbiBpcyByZXF1aXJlZCBvZiBhbGwgbmV3bHkgYWNjZXB0ZWQgcHJvamVjdHMgdW50aWwgYSAKLWZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIAotYW5kIGRlY2lzaW9uIG1ha2luZyBwcm9jZXNzIGhhdmUgc3RhYmlsaXplZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IAotd2l0aCBvdGhlciBzdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4gV2hpbGUgaW5jdWJhdGlvbiBzdGF0dXMgaXMgbm90IAotbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IG9mIHRoZSAKLWNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IAotZW5kb3JzZWQgYnkgdGhlIEFTRi4gCi0KLQotS2l0IGNvbnRlbnRzOgotCi0oMSkgT25lIGNvcHkgb2YgeGJlYW4uamFyLCB3aGljaCBjb250YWlucyBYTUxCZWFucy4KLSAgICBTaG91bGQgd29yayBvbiBhbnkgSkRLIDEuNC54LgotICAgIC4vbGliL3hiZWFuLmphcgotCi0oMikgTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgWE1MIEJlYW5zIGFuZCBpbmNsdWRlZCBsaWJyYXJpZXMKLSAgICAuL2xpY2Vuc2UudHh0Ci0KLSgzKSBPbmUgZm9sZGVyIGZ1bGwgb2YgY29tbWFuZC1saW5lIHNjcmlwdHMsIHBvaW50aW5nIHRvIHRoZQotICAgIHVzZWZ1bCBtYWluKCkgZnVuY3Rpb25zIGluIHRoZSBKQVIuCi0gICAgLi9iaW4KLQotKDQpIE9uZSBiaXQgb2YgYW50IHRhc2sgZG9jdW1lbnRhdGlvbi4KLSAgICAuL2FudHRhc2suaHRtbAotCi0oNSkgQSBjb3B5IG9mIHRoZSBwbGFpbiBqYXZhZG9jIHRyZWUgZm9yIGNvbS5iZWEueG1sLioKLSAgICAuL2RvY3MvcmVmZXJlbmNlCi0KLSg2KSBBIHByZWxpbWluYXJ5IGNvbGxlY3Rpb24gb2YgbmljZWx5IGZvcm1hdHRlZCB1c2VyLWxldmVsCi0gICAgZG9jdW1lbnRhdGlvbiBIVE1MIChpbmNsdWRlcyByZWZvcm1hdHRlZCBhbmQgbmljZWx5Ci0gICAgb3JnYW5pemVkIGphdmFkb2MgYXMgd2VsbCkKLSAgICAuL2RvY3MvZ3VpZGUKLQotKDcpIEEgZmV3IHNhbXBsZSBzY2hlbWFzCi0gICAgLi9zY2hlbWFzCi0KLQotV2hlcmUgdG8gc3RhcnQ/Ci0KLSgxKSBTZXR1cC4KLQotICAgIDEuIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIEpESyAxLjQueCBpbnN0YWxsZWQ7IHRoYXQgamF2YVsuZXhlXQotICAgICAgIGlzIG9uIHlvdXIgcGF0aCBhbmQgdGhhdCBKQVZBX0hPTUUvYmluIGNvbnRhaW5zIGphdmFbLmV4ZV0sCi0gICAgICAgamF2YWNbLmV4ZV0sIGFuZCBqYXJbLmV4ZV0uCi0KLSAgICAyLiBzZXQgeW91ciBYTUxCRUFORElSIGVudiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgZGlyZWN0b3J5Ci0gICAgICAgY29udGFpbmluZyB4YmVhbi5qYXIgKGkuZS4sIC4vbGliKS4KLQotICAgIDMuIHB1dCB0aGUgc2NyaXB0cyBpbiAuL2JpbiBvbiB5b3VyIHBhdGguCi0KLSAgICA0LiBydW4gInNjb21wIiB3aXRoIG5vIGFyZ3VtZW50cy4gIFlvdSBzaG91bGQgZ2V0IGEgInVzYWdlIgotICAgICAgIG1lc3NhZ2UuCi0KLSgyKSBUcnkgc29tZSBzY2hlbWEgY29tcGlsYXRpb24KLQotICAgIDEuIEluIHRoZSAuL3NjaGVtYXMgZGlyZWN0b3J5IHlvdSdsbCBmaW5kIHNvbWUgY29sbGVjdGlvbnMgb2YKLSAgICAgICBzY2hlbWFzIHlvdSBjYW4gdHJ5IG91dC4KLQotICAgICAgICAgLSBlYXN5cG86IGEgY29udHJpdmVkIHNpbXBsZSBzdGFydGVyICJwdXJjaGFzZSBvcmRlciIKLSAgICAgICAgIC0gY3ljbG9uZTogYW4gYWN0dWFsIGN1c3RvbWVyIHNjaGVtYSAoY3ljbG9uZWNvbW1lcmNlLmNvbSkKLSAgICAgICAgIC0gczRzOiB0aGUgU2NoZW1hIGZvciBTY2hlbWEKLSAgICAgICAgIC0gajJlZTogajJlZSBkZXNjcmlwdG9yIHNjaGVtYXMKLQotICAgICAgIFRvIGNvbXBpbGUgdGhlbSwgeW91IGNhbiBqdXN0IHNlbmQgdGhlIHdob2xlIGRpcmVjdG9yeSB0bwotICAgICAgIHNjb21wLCBmb3IgZXhhbXBsZSwgImNkIHNhbXBsZXMiOyB0aGVuICJzY29tcCBlYXN5cG8iLgotICAgICAgIFlvdSB3aWxsIGdldCBhbiAieG1sdHlwZXMuamFyIiBvdXQgdGhhdCBjb250YWlucyBhbGwgdGhlCi0gICAgICAgY29tcGlsZWQgWE1MQmVhbnMuICBUbyBwaWNrIHlvdXIgb3duIEpBUiBmaWxlbmFtZSBqdXN0IHNheQotCi0gICAgICAgc2NvbXAgLW91dCBteWVhc3lwby5qYXIgZWFzeXBvCi0KLQotICAgIDIuIEVzcGVjaWFsbHkgYXMgeW91IGdldCBzdGFydGVkLCB5b3Ugd2lsbCB3YW50IHRvIHNlZSB0aGUKLSAgICAgICAuamF2YSBzb3VyY2UgY29kZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZ2V0IHRoYXQsCi0gICAgICAgdXNlIGEgY29tbWFuZC1saW5lIGxpa2UKLQotICAgICAgIHNjb21wIC1zcmMgbXlzcmNkaXIgLW91dCBteWVhc3lwby5qYXIgZWFzeXBvCi0KLSAgICAgICBUaGUgIm15c3JjZGlyIiB3aWxsIGNvbnRhaW4gYWxsIHRoZSAuamF2YSBzb3VyY2UgY29kZQotICAgICAgIGZvciB0aGUgZ2VuZXJhdGVkIFhNTEJlYW5zLgotCi0oMykgVHJ5IHVzaW5nIHlvdXIgY29tcGlsZWQgWE1MQmVhbnMKLQotICAgIE5vdywgYXJtZWQgd2l0aCB0aGUgWE1MQmVhbnMgc291cmNlIGNvZGUgYW5kIHRoZSBiYXNpYwotICAgIGRvY3MsIHlvdSdyZSByZWFkeSB0byBwcm9ncmFtLiAgVGhpbmdzIHlvdSBuZWVkIHRvIGtub3c6Ci0KLSAgICAqIFRoZSBvcmcuYXBhY2hlLnhtbGJlYW5zIHBhY2thZ2UgaGFzIGFsbCB0aGUgcHVibGljIGNsYXNzZXMKLSAgICAgIGZvciBYTUxCZWFucy4gIFByb2dyYW1zIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIGFueXRoaW5nCi0gICAgICBlbHNlIGluIHhiZWFuLmphciBkaXJlY3RseS4KLQotICAgICogWG1sT2JqZWN0IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWE1MQmVhbnMuICBJdAotICAgICAgY29ycmVzcG9uZHMgdG8geHM6YW55VHlwZS4KLQotICAgICogRXZlcnkgc2NoZW1hIHR5cGUgY29ycmVzcG9uZHMgdG8gYW4gWE1MQmVhbiBpbnRlcmZhY2UsCi0gICAgICBlLmcuLCBYbWxBbnlTaW1wbGVUeXBlIGNvcnJlc3BvbmRzIHRvIHhzOmFueVNpbXBsZVR5cGUsIGFuZAotICAgICAgWG1sSW50IGNvcnJlc3BvbmRzIHRvIHhzOmludCwgZXRjLi4gQW5kIG9mIGNvdXJzZSB0aGlzCi0gICAgICBleHRlbmRzIHRvIHRoZSBYTUxCZWFuIGNsYXNzZXMgY29tcGlsZWQgZnJvbSB1c2VyLWRlZmluZWQKLSAgICAgIHNjaGVtYXMuCi0KLSAgICAqIEV2ZXJ5IFhNTEJlYW4gaW50ZXJmYWNlIGhhcyBhbiBpbm5lciBGYWN0b3J5IGNsYXNzIGZvcgotICAgICAgY3JlYXRpbmcgb3IgcGFyc2luZyBpbnN0YW5jZXMsIGUuZy4sIHRvIGxvYWQgYSBmaWxlIG9mCi0gICAgICBnZW5lcmljIHR5cGUsIHVzZSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteWZpbGUpOyB0bwotICAgICAgcGFyc2UgYSBzdHJpbmcgeW91IGV4cGVjdCB0byBiZSBhIHB1cmNhaHNlLW9yZGVyLCB1c2UKLSAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCI8ZXA6cHVyY2hhc2Utby4uLiIpOwotCi0gICAgKiBYbWxDdXJzb3IgaXMgdGhlIEFQSSBmb3IgZnVsbCBYTUwgaW5mb3NldCB0cmVld2Fsa2luZy4KLSAgICAgIEl0IGlzIG9idGFpbmVkIHZpYSB4bWxvYmplY3QubmV3Q3Vyc29yKCkuIFVzaW5nIGl0IGlzCi0gICAgICBsZXNzIGNvbnZlbmllbnQsIGJ1dCBmYXN0ZXIgdGhhbiB1c2luZyBYTUwgT2JqZWN0cywKLSAgICAgIGJlY2F1c2UgaXQgZG9lcyBub3QgY3JlYXRlIG9iamVjdHMgYXMgaXQgdHJhdmVyc2VzCi0gICAgICB0aGUgWE1MIHRyZWUuCi0KLSAgICAqIFNjaGVtYVR5cGUgaXMgdGhlIGJhc2ljICJzY2hlbWEgcmVmbGVjdGlvbiIgQVBJIChqdXN0IGxpa2UKLSAgICAgIENsYXNzLCBidXQgZm9yIFNjaGVtYSkuICBHZXQgdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBvZiBhbnkKLSAgICAgIGluc3RhbmNlIGJ5IHNheWluZyAieG9iai5zY2hlbWFUeXBlKCk7IiBnZXQgdGhlIHN0YXRpYwotICAgICAgY29uc3RhbnQgc2NoZW1hIHR5cGUgY29ycmVzcG9uZGluZyB0byBhbnkgWE1MQmVhbiBjbGFzcwotICAgICAgYnkgc2F5aW5nICJNeVB1cmNoYXNlT3JkZXIudHlwZSIgb3IgIlhtbEludC50eXBlIi4KLSAgICAgIChBbmFsb2dvdXMgdG8gIm9iai5nZXRDbGFzcygpIiBhbmQgIk9iamVjdC5jbGFzcyIuKQotCi0gICAgKiBBIG51bWJlciBvZiB1dGlsaXR5IG1ldGhvZHMgYXJlIGF2YWxpYWJsZSBvbgotICAgICAgY29tLmJlYS54bWwuWG1sQmVhbnMsIGluY2x1ZGluZyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCi0gICAgICB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgSmF2YSBjbGFzcyBpcyBhbiBYbWxCZWFuIGFuZAotICAgICAgZnVuY3Rpb25zIHRvIG1hbmFnZSBydW50aW1lLWxvYWRpbmcgb2Ygc2NoZW1hIHR5cGUKLSAgICAgIHN5c3RlbXMuCi0KLSAgICBXaXRoIHRoYXQsIHlvdSdyZSByZWFkeSB0byBuYXZpZ2F0ZSB0aGUgamF2YWRvYyBhbmQgcGxheQotICAgIHdpdGggdGhlIGNvZGUuICBBbHNvLCB0cnkgcmVhZGluZyBzb21lIG9mIG91ciAKLSAgICBkb2NzIHRoYXQgYXJlIGluY2x1ZGVkIGluIC4vZG9jcwotCi0oMykgVHJ5IHNvbWUgb2YgdGhlIG90aGVyIHV0aWxpdGllczsgeW91IGNhbiBhbHNvIHNlZSBhIGZldwotICAgIGV4YW1wbGVzIG9mIFhNTEJlYW4gdGVjaG5pcXVlcyBpbiB0aGVpciBzb3VyY2UgY29kZS4KLQotICAgIDEuICJ4cHJldHR5IGluc3RhbmNlLnhtbCIgcHJldHR5LXByaW50cyBhbiBYTUwgaW5zdGFuY2UKLSAgICAgICBkb2N1bWVudC4KLQotICAgICAgIFRoZSBjb2RlIGlzIGluIHhtbC5hcGFjaGUub3JnLnRvb2wuUHJldHR5UHJpbnRlciBhbmQgaXMKLSAgICAgICBhIHJlYXNvbmFibGUgZXhhbXBsZSBvZiBob3cgdG8gbG9hZCBhbmQgc2F2ZSBvdXQgYW4KLSAgICAgICBhcmJpdHJhcnkgWE1MIGRvY3VtZW50LiAgWG1sT3B0aW9ucyBhcmUgdXNlZCB0byBwcm9kdWNlCi0gICAgICAgdGhlIHByZXR0eS1wcmludGluZy4KLQotICAgIDIuICJ2YWxpZGF0ZSBpbnN0YW5jZS54bWwgc2NoZW1hLnhzZCIgd2lsbCB2YWxpZGF0ZSB0aGUKLSAgICAgICBpbnN0YW5jZSBhZ2FpbnN0IHRoZSBzY2hlbWEuICBYTUxCZWFucyBpcyBpbnRlbmRlZCB0bwotICAgICAgIGJlIGEgdmVyeSBhY2N1cmF0ZSBYTUwgc2NoZW1hIHZhbGlkYXRvci4KLQotICAgICAgIFRoZSBjb2RlIGlzIGluIHhtbC5hcGFjaGUub3JnLnRvb2wuSW5zdGFuY2VWYWxpZGF0b3IuCi0gICAgICAgSXQgaXMgYW4gZXhjZWxsZW50IGV4YW1wbGUgb2YgaG93IHRvIGxvYWQgYSBzY2hlbWEKLSAgICAgICB0eXBlIHN5c3RlbSBkeW5hbWljYWxseSBhdCBydW50aW1lLCBsb2FkIGFuZCB2YWxpZGF0ZQotICAgICAgIGFuIGluc3RhbmNlIHdpdGhpbiB0aGF0IHR5cGUgc3lzdGVtLCBhbmQgaG93IHRvIG9idGFpbgotICAgICAgIGxpc3RzIG9mIGFuZCBsb2NhdGlvbnMgZm9yIHZhbGlkYXRpb24gZXJyb3JzLgotCi0gICAgMy4gInhzZHRyZWUgZWFzeXBvIiB3aWxsIHNob3cgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICAgICAgIG9mIHRoZSBzY2hlbWEgdHlwZXMgaW4gdGhhdCBkaXJlY3RvcnkuCi0KLSAgICAgICBUaGUgY29kZSBpcyBpbiB4bWwuYXBhY2hlLm9yZy50b29sLlR5cGVIaWVyYXJjaHlQcmludGVyCi0gICAgICAgYW5kIGlzIGEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gaG93IHRvIHRyYXZlcnNlIHRoZQotICAgICAgIG1ldGFkYXRhIGluIGEgc2NoZW1hIHR5cGUgc3lzdGVtLgotCi0gICAgNC4gImR1bXB4c2IgeGJlYW4uamFyIiBvciAiZHVtcHhzYiBteWZpbGUueHNiIiB3aWxsIGR1bXAKLSAgICAgICB0aGUgY29udGVudHMgb2YgInhzYiIgKGJpbmFyeSBzY2hlbWEgbWV0YWRhdGEpIGZpbGVzCi0gICAgICAgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtLiAgVGhlc2UgLnhzYiBmaWxlcyBjb250YWluCi0gICAgICAgdGhlIGNvbXBpbGVkIG1ldGFkYXRhIHJlc3VsdGluZyBmcm9tIHRoZSAueHNkIGZpbGVzCi0gICAgICAgb2YgYSB0eXBlIHN5c3RlbS4gIFRoZXkgYXJlIGFuYWxvZ291cyB0byAuY2xhc3MgZmlsZXMKLSAgICAgICBmb3IgLmphdmEuCi0KZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL2R1bXB4c2IgYi92MS94a2l0L2Jpbi9kdW1weHNiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE4MTA0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL2R1bXB4c2IKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIS9iaW4vc2gKLQotI1hTQiBmaWxlIGR1bXBlcgotI1ByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybQotCi1jcD0KLWNwPSRjcDokWE1MQkVBTkRJUi94YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICRjcCB4bWxiZWFucy5hcGFjaGUub3JnLnRvb2wuWHNiRHVtcGVyICQqCi0KZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL2R1bXB4c2IuY21kIGIvdjEveGtpdC9iaW4vZHVtcHhzYi5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjY4ODYuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4vZHVtcHhzYi5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1AcmVtIFhTQiBmaWxlIGR1bXBlcgotQHJlbQotQHJlbSBQcmludHMgdGhlIGNvbnRlbnRzIG9mIGFuIHhzYiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0KLQotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sYmVhbnMuYXBhY2hlLm9yZy50b29sLlhzYkR1bXBlciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2NvbXAgYi92MS94a2l0L2Jpbi9zY29tcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxZjFjMi4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi9zY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jU2NoZW1hIGNvbXBpbGVyCi0jQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgotCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbGJlYW5zLmFwYWNoZS5vcmcudG9vbC5TY2hlbWFDb21waWxlciAkKgotCi0KZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3Njb21wLmNtZCBiL3YxL3hraXQvYmluL3Njb21wLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5ZWZjNC4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi9zY29tcC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1AcmVtIFNjaGVtYSBjb21waWxlcgotQHJlbQotQHJlbSBCdWlsZHMgWEJlYW4gdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLUBlY2hvIG9mZgotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTkRJUiVceGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIHhtbGJlYW5zLmFwYWNoZS5vcmcudG9vbC5TY2hlbWFDb21waWxlciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2NvcHkgYi92MS94a2l0L2Jpbi9zY29weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4YzAyMC4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi9zY29weQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuU2NoZW1hQ29tcGlsZXIgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi9zY29weS5jbWQgYi92MS94a2l0L2Jpbi9zY29weS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzcxM2QuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4vc2NvcHkuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQHJlbSBTY2hlbWEgY29tcGlsZXIKLUByZW0KLUByZW0gQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgotCi1AZWNobyBvZmYKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5ESVIlXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSB4bWxiZWFucy5hcGFjaGUub3JnLnRvb2wuU2NoZW1hQ29weSAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2Rvd25sb2FkIGIvdjEveGtpdC9iaW4vc2Rvd25sb2FkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlhZjc1Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3Nkb3dubG9hZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuU2NoZW1hUmVzb3VyY2VNYW5hZ2VyICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2Rvd25sb2FkLmNtZCBiL3YxL3hraXQvYmluL3Nkb3dubG9hZC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGFhZGIuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4vc2Rvd25sb2FkLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5TY2hlbWFSZXNvdXJjZU1hbmFnZXIgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3NmYWN0b3IgYi92MS94a2l0L2Jpbi9zZmFjdG9yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA0ZDgwLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3NmYWN0b3IKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1jcD0KLWNwPSRjcDokWE1MQkVBTkRJUi94YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICRjcCB4bWwuYXBhY2hlLm9yZy50b29sLkZhY3RvckltcG9ydHMgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi9zZmFjdG9yLmNtZCBiL3YxL3hraXQvYmluL3NmYWN0b3IuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQyMjBjLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3NmYWN0b3IuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQHJlbSBGYWN0b3JzIG92ZXJsYXBwaW5nIHNjaGVtYXMgaW50byBzY2hlbWFzIHRoYXQgdXNlIGltcG9ydHMKLQotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5GYWN0b3JJbXBvcnRzICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi92YWxpZGF0ZSBiL3YxL3hraXQvYmluL3ZhbGlkYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGEwMWY3Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3ZhbGlkYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIEluc3RhbmNlIFZhbGlkYXRvcgotIwotIyBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCBhIHNjaGVtYS4KLQotY3A9Ci1jcD0kY3A6JFhNTEJFQU5ESVIveGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAkY3AgeG1sLmFwYWNoZS5vcmcudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3ZhbGlkYXRlLmNtZCBiL3YxL3hraXQvYmluL3ZhbGlkYXRlLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkMTNlOS4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi92YWxpZGF0ZS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1AcmVtIEluc3RhbmNlIFZhbGlkYXRvcgotQHJlbQotQHJlbSBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCBhIHNjaGVtYS4KLQotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4veHByZXR0eSBiL3YxL3hraXQvYmluL3hwcmV0dHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDNjMzYuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4veHByZXR0eQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuUHJldHR5UHJpbnRlciAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3hwcmV0dHkuY21kIGIvdjEveGtpdC9iaW4veHByZXR0eS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzkwZDguLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4veHByZXR0eS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZgotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTkRJUiVceGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIHhtbC5hcGFjaGUub3JnLnRvb2wuUHJldHR5UHJpbnRlciAlKgpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4veHNkdHJlZSBiL3YxL3hraXQvYmluL3hzZHRyZWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjEzNjIuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4veHNkdHJlZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuVHlwZUhpZXJhcmNoeVByaW50ZXIgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi94c2R0cmVlLmNtZCBiL3YxL3hraXQvYmluL3hzZHRyZWUuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDM2ZDViLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3hzZHRyZWUuY21kCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1AZWNobyBvZmYKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5ESVIlXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSB4bWwuYXBhY2hlLm9yZy50b29sLlR5cGVIaWVyYXJjaHlQcmludGVyICUqCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi94c3RjIGIvdjEveGtpdC9iaW4veHN0YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlYzMxYi4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi94c3RjCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIS9iaW4vc2gKLQotY3A9Ci1jcD0kY3A6JFhNTEJFQU5ESVIveGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAkY3AgeG1sLmFwYWNoZS5vcmcudG9vbC5YU1RDVGVzdGVyICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4veHN0Yy5jbWQgYi92MS94a2l0L2Jpbi94c3RjLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MmUxYS4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi94c3RjLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5YU1RDVGVzdGVyICUqCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9DeWNsb25lT3JnYW5pemF0aW9uUHJvZmlsZS54c2QgYi92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9DeWNsb25lT3JnYW5pemF0aW9uUHJvZmlsZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzE0YzAuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2N5Y2xvbmUvQ3ljbG9uZU9yZ2FuaXphdGlvblByb2ZpbGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDgvY29wIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxkc2lnLWNvcmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiLz4KLQk8eHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSByZXByZXNlbnRzIG9yZ2FuaXphdGlvbiBkZXRhaWxzIHJlcXVpcmVkIGZvciB0cmFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQk8IS0tR2VuZXJhbCBkZWZpbml0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcmVzdCBvZiB0aGUgc2NoZW1hLi0tPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZnJlZWZvcm0gdGV4dCBmaWVsZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2Q6bGFuZ3VhZ2UiIGRlZmF1bHQ9ImVuIi8+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZCBmb3IgYW4gZWxlbWVudC4gIENhbid0IHVzZSB4c2Q6SUQgYmVjYXVzZSBpdCB3b24ndCBhbGxvdyB0aGVtIHRvIGJlZ2luIHdpdGggYSBudW1iZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllclJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBJZGVudGlmaWVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZ2FuaXphdGlvbklkIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXJ2ZXIncyB1bmlxdWUgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgYW4gb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb21tdW5pdHlJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VydmVyJ3MgdW5pcXVlIGludGVybmFsIGlkZW50aWZpZXIgZm9yIGEgY29tbXVuaXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pdHkiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bml0eU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcm9rZXJJZCIgdHlwZT0iT3JnYW5pemF0aW9uSWQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21tdW5pdHlJZCIgdHlwZT0iQ29tbXVuaXR5SWQiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciB0aGUgQWRtaW5pc3RyYXRpdmUgSW5mb3JtYXRpb24tLT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iT3JnYW5pemF0aW9uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyc29uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIHBlcnNvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBob25lIiBtaXhlZD0idHJ1ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHBob25lIG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVtYWlsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGVtYWlsIGFkZHJlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBhYm91dCBhIHBlcnNvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUGVyc29uTmFtZSIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUaXRsZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlcGFydG1lbnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbWFpbCBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRW1haWwiPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGhvbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBob25lIi8+Ci0JCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb250YWN0SWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdHMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBDb250YWN0IGFuZCBDb250YWN0UmVmcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qb3N0YWwgbWFpbGluZyBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdHJlZXQgYWRkcmVzcy4gIFRoaXMgbWF5IHJlc29sdmUgdG8gd2hhdCBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgbXVsdGlwbGUgbGluZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2l0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlcHJvdiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0YXRlIG9yIHByb3ZpbmNlIGRlcGVuZGluZyBvbiB0aGUgY291bnRyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9zdGFsIG9yIHppcCBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iVVMiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q291bnRyeSBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSb3V0aW5nSWRUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIHJvdXRpbmcgaWRlbnRpZmllciwgbGlrZSBEVU5TLCBFREksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElGQUNUIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJvdXRpbmdJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZGVudGlmaWVyIHN1Y2ggYXMgRFVOUyBvciBFREkgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbXBhbnkgZm9yIHRyYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0iUm91dGluZ0lkVHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgY2VydGlmaWNhdGUuIFRoZSBpbml0aWFsIHZlcnNpb24gb2YgZWFjaCBJbnRlcmNoYW5nZSBwcm9kdWN0IG9ubHkgc3VwcG9ydCB0aGUgZHM6S2V5SW5mby9kczpYNTA5RGF0YSBzZWN0aW9uIGluY2x1ZGluZyBkczpYNTA5SXNzdWVyU2VyaWFsIGFuZCBYNTA5Q2VydGlmaWNhdGUuICBBbnkgb3RoZXIgZWxlbWVudHMgdXNlZCB3aWxsIGJlIGlnbm9yZWQsIGFuZCBpZiBvbmUgb2YgdGhlIHR3byBzdXBwb3J0ZWQgZWxlbWVudHMgaXMgbm90IGluY2x1ZGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGNvbnNpZGVyZWQgaW52YWxpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNlcnRJZCIgdHlwZT0iSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZXJ0aWZpY2F0ZXRSZWYiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYSBDZXJ0aWZpY2F0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIENlcnRpZmljYXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmZXJyZWRFbmNyeXB0aW9uQ2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkFkbWluaXN0cmF0aXZlSW5mbyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBkZXNjcmliaW5nIGFuIG9yZ2FuaXphdGlvbiB1c2VmdWwgdG8gaHVtYW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik9yZ2FuaXphdGlvbk5hbWUiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciBUcmFuc3BvcnRzLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlVzZXJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZXJuYW1lIHVzZWQgdG8gYWNjZXNzIGEgcmVzb3VyY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXNzd29yZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QYXNzd29yZCB1c2VkIHRvIGFjY2VzcyBhIHNlY3VyZSByZXNvdWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImVuY3J5cHRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJUEFkZHJlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SW50ZXJuZXQgUHJvdG9jYWwgYWRkcmVzcywgZXg6ICAxMi4zNC41Ni43ODwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQk8eHNkOnBhdHRlcm4gdmFsdWU9IigoWzAtMV0/WzAtOV0/WzAtOV18MlswLTRdWzAtOV18MjVbMC05XSl7M30oLlswLTFdP1swLTldP1swLTldfDJbMC00XVswLTldfDI1WzAtNV0pKSI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBtZXNzIGp1c3QgcmVzdHJpY3RzIHRoZSB2YWx1ZSB0byBzdGFuZGFyZCBJUCBhZGRyZXNzZXMgd2hlcmUgZWFjaCBvZiBmb3VyIG9jdGV0cyBjYW4gaGF2ZSB2YWx1ZXMgMC0yNTUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJPC94c2Q6cGF0dGVybj4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRE5TQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Eb21haW4gTmFtZSBTZXJ2ZXIgYWRkcmVzcywgZXg6IHd3dy5jeWNsb25lY29tbWVyY2UuY29tPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU29ja2V0U2VjdXJpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFVVEhFTlRJQ0FURUQgb3IgQU5PTllNT1VTPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVEhFTlRJQ0FURUQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOT05ZTU9VUyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3N0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgaG9zdCBhZGRyZXNzLCBlaXRoZXIgaW4gRE5TIG9yIElQLCBmb3IgYSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0iRE5TQWRkcmVzcyBJUEFkZHJlc3MiLz4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNvY2tldCBwb3J0IG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLQkJCQk8eHNkOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotCQkJCTx4c2Q6bWF4SW5jbHVzaXZlIHZhbHVlPSI2NTAwMCIvPgotCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCTwveHNkOnNpbXBsZVR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGlyZWN0b3J5IG9uIGEgZmlsZSBzeXN0ZW0gb3Igc2VydmVyIHN1Y2ggYXMgRlRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkpNU0NvbnN1bWVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgSk1TLCBlaXRoZXIgYSBRdWV1ZSBvciBUb3BpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVVFVUUiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUElDIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBTL0tleSBvciBDbGVhclRleHQ8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tFWSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xFQVJURVhUIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZpcmV3YWxsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNwb3J0IHNlcnZlcidzIGZpcmV3YWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgUy9LZXkgb3IgQ2xlYXIgdGV4dCBhdXRoZW50aWNhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU29ja2V0U2VjdXJpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VHlwZSBvZiBTU0wgc2VjdXJpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNlcnRpZmljYXRldFJlZiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IlNvY2tldFNlY3VyaXR5VHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSB0cmFkaW5nIHRyYW5zcG9ydCBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBzY2hlZHVsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZWR1bGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBlcmlvZCBvZiB0aW1lIGluY2x1ZGluZyBhIHN0YXJ0IGFuZCBzdG9wIHRpbWUgcmVwcmVzZW50aW5nIHRoZSBwZXJpb2Qgb2YgdGltZSB0aGUgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lIiB0eXBlPSJ4c2Q6dGltZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdG9wVGltZSIgdHlwZT0ieHNkOnRpbWUiIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zcG9ydElkIiB0eXBlPSJJZGVudGlmaWVyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIFRyYW5zcG9ydCBkZWZpbmVkIGVsc2V3aGVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNwb3J0SWQiIHR5cGU9IklkZW50aWZpZXJSZWYiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0cyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIFRyYW5zcG9ydHMgZGVmaW50aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaWxlVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iRlRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iSFRUUFRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkhUVFBUcmFuc3BvcnRfQ0kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTTVRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iU01UUFRyYW5zcG9ydF9DSSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkpNU1RyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik1RU2VyaWVzVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZlcnJlZFRyYW5zcG9ydFJlZiIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaWxlVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkZpbGUgc3lzdGVtIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0xvY2FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZUUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWxlIFRyYW5zZmVyIFByb3RvY29sIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wRGlyIiB0eXBlPSJEaXJlY3RvcnkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpcmVjdG9yeSBvbiB0aGUgRlRQIHNlcnZlciB3aGVyZSBpbmNvbWluZyBkb2N1bWVudHMgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCBhcyB0aGV5IGFyZSB0cmFuc2ZlcnJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBpY2t1cERpciIgdHlwZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXJlY3Rvcnkgd2hlcmUgdGhlIGRvY3VtZW50cyBhcmUgbW92ZWQgYWZ0ZXIgaGF2aW5nIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFRlbXBEaXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclR5cGUiIGRlZmF1bHQ9IkJJTkFSWSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QklOQVJZIG9yIEFTQ0lJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTQ0lJIi8+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSU5BUlkiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTW9kZSIgZGVmYXVsdD0iUGFzc2l2ZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9ydCBvciBQYXNzaXZlLiAgUGFzc2l2ZSBtZWFucyB0aGUgRlRQIHNlcnZlciBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci4gUG9ydCBtZWFucyB0aGUgRlRQIGNsaWVudCBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2l2ZSIvPgotCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkhUVFBUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2QiIGRlZmF1bHQ9IlBPU1QiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBQVVQgb3IgUE9TVCB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0byBwdXNoIGRvY3VlbW50cyB0byB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPU1QiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRG91YmxlTWltZVdyYXBwZWQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U29tZSBzZXJ2ZXJzIHdpbGwgc3RyaXAgb2ZmIE1JTUUgd3JhcHBpbmcgb2YgYSBkb2N1bWVudCByZXF1aXJpbmcgdGhhdCB0aGUgZG9jdW1lbnQgYmUgTUlNRSB3cmFwcGVkIHR3aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTb2NrZXRTZWN1cml0eSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIVFRQVHJhbnNwb3J0X0NJIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgRW50ZXJwcmlzZSdzIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgSFRUUC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJUcmFuc3BvcnQiPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU01UUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGUgTWFpbCBUcmFuc3BvcnQgUHJvdG9jb2wgdHJhbnNwb3J0IGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVjaXBpZW50IiB0eXBlPSJFbWFpbCI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RW1haWwgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSXNDb21wbGlhbnQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIj4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXQgdG8gZmFsc2UgZm9yIFNNVFAgaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGxlYXZlIHRoZSBNSU1FIHdyYXBwaW5nIGluIHRhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlNNVFBUcmFuc3BvcnRfQ0kiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q3ljbG9uZSBJbnRlcmNoYW5nZSBFbnRlcnByaXNlJ3Mgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBTTVRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlY2lwaWVudCIgdHlwZT0iRW1haWwiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSk1TVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTWVzc2FnZSBTZXJ2aWNlIChKTVMpIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29ubmVjdGlvbkZhY3RvcnkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25zdW1lciI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIFF1ZXVlIG9yIFRvcGljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJKTVNDb25zdW1lclR5cGUiIGRlZmF1bHQ9IlFVRVVFIi8+Ci0JCQkJCQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQkJCQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkpOREkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlIGRlZmludGlvbiB0byBsb2NhdGUgdGhlIEpNUyBwcm92aWRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSI+Ci0JCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBsb2NhdGlvbiBvZiB0aGUgSk1TIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iVXNlcm5hbWUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRleHRGYWN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgSk5ESSBjb250ZXh0IGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTVFTZXJpZXNUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SUJNJ3MgTVEgU2VyaWVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZU1hbmFnZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoYW5uZWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPCEtLVRoZSBmb2xsb3dpbmcgZGVmaW5lcyBidXNpbmVzcyBwcm90b2NvbCBpbmZvcm1hdGlvbiAtLT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJ1c2luZXNzUHJvdG9jb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QmFzZSBkZWZpbml0aW9uIGZvciBhIGJ1c2luZXNzIHByb3RvY29sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRSZWYiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzc1Byb3RvY29sSWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQnVzaW5lc3NQcm90b2NvbFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIGJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzUHJvdG9jb2xJZCIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJCdXNpbmVzc1Byb3RvY29scyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIEJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmFsbD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQVMxUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUzJQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvc2V0dGFOZXRQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9ImViWE1MUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6YWxsPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTwhLS1UaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIHRvcC1sZXZlbCBPcmdhbml6YXRpb25EYXRhLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvblByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QWxsIGluZm9ybWF0aW9uIG5lZWRlZCB0byB0cmFkZSB3aXRoIGFuIG9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iQWRtaW5pc3RyYXRpdmVJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm91dGluZ0lkcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbGxlY3Rpb24gb2YgUm91dGluZ0lkczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlJvdXRpbmdJZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyb2tlcklkIiB0eXBlPSJPcmdhbml6YXRpb25JZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPldpdGhpbiB0aGlzIGNvbW11bml0eSwgdGhpcyBvcmdhbml6YXRpb24gdHJhZGVzIHRocm91Z2ggYSBicm9rZXIgKGh1YikuIFRoaXMgcmVmZXJlbmNlcyBhbm90aGVyIHByb2ZpbGUgd2l0aCB0aGlzIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaXRpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIGNvbW11bml0aWVzIHRoZSB0cmFkaW5nIHByb2ZpbGUgaXMgYWN0aXZlbHkgYSBtZW1iZXIgb2YuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iQ29tbXVuaXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkJ1c2luZXNzUHJvdG9jb2xzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9Ik9yZ2FuaXphdGlvbklkIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgT3JnYW5pemF0aW9uSWQgZXhpc3RzIGZvciB2YWxpZCBwcm9maWxlcyBleGlzdGluZyB3aXRoaW4gdGhlIHNlcnZlci4gIElmIGEgY2xpZW50IGlzIHNlbmRpbmcgYSBwcm9maWxlIGZvciBhbiBvcmdhbml6YXRpb24gdGhhdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgc2VydmVyJ3MgcmVwb3NpdG9yeSwgdGhpcyBpZCB3aWxsIG5vdCBiZSBwcmVzZW50IGFzIHRoZSBzZXJ2ZXIgd2lsbCBiZSBhc3NpZ25pbmcgb25lIGZvciBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9JbnRlcmNoYW5nZVBhcnRuZXJDb25maWcueHNkIGIvdjEveGtpdC9zY2hlbWFzL2N5Y2xvbmUvSW50ZXJjaGFuZ2VQYXJ0bmVyQ29uZmlnLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0OWIxZC4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9JbnRlcmNoYW5nZVBhcnRuZXJDb25maWcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIGVkaXRlZCB3aXRoIFhNTCBTcHkgdjQuMyBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pIGJ5IEJvYiBLcmllciAoQ3ljbG9uZSBDT21tZXJjZSwgSW5jLikgLS0+Ci08IS0tVzNDIFNjaGVtYSBnZW5lcmF0ZWQgYnkgWE1MIFNweSB2My41IE5UIChodHRwOi8vd3d3LnhtbHNweS5jb20pLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDkvaXBwIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOS9pcHAiIHhtbG5zOmNvcD0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmN5Y2xvbmVjb21tZXJjZS5jb20vU2NoZW1hcy8yMDAxLzA4L0N5Y2xvbmVPcmdhbml6YXRpb25Qcm9maWxlLnhzZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmNoYW5nZVBhcnRuZXJQcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgcGFydG5lciBwcm9maWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvcDpPcmdhbml6YXRpb25Qcm9maWxlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWRzIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJmYWxzZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUHJlZmVyZW5jZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pblNLZXlJdGVyYXRpb25Db3VudCI+Ci0JCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0JCQkJCQkJCQkJPHhzZDptaW5JbmNsdXNpdmUgdmFsdWU9IjAiLz4KLQkJCQkJCQkJCQk8eHNkOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHkiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZWN1cml0eSBwYXJhbWV0ZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFNpZ25pbmciIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGRvY3VtZW50cyByZWNlaXZlZCBieSB0aGlzIHBhcnRuZXIgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50QWNrbm93bGVkZ2VtZW50IiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RG9jdW1lbnQgYWNrbm93bGVkZ2VtZW50IGNvbmZpZ3VyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTaWduZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBkb2N1bWVudCBhY2tub3dsZWRnbWVudHMgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTeW5jaHJvbm91cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFja25vd2xlZGdlbWVudHMgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHJlY2VpdmVkLiAgUmVxdWlyZXMgYnVuZGxlZCBIVFRQKFMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpib29sZWFuIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1lc3NhZ2VEaWdlc3QiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkb2N1bWVudCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aGltIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRDUiLz4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSEExIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudEVuY3J5cHRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSB0eXBlIG9mIGRvY3VtZW50IGVuY3J5cHRpb24gYWxnb3JpdGhpbSB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6Y2hvaWNlPgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSQzJFbmNyeXB0aW9uIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJDMiBFbmNyeXB0aW9uIGFsZ29yaXRoaW0uICBLZXkgbGVuZ3RoIGlzIHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlMZW5ndGgiIHVzZT0icmVxdWlyZWQiPgotCQkJCQkJCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEyOCIvPgotCQkJCQkJCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUkNGb3VyRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BUkNGb3VyIEVuY3J5cHRpb24gYWxnb3JpdGhpbS4gIEtleSBsZW5ndGggaXMgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImtleUxlbmd0aCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJCQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwIi8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTI4Ii8+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQkJCQkJCTwveHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRFU0VuY3J5cHRpb24iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+REVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iNTYiLz4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJpcGxlREVTRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UcmlwbGUgREVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iMTY4Ii8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3JpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgY29tcGFuaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCaW5hcnlDb21wYW55IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgY29tcGFueS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3J5IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmJvdW5kIGFuZCBvdXRib3VuZCBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgcGFydG5lci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydG5lcklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbmJvdW5kUGF0aCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0Ym91bmRQYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbXBhbnlJZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlByZWZlcmVuY2VzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBhcnRuZXIgcHJvZmlsZSB0cmFuc3BvcnQgYW5kIGRvY3VtZW50IHNldHRpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZSIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgc2NoZWR1bGUgdG8gdXNlIHdoZW4gc2VuZGluZyBkb2N1bWVudHMgdG8gdGhpcyBwYXJ0bmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5ib3VuZEZpbGVQcmVzZXJ2YXRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgaW5ib3VuZCBmaWxlcyBzaG91bGQgYmUgcGVyc2lzdGVkIHdpdGggdGhlaXIgb3JpZ2luYWwgZmlsZSBuYW1lLiAgT3B0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgZm9yIG92ZXJ3cml0aW5nIG9yIHNlcXVlbmNpbmcgZmlsZXMgd2l0aCBkdXBsaWNhdGUgZmlsZSBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50T3B0aW9ucyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdsb2JhbCBkb2N1bWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlamVjdER1cGxpY2F0ZUVESSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIEVESSBkb2N1bWVudCByZWNpZXZlZCB3aXRoIGR1cGxpY2F0ZSBjb250cm9sIElEcyBzaG91bGQgYmUgcmVqZWN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wcmVzc2lvbiIgZGVmYXVsdD0iTk9ORSIgbmlsbGFibGU9ImZhbHNlIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiBhbGdvcml0aGltIHRvIHVzZSAoTk9ORSwgR1pJUCBvciBaTElCKS4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWklQIi8+Ci0JCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkxJQiIvPgotCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc2VuZEF0dGVtcHRzIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZG9jdW1lbnQgc2hvdWxkIGJlIHJlc2VudCBpZiBhbiBhY2tub3dsZWRtZW50IGhhcyBub3QgYmVlbiByZWNpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIwIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9IjYwIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNlbmRJbnRlcnZhbCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhlIGR1cmF0aW9uIChpbiBob3VycykgYmV0d2VlbiByZXNlbmQgYXR0ZXB0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTkiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmV0cmllcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgVHJhbnNwb3J0IHJldHJpZXMgb3B0aW9uIGFuZCBpbnRlcnZhbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZHVyYXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmYWxsb2ZmIiB0eXBlPSJ4c2Q6aW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc1Byb3RvY29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSBidXNpbmVzcyBwcm90b2NvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IHJlZj0iVHJhbnNwb3J0UmVmIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3NQcm90b2NvbElkIiB0eXBlPSJ4c2Q6SURSRUYiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmVmIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGEgVHJhbnNwb3J0IGRlZmluZWQgZWxzZXdoZXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL1RQTS54c2QgYi92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9UUE0ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmI2MmY0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL1RQTS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCUNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCUFsbCByaWdodHMgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRISVMgSVMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVNPVVJDRSBDT0RFIE9GIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRoZSBjb3B5cmlnaHQgbm90aWNlIGFib3ZlIGRvZXMgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCWV2aWRlbmNlIGFueSBhY3R1YWwgb3IgaW50ZW5kZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCXB1YmxpY2F0aW9uIG9mIHN1Y2ggc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAkSWQ6IFRQTS54c2QsdiAxLjEgMjAwMy8wOS8xNSAxODoyMDo0OCBlcmljdmFzIEV4cCAkIC0tPgotPHhzOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzAzL3dsaS90cG0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMy93bGkvdHBtIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmltcG9ydAotICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sZHNpZy1jb3JlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW1hbmFnZW1lbnQiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYWRpbmctcGFydG5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ic2VydmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZy1kZWZhdWx0IiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUtYXVkaXQtbG9nZ2luZyIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXN0LW1vZGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iYWRkcmVzcyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9ImNsaWVudC1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNlcnZlci1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0iZW5jcnlwdGlvbi1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHM6Y2hvaWNlPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZWJ4bWwtYmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icm9zZXR0YW5ldC1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ3ZWItc2VydmljZS1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6Y2hvaWNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0NBTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRU1PVEUiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1pZC10eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbWFpbCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBob25lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZmF4IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2xpZW50LWNlcnRpZmljYXRlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzOmhleEJpbmFyeSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImRzOktleUluZm8iIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4czpoZXhCaW5hcnkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZWJ4bWwtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS10cmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtcHJvdG9jb2wtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLXZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1kZWZhdWx0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1yZWNlaXB0LXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaWduYXR1cmUtY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlbGl2ZXJ5LXNlbWFudGljcyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0RWZmb3J0Ii8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJFU1RFRkZPUlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbmNlQW5kT25seU9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT05DRUFORE9OTFlPTkNFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQXRMZWFzdE9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVRMRUFTVE9OQ0UiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBdE1vc3RPbmNlIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFUTU9TVE9OQ0UiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGVyc2lzdC1kdXJhdGlvbiIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS10cmFuc2Zvcm1zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ieHBhdGgiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4cGF0aCIvPgotCTx4czplbGVtZW50IG5hbWU9InJvc2V0dGFuZXQtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImZhaWx1cmUtcmVwb3J0LWFkbWluaXN0cmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iZmFpbHVyZS1ub3RpZmllciIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbC12ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWNlcnRpZmljYXRlLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaXBoZXItYWxnb3JpdGhtIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJDNSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERVMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJJUExFX0RFUyIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWxldmVsIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUxPQUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5USVJFX1BBWUxPQUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXJlY2VpcHQtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzcy10aW1lb3V0IiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZmFpbHVyZS1yZXBvcnQtYWRtaW5pc3RyYXRvciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsdXJlLW5vdGlmaWVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFkaW5nLXBhcnRuZXItbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmctbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IndlYi1zZXJ2aWNlLWJpbmRpbmciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm90b2NvbCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHR0cCIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJIVFRQIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHBzIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkhUVFBTIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImptcyIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKTVMiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvdG9jb2wtdmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVuZHBvaW50IiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGllbnQtYXV0aGVudGljYXRpb24iIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFTSUMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1NMX0NFUlQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2VydmVyLWF1dGhlbnRpY2F0aW9uIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNTTF9DRVJUX01VVFVBTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJzZXJ2aWNlLXByb2ZpbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InJvc2V0dGFuZXQtc2VydmljZS1kZWZhdWx0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2aWNlLXR5cGUiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldFQlNFUlZJQ0UiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPQ0VTUyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVJWSUNFQ09OVFJPTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbCIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0VCU0VSVklDRSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQlhNTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJST1NFVFRBTkVUIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UtcHJvZmlsZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtdHJhZGluZy1wYXJ0bmVyIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtYmluZGluZyIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLXRyYWRpbmctcGFydG5lciIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLWJpbmRpbmciIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOQUJMRUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQUJMRUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUZBVUxUIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyb3NldHRhbmV0LXNlcnZpY2UtZGVmYXVsdHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNlcnZpY2UtY29udGVudC1zY2hlbWEiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtZHRkLXZhbGlkYXRpb24iIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGUtc2VydmljZS1jb250ZW50IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRlLXNlcnZpY2UtaGVhZGVyIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czpzaW1wbGVUeXBlIG5hbWU9InJlZmVyZW5jZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL2RzaWcveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QgYi92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9kc2lnL3htbGRzaWctY29yZS1zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzZlNzM0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL2RzaWcveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhRE9DVFlQRSBzY2hlbWEKLSAgUFVCTElDICItLy9XM0MvL0RURCBYTUxTY2hlbWEgMjAwMTAyLy9FTiIgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLmR0ZCIKLSBbCi0gICA8IUFUVExJU1Qgc2NoZW1hIAotICAgICB4bWxuczpkcyBDREFUQSAjRklYRUQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICAgPCFFTlRJVFkgZHNpZyAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+Ci0gICA8IUVOVElUWSAlIHAgJyc+Ci0gICA8IUVOVElUWSAlIHMgJyc+Ci0gIF0+Ci0KLTwhLS0gU2NoZW1hIGZvciBYTUwgU2lnbmF0dXJlcwotICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMKLSAgICAkUmV2aXNpb246IDEuMSAkIG9uICREYXRlOiAyMDAzLzA5LzE1IDE4OjIwOjQ4ICQgYnkgJEF1dGhvcjogZXJpY3ZhcyAkCi0KLSAgICBDb3B5cmlnaHQgMjAwMSBUaGUgSW50ZXJuZXQgU29jaWV0eSBhbmQgVzNDIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZQotICAgIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4KLSAgICBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotCi0gICAgVGhpcyBkb2N1bWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UgWzFdIGFzIGRlc2NyaWJlZAotICAgIGluIHRoZSBGQVEgWzJdLgotCi0gICAgWzFdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gICAgWzJdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURAotLS0+Ci0KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgICAgIHZlcnNpb249IjAuMSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAKLQotPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPgotCi08c2ltcGxlVHlwZSBuYW1lPSJDcnlwdG9CaW5hcnkiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KLSAgPC9yZXN0cmljdGlvbj4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBTdGFydCBTaWduYXR1cmUgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVR5cGUiPgotICA8c2VxdWVuY2U+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmVkSW5mbyIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZVZhbHVlIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6T2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICA8L3NlcXVlbmNlPiAgCi0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVZhbHVlIiB0eXBlPSJkczpTaWduYXR1cmVWYWx1ZVR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVWYWx1ZVR5cGUiPgotICAgIDxzaW1wbGVDb250ZW50PgotICAgICAgPGV4dGVuc2lvbiBiYXNlPSJiYXNlNjRCaW5hcnkiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgPC9leHRlbnNpb24+Ci0gICAgPC9zaW1wbGVDb250ZW50PgotICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIFN0YXJ0IFNpZ25lZEluZm8gLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25lZEluZm8iIHR5cGU9ImRzOlNpZ25lZEluZm9UeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iU2lnbmVkSW5mb1R5cGUiPgotICA8c2VxdWVuY2U+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZU1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+ICAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCi08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2QiIHR5cGU9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIi8+IAotICA8Y29tcGxleFR5cGUgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIG5hbWVzcGFjZSAtLT4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gIDwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlTWV0aG9kIiB0eXBlPSJkczpTaWduYXR1cmVNZXRob2RUeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iSE1BQ091dHB1dExlbmd0aCIgbWluT2NjdXJzPSIwIiB0eXBlPSJkczpITUFDT3V0cHV0TGVuZ3RoVHlwZSIvPgotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIGV4dGVybmFsIG5hbWVzcGFjZSAtLT4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPgotCi08ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9ImRzOlJlZmVyZW5jZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4KLSAgPHNlcXVlbmNlPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdE1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdFZhbHVlIi8+IAotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCi08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybXMiIHR5cGU9ImRzOlRyYW5zZm9ybXNUeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1zVHlwZSI+Ci0gICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm0iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAKLSAgICA8L3NlcXVlbmNlPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPgotICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3JtVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+IAotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWFBhdGgiIHR5cGU9InN0cmluZyIvPiAKLSAgICA8L2Nob2ljZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAotICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBSZWZlcmVuY2UgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IkRpZ2VzdE1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4gCi0gIDxzZXF1ZW5jZT4KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgPC9zZXF1ZW5jZT4gICAgCi0gIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJEaWdlc3RWYWx1ZSIgdHlwZT0iZHM6RGlnZXN0VmFsdWVUeXBlIi8+Ci08c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ii8+Ci08L3NpbXBsZVR5cGU+Ci0KLTwhLS0gRW5kIFNpZ25lZEluZm8gLS0+Ci0KLTwhLS0gU3RhcnQgS2V5SW5mbyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iS2V5SW5mbyIgdHlwZT0iZHM6S2V5SW5mb1R5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiIG1peGVkPSJ0cnVlIj4KLSAgPGNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+ICAgICAKLSAgICA8ZWxlbWVudCByZWY9ImRzOktleU5hbWUiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlWYWx1ZSIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlJldHJpZXZhbE1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlg1MDlEYXRhIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UEdQRGF0YSIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlNQS0lEYXRhIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpNZ210RGF0YSIvPgotICAgIDxhbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIvPgotICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gIDwvY2hvaWNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+Ci0gIDxlbGVtZW50IG5hbWU9Ik1nbXREYXRhIiB0eXBlPSJzdHJpbmciLz4KLQotICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+IAotICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5VmFsdWVUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICA8Y2hvaWNlPgotICAgICA8ZWxlbWVudCByZWY9ImRzOkRTQUtleVZhbHVlIi8+Ci0gICAgIDxlbGVtZW50IHJlZj0iZHM6UlNBS2V5VmFsdWUiLz4KLSAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L2Nob2ljZT4KLSAgPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJSZXRyaWV2YWxNZXRob2QiIHR5cGU9ImRzOlJldHJpZXZhbE1ldGhvZFR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJSZXRyaWV2YWxNZXRob2RUeXBlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKLSAgICA8L3NlcXVlbmNlPiAgCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iVHlwZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgWDUwOURhdGEgLS0+Ci0KLTxlbGVtZW50IG5hbWU9Ilg1MDlEYXRhIiB0eXBlPSJkczpYNTA5RGF0YVR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iWDUwOURhdGFUeXBlIj4KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8Y2hvaWNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3VlclNlcmlhbCIgdHlwZT0iZHM6WDUwOUlzc3VlclNlcmlhbFR5cGUiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVN1YmplY3ROYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDZXJ0aWZpY2F0ZSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwvY2hvaWNlPgotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4gCi0gIDxzZXF1ZW5jZT4gCi0gICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3Vlck5hbWUiIHR5cGU9InN0cmluZyIvPiAKLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+IAotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPCEtLSBFbmQgWDUwOURhdGEgLS0+Ci0KLTwhLS0gQmVnaW4gUEdQRGF0YSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iUEdQRGF0YSIgdHlwZT0iZHM6UEdQRGF0YVR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iUEdQRGF0YVR5cGUiPiAKLSAgPGNob2ljZT4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IAotICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIvPiAKLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPiAKLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgPC9jaG9pY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBQR1BEYXRhIC0tPgotCi08IS0tIEJlZ2luIFNQS0lEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+IAotPGNvbXBsZXhUeXBlIG5hbWU9IlNQS0lEYXRhVHlwZSI+Ci0gIDxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0iU1BLSVNleHAiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIi8+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPiAKLQotPCEtLSBFbmQgU1BLSURhdGEgLS0+Ci0KLTwhLS0gRW5kIEtleUluZm8gLS0+Ci0KLTwhLS0gU3RhcnQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPgotCi08ZWxlbWVudCBuYW1lPSJPYmplY3QiIHR5cGU9ImRzOk9iamVjdFR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+IDwhLS0gYWRkIGEgZ3JlcCBmYWNldCAtLT4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZyIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotPGVsZW1lbnQgbmFtZT0iTWFuaWZlc3QiIHR5cGU9ImRzOk1hbmlmZXN0VHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJNYW5pZmVzdFR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXMiIHR5cGU9ImRzOlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIi8+IAotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlUHJvcGVydHkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnR5IiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0eVR5cGUiLz4gCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHlUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMSx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gICAgIDwvY2hvaWNlPgotICAgICA8YXR0cmlidXRlIG5hbWU9IlRhcmdldCIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAotICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLSAgIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KLQotPCEtLSBTdGFydCBBbGdvcml0aG0gUGFyYW1ldGVycyAtLT4KLQotPHNpbXBsZVR5cGUgbmFtZT0iSE1BQ091dHB1dExlbmd0aFR5cGUiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iaW50ZWdlciIvPgotPC9zaW1wbGVUeXBlPgotCi08IS0tIFN0YXJ0IEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IkRTQUtleVZhbHVlIiB0eXBlPSJkczpEU0FLZXlWYWx1ZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJEU0FLZXlWYWx1ZVR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlEiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgbmFtZT0iRyIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJKIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPGVsZW1lbnQgbmFtZT0iU2VlZCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQZ2VuQ291bnRlciIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9IlJTQUtleVZhbHVlIiB0eXBlPSJkczpSU0FLZXlWYWx1ZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJSU0FLZXlWYWx1ZVR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgbmFtZT0iTW9kdWx1cyIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+IAotICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gCi0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPiAKLQotPCEtLSBFbmQgS2V5VmFsdWUgRWxlbWVudC10eXBlcyAtLT4KLQotPCEtLSBFbmQgU2lnbmF0dXJlIC0tPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZCBiL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyZDFkNi4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvZWFzeXBvL2Vhc3lwby54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczpwbz0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJwdXJjaGFzZS1vcmRlciI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0icG86Y3VzdG9tZXIiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibGluZS1pdGVtIiB0eXBlPSJwbzpsaW5lLWl0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hpcHBlciIgdHlwZT0icG86c2hpcHBlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21lciI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWdlIiB0eXBlPSJ4czppbnQiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGluZS1pdGVtIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwZXItdW5pdC1vdW5jZXMiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6aW50ZWdlciIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNoaXBwZXIiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGVyLW91bmNlLXJhdGUiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZyBiL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkYjY4NS4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvZWFzeXBvL2Vhc3lwby54c2Rjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08eGI6Y29uZmlnIHhtbG5zOnhiPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMi8wOS94YmVhbi9jb25maWciCi0gICAgICAgICAgIHhtbG5zOmVwPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KLQotICA8eGI6bmFtZXNwYWNlIHVyaT0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyI+Ci0gICAgPHhiOnBhY2thZ2U+Y29tLmVhc3lwbzwveGI6cGFja2FnZT4KLSAgPC94YjpuYW1lc3BhY2U+Ci0KLSAgPHhiOm5hbWVzcGFjZSB1cmk9IiMjYW55Ij4KLSAgICA8eGI6cHJlZml4PlhtbDwveGI6cHJlZml4PgotICAgIDx4YjpzdWZmaXg+QmVhbjwveGI6c3VmZml4PgotICA8L3hiOm5hbWVzcGFjZT4KLQotPC94Yjpjb25maWc+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9YTUwueHNkIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvWE1MLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4YWRkOS4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS9YTUwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0KLSAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gICAgICAgICZsdDtzY2hlbWEgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgotCi0gICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotCi0gICAgICAgICZsdDt0eXBlIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KLSAKLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCBiL3YxL3hraXQvc2NoZW1hcy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA0Zjg0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZHMJMS43IDA3LzA4LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDEuNAotZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLXNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxhcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0gICAgIHZlcnNpb249IjEuNCI+Ci0KLSAgICAuLi4KLSAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImoyZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0gICAgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotICAgIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotICAgIGFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLSAgICBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLSAgICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLSAgICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLSAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLSAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0gICAgICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0gICAgICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLSAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLSAgICAgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjQiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMTEzYi4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbl8xXzQueHNkcwkxLjYgMDgvMDkvMDIKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiAxLjQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QKLWluZGljYXRlIHRoYXQgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2UKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi1hbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci11c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotCi0gICAgLi4uCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIgdHlwZT0iajJlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRQotICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLSAgICBpbiB0aGUgZWFyLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1vZHVsZS9qMmVlOndlYiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0gICAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi1hcHBsaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bW9kdWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0gICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEoyRUUgbW9kdWxlIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQKLSAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuNCIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1vZHVsZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi1jb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi10aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0gICAgICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotICAgICAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0gICAgICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotICAgICAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLSAgICAgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotICAgICAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290Ci0gICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTU1YmQuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIyljb25uZWN0b3JfMV81LnhzZHMJMS4xNiAwNy8wNi8wMgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi1Sb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi1yZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLXBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLWxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLWFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi1VLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLWRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLXdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi1jb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLUphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLUN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLVN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjUgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBDb25uZWN0b3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0Ci1pbmRpY2F0ZSB0aGUgY29ubmVjdG9yIHJlc291cmNlIGFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZQotSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLSAgICAuLi4KLSAgICA8L2Nvbm5lY3Rvcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImoyZWU6Y29ubmVjdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi1nZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHJlc291cmNlIGFkYXB0ZXIgdmVyc2lvbiwKLWljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKLWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudAotcmVzb3VyY2VhZGFwdGVyLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLUphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi1yZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbgotICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLSAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhCi0gICAgICAgIEphdmFCZWFuLgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLWFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotbWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLWFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZQotICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQotICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgIDxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0gICAgICAgICA8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLSAgICAgICAgICAgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUgc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi11bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcwotYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi1zZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi1Ob3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCBpbnRlcmZhY2Ugb3IgdGhlIGRlcHJlY2F0ZWQKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCi0gICAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0gICAgICAgIFRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQKLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0KLSAgICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLSAgICAgICAgc2NvcGUgb2YgdGhlIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLWNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkCi1wcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcwotZm9sbG93cy4KLQotICAgICBTZXJ2ZXJOYW1lCi0gICAgIFBvcnROdW1iZXIKLSAgICAgVXNlck5hbWUKLSAgICAgUGFzc3dvcmQKLSAgICAgQ29ubmVjdGlvblVSTAotCi1BIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0bwotaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMKLXVuZGVybHlpbmcgRUlTLgotCi1Qb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZQotICAgICAgICBTZXJ2ZXJOYW1lCi0gICAgICAgIFBvcnROdW1iZXIKLSAgICAgICAgVXNlck5hbWUKLSAgICAgICAgUGFzc3dvcmQKLSAgICAgICAgQ29ubmVjdGlvblVSTAotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0gICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0gICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZToKLTxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IG1heSBiZSB1c2VkIGZvciBwcm92aWRpbmcKLWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0KLVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwKLXR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLXRoZSBkZXBsb3llciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yCi1hIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLUFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZQotZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi1pbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLXR5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IKLU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci1vZiB0aGlzIHNldC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLSAgICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLSAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotICAgICAgICBFeGFtcGxlOgotICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgICAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCi0gICAgICAgIE9SCi0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0gICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWludGVyZmFjZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb24KLSAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbgotICAgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLSAgICAgICAgZWxlbWVudHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0gICAgICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3RvclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29ubmVjdG9yVHlwZSBkZWZpbmVzIGEgcmVzb3VyY2UgYWRhcHRlci4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yLW5hbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCB2ZW5kb3ItbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgY2FuCi0gICAgICAgIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24KLSAgICAgICAgaW5mby4KLQotICAgICAgICBUaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUKLSAgICAgICAgdXNlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbgotICAgICAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0gICAgICAgIHByb3ZpZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxpY2Vuc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgZXh0ZW5zaW9ucyBjYW4gYmUKLSAgICAgICAgc3BlY2lmaWVkIGJ5IHVzaW5nIHRoZSBkZXBsb3ltZW50LWV4dGVuc2lvbgotICAgICAgICBlbGVtZW50cy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjUiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLSAgICBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotICAgIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24KLSAgICBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0bwotICAgIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSBzcGVjaWZpZXMgdGhlCi1pbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLWNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQocykgdGhhdCB1c2UgdGhpcyB0eXBlLAotaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci1hcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKLWludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5Ci1jb250cmFjdC4KLQotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uCi0gICAgICAgICAgICB2YWx1ZT0iamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbgotYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1zcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLWxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBtZXNzYWdlbGlzdGVuZXItdHlwZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lciIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lci10eXBlIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWNlbnNlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gVGhpcyB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGEKLWxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKLShleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24KLXJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGxpY2Vuc2UtcmVxdWlyZWQgc3BlY2lmaWVzIHdoZXRoZXIgYQotICAgICAgICAgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGUKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotICAgICAgICAgICAgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1tZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzCi1jb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi1tZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLXNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLXJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLW9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlCi0gICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLSAgICAgICAgICA8L21lc3NhZ2VsaXN0ZW5lci10eXBlPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uc3BlY1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0Ci1hbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3IKLWNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi1hbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLQotSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcwotcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi10aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi1zdXBwb3J0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzCi0gICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLSAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbgotICAgICAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZQotICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQotICAgICAgICBlaXRoZXIgYSAidHJ1ZSIgb3IgImZhbHNlIiB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotb2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEKLXJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZAotYnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLgotCi1FeGFtcGxlOgotCi08cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi1yZXNvdXJjZSBhZGFwdGVyIEphdmEgY2xhc3MgbmFtZSwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLAotaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZQotYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIGFuZCBpbmJvdW5kLXJlc291cmNlYWRhcHRlcgotZWxlbWVudHMsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgYWRtaW5pc3RlcmVkIG9iamVjdHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0gICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXIKLSAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yCi0gICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphZG1pbm9iamVjdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci1wZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3Rvcgotc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljCi1yZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLXBlcm1pc3Npb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eQotICAgICAgICBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZQotICAgICAgICBzeW50YXguIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBTdW4ncwotICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbgotICAgICAgICBzcGVjaWZpY2F0aW9uOgotCi0gICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuNC9kb2NzL2d1aWRlL3NlY3VyaXR5L1BvbGljeUZpbGVzLmh0bWwjRmlsZVN5bnRheAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLXVzZWQgYnkgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBOb1RyYW5zYWN0aW9uCi0gICAgTG9jYWxUcmFuc2FjdGlvbgotICAgIFhBVHJhbnNhY3Rpb24KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVHJhbnNhY3Rpb24iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9lamItamFyXzJfMS54c2QgYi92MS94a2l0L3NjaGVtYXMvajJlZS9lamItamFyXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmMxMmUuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvZWpiLWphcl8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpZWpiLWphcl8yXzEueHNkcwkxLjEwIDA3LzI0LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDIuMSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotICAgICB2ZXJzaW9uPSIyLjEiPgotICAgIC4uLgotICAgIDwvZWpiLWphcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLUoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiIHR5cGU9ImoyZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLSAgICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0gICAgICAgICAgICByZWZlcj0iajJlZTplamItbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotICAgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IKLSAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIHJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi08L3hzZDplbGVtZW50PgotCi0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi1jb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi1tZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0gICAgICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLSAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLSAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLSAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLSAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi1pbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotZGVzdGluYXRpb24gdHlwZSwgZXRjLgotCi1UaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi1UaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi1hcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi1kZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kIGEgbGlzdCBvZgotbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi1vbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZXhjbHVkZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi1hbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotICAgICAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotICAgICAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0gICAgICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotICAgICAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotICAgICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLWNtcC12ZXJzaW9uIGVsZW1lbnRzLgotCi1UaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICAxLngKLSAgICAyLngKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS54Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi1hIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi1yb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi1tZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi10eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0gICAgICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0gICAgICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotICAgICAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotICAgICAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0gICAgICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtci1maWVsZC10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi1tdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi1saXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi1tZXRob2RzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLUV4YW1wbGU6Ci0KLSAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAgICAgIGljb24gZmlsZSBuYW1lCi0gICAgLSBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLSAgICAgIGVudGVycHJpc2UgYmVhbnMKLSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLSAgICAgIGlmIGFueQotICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLSAgICAgIGVqYi1qYXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudGVycHJpc2UtYmVhbnNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotICAgICAgICBwcm9kdWNlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCi0gICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0gICAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLSAgICAgICAgICAgIDwvZWpiLWNsaWVudC1qYXI+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLSAgICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMKLSAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLSAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotICAgIHNjaGVtYS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLWVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotZWpiLWphciBmaWxlLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci10aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLVRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLXJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1FeGFtcGxlOgotCi08ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi1ieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi1vcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi1yZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotICAgICAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi1yZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi1zcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi1zcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi1ieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi1hY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLVRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi1yZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi1yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLWEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLXRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0ibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi1FeGFtcGxlOgotCi08ZWpiLXJlbGF0aW9uPgotICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotPC9lamItcmVsYXRpb24+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotICAgICAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLSAgICAgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bXVsdGlwbGljaXR5VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotICAgICAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0gICAgICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0gICAgICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLSAgICAgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLSAgICAgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotICAgICAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjbXItZmllbGRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGVycHJpc2UtYmVhbnNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi1iZWFuLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlc3Npb24tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZW50aXR5LWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0gICAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotICAgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotICAgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLQotICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpjaG9pY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi1jb25zaXN0cyBvZjoKLQotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICAgICAgaWNvbiBmaWxlIG5hbWUKLSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0gICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0gICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLSAgICAgIGZpZWxkCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0gICAgICBlbnRyaWVzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICAgICAgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0gICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0gICAgICByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgZGVwbG95bWVudC1leHRlbnNpb24KLSAgICAgIGRlY2xhcmF0aW9ucy4KLQotVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotY21wLXZlcnNpb24gMi54LgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi1UaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi1wZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi1mb3IgdGhlIGVudGl0eSBiZWFuLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi1zZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLWFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW0ta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0gICAgICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLSAgICAgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0gICAgICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0gICAgICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLSAgICAgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0gICAgICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y21wLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotICAgICAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0gICAgICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0gICAgICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtcC1maWVsZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICAgIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aAotICAgICAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotICAgICAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0gICAgICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCi0gICAgICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLSAgICAgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gICAgICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgICAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLSAgICAgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotICAgICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnF1ZXJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBleGNsdWRlLWxpc3RUeXBlIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoCi10aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi1pbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi1tZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi10eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Wn1dKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZS4KLSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotICAgICAgdHlwZQotICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICAgICAgZW50cmllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLSAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXRob2QtaW50ZlR5cGUiPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi1kaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi1zZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIEhvbWUKLSAgICBSZW1vdGUKLSAgICBMb2NhbEhvbWUKLSAgICBMb2NhbAotICAgIFNlcnZpY2VFbmRwb2ludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW1zVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtcGFyYW1zVHlwZSBkZWZpbmVzIGEgbGlzdCBvZiB0aGUKLWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotICAgICAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGVybWlzc2lvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi1zZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi1vcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50IGFuZC9vciB3ZWIKLXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLSAgICAgICAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLWludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiwgdGhlCi1iZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLW1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUKLW9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotYWNyb3NzIHRoZSBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotaW50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QKLW5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi1zaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkCi1tZXRob2QgbmFtZS4KLQotVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB1c2luZyBtZXRob2RUeXBlIGVsZW1lbnQKLXdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotCi0xLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0gICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViCi0gICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLTIuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPj4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAgIG5hbWUuCi0KLTMuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAuLi4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLSAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLSAgIFBBUkFNLW4gYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUKLSAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0gICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLSAgIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLSAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycwotICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuCi0KLUV4YW1wbGVzOgotCi1TdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1tZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwKLWFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi1TdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1jcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi1pbnRlcmZhY2UocykuCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi1jcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi1tb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi1mb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi1UaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLW5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yCi13ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLXNpZ25hdHVyZS4KLQotRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLW1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi1jcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaG9tZQotaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLWludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGggcmVlIFN0eWxlcwotb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1pbnRmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtaW50ZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi1yb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIE9uZQotICAgIE1hbnkKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIEJlYW4KLSAgICBDb250YWluZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LgotCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci1tZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi1tZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLUl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi1FeGFtcGxlOgotCi08cXVlcnk+Ci0gICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8L2VqYi1xbD4KLTwvcXVlcnk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LiBJdCBjb250YWlucwotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotICAgICAgICAgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0gICAgICAgICAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLSAgICAgICAgLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi1pbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi1kZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci1zaG91bGQgYmUgZW1wdHkuCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci1iZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi1lbnRpdHkgYmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi13aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLSAgICAgICAgcmVsYXRpb25zaGlwcy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvcgotICAgICAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICAgICAgeHBhdGg9Ii4iLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci1mb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotRUpCT2JqZWN0IHR5cGUuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTG9jYWwKLSAgICBSZW1vdGUKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi1pZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0gICAgICAgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLSAgICAgICAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRISVMgSVMgQSBQTEFDRUhPTERFUiBUWVBFIHdoaWNoIHdpbGwKLWJlIFJFUExBQ0VELiBJdCB3aWxsIGJlIGRlZmluZWQgYmFzZWQgb24KLWRlZmluaXRpb24gdG8gYmUgc3VwcGxpZWQgYnkgSlNSMTA5LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZQotICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLSAgICAgIEVKQiByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0gICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi1lbXB0eS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi10aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi1zZXNzaW9uIGJlYW4uCi0KLVRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLSAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0gICAgICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0gICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXNzaW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0gICAgU3RhdGVmdWwKLSAgICBTdGF0ZWxlc3MKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTm90U3VwcG9ydGVkCi0gICAgU3VwcG9ydHMKLSAgICBSZXF1aXJlZAotICAgIFJlcXVpcmVzTmV3Ci0gICAgTWFuZGF0b3J5Ci0gICAgTmV2ZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICBCZWFuCi0gICAgQ29udGFpbmVyCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvZXhwb3J0ZWRfYnVpbGQueG1sIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvZXhwb3J0ZWRfYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdhMzhjLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL2V4cG9ydGVkX2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPHByb2plY3QgbmFtZT0iU2NoZW1hIHByb2plY3QgYnVpbGQiIGRlZmF1bHQ9ImJ1aWxkIj4KLSAgICAKLSAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlc3lzdGVtbmFtZSIgdmFsdWU9IlNjaGVtYSIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzLnBhdGgiIHZhbHVlPSJDOi9wZXJmb3JjZS92Mi9iZWEvamRrMTQxXzAyL2pyZS9saWIvcnQuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS9qZGsxNDFfMDIvbGliL3Rvb2xzLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi9rbmV4LmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvY29tbW9uL2xpYi9sb2c0ai5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvZGVidWdnaW5nLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi9qYXZlbGluLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi93bHctbGFuZy5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2VibG9naWMuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS93ZWJsb2dpYzgxYi9jb21tb24vZXZhbC9wb2ludGJhc2UvbGliL3Bic2VydmVyNDQuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS93ZWJsb2dpYzgxYi9jb21tb24vZXZhbC9wb2ludGJhc2UvbGliL3BiY2xpZW50NDQuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS93ZWJsb2dpYzgxYi9zZXJ2ZXIvbGliL3dlYnNlcnZpY2VzLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi93ZWJzZXJ2aWNlY2xpZW50LmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi93ZWJzZXJ2aWNlY2xpZW50K3NzbC5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2xpLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi94YmVhbi5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2x4YmVhbi5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIveHFybC5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2x4dHJ0LmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi9uZXR1aS9uZXR1aS1jb21waWxlci5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL2ludGVncmF0aW9uL2xpYi93bGFpLXNlcnZlci5qYXI7QzovRG9jdW1lbnRzIGFuZCBTZXR0aW5ncy9tYmlzaG9wL015IERvY3VtZW50cy90ZXN0L0FQUC1JTkYvbGliL0NvbnRyb2wuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9KYXZhU3R1ZmYuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9NYWMuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9TY2hlbWEuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9TaW1wQ29udHJvbFR3by5qYXIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMucGF0aCIgdmFsdWU9IkM6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9TY2hlbWEvIiAvPgotICA8cHJvcGVydHkgbmFtZT0iamFyLnBhdGgiIHZhbHVlPSJDOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL21iaXNob3AvTG9jYWwgU2V0dGluZ3MvVGVtcC93bHdfY29tcGlsZTIzMjE3IiAvPgotICA8cHJvcGVydHkgbmFtZT0iamFybmFtZSIgdmFsdWU9IlNjaGVtYS5qYXIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LnBhdGgiIHZhbHVlPSJDOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL21iaXNob3AvTXkgRG9jdW1lbnRzL3Rlc3QvQVBQLUlORi9saWIvIiAvPgotICA8cHJvcGVydHkgbmFtZT0id2xob21lLnBhdGgiIHZhbHVlPSJDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvIiAvPgotICAKLSAgPHBhdGggaWQ9InRhc2suY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9IiR7d2xob21lLnBhdGh9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9saWIveGJlYW4uamFyIiAvPgotICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2xpYi93ZWJsb2dpYy5qYXIiLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgCi0gIDx0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0ieG1sLmFwYWNoZS5vcmcudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGhyZWY9InRhc2suY2xhc3NwYXRoIi8+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIFNjaGVtYXMgcHJvamVjdCBhbmQgY29weSBpdCB0byBMaWJyYXJpZXMiPgotICAJCi0gICAgPG1rZGlyIGRpcj0iJHtqYXIucGF0aH0iIC8+Ci0gICAgPHhtbGJlYW4KLSAgICAgIGRlc3RmaWxlPSIke2phci5wYXRofS8ke2phcm5hbWV9IgotICAgICAgc2NoZW1hPSIke3NyYy5wYXRofSIKLSAgICAgIHR5cGVzeXN0ZW1uYW1lPSIke3R5cGVzeXN0ZW1uYW1lfSIKLSAgICAgIGNsYXNzcGF0aD0iJHtjbGFzcy5wYXRofSIKLSAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgotICAgICAgPCEtLSBXaXRoIGZhaWxvbmVycm9yPXRydWUsIGFuIHRoZSB0YXJnZXQgc2hvdWxkIGFib3J0IGJlZm9yZQotICAgICAgICAgICBoZXJlIGlmIHRoZXJlJ3MgYW4gZXJyb3IuCi0gICAgICAgICAgIFRoZXJlZm9yZSBpZiB0aGVyZSdzIG5vIGphciwgdGhlbiBpdCBtdXN0IG1lYW4gdGhhdCB0aGVyZQotICAgICAgICAgICB3ZXJlIG5vIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLCBzbyBkZWxldGUgdGhlIGphciBpbiBsaWJyYXJpZXMuIC0tPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImlzLWphciIgZmlsZT0iJHtqYXIucGF0aH0vJHtqYXJuYW1lfSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0ibW92ZS1qYXIiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImNoZWNrLWNsZWFudXAtamFyIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPHRhcmdldCBuYW1lPSJtb3ZlLWphciIgaWY9ImlzLWphciI+Ci0gICAgPG1vdmUgdG9kaXI9IiR7bGlicmFyeS5wYXRofSIgZmlsZT0iJHtqYXIucGF0aH0vJHtqYXJuYW1lfSIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNoZWNrLWNsZWFudXAtamFyIiB1bmxlc3M9ImlzLWphciI+Ci0gICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgPGRlbGV0ZSBmaWxlPSIke2xpYnJhcnkucGF0aH0vJHtqYXJuYW1lfSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9qMmVlXzFfNC54c2QgYi92MS94a2l0L3NjaGVtYXMvajJlZS9qMmVlXzFfNC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTQyNzIuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvajJlZV8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLUdlbmVyYXRlZCBieSBVbWl0IFlhbGNpbmFscCBNYXJjaCAyMDAyLS0+Ci08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjEuNCI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpajJlZV8xXzQueHNkcwkxLjIwIDAyLzA3LzEyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLXNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotCi1EZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgajJlZSBhcHBsaWNhdGlvbjsKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gICAgd2ViIGFwcGxpY2F0aW9uOwotICAgIGVudGVycHJpc2UgYmVhbjsKLSAgICByZXNvdXJjZSBhZGFwdGVyOwotCi1EZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGVhciBmaWxlOwotICAgIHdhciBmaWxlOwotICAgIGphciBmaWxlOwotICAgIHJhciBmaWxlOwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotZXh0ZW5zaW9ucyB0byB0aGUgc3BlY2lmaWMgRGVwbG95bWVudCBDb21wb25lbnQuCi0KLUl0IGlzIHVzZWQgYnkgZGVwbG95bWVudC1leHRlbnNpb24gZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuCi1leHRlbnNpb24gYmxvY2sgdGhhdCBpcyB0YXJnZXRlZCB0byBhIHNwZWNpZmljIGV4dGVuc2lvbgotZGVzaWduYXRlZCBieSBhIHNldCBvZiBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVjbGFyZWQKLWJ5IGEgbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bwotdGhlIGRlcGxveW1lbnQgdG9vbCB0aGF0IHByb2Nlc3NlcyB0aGUgZXh0ZW5zaW9uLgotCi1UaGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIGlzIHByb3ZpZGVkIGJ5IHRoZSBBcHBsaWNhdGlvbgotQXNzZW1ibGVyIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBkZXNjcmliZWQgaXMgYW4KLWVzc2VudGlhbCBleHRlbnNpb24gdGhhdCBtdXN0IGV4aXN0IGluIHRoZSBjb250YWluZXIuIElmCi1tdXN0VW5kZXJzdGFuZCBpcyAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBpbmRpY2F0ZQotYW4gZXJyb3Igd2hlbiBwcm9jZXNzaW5nIGEgZGVwbG95bWVudC1leHRlbnNpb24gZWxlbWVudCB3aXRoCi1hIG5hbWVzcGFjZSBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kLiAgRXh0ZW5zaW9ucyB0aGF0IGFyZSBub3QKLWVzc2VudGlhbCBhcmUgZGVjbGFyZWQgYnkgZGVmYXVsdCBhcyBvcHRpb25hbCBleHRlbnNpb25zCi10aGF0IG5lZWQgbm90IGJlIHByb3ZpZGVkIGJ5IGEgY29udGFpbmVyLiAgQXBwbGljYXRpb25zIHRoYXQKLXVzZSBzdWNoIGV4dGVuc2lvbnMgYXJlIHBvcnRhYmxlIHRvIG90aGVyIGNvbnRhaW5lcnMgYmVjYXVzZQotZGVwbG95bWVudCB0b29scyB3aWxsIGlnbm9yZSBleHRlbnNpb25zIHRoYXQgdGhleSBkb24ndAotc3VwcG9ydC4KLQotVGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbi1lbGVtZW50IGlzIGFic3RyYWN0LiBUaGVyZWZvcmUsIGEKLWNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIGZvciBlYWNoIGV4dGVuc2lvbi1lbGVtZW50LgotCi1UaGUgdmFsdWUgb2YgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBpcyAiZmFsc2UiCi1ieSBkZWZhdWx0LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50IgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmV4dGVuc2libGVUeXBlIgotICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11c3RVbmRlcnN0YW5kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVzY3JpcHRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLXByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotdGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLURlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUKLXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLXRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLWNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi1kZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRld2V5LXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHdoaWNoIGlzIHVzZWQKLXRvIGRlc2NyaWJlIHZlcnNpb25zIG9mIGRvY3VtZW50cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGxheS1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotRXhhbXBsZToKLQotLi4uCi0gICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0KLVRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItbGlua1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLWVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0KLVRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLWZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUgY29tcG9zZWQgb2YgYQotcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KLXRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi1jb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQotdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotRXhhbXBsZXM6Ci0KLSAgICA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotCi0gICAgPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1sb2NhbC1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLXRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAotaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50Ci0gICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgIC0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlCi0gICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotRGVwbG95bWVudCBDb21wb25lbnQuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotRXhhbXBsZToKLQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpqbmRpLW5hbWVUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZQotdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgRW50aXR5Ci0gICAgU2Vzc2lvbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHkiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLWRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZQotZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLSAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLSAgICAgIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0gICAgICBlbnRlcnByaXNlIGJlYW4KLSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmhvbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLWVsZW1lbnQgd2hlbiB1c2VkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLWFwcGxpY2F0aW9uJ3MgY29kZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotCi0gICAgamF2YS5sYW5nLkJvb2xlYW4KLSAgICBqYXZhLmxhbmcuQnl0ZQotICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLSAgICBqYXZhLmxhbmcuU3RyaW5nCi0gICAgamF2YS5sYW5nLlNob3J0Ci0gICAgamF2YS5sYW5nLkludGVnZXIKLSAgICBqYXZhLmxhbmcuTG9uZwotICAgIGphdmEubGFuZy5GbG9hdAotICAgIGphdmEubGFuZy5Eb3VibGUKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4KLW9wdGlvbmFsIHZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZQotc3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuCi0KLUl0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotICAgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotICAgICAgICBjb250ZXh0LgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiLz4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKLSAgICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLSAgICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQotICAgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCi0gICAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZXh0ZW5zaWJsZVR5cGUgaXMgYW4gYWJzdHJhY3QgYmFzZSB0eXBlIHdoaWNoIGlzIHVzZWQgdG8KLWRlZmluZSB0aGUgdHlwZSBvZiBleHRlbnNpb24tZWxlbWVudHMuIEluc3RhbmNlIGRvY3VtZW50cwotbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQotdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKLWV4dGVuc2lvbi1lbGVtZW50cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIHRoZSBuYW1lIG9mIGEKLUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi1ib29sZWFuIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB2YWx1ZXMgeWVzIGFuZCBubyB3aGljaCBhcmUKLW5vdCBkZXNpZ25hdGVkIGJ5IHhzZDpib29sZWFuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQotRXhhbXBsZToKLQotICAgIDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yCi1KUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCi1HVUkgdG9vbC4KLQotVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCi1ieSBkZWZhdWx0LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzbWFsbC1pY29uIiB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotICAgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0gICAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAotICAgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCi0KLSAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLSAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0gICAgICAgIGNvbnRhaW5pbmcgYSBsYXJnZQotICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0gICAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLSAgICAgICAgRmlsZS4KLQotICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuCi1UaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0Ci10aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpuZGktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgam5kaS1uYW1lVHlwZSB0eXBlIGRlc2lnbmF0ZXMgYSBKTkRJIG5hbWUgaW4gdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkCi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZQotZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlCi1kZXN0aW5hdGlvbi4KLQotVGhlIEFzc2VtYmxlciBzZXRzIHRoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBmbG93IG9mIG1lc3NhZ2VzCi1iZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLQotVGhlIHZhbHVlIG11c3QgYmUgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiBhIG1lc3NhZ2UKLWRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSBvciBpbiBhbm90aGVyCi1EZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgdmFsdWUgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lCi1zcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQKLW1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZQotZGVzdGluYXRpb24gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkKLSIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi1jb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlCi1tZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZQotZGVzdGluYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi1vZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24KLWFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLWVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLQotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLSAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0gICAgICAgIC0gYSBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlCi0gICAgICAgICAgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKLSAgICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoCi0gICAgICAgIC0gYSBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0KLUV4YW1wbGVzOgotCi08bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci08L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLSAgICAgICAgdGhlIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzCi0gICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0gICAgICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUKLSAgICAgICAgdW5pcXVlIHdpdGhpbiBhbiBlamItamFyIChmb3IgZW50ZXJwcmlzZSBiZWFucykgb3IgYQotICAgICAgICBEZXBsb3ltZW50IEZpbGUgKGZvciBvdGhlcnMpLgotICAgICAgICAlJSUKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi10aGUgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLQotRXhhbXBsZToKLQotIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi1tZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLiAgVGhlIHZhbHVlCi1pbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLUFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nIHByb2R1Y2Vycwotb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLW9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIENvbnN1bWVzCi0gICAgUHJvZHVjZXMKLSAgICBDb25zdW1lc1Byb2R1Y2VzCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKLWRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0KLVRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24KLSAgICAgICAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQotICAgICAgICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lCi0gICAgICAgICAgRGVwbG95bWVudCBGaWxlLgotCi1FeGFtcGxlOgotCi08bWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT5Db3Jwb3JhdGVTdG9ja3MKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci08L21lc3NhZ2UtZGVzdGluYXRpb24+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQotICAgICAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0gICAgICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW0tdmFsdWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiCi0gICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcGFyYW1ldGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXZhbHVlIgotICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQotICAgICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBhdGhUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgZWl0aGVyIGEgcmVsYXRpdmUKLXBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotCi1JbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotc2FtZSBEZXBsb3ltZW50IEZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci1zdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sCi10aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCi10aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMKLWFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icmVtb3RlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUKLW9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1FeGFtcGxlOgotCi0gICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icmVzLWF1dGhUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLWNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKLXdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKLW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLXRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIEFwcGxpY2F0aW9uCi0gICAgQ29udGFpbmVyCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi1mYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUgc2hhcmVkLiBUaGUgdmFsdWUsIGlmIHNwZWNpZmllZCwKLW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0gICAgU2hhcmVhYmxlCi0gICAgVW5zaGFyZWFibGUKLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGFyZWFibGUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi1yZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLWVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mCi10aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gICAgPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWUKLSAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLTwvcmVzb3VyY2UtZW52LXJlZj4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKLSAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLSAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLSAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0gICAgICAgIGludGVyZmFjZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci1jb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlCi1yZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLShBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1yZWY+Ci0gICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLSAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotPC9yZXNvdXJjZS1yZWY+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KLSAgICAgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCi0gICAgICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLSAgICAgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXMtYXV0aFR5cGUiLz4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBydW4tYXNUeXBlIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlCi11c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQotc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi1EZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKLWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi1zZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0gICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0gICAgICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLWxpbmsiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkCi0gICAgICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLSAgICAgICAgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZQotICAgICAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotRXhhbXBsZToKLQotICAgIDxzZWN1cml0eS1yb2xlPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0gICAgICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ic3RyaW5nIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKMkVFIGFzCi1hIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcgY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcwotcmVxdWlyZSB0cmFpbGluZy9sZWFkaW5nIHNwYWNlIGVsaW1pbmF0aW9uIGFzIHdlbGwgYXMKLWNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvCi1wZXJtaXNzaWJsZSB2YWx1ZXMKLQotLSB0cnVlCi0tIGZhbHNlCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKHRydWV8ZmFsc2UpIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gSXQgbXVzdAotZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZSBTZXJ2bGV0IEFQSQotU3BlY2lmaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGEgcGF0aCBzdGFydGluZwotd2l0aCBhICIvIiBhbmQgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgYSBXQVIKLWZpbGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iLy4qIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvanNwXzJfMC54c2QgYi92MS94a2l0L3NjaGVtYXMvajJlZS9qc3BfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkNTY2OC4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS9qc3BfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMCI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpanNwXzJfMC54c2RzCTEuMTAgMDgvMjAvMDIKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotdHlwZXMuICBUaGUgSlNQIDIuMCBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi1zdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLWZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0KLVRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNC54c2QKLWZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uCi1pbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi10d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRhZ2xpYlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZQotd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnBhdGhUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXBUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotZmlsZXMgc28gdGhleSBjYW4gYmUgZ2l2ZW4gZ2xvYmFsIHByb3BlcnR5IGluZm9ybWF0aW9uLgotQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotCi0gICAgLSBDb250cm9sIGVuYWJsaW5nIG9mIEVMIGV2YWx1YXRpb24uCi0gICAgLSBDb250cm9sIGVuYWJsaW5nIG9mIFNjcmlwdGluZyBlbGVtZW50cy4KLSAgICAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyBpbmZvcm1hdGlvbi4KLSAgICAtIEluZGljYXRpbmcgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50Ci0gICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtZW5hYmxlZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMRW5hYmxlZAotICAgICAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQotICAgICAgICBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYiBBcHBsaWNhdGlvbnMgdXNpbmcKLSAgICAgICAgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyIHdlYi54bWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0gICAgICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gSXQgaXMgYQotICAgICAgICB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIGRlZmluZSB0aGUgcGFnZUVuY29kaW5nCi0gICAgICAgIG9mIGEgSlNQIHBhZ2UgdGhyb3VnaCBvbmUgdmFsdWUgaW4gdGhlIEpTUAotICAgICAgICBjb25maWd1cmF0aW9uIGVsZW1lbnQgYW5kIHRoZW4gZ2l2ZSBpdCBhIGRpZmZlcmVudAotICAgICAgICB2YWx1ZSBpbiBhIHBhZ2VFbmNvZGluZyBkaXJlY3RpdmUsIGJ1dCBpdCBpcyBsZWdhbAotICAgICAgICB0byBnaXZlIGl0IHRoZSBzYW1lIHZhbHVlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctZW5hYmxlZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc1NjcmlwdGluZ0VuYWJsZWQKLSAgICAgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LAotICAgICAgICBzY3JpcHRpbmcgaXMgZW5hYmxlZC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCi0JCSAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcwotCXRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAotCWFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQlJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QKLQliZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgotCXByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1wcmVsdWRlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotICAgICAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0gICAgICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLSAgICAgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotICAgICAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCi0gICAgICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0gICAgICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLSAgICAgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotICAgICAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0gICAgICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLSAgICAgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdsaWJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQSB0YWdsaWIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhIHRhZwotbGlicmFyeSB0aGF0IGlzIHVzZWQgYnkgYSBKU1AgcGFnZSB3aXRoaW4gdGhlIFdlYgotQXBwbGljYXRpb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi11cmkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0gICAgICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0gICAgICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotICAgICAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0gICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLSAgICAgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1sb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0gICAgICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLSAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0gICAgICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL3dlYi1hcHBfMl80LnhzZCBiL3YxL3hraXQvc2NoZW1hcy9qMmVlL3dlYi1hcHBfMl80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4YzE1OC4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS93ZWItYXBwXzJfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIyl3ZWItYXBwXzJfNC54c2RzCTEuMzQgMDIvMDgvMDEKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDIuNCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0Ci1pbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRQotbmFtZXNwYWNlOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gICAgIHZlcnNpb249IjIuNCI+Ci0gICAgLi4uCi0gICAgPC93ZWItYXBwPgotCi1UaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEoyRUUKLW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8wLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi08eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIgdHlwZT0iajJlZTp3ZWItYXBwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLSAgICBkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlcnZsZXQuCi0gICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldCIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnNlcnZsZXQtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZpbHRlci1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZmlsdGVyIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWx0ZXIuCi0gICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZmlsdGVyIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViCi0gICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0gICAgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLSAgICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9InJvbGUtbmFtZS1yZWZlcmVuY2VzIgotICAgICAgICAgICAgcmVmZXI9ImoyZWU6cm9sZS1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLSAgICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldC9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi08L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLWNvbnN0cmFpbnRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKLXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKLWNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLXRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCi1kZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQotcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi1pbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgotYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAotcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCi1jb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKLXJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iYXV0aC1tZXRob2RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGgtbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8KLWdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkKLWFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkCi11c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBhcmUgIkJBU0lDIiwKLSJESUdFU1QiLCAiRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQVNJQyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESUdFU1QiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9STSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTElFTlQtQ0VSVCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNwYXRjaGVyVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkaXNwYXRjaGVyIGhhcyB0aHJlZSBsZWdhbCB2YWx1ZXMsIEZPUldBUkQgYW5kIFJFUVVFU1QKLWFuZCBJTkNMVURFLiBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlcgotd2lsbCBiZSBhcHBsaWVkIHVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4KLUEgdmFsdWUgb2YgUkVRVUVTVCBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZAotdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuIEEgdmFsdWUgb2YKLUlOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKLVJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBjYWxscy4KLVRoZSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGluIGEKLWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcKLWZpbHRlcnMgb25seSB1bmRlciBvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgotICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVRVNUIi8+Ci0KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXJyb3ItY29kZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotVXNlZCBpbjogZXJyb3ItcGFnZQotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icG9zaXRpdmVJbnRlZ2VyIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1wYWdlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi1vciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPGNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLWNvZGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVycm9yLWNvZGVUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwvY2hvaWNlPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICAgICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKLSAgICAgICAgYSBsZWFkaW5nIGAvJy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1tYXBwaW5nVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKLWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgotVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKLWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCi1hIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi1hcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KLXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKLWVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLXdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCi1maWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi1zZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLWZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQotc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BhdGNoZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmlsdGVyLW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyIGlzIGRlY2xhcmUKLWJ5IHVzaW5nIGZpbHRlci1uYW1lVHlwZS4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZQotZmlsdGVyLiAgRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi1VUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCi1maWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLSAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9ybS1sb2dpbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCi1hdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tcGFnZSIKLSAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLSAgICAgICAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kLgotICAgICAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMKLSAgICAgICAgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWVycm9yLXBhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCi0gICAgICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0gICAgICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgotICAgICAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLSAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJodHRwLW1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotCi08eHNkOmRvY3VtZW50YXRpb24+Ci1UaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgcmVjb2duaXplZCBieSB0aGUgd2ViLWFwcCwgaS5lLgotKEdFVCB8IFBPU1QgfC4uLikuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT1NUIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEVBRCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05TIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQUNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbGlzdGVuZXJUeXBlIGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgotYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotVXNlZCBpbjogd2ViLWFwcDpsaXN0ZW5lclR5cGUKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIKLSAgICAgICAgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gVGhlIHZhbHVlIGlzIHRoZSBmdWxseQotICAgICAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKLWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciCi0gICAgICAgIHR5cGU9ImoyZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgotICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKLWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi1zdWNoIGFzICJqYSIsIGRlZmluZWQgYnkgSVNPLTYzOSBvciAiTGFuZ3VhZ2UtY29kZV9Db3VudHJ5LWNvZGUiLAotc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZSIKLSAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jb2RpbmciCi0gICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci08L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4tY29uZmlnVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCi11c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmF1dGgtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhbG0tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bwotICAgICAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Zm9ybS1sb2dpbi1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS1tYXBwaW5nVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi1hbmQgYSBtaW1lIHR5cGUuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgotICAgICAgICBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWltZS10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtaW1lLXR5cGVUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBkZWZpbmVkIG1pbWUgdHlwZS4KLQotRXhhbXBsZToKLSJ0ZXh0L3BsYWluIgotCi1Vc2VkIGluOiBtaW1lLW1hcHBpbmcKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXHB7TH1cLVxwe05kfV0rL1tccHtMfVwtXHB7TmR9XC5dKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi1jb2xsZWN0aW9ucwotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtY29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLXNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4uCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2bGV0LW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLXNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotYXBwbGljYXRpb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLUl0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi1lbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi1sb2FkZWQuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmpzcC1maWxlVHlwZSIvPgotCi0gICAgICAgIDwvY2hvaWNlPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2FkLW9uLXN0YXJ0dXAiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzCi0gICAgICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0gICAgICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UKLSAgICAgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLSAgICAgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0gICAgICAgIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgdGhlIGVsZW1lbnQgaXMgbm90Ci0gICAgICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0gICAgICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0gICAgICAgIGludGVnZXIgb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kCi0gICAgICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0gICAgICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLSAgICAgICAgc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZAotICAgICAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLSAgICAgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLSAgICAgICAgc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWNvbmZpZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdGltZW91dCIKLSAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLSAgICAgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotICAgICAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0Ci0gICAgICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0gICAgICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0gICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lCi0gICAgICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLSAgICAgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi1iZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZQotY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi1yZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0Ci1wcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi10cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcwotcmVxdWlyZWQuCi0KLVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdSQUwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09ORklERU5USUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93Ci1kYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLXByb3RlY3RlZC4KLQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ3ZWItYXBwLXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi13ZWItYXBwbGljYXRpb24gc3VwcG9ydGVkLiBJdCBpcyB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUKLXZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotRXhhbXBsZToKLQotPHdlYi1hcHA+Ci0gICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotLi4uCi08L3dlYi1hcHA+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuNCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLWFwcFR5cGUiPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0gICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0gICAgICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmaWx0ZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZpbHRlci1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbWFwcGluZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2Vzc2lvbi1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1pbWUtbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZXJyb3ItcGFnZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6anNwLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9naW4tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp3ZWItYXBwLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluCi1hIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLW5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50Ci1hcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgotICAgICAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmh0dHAtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLWZpbGVzIGVsZW1lbnRzLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZQotICAgICAgICBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvczRzL1hNTC54c2QgYi92MS94a2l0L3NjaGVtYXMvczRzL1hNTC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGFkZDkuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL3M0cy9YTUwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0KLSAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gICAgICAgICZsdDtzY2hlbWEgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgotCi0gICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotCi0gICAgICAgICZsdDt0eXBlIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KLSAKLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvczRzL1hNTFNjaGVtYS54c2QgYi92MS94a2l0L3NjaGVtYXMvczRzL1hNTFNjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzcyNTEuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL3M0cy9YTUxTY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjUwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBYTUwgU2NoZW1hIHNjaGVtYSBmb3IgWE1MIFNjaGVtYXM6IFBhcnQgMTogU3RydWN0dXJlcyAtLT4KLTwhLS0gTm90ZSB0aGlzIHNjaGVtYSBpcyBOT1QgdGhlIG5vcm1hdGl2ZSBzdHJ1Y3R1cmVzIHNjaGVtYS4gLS0+Ci0KLTwhLS0gVGhlIHByb3NlIGNvcHkgaW4gdGhlIHN0cnVjdHVyZXMgUkVDIGlzIHRoZSBub3JtYXRpdmUgLS0+Ci0KLTwhLS0gdmVyc2lvbiAod2hpY2ggc2hvdWxkbid0IGRpZmZlciBmcm9tIHRoaXMgb25lIGV4Y2VwdCBmb3IgLS0+Ci0KLTwhLS0gdGhpcyBjb21tZW50IGFuZCBlbnRpdHkgZXhwYW5zaW9ucywgYnV0IGp1c3QgaW4gY2FzZSAtLT4KLQotPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgWwotCi08IS0tIHByb3ZpZGUgSUQgdHlwZSBpbmZvcm1hdGlvbiBldmVuIGZvciBwYXJzZXJzIHdoaWNoIG9ubHkgcmVhZCB0aGUKLSAgICAgaW50ZXJuYWwgc3Vic2V0IC0tPgotPCFBVFRMSVNUIHhzOnNjaGVtYSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmNvbXBsZXhUeXBlICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmNvbXBsZXhDb250ZW50ICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnNpbXBsZUNvbnRlbnQgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmV4dGVuc2lvbiAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmVsZW1lbnQgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmdyb3VwICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPiAKLTwhQVRUTElTVCB4czphbGwgICAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpjaG9pY2UgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpzZXF1ZW5jZSAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphbnkgICAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphbnlBdHRyaWJ1dGUgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphdHRyaWJ1dGUgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphdHRyaWJ1dGVHcm91cCAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czp1bmlxdWUgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czprZXkgICAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czprZXlyZWYgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpzZWxlY3RvciAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpmaWVsZCAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czppbmNsdWRlICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czppbXBvcnQgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpyZWRlZmluZSAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpub3RhdGlvbiAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhLS0KLSAgICAga2VlcCB0aGlzIHNjaGVtYSBYTUwxLjAgRFREIHZhbGlkCi0gIC0tPgotICAgICAgICA8IUVOVElUWSAlIHNjaGVtYUF0dHJzICd4bWxuczpoZnAgQ0RBVEEgI0lNUExJRUQnPgotCi0gICAgICAgIDwhRUxFTUVOVCBoZnA6aGFzRmFjZXQgRU1QVFk+Ci0gICAgICAgIDwhQVRUTElTVCBoZnA6aGFzRmFjZXQKLSAgICAgICAgICAgICAgICBuYW1lIE5NVE9LRU4gI1JFUVVJUkVEPgotCi0gICAgICAgIDwhRUxFTUVOVCBoZnA6aGFzUHJvcGVydHkgRU1QVFk+Ci0gICAgICAgIDwhQVRUTElTVCBoZnA6aGFzUHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lIE5NVE9LRU4gI1JFUVVJUkVECi0gICAgICAgICAgICAgICAgdmFsdWUgQ0RBVEEgI1JFUVVJUkVEPgotPCEtLQotICAgICAgICBNYWtlIHN1cmUgdGhhdCBwcm9jZXNzb3JzIHRoYXQgZG8gbm90IHJlYWQgdGhlIGV4dGVybmFsCi0gICAgICAgIHN1YnNldCB3aWxsIGtub3cgYWJvdXQgdGhlIHZhcmlvdXMgSURzIHdlIGRlY2xhcmUKLSAgLS0+Ci0gICAgICAgIDwhQVRUTElTVCB4czpzaW1wbGVUeXBlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWF4RXhjbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWluRXhjbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWF4SW5jbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWluSW5jbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6dG90YWxEaWdpdHMgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpmcmFjdGlvbkRpZ2l0cyBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmxlbmd0aCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkxlbmd0aCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heExlbmd0aCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmVudW1lcmF0aW9uIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6cGF0dGVybiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmFwcGluZm8gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpkb2N1bWVudGF0aW9uIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bGlzdCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnVuaW9uIGlkIElEICNJTVBMSUVEPgotICAgICAgICBdPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBibG9ja0RlZmF1bHQ9IiNhbGwiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sOmxhbmc9IkVOIiB4bWxuczpoZnA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWhhc0ZhY2V0QW5kUHJvcGVydHkiPgotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQYXJ0IDEgdmVyc2lvbjogSWQ6IFhNTFNjaGVtYS54c2QsdiAxLjUzIDIwMDMvMDIvMjQgMTc6NDA6MDcgaHQgRXhwIAotICAgIFBhcnQgMiB2ZXJzaW9uOiBJZDogZGF0YXR5cGVzLnhzZCx2IDEuNTggMjAwMy8wMi8yNiAxNDowMToyOSBodCBFeHAgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLQotIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvR3JvdXAvMjAwMi8wOS94bWxzY2hlbWEtMS9zdHJ1Y3R1cmVzLXdpdGgtZXJyYXRhLmh0bWwiPgotICAgVGhlIHNjaGVtYSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZG9jdW1lbnQgaXMgbm9ybWF0aXZlLAotICAgd2l0aCByZXNwZWN0IHRvIHRoZSBzeW50YWN0aWMgY29uc3RyYWludHMgaXQgZXhwcmVzc2VzIGluIHRoZQotICAgWE1MIFNjaGVtYSBsYW5ndWFnZS4gIFRoZSBkb2N1bWVudGF0aW9uICh3aXRoaW4gJmx0O2RvY3VtZW50YXRpb24+IGVsZW1lbnRzKQotICAgYmVsb3csIGlzIG5vdCBub3JtYXRpdmUsIGJ1dCByYXRoZXIgaGlnaGxpZ2h0cyBpbXBvcnRhbnQgYXNwZWN0cyBvZgotICAgdGhlIFczQyBSZWNvbW1lbmRhdGlvbiBvZiB3aGljaCB0aGlzIGlzIGEgcGFydDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhlIHNpbXBsZVR5cGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBtZW1iZXJzIGFyZSBkZWZpbmVkCi0gICAgICB0b3dhcmRzIHRoZSBlbmQgb2YgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgR2V0IGFjY2VzcyB0byB0aGUgeG1sOiBhdHRyaWJ1dGUgZ3JvdXBzIGZvciB4bWw6bGFuZwotICAgICAgIGFzIGRlY2xhcmVkIG9uICdzY2hlbWEnIGFuZCAnZG9jdW1lbnRhdGlvbicgYmVsb3cKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotIDwveHM6aW1wb3J0PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im9wZW5BdHRycyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGFsbW9zdCBhbGwgc2NoZW1hIHR5cGVzCi0gICAgICAgdG8gYWxsb3cgYXR0cmlidXRlcyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUKLSAgICAgICBhZGRlZCB0byB1c2VyIHNjaGVtYXMuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFubm90YXRlZCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGFsbCB0eXBlcyB3aGljaCBhbGxvdyBhbm5vdGF0aW9uCi0gICAgICAgb3RoZXIgdGhhbiAmbHQ7c2NoZW1hJmd0OyBpdHNlbGYKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9InNjaGVtYVRvcCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGdyb3VwIGlzIGZvciB0aGUKLSAgIGVsZW1lbnRzIHdoaWNoIG9jY3VyIGZyZWVseSBhdCB0aGUgdG9wIGxldmVsIG9mIHNjaGVtYXMuCi0gICBBbGwgb2YgdGhlaXIgdHlwZXMgYXJlIGJhc2VkIG9uIHRoZSAiYW5ub3RhdGVkIiB0eXBlIGJ5IGV4dGVuc2lvbi48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czpncm91cCByZWY9InhzOnJlZGVmaW5hYmxlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOm5vdGF0aW9uIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0gCi0gPHhzOmdyb3VwIG5hbWU9InJlZGVmaW5hYmxlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoaXMgZ3JvdXAgaXMgZm9yIHRoZQotICAgZWxlbWVudHMgd2hpY2ggY2FuIHNlbGYtcmVkZWZpbmUgKHNlZSAmbHQ7cmVkZWZpbmU+IGJlbG93KS48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6c2ltcGxlVHlwZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpjb21wbGV4VHlwZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpncm91cCIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphdHRyaWJ1dGVHcm91cCIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZm9ybUNob2ljZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icXVhbGlmaWVkIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVucXVhbGlmaWVkIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icmVkdWNlZERlcml2YXRpb25Db250cm9sIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlcml2YXRpb25Db250cm9sIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVyaXZhdGlvblNldCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtleHRlbnNpb24sIHJlc3RyaWN0aW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4gICAgCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpyZWR1Y2VkRGVyaXZhdGlvbkNvbnRyb2wiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIGlkPSJzY2hlbWEiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNjaGVtYSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czppbmNsdWRlIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czppbXBvcnQiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnJlZGVmaW5lIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzY2hlbWFUb3AiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWxEZWZhdWx0IiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9ja0RlZmF1bHQiIHR5cGU9InhzOmJsb2NrU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIgdHlwZT0ieHM6Zm9ybUNob2ljZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0idW5xdWFsaWZpZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50Rm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6a2V5IG5hbWU9ImVsZW1lbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0idHlwZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmNvbXBsZXhUeXBlfHhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0gCi0gIDx4czprZXkgbmFtZT0iZ3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpncm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLSAKLSAgPHhzOmtleSBuYW1lPSJhdHRyaWJ1dGVHcm91cCI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZUdyb3VwIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotIAotICA8eHM6a2V5IG5hbWU9Im5vdGF0aW9uIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6bm90YXRpb24iLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSAgPHhzOmtleSBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSIuLy94czprZXl8Li8veHM6dW5pcXVlfC4vL3hzOmtleXJlZiIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotIDwveHM6ZWxlbWVudD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE5OSSI+Ci0gIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPgotICAgZm9yIG1heE9jY3VyczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvY2N1cnMiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBhbGwgcGFydGljbGVzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdHlwZT0ieHM6YWxsTk5JIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkZWZSZWYiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBlbGVtZW50LCBncm91cCBhbmQgYXR0cmlidXRlR3JvdXAsCi0gICB3aGljaCBib3RoIGRlZmluZSBhbmQgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOlFOYW1lIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czpncm91cCBuYW1lPSJ0eXBlRGVmUGFydGljbGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICdjb21wbGV4VHlwZScgdXNlcyB0aGlzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0gCi0gCi0KLSA8eHM6Z3JvdXAgbmFtZT0ibmVzdGVkUGFydGljbGUiPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpncm91cCBuYW1lPSJwYXJ0aWNsZSI+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czpsb2NhbEVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJvcHRpb25hbCI+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvaGliaXRlZCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHR5cGU9InhzOmZvcm1DaG9pY2UiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQXR0cmlidXRlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iYXR0ckRlY2xzIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOmF0dHJpYnV0ZSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiB0eXBlPSJ4czphdHRyaWJ1dGVHcm91cFJlZiIvPgotICAgPC94czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueUF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueUF0dHJpYnV0ZSIgdHlwZT0ieHM6d2lsZGNhcmQiIGlkPSJhbnlBdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYW55QXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iY29tcGxleFR5cGVNb2RlbCI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZUNvbnRlbnQiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleENvbnRlbnQiLz4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGJyYW5jaCBpcyBzaG9ydCBmb3IKLSAgICZsdDtjb21wbGV4Q29udGVudD4KLSAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4KLSAgIC4uLgotICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAgICZsdDsvY29tcGxleENvbnRlbnQ+PC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4VHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFdpbGwgYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1peGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBOb3QgYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50IGNoaWxkIGlzIGNob3Nlbi4KLSAgICAgIE1heSBiZSBvdmVycmlkZW4gYnkgc2V0dGluZyBvbiBjb21wbGV4Q29udGVudCBjaGlsZC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxDb21wbGV4VHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpjb21wbGV4VHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpjb21wbGV4VHlwZU1vZGVsIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJyZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgICAgIAotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFJlc3RyaWN0aW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZXN0cmljdGlvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2UgaXMgYWRkZWQgc2ltcGx5IHRvCi0gICAgICAgICAgICAgICAgICAgbWFrZSB0aGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gcGVyIHRoZSBSRUM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2lvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleENvbnRlbnQiIGlkPSJjb21wbGV4Q29udGVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4Q29udGVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgdHlwZT0ieHM6Y29tcGxleFJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpleHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPiAgICAgCi0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgT3ZlcnJpZGVzIGFueSBzZXR0aW5nIG9uIGNvbXBsZXhUeXBlIHBhcmVudC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVSZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bwotICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHRlbnNpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4dGVuc2lvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vIHR5cGVEZWZQYXJ0aWNsZSBncm91cCByZWZlcmVuY2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNpbXBsZUNvbnRlbnQiIGlkPSJzaW1wbGVDb250ZW50Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNpbXBsZUNvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOnNpbXBsZVJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpzaW1wbGVFeHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0gCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOnRvcExldmVsQ29tcGxleFR5cGUiIGlkPSJjb21wbGV4VHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4VHlwZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmxvY2tTZXQiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtzdWJzdGl0dXRpb24sIGV4dGVuc2lvbiwKLSAgICByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+ICAgIAotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6bGlzdD4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgPC94czp1bmlvbj4gIAotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhlIGVsZW1lbnQgZWxlbWVudCBjYW4gYmUgdXNlZCBlaXRoZXIKLSAgIGF0IHRoZSB0b3AgbGV2ZWwgdG8gZGVmaW5lIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGdsb2JhbGx5LAotICAgb3Igd2l0aGluIGEgY29udGVudCBtb2RlbCB0byBlaXRoZXIgcmVmZXJlbmNlIGEgZ2xvYmFsbHktZGVmaW5lZAotICAgZWxlbWVudCBvciB0eXBlIG9yIGRlY2xhcmUgYW4gZWxlbWVudC10eXBlIGJpbmRpbmcgbG9jYWxseS4KLSAgIFRoZSByZWYgZm9ybSBpcyBub3QgYWxsb3dlZCBhdCB0aGUgdG9wIGxldmVsLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uR3JvdXAiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmJsb2NrU2V0Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB0eXBlPSJ4czpmb3JtQ2hvaWNlIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEVsZW1lbnQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZWxlbWVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxFbGVtZW50Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOnRvcExldmVsRWxlbWVudCIgaWQ9ImVsZW1lbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZWxlbWVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBncm91cCB0eXBlIGZvciBleHBsaWNpdCBncm91cHMsIG5hbWVkIHRvcC1sZXZlbCBncm91cHMgYW5kCi0gICBncm91cCByZWZlcmVuY2VzPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czpwYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVhbEdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZWFsR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpzaW1wbGVFeHBsaWNpdEdyb3VwIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXBSZWYiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4cGxpY2l0R3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgZ3JvdXAgdHlwZSBmb3IgdGhlIHRocmVlIGtpbmRzIG9mIGdyb3VwPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZUV4cGxpY2l0R3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0iYWxsTW9kZWwiPgotICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2Ugd2l0aCBtaW4vbWF4IGlzIGhlcmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgYSBwYmxtIHdpdGggdGhlIEVsdDpBbGwvQ2hvaWNlL1NlcQotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNsZSBkZXJpdmF0aW9uIGNvbnN0cmFpbnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmVsZW1lbnRJbkFsbCIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudEluQWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPnJlc3RyaWN0ZWQgbWF4L21pbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9jYWxFbGVtZW50Ij4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+ICAgIAotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbGwiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBPbmx5IGVsZW1lbnRzIGFsbG93ZWQgaW5zaWRlPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpleHBsaWNpdEdyb3VwIj4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFsbCIgaWQ9ImFsbCIgdHlwZT0ieHM6YWxsIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFsbCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0iY2hvaWNlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWNob2ljZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOmV4cGxpY2l0R3JvdXAiIGlkPSJzZXF1ZW5jZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZXF1ZW5jZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOm5hbWVkR3JvdXAiIGlkPSJncm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ncm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9IndpbGRjYXJkIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpuYW1lc3BhY2VMaXN0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIjI2FueSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0NvbnRlbnRzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJzdHJpY3QiPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNraXAiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaWN0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYW55IiBpZD0iYW55Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOndpbGRjYXJkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgc2ltcGxlIHR5cGUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgJ25hbWVzcGFjZScgYXR0ciBvZgotICAgJ2FueScgYW5kICdhbnlBdHRyaWJ1dGUnPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBWYWx1ZSBpcwotICAgICAgICAgICAgICAjI2FueSAgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBhdCBhbGwKLQotICAgICAgICAgICAgICAjI290aGVyICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0YXJnZXROUwotCi0gICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIAotCi0gICAgICAgICAgICAgIG9uZSBvciAgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGZyb20KLSAgICAgICAgICAgICAgbW9yZSBVUkkgICAgICAgIHRoZSBsaXN0ZWQgbmFtZXNwYWNlcwotICAgICAgICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgICAgICAgIChzcGFjZSBzZXBhcmF0ZWQpCi0KLSAgICAjI3RhcmdldE5hbWVzcGFjZSBvciAjI2xvY2FsIG1heSBhcHBlYXIgaW4gdGhlIGFib3ZlIGxpc3QsIHRvCi0gICAgICAgIHJlZmVyIHRvIHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZwotICAgICAgICBzY2hlbWEgb3IgYW4gYWJzZW50IHRhcmdldE5hbWVzcGFjZSByZXNwZWN0aXZlbHk8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWVzcGFjZUxpc3QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNvdGhlciIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdD4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmFueVVSSSI+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjbG9jYWwiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOnVuaW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czpsaXN0PgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ieHM6dG9wTGV2ZWxBdHRyaWJ1dGUiIGlkPSJhdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlR3JvdXAiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRBdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZUdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlR3JvdXAiIHR5cGU9InhzOm5hbWVkQXR0cmlidXRlR3JvdXAiIGlkPSJhdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hdHRyaWJ1dGVHcm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgaWQ9ImluY2x1ZGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW5jbHVkZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJyZWRlZmluZSIgaWQ9InJlZGVmaW5lIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXJlZGVmaW5lIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiIGlkPSJpbXBvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW1wb3J0Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VsZWN0b3IiIGlkPSJzZWxlY3RvciI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZWxlY3RvciIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCi1pbiBzZWxlY3RvcnM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwotdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBmb2xsb3dpbmcgRUJORjoKLSAgICAgICAgICBTZWxlY3RvciAgICA6Oj0gICAgUGF0aCAoICd8JyBQYXRoICkqICAKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyBTdGVwICggJy8nIFN0ZXAgKSogIAotICAgICAgICAgIFN0ZXAgICAgOjo9ICAgICcuJyB8IE5hbWVUZXN0ICAKLSAgICAgICAgICBOYW1lVGVzdCAgICA6Oj0gICAgUU5hbWUgfCAnKicgfCBOQ05hbWUgJzonICcqJyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDo6IGlzIGFsc28gYWxsb3dlZAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIGNvbW1lbnRlZCBvdXQgc2luY2UgdGhpcyBpbmNvcnJlY3RseSBkb2VzIG5vdCBhbGxvdyB3aGl0ZSBzcGFjZSAtLT4KLSAgICAgICAgPCEtLSA8eHM6cGF0dGVybiB2YWx1ZT0iKFwuLy8pPygoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pKC8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSkqKFx8KFwuLy8pPygoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pKC8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSkqKSoiPiAKLSAgICAgICAgPC94czpwYXR0ZXJuPiAtLT4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZmllbGQiIGlkPSJmaWVsZCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1maWVsZCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCi1pbiBmaWVsZHM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwotdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBzYW1lIEVCTkYgYXMgZm9yIHNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZToKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyAoIFN0ZXAgJy8nICkqICggU3RlcCB8ICdAJyBOYW1lVGVzdCApIAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIGNvbW1lbnRlZCBvdXQgc2luY2UgdGhpcyBpbmNvcnJlY3RseSBkb2VzIG5vdCBhbGxvdyB3aGl0ZSBzcGFjZSAtLT4KLSAgICAgICAgPCEtLSA8eHM6cGF0dGVybiB2YWx1ZT0iKFwuLy8pPygoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKS8pKigoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKXwoKGF0dHJpYnV0ZTo6fEApKChcaVxjKjopPyhcaVxjKnxcKikpKSkoXHwoXC4vLyk/KCgoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pLykqKCgoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pfCgoYXR0cmlidXRlOjp8QCkoKFxpXGMqOik/KFxpXGMqfFwqKSkpKSkqIj4gCi0gICAgICAgIDwveHM6cGF0dGVybj4tLT4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImtleWJhc2UiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNlbGVjdG9yIi8+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZmllbGQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9ImlkZW50aXR5Q29uc3RyYWludCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIHRocmVlIGtpbmRzIG9mIGlkZW50aXR5IGNvbnN0cmFpbnRzLCBhbGwgd2l0aAotICAgICAgICAgICAgICAgICAgICAgdHlwZSBvZiBvciBkZXJpdmVkIGZyb20gJ2tleWJhc2UnLgotICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnVuaXF1ZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czprZXkiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5cmVmIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzOmtleWJhc2UiIGlkPSJ1bmlxdWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtdW5pcXVlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0gPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiB0eXBlPSJ4czprZXliYXNlIiBpZD0ia2V5Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWtleSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotIDx4czplbGVtZW50IG5hbWU9ImtleXJlZiIgaWQ9ImtleXJlZiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXlyZWYiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czprZXliYXNlIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWZlciIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ibm90YXRpb24iIGlkPSJub3RhdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ub3RhdGlvbiIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHVibGljIiB0eXBlPSJ4czpwdWJsaWMiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW0iIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwdWJsaWMiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSBwdWJsaWMgaWRlbnRpZmllciwgcGVyIElTTyA4ODc5PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiIvPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFwcGluZm8iIGlkPSJhcHBpbmZvIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFwcGluZm8iLz4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICA8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNvdXJjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImRvY3VtZW50YXRpb24iIGlkPSJkb2N1bWVudGF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWRvY3VtZW50YXRpb24iLz4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICA8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNvdXJjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImFubm90YXRpb24iIGlkPSJhbm5vdGF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFubm90YXRpb24iLz4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphcHBpbmZvIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpkb2N1bWVudGF0aW9uIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIG5vdGF0aW9ucyBmb3IgdXNlIHdpdGhpbiBYTUwgU2NoZW1hIHNjaGVtYXM8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOm5vdGF0aW9uIG5hbWU9IlhNTFNjaGVtYVN0cnVjdHVyZXMiIHB1YmxpYz0ic3RydWN0dXJlcyIgc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA4L1hNTFNjaGVtYS54c2QiLz4KLSA8eHM6bm90YXRpb24gbmFtZT0iWE1MIiBwdWJsaWM9IlJFQy14bWwtMTk5ODAyMTAiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwIi8+Ci0gIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbnlUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBOb3QgdGhlIHJlYWwgdXJUeXBlLCBidXQgYXMgY2xvc2UgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW4KLSAgIGdldCBpbiB0aGUgWE1MIHJlcHJlc2VudGF0aW9uPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgIDx4czphbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgPC94czpzZXF1ZW5jZT4KLSAgPHhzOmFueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBGaXJzdCB0aGUgYnVpbHQtaW4gcHJpbWl0aXZlIGRhdGF0eXBlcy4gIFRoZXNlIGRlZmluaXRpb25zIGFyZSBmb3IKLSAgICAgIGluZm9ybWF0aW9uIG9ubHksIHRoZSByZWFsIGJ1aWx0LWluIGRlZmluaXRpb25zIGFyZSBtYWdpYy4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEZvciBlYWNoIGJ1aWx0LWluIGRhdGF0eXBlIGluIHRoaXMgc2NoZW1hIChib3RoIHByaW1pdGl2ZSBhbmQKLSAgICAgIGRlcml2ZWQpIGNhbiBiZSB1bmlxdWVseSBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkCi0gICAgICBhcyBmb2xsb3dzOgotICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKLSAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGF0eXBlCi0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSBpbnQgZGF0YXR5cGUsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50Ci0KLSAgICAgIEFkZGl0aW9uYWxseSwgZWFjaCBmYWNldCBkZWZpbml0aW9uIGVsZW1lbnQgY2FuIGJlIHVuaXF1ZWx5Ci0gICAgICBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZmFjZXQKLQotICAgICAgRm9yIGV4YW1wbGUsIHRvIGFkZHJlc3MgdGhlIG1heEluY2x1c2l2ZSBmYWNldCwgdGhlIFVSSSBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNtYXhJbmNsdXNpdmUKLQotICAgICAgQWRkaXRpb25hbGx5LCBlYWNoIGZhY2V0IHVzYWdlIGluIGEgYnVpbHQtaW4gZGF0YXR5cGUgZGVmaW5pdGlvbgotICAgICAgY2FuIGJlIHVuaXF1ZWx5IGFkZHJlc3NlZCB2aWEgYSBVUkkgY29uc3RydWN0ZWQgYXMgZm9sbG93czoKLSAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZSwgZm9sbG93ZWQKLSAgICAgICAgICAgYnkgYSBwZXJpb2QgKCIuIikgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGZhY2V0Ci0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSB1c2FnZSBvZiB0aGUgbWF4SW5jbHVzaXZlIGZhY2V0IGluCi0gICAgICB0aGUgZGVmaW5pdGlvbiBvZiBpbnQsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50Lm1heEluY2x1c2l2ZQotCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic3RyaW5nIiBpZD0ic3RyaW5nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9InByZXNlcnZlIiBpZD0ic3RyaW5nLnByZXNlcnZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJvb2xlYW4iIGlkPSJib29sZWFuIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImJvb2xlYW4ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJmbG9hdCIgaWQ9ImZsb2F0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Zsb2F0Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJmbG9hdC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRvdWJsZSIgaWQ9ImRvdWJsZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkb3VibGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkb3VibGUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZWNpbWFsIiBpZD0iZGVjaW1hbCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ0b3RhbERpZ2l0cyIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImZyYWN0aW9uRGlnaXRzIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRlY2ltYWwud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImR1cmF0aW9uIiBpZD0iZHVyYXRpb24iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkdXJhdGlvbi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRhdGVUaW1lIiBpZD0iZGF0ZVRpbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZGF0ZVRpbWUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0aW1lIiBpZD0idGltZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdGltZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9InRpbWUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlIiBpZD0iZGF0ZSI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZGF0ZS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdZZWFyTW9udGgiIGlkPSJnWWVhck1vbnRoIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyTW9udGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJnWWVhck1vbnRoLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ1llYXIiIGlkPSJnWWVhciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJnWWVhci53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ01vbnRoRGF5IiBpZD0iZ01vbnRoRGF5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGhEYXkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBpZD0iZ01vbnRoRGF5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ0RheSIgaWQ9ImdEYXkiPgotICAgIDx4czphbm5vdGF0aW9uPgotICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnRGF5Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJnRGF5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnTW9udGgiIGlkPSJnTW9udGgiPgotICAgIDx4czphbm5vdGF0aW9uPgotICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgaWQ9ImdNb250aC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJoZXhCaW5hcnkiIGlkPSJoZXhCaW5hcnkiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2JpbmFyeSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iaGV4QmluYXJ5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiBpZD0iYmFzZTY0QmluYXJ5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jhc2U2NEJpbmFyeSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iYmFzZTY0QmluYXJ5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbnlVUkkiIGlkPSJhbnlVUkkiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2FueVVSSSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImFueVVSSS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZSIgaWQ9IlFOYW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iUU5hbWUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk9UQVRJT04iIGlkPSJOT1RBVElPTiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOT1RBVElPTiIvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIE5PVEFUSU9OIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5IGluIGEgc2NoZW1hOyByYXRoZXIgYSB0eXBlCi0gICAgICAgIG11c3QgYmUgZGVyaXZlZCBmcm9tIGl0IGJ5IHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIGVudW1lcmF0aW9uCi0gICAgICAgIGZhY2V0IHdob3NlIHZhbHVlIGlzIHRoZSBuYW1lIG9mIGEgTk9UQVRJT04gZGVjbGFyZWQgaW4gdGhlCi0gICAgICAgIHNjaGVtYS4KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJOT1RBVElPTi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgTm93IHRoZSBkZXJpdmVkIHByaW1pdGl2ZSB0eXBlcwotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vcm1hbGl6ZWRTdHJpbmciIGlkPSJub3JtYWxpemVkU3RyaW5nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vcm1hbGl6ZWRTdHJpbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0icmVwbGFjZSIKLSAgICAgICAgaWQ9Im5vcm1hbGl6ZWRTdHJpbmcud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0b2tlbiIgaWQ9InRva2VuIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub3JtYWxpemVkU3RyaW5nIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgaWQ9InRva2VuLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibGFuZ3VhZ2UiIGlkPSJsYW5ndWFnZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsYW5ndWFnZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOnBhdHRlcm4KLSAgICAgICAgdmFsdWU9IlthLXpBLVpdezEsOH0oLVthLXpBLVowLTldezEsOH0pKiIKLSAgICAgICAgICAgICAgICBpZD0ibGFuZ3VhZ2UucGF0dGVybiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUxhbmd1YWdlSUQiPgotICAgICAgICAgICAgcGF0dGVybiBzcGVjaWZpZXMgdGhlIGNvbnRlbnQgb2Ygc2VjdGlvbiAyLjEyIG9mIFhNTCAxLjBlMgotICAgICAgICAgICAgYW5kIFJGQyAzMDY2IChSZXZpc2VkIHZlcnNpb24gb2YgUkZDIDE3NjYpLgotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czpwYXR0ZXJuPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRFJFRlMiIGlkPSJJRFJFRlMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUZTIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6SURSRUYiLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9IklEUkVGUy5taW5MZW5ndGgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iRU5USVRJRVMiIGlkPSJFTlRJVElFUyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVElFUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOkVOVElUWSIvPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSIxIiBpZD0iRU5USVRJRVMubWluTGVuZ3RoIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5NVE9LRU4iIGlkPSJOTVRPS0VOIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU4iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcYysiIGlkPSJOTVRPS0VOLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1ObXRva2VuIj4KLSAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDcgZnJvbSB0aGUgWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk1UT0tFTlMiIGlkPSJOTVRPS0VOUyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOk5NVE9LRU4iLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9Ik5NVE9LRU5TLm1pbkxlbmd0aCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOYW1lIiBpZD0iTmFtZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGlcYyoiIGlkPSJOYW1lLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULU5hbWUiPgotICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNSBmcm9tIHRoZSBYTUwgc3BlYwotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czpwYXR0ZXJuPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOQ05hbWUiIGlkPSJOQ05hbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTkNOYW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOYW1lIj4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXGktWzpdXVtcYy1bOl1dKiIgaWQ9Ik5DTmFtZS5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI05ULU5DTmFtZSI+Ci0gICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA0IGZyb20gdGhlIE5hbWVzcGFjZXMgaW4gWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IklEIiBpZD0iSUQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSUQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRFJFRiIgaWQ9IklEUkVGIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iRU5USVRZIiBpZD0iRU5USVRZIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaW50ZWdlciIgaWQ9ImludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVjaW1hbCI+Ci0gICAgICA8eHM6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjAiIGZpeGVkPSJ0cnVlIiBpZD0iaW50ZWdlci5mcmFjdGlvbkRpZ2l0cyIvPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1stK10/WzAtOV0rJy8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgaWQ9Im5vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25Qb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMCIgaWQ9Im5vblBvc2l0aXZlSW50ZWdlci5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIiBpZD0ibmVnYXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9Ii0xIiBpZD0ibmVnYXRpdmVJbnRlZ2VyLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJsb25nIiBpZD0ibG9uZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsb25nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii05MjIzMzcyMDM2ODU0Nzc1ODA4IiBpZD0ibG9uZy5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjkyMjMzNzIwMzY4NTQ3NzU4MDciIGlkPSJsb25nLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJpbnQiIGlkPSJpbnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpsb25nIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0yMTQ3NDgzNjQ4IiBpZD0iaW50Lm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMjE0NzQ4MzY0NyIgaWQ9ImludC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2hvcnQiIGlkPSJzaG9ydCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50Ij4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0zMjc2OCIgaWQ9InNob3J0Lm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMzI3NjciIGlkPSJzaG9ydC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYnl0ZSIgaWQ9ImJ5dGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnl0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2hvcnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTEyOCIgaWQ9ImJ5dGUubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMjciIGlkPSJieXRlLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIGlkPSJub25OZWdhdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjAiIGlkPSJub25OZWdhdGl2ZUludGVnZXIubWluSW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkTG9uZyIgaWQ9InVuc2lnbmVkTG9uZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxODQ0Njc0NDA3MzcwOTU1MTYxNSIKLSAgICAgICAgaWQ9InVuc2lnbmVkTG9uZy5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRJbnQiIGlkPSJ1bnNpZ25lZEludCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEludCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjQyOTQ5NjcyOTUiCi0gICAgICAgIGlkPSJ1bnNpZ25lZEludC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgaWQ9InVuc2lnbmVkU2hvcnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRJbnQiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiCi0gICAgICAgIGlkPSJ1bnNpZ25lZFNob3J0Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiIGlkPSJ1bnNpZ25lZEJ5dGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRCeXRlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZFNob3J0Ij4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjI1NSIgaWQ9InVuc2lnbmVkQnl0ZS5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiBpZD0icG9zaXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiIGlkPSJwb3NpdGl2ZUludGVnZXIubWluSW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVyaXZhdGlvbkNvbnRyb2wiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN1YnN0aXR1dGlvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJzaW1wbGVEZXJpdmF0aW9uIj4KLSAgPHhzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnJlc3RyaWN0aW9uIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpsaXN0Ii8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlvbiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2ltcGxlRGVyaXZhdGlvblNldCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtyZXN0cmljdGlvbiwgdW5pb24sIGxpc3R9Ci0gICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuaW9uIi8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB0eXBlPSJ4czpzaW1wbGVEZXJpdmF0aW9uU2V0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBDYW4gYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW4KLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxTaW1wbGVUeXBlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgUmVxdWlyZWQgYXQgdGhlIHRvcCBsZXZlbAotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsU2ltcGxlVHlwZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJwcm9oaWJpdGVkIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBGb3JiaWRkZW4gd2hlbiBuZXN0ZWQKLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czp0b3BMZXZlbFNpbXBsZVR5cGUiIGlkPSJzaW1wbGVUeXBlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtc2ltcGxlVHlwZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpncm91cCBuYW1lPSJmYWNldHMiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgV2Ugc2hvdWxkIHVzZSBhIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgZmFjZXRzLCBidXQKLSAgICAgICB0aGF0J3MgcnVsZWQgb3V0IGJlY2F1c2UgaXQgd291bGQgYWxsb3cgdXNlcnMgdG8KLSAgICAgICBhZGQgdGhlaXIgb3duLCB3aGljaCB3ZSdyZSBub3QgcmVhZHkgZm9yIHlldC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluRXhjbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5JbmNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heEV4Y2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4SW5jbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp0b3RhbERpZ2l0cyIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZnJhY3Rpb25EaWdpdHMiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmxlbmd0aCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluTGVuZ3RoIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhMZW5ndGgiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmVudW1lcmF0aW9uIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp3aGl0ZVNwYWNlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpwYXR0ZXJuIi8+Ci0gICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6Z3JvdXAgbmFtZT0ic2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCI+Ci0gICA8eHM6c2VxdWVuY2U+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czpmYWNldHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIGlkPSJyZXN0cmljdGlvbiI+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtcmVzdHJpY3Rpb24iPgotICAgICAgICAgIGJhc2UgYXR0cmlidXRlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseQotICAgICAgICAgIGV4Y2x1c2l2ZSwgYnV0IG9uZSBvciBvdGhlciBpcyByZXF1aXJlZAotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsaXN0IiBpZD0ibGlzdCI+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbGlzdCI+Ci0gICAgICAgICAgaXRlbVR5cGUgYXR0cmlidXRlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseQotICAgICAgICAgIGV4Y2x1c2l2ZSwgYnV0IG9uZSBvciBvdGhlciBpcyByZXF1aXJlZAotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Iml0ZW1UeXBlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuaW9uIiBpZD0idW5pb24iPgotICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXVuaW9uIj4KLSAgICAgICAgICBtZW1iZXJUeXBlcyBhdHRyaWJ1dGUgbXVzdCBiZSBub24tZW1wdHkgb3IgdGhlcmUgbXVzdCBiZQotICAgICAgICAgIGF0IGxlYXN0IG9uZSBzaW1wbGVUeXBlIGNoaWxkCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lbWJlclR5cGVzIiB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6UU5hbWUiLz4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXQiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIgotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vRml4ZWRGYWNldCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWluRXhjbHVzaXZlIiBpZD0ibWluRXhjbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkV4Y2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5JbmNsdXNpdmUiIGlkPSJtaW5JbmNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluSW5jbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4RXhjbHVzaXZlIiBpZD0ibWF4RXhjbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heEV4Y2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhJbmNsdXNpdmUiIGlkPSJtYXhJbmNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im51bUZhY2V0Ij4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgotICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0b3RhbERpZ2l0cyIgaWQ9InRvdGFsRGlnaXRzIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtdG90YWxEaWdpdHMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bnVtRmFjZXQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpwb3NpdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9ImZyYWN0aW9uRGlnaXRzIiBpZD0iZnJhY3Rpb25EaWdpdHMiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtZnJhY3Rpb25EaWdpdHMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIGlkPSJsZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbGVuZ3RoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1pbkxlbmd0aCIgaWQ9Im1pbkxlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5MZW5ndGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4TGVuZ3RoIiBpZD0ibWF4TGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heExlbmd0aCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9ImVudW1lcmF0aW9uIiBpZD0iZW51bWVyYXRpb24iIHR5cGU9InhzOm5vRml4ZWRGYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWVudW1lcmF0aW9uIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0id2hpdGVTcGFjZSIgaWQ9IndoaXRlU3BhY2UiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC13aGl0ZVNwYWNlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2UiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9InBhdHRlcm4iIGlkPSJwYXR0ZXJuIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtcGF0dGVybiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub0ZpeGVkRmFjZXQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgo=